WooCommerce Gutenberg Products Block - Version 3.6.1

Version Description

Download this release

Release Info

Developer aljullu
Plugin Icon 128x128 WooCommerce Gutenberg Products Block
Version 3.6.1
Comparing to
See all releases

Code changes from version 5.5.0 to 3.6.1

Files changed (295) hide show
  1. .prettierrc.js +0 -3
  2. LICENSE +0 -674
  3. assets/css/abstracts/_breakpoints.scss +0 -2
  4. assets/css/abstracts/_colors.scss +51 -8
  5. assets/css/abstracts/_mixins.scss +3 -47
  6. assets/css/abstracts/_variables.scss +18 -8
  7. assets/css/editor.scss +10 -10
  8. assets/css/style.scss +8 -38
  9. assets/img/avatar.jpg +0 -0
  10. {images/previews → assets/img}/beanie.jpg +0 -0
  11. assets/img/block-error.svg +2727 -0
  12. {images/previews → assets/img}/cap.jpg +0 -0
  13. {images/previews → assets/img}/collection.jpg +0 -0
  14. assets/img/grid.svg +50 -0
  15. assets/img/no-matching-products.svg +1 -0
  16. assets/img/no-products.svg +1 -0
  17. {images → assets/img}/payment-methods/alipay.svg +0 -0
  18. {images → assets/img}/payment-methods/amex.svg +0 -0
  19. {images → assets/img}/payment-methods/bancontact.svg +0 -0
  20. {images → assets/img}/payment-methods/diners.svg +0 -0
  21. {images → assets/img}/payment-methods/discover.svg +0 -0
  22. {images → assets/img}/payment-methods/eps.svg +0 -0
  23. {images → assets/img}/payment-methods/giropay.svg +0 -0
  24. {images → assets/img}/payment-methods/ideal.svg +0 -0
  25. {images → assets/img}/payment-methods/jcb.svg +0 -0
  26. {images → assets/img}/payment-methods/laser.svg +0 -0
  27. {images → assets/img}/payment-methods/maestro.svg +0 -0
  28. {images → assets/img}/payment-methods/mastercard.svg +0 -0
  29. {images → assets/img}/payment-methods/multibanco.svg +0 -0
  30. {images → assets/img}/payment-methods/p24.svg +0 -0
  31. {images → assets/img}/payment-methods/sepa.svg +0 -0
  32. {images → assets/img}/payment-methods/sofort.svg +0 -0
  33. {images → assets/img}/payment-methods/unionpay.svg +0 -0
  34. {images → assets/img}/payment-methods/visa.svg +0 -0
  35. {images → assets/img}/payment-methods/wechat.svg +0 -0
  36. {images/previews → assets/img}/pennant.jpg +0 -0
  37. assets/img/single-product-preview.svg +5 -0
  38. assets/js/atomic/blocks/product-elements/add-to-cart/frontend.js +2 -1
  39. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js +2 -4
  40. assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss +2 -2
  41. assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js +5 -29
  42. assets/js/atomic/blocks/product-elements/button/block.js +16 -14
  43. assets/js/atomic/blocks/product-elements/button/style.scss +0 -10
  44. assets/js/atomic/blocks/product-elements/image/block.js +51 -48
  45. assets/js/atomic/blocks/product-elements/image/frontend.js +2 -1
  46. assets/js/atomic/blocks/product-elements/image/test/block.test.js +0 -139
  47. assets/js/atomic/blocks/product-elements/price/block.js +1 -1
  48. assets/js/atomic/blocks/product-elements/rating/block.js +2 -1
  49. assets/js/atomic/blocks/product-elements/shared/editor.scss +1 -1
  50. assets/js/atomic/blocks/product-elements/shared/with-product-selector.js +4 -4
  51. assets/js/atomic/blocks/product-elements/stock-indicator/style.scss +3 -3
  52. assets/js/atomic/blocks/product-elements/summary/block.js +4 -2
  53. assets/js/atomic/blocks/product-elements/title/block.js +30 -21
  54. assets/js/atomic/blocks/product-elements/title/frontend.js +2 -1
  55. assets/js/atomic/utils/index.js +5 -4
  56. assets/js/atomic/utils/render-inner-blocks.js +69 -0
  57. assets/js/atomic/utils/render-parent-block.js +41 -0
  58. assets/js/atomic/utils/render-parent-block.tsx +0 -126
  59. assets/js/base/components/block-error-boundary/block-error.js +2 -12
  60. assets/js/base/components/block-error-boundary/index.js +3 -13
  61. assets/js/base/components/block-error-boundary/style.scss +18 -16
  62. assets/js/base/components/button/index.js +55 -0
  63. assets/js/base/components/button/index.tsx +0 -48
  64. assets/js/base/components/button/style.scss +41 -3
  65. assets/js/base/components/cart-checkout/address-form/country-address-fields.js +546 -0
  66. assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} +23 -73
  67. assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} +29 -54
  68. assets/js/base/components/cart-checkout/address-form/index.ts +0 -1
  69. assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts +0 -131
  70. assets/js/base/components/cart-checkout/address-form/test/index.js +0 -178
  71. assets/js/base/components/cart-checkout/form-step/index.js +0 -1
  72. assets/js/base/components/cart-checkout/form-step/style.scss +10 -16
  73. assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap +1 -1
  74. assets/js/base/components/cart-checkout/index.js +4 -4
  75. assets/js/base/components/cart-checkout/order-summary/index.js +1 -2
  76. assets/js/base/components/cart-checkout/order-summary/order-summary-item.js +20 -104
  77. assets/js/base/components/cart-checkout/order-summary/style.scss +12 -29
  78. assets/js/base/components/cart-checkout/order-summary/test/index.js +0 -43
  79. assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js +20 -20
  80. assets/js/base/components/cart-checkout/place-order-button/index.js +2 -6
  81. assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} +1 -1
  82. assets/js/base/components/cart-checkout/policies/style.scss +1 -1
  83. assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} +1 -1
  84. assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} +6 -9
  85. assets/js/base/components/cart-checkout/product-details/index.tsx +0 -60
  86. assets/js/base/components/cart-checkout/product-details/style.scss +0 -25
  87. assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap +0 -76
  88. assets/js/base/components/cart-checkout/product-details/test/index.js +0 -57
  89. assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} +10 -5
  90. assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} +7 -7
  91. assets/js/base/components/cart-checkout/product-metadata/index.js +39 -0
  92. assets/js/base/components/cart-checkout/product-metadata/index.tsx +0 -45
  93. assets/js/base/components/cart-checkout/product-metadata/style.scss +1 -1
  94. assets/js/base/components/cart-checkout/product-name/index.js +32 -0
  95. assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss +2 -0
  96. assets/js/base/components/cart-checkout/product-sale-badge/index.js +50 -0
  97. assets/js/base/components/cart-checkout/product-sale-badge/index.tsx +0 -62
  98. assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js} +10 -8
  99. assets/js/base/components/cart-checkout/product-variation-data/index.js +53 -0
  100. assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} +30 -8
  101. assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} +8 -10
  102. assets/js/base/components/cart-checkout/shipping-location/index.js +67 -0
  103. assets/js/base/components/cart-checkout/shipping-location/index.tsx +0 -70
  104. assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx +0 -152
  105. assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx +0 -69
  106. assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx +0 -46
  107. assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss +0 -43
  108. assets/js/base/components/cart-checkout/shipping-rates-control/index.js +113 -0
  109. assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx +0 -187
  110. assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js +71 -0
  111. assets/js/base/components/cart-checkout/shipping-rates-control/package.js +126 -0
  112. assets/js/base/components/cart-checkout/shipping-rates-control/packages.js +71 -0
  113. assets/js/base/components/cart-checkout/shipping-rates-control/style.scss +35 -0
  114. assets/js/base/components/cart-checkout/totals/discount/stories/index.js +0 -37
  115. assets/js/base/components/cart-checkout/totals/discount/style.scss +0 -9
  116. assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js +0 -32
  117. assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap +0 -79
  118. assets/js/base/components/cart-checkout/totals/footer-item/test/index.js +0 -81
  119. assets/js/base/components/cart-checkout/totals/index.js +8 -4
  120. assets/js/base/components/cart-checkout/totals/shipping/index.tsx +0 -215
  121. assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js +0 -48
  122. assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx +0 -17
  123. assets/js/base/components/cart-checkout/totals/shipping/stories/index.js +0 -35
  124. assets/js/base/components/cart-checkout/totals/subtotals-item/index.js +39 -0
  125. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js +11 -11
  126. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js +4 -5
  127. assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss +8 -18
  128. assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js +35 -51
  129. assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss +5 -0
  130. assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js +50 -0
  131. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js +6 -27
  132. assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss +1 -1
  133. assets/js/base/components/cart-checkout/totals/totals-item/index.js +52 -0
  134. {packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss +2 -6
  135. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js +0 -0
  136. assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js +155 -0
  137. assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js +65 -0
  138. assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss +11 -9
  139. assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js +57 -0
  140. assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss +3 -0
  141. assets/js/base/components/checkbox-control/stories/index.js +0 -27
  142. assets/js/base/components/checkbox-control/style.scss +15 -45
  143. assets/js/base/components/checkbox-list/index.js +5 -6
  144. assets/js/base/components/chip/removable-chip.js +1 -1
  145. assets/js/base/components/chip/stories/index.js +0 -42
  146. assets/js/base/components/chip/style.scss +4 -4
  147. assets/js/base/components/chip/test/__snapshots__/index.js.snap +12 -12
  148. assets/js/base/components/country-input/CountryInputProps.ts +0 -15
  149. assets/js/base/components/country-input/billing-country-input.js +23 -0
  150. assets/js/base/components/country-input/billing-country-input.tsx +0 -16
  151. assets/js/base/components/country-input/{country-input.tsx → country-input.js} +14 -2
  152. assets/js/base/components/country-input/{index.ts → index.js} +0 -0
  153. assets/js/base/components/country-input/shipping-country-input.js +23 -0
  154. assets/js/base/components/country-input/shipping-country-input.tsx +0 -16
  155. assets/js/base/components/country-input/stories/index.js +1 -1
  156. assets/js/base/components/dropdown-selector/index.js +1 -1
  157. assets/js/base/components/dropdown-selector/menu.js +1 -1
  158. assets/js/base/components/dropdown-selector/selected-chip.js +1 -1
  159. assets/js/base/components/dropdown-selector/style.scss +4 -4
  160. assets/js/base/components/filter-submit-button/index.js +1 -1
  161. assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} +20 -33
  162. assets/js/base/components/label/{index.tsx → index.js} +15 -10
  163. assets/js/base/components/loading-mask/index.js +17 -16
  164. assets/js/base/components/loading-mask/style.scss +3 -4
  165. packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js +15 -16
  166. assets/js/base/components/panel/style.scss +50 -0
  167. assets/js/base/components/payment-methods/express-payment-methods.js +86 -0
  168. assets/js/base/components/payment-methods/express-payment/cart-express-payment.js +47 -0
  169. assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js +78 -0
  170. assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js +0 -0
  171. assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss +0 -0
  172. assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js +0 -0
  173. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js +1 -1
  174. assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss +1 -1
  175. assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js +2 -2
  176. assets/js/base/components/payment-methods/payment-method-options.js +87 -0
  177. assets/js/{blocks/cart-checkout/payment-methods/payment-method-card.js → base/components/payment-methods/payment-method-tab.js} +10 -10
  178. assets/js/base/components/payment-methods/payment-methods.js +43 -0
  179. assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js +45 -51
  180. assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss +19 -80
  181. assets/js/base/components/payment-methods/test/payment-methods.js +112 -0
  182. assets/js/base/components/price-slider/constrain-range-slider-values.js +2 -2
  183. assets/js/base/components/price-slider/index.js +17 -17
  184. assets/js/base/components/price-slider/style.scss +181 -251
  185. assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js +0 -0
  186. assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js +0 -0
  187. assets/js/base/components/product-list/container.js +2 -7
  188. assets/js/base/components/product-list/index.js +236 -2
  189. assets/js/base/components/product-list/product-list.js +0 -262
  190. assets/js/base/components/product-list/style.scss +6 -21
  191. assets/js/base/components/product-name/index.tsx +0 -48
  192. assets/js/base/components/product-name/stories/index.js +0 -26
  193. assets/js/base/components/product-name/test/__snapshots__/index.js.snap +0 -49
  194. assets/js/base/components/product-name/test/index.js +0 -48
  195. assets/js/base/components/product-price/index.js +53 -71
  196. assets/js/base/components/product-price/stories/index.js +32 -7
  197. assets/js/base/components/product-price/test/__snapshots__/index.js.snap +0 -57
  198. assets/js/base/components/product-price/test/index.js +0 -63
  199. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js +0 -0
  200. assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss +0 -0
  201. assets/js/base/components/quantity-selector/{index.tsx → index.js} +17 -19
  202. assets/js/base/components/quantity-selector/style.scss +11 -25
  203. assets/js/base/components/radio-control-accordion/index.js +0 -73
  204. assets/js/base/components/radio-control/_mixin.scss +114 -0
  205. assets/js/base/components/radio-control/index.js +1 -1
  206. assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} +5 -11
  207. assets/js/base/components/radio-control/option.js +1 -6
  208. assets/js/base/components/radio-control/style.scss +3 -114
  209. assets/js/base/components/read-more/test/index.js +3 -3
  210. assets/js/base/components/reviews/review-list-item/index.js +10 -7
  211. assets/js/base/components/reviews/review-list/index.js +6 -5
  212. assets/js/base/components/select/index.js +60 -1
  213. assets/js/base/components/select/select.js +0 -60
  214. assets/js/base/components/select/style.scss +7 -49
  215. assets/js/base/components/select/validated.js +10 -15
  216. assets/js/base/components/sidebar-layout/style.scss +7 -12
  217. assets/js/base/components/spinner/index.tsx +0 -10
  218. assets/js/base/components/spinner/style.scss +0 -37
  219. assets/js/base/components/state-input/StateInputProps.ts +0 -15
  220. assets/js/base/components/state-input/billing-state-input.js +23 -0
  221. assets/js/base/components/state-input/billing-state-input.tsx +0 -16
  222. assets/js/base/components/state-input/{index.ts → index.js} +0 -0
  223. assets/js/base/components/state-input/shipping-state-input.js +23 -0
  224. assets/js/base/components/state-input/shipping-state-input.tsx +0 -16
  225. assets/js/base/components/state-input/{state-input.tsx → state-input.js} +20 -4
  226. assets/js/base/components/store-notices-container/index.js +2 -0
  227. assets/js/base/components/store-notices-container/snackbar-notices.js +29 -0
  228. assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js +3 -1
  229. assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss +24 -3
  230. assets/js/base/components/summary/{index.tsx → index.js} +1 -8
  231. assets/js/base/components/text-input/debounced-validated.js +35 -0
  232. assets/js/base/components/text-input/{text-input.tsx → index.js} +23 -26
  233. assets/js/base/components/text-input/index.ts +0 -2
  234. assets/js/base/components/text-input/style.scss +4 -24
  235. assets/js/base/components/text-input/validated-text-input.tsx +0 -166
  236. assets/js/base/components/text-input/validated.js +117 -0
  237. assets/js/base/components/textarea/style.scss +0 -7
  238. assets/js/base/components/title/index.js +1 -1
  239. assets/js/base/components/title/style.scss +0 -2
  240. assets/js/base/{context/providers/validation/components → components/validation}/index.js +0 -0
  241. assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss +1 -1
  242. assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} +2 -5
  243. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js +0 -0
  244. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js +0 -0
  245. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js +9 -3
  246. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js +34 -37
  247. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js +0 -0
  248. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js +5 -1
  249. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js +7 -8
  250. assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js +0 -0
  251. assets/js/base/context/cart-checkout/billing/constants.js +50 -0
  252. assets/js/base/context/cart-checkout/billing/index.js +51 -0
  253. assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js +10 -4
  254. assets/js/base/context/cart-checkout/checkout-state/actions.js +77 -0
  255. assets/js/base/context/cart-checkout/checkout-state/constants.js +50 -0
  256. assets/js/base/context/cart-checkout/checkout-state/event-emit.js +53 -0
  257. assets/js/base/context/cart-checkout/checkout-state/index.js +345 -0
  258. assets/js/base/context/cart-checkout/checkout-state/reducer.js +222 -0
  259. assets/js/base/context/cart-checkout/checkout/index.js +34 -0
  260. assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js +67 -68
  261. assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js +1 -1
  262. assets/js/base/context/cart-checkout/payment-methods/actions.js +115 -0
  263. assets/js/base/context/cart-checkout/payment-methods/constants.js +80 -0
  264. assets/js/base/context/cart-checkout/payment-methods/event-emit.js +41 -0
  265. assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js} +0 -0
  266. assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js +461 -0
  267. assets/js/base/context/cart-checkout/payment-methods/reducer.js +134 -0
  268. assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js +56 -62
  269. assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js} +48 -79
  270. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js +3 -2
  271. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js +3 -3
  272. assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js +82 -52
  273. assets/js/base/context/{providers/container-width-context.js → container-width-context.js} +0 -0
  274. assets/js/base/context/{providers/editor-context.js → editor/index.js} +1 -13
  275. assets/js/base/context/event-emit/emitter-callback.ts +0 -16
  276. assets/js/base/context/event-emit/reducer.ts +0 -65
  277. assets/js/base/context/event-emit/types.ts +0 -18
  278. assets/js/base/context/event-emit/utils.ts +0 -15
  279. assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts +0 -146
  280. assets/js/base/context/hooks/cart/use-store-cart.ts +0 -223
  281. assets/js/base/context/hooks/collections/index.js +0 -3
  282. assets/js/base/context/hooks/index.js +0 -14
  283. assets/js/base/context/hooks/payment-methods/use-payment-methods.js +0 -35
  284. assets/js/base/context/hooks/payment-methods/utils.ts +0 -85
  285. assets/js/base/context/hooks/shipping/index.js +0 -2
  286. assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts +0 -81
  287. assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts +0 -55
  288. assets/js/base/context/hooks/test/use-store-snackbar-notices.js +0 -51
  289. assets/js/base/context/hooks/use-checkout-address.js +0 -130
  290. assets/js/base/context/hooks/use-checkout-notices.js +0 -57
  291. assets/js/base/context/hooks/use-checkout-submit.js +0 -47
  292. assets/js/base/context/hooks/use-customer-data.ts +0 -181
  293. assets/js/base/context/hooks/use-emit-response.ts +0 -66
  294. assets/js/base/context/hooks/use-store-events.ts +0 -66
  295. assets/js/{base/context/hooks/use-store-snackbar-notices.js → b} +0 -0
.prettierrc.js DELETED
@@ -1,3 +0,0 @@
1
- // Import the default config file and expose it in the project root.
2
- // Useful for editor integrations.
3
- module.exports = require( '@wordpress/prettier-config' );
 
 
 
LICENSE DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <https://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <https://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <https://www.gnu.org/licenses/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/css/abstracts/_breakpoints.scss CHANGED
@@ -8,8 +8,6 @@
8
  // See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
9
  $breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
10
 
11
- // @todo refactor breakpoints so they use the mixins from Gutenberg
12
- // https://github.com/WordPress/gutenberg/blob/master/packages/base-styles/_mixins.scss
13
  @mixin breakpoint( $sizes... ) {
14
  @each $size in $sizes {
15
  @if type-of( $size ) == string {
8
  // See https://github.com/WordPress/gutenberg/tree/master/packages/viewport#usage
9
  $breakpoints: 480px, 600px, 782px, 960px, 1280px, 1440px;
10
 
 
 
11
  @mixin breakpoint( $sizes... ) {
12
  @each $size in $sizes {
13
  @if type-of( $size ) == string {
assets/css/abstracts/_colors.scss CHANGED
@@ -1,14 +1,56 @@
1
- @import "node_modules/@wordpress/base-styles/colors";
2
- @import "node_modules/@automattic/color-studio/dist/color-variables";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  // Bright colors
5
- $no-stock-color: $alert-red;
6
- $low-stock-color: $alert-yellow;
7
- $in-stock-color: $alert-green;
8
- $discount-color: $alert-green;
 
 
 
 
 
 
 
9
 
10
- $placeholder-color: var(--global--color-primary, $gray-200);
11
- $input-border-gray: #50575e;
12
  $input-border-dark: rgba(255, 255, 255, 0.4);
13
  $input-disabled-dark: rgba(255, 255, 255, 0.3);
14
  $controls-border-dark: rgba(255, 255, 255, 0.6);
@@ -19,3 +61,4 @@ $input-background-dark: rgba(0, 0, 0, 0.1);
19
  $select-dropdown-dark: #1e1e1e;
20
  $select-dropdown-light: #fff;
21
  $select-item-dark: rgba(0, 0, 0, 0.4);
 
1
+ // Greys
2
+ $core-grey-light-100: #f8f9f9;
3
+ $core-grey-light-200: #f3f4f5;
4
+ $core-grey-light-300: #edeff0;
5
+ $core-grey-light-400: #e8eaeb;
6
+ $core-grey-light-500: #e2e4e7;
7
+ $core-grey-light-600: #d7dade;
8
+ $core-grey-light-700: #ccd0d4;
9
+ $core-grey-light-800: #b5bcc2;
10
+ $core-grey-light-900: #a2aab2;
11
+ $core-grey-dark-100: #86909b;
12
+ $core-grey-dark-200: #78848f;
13
+ $core-grey-dark-300: #6c7781; // This & below have 4.5+ contrast against white
14
+ $core-grey-dark-400: #606a73;
15
+ $core-grey-dark-500: #555d66;
16
+ $core-grey-dark-600: #40464d;
17
+ $core-grey-dark-700: #32373c;
18
+ $core-grey-dark-800: #23282d;
19
+ $core-grey-dark-900: #191e23;
20
+
21
+ $gray-text: $core-grey-dark-500;
22
+
23
+ // WooCommerce Purples
24
+ $woocommerce-100: #ffd7ff;
25
+ $woocommerce-200: #e2a5d7;
26
+ $woocommerce-300: #c88bbd;
27
+ $woocommerce-400: #af72a4;
28
+ $woocommerce-500: #95588a;
29
+ $woocommerce-600: #7c3f71;
30
+ $woocommerce-700: #622557;
31
+ $woocommerce-800: #490c3e;
32
+ $woocommerce-900: #2f0024;
33
+ $woocommerce: $woocommerce-500;
34
+
35
+ $wp-admin-background: #f1f1f1;
36
+ $black: #24292d; // same as wp-admin sidebar
37
+
38
+ $white: #fff;
39
 
40
  // Bright colors
41
+ $valid-green: #4ab866;
42
+ $notice-yellow: #ffb900;
43
+ $error-red: #d94f4f;
44
+ $box-shadow-blue: #5b9dd9;
45
+ $core-orange: #ca4a1f;
46
+
47
+ $gray-10: #c3c4c7;
48
+ $gray-20: #a7aaad;
49
+ $gray-50: #646970;
50
+ $gray-60: #50575e;
51
+ $gray-80: #2c3338;
52
 
53
+ $input-border-gray: #8d96a0;
 
54
  $input-border-dark: rgba(255, 255, 255, 0.4);
55
  $input-disabled-dark: rgba(255, 255, 255, 0.3);
56
  $controls-border-dark: rgba(255, 255, 255, 0.6);
61
  $select-dropdown-dark: #1e1e1e;
62
  $select-dropdown-light: #fff;
63
  $select-item-dark: rgba(0, 0, 0, 0.4);
64
+
assets/css/abstracts/_mixins.scss CHANGED
@@ -26,13 +26,11 @@ $fontSizes: (
26
  // Adds animation to placeholder section
27
  @mixin placeholder() {
28
  animation: loading-fade 1.2s ease-in-out infinite;
29
- background-color: $placeholder-color !important;
30
- color: $placeholder-color !important;
31
- outline: 0 !important;
32
- border: 0 !important;
33
  box-shadow: none;
34
  pointer-events: none;
35
- max-width: 100%;
36
 
37
  // Forces direct descendants to keep layout but lose visibility.
38
  > * {
@@ -52,7 +50,6 @@ $fontSizes: (
52
 
53
  // Hide an element from sighted users, but available to screen reader users.
54
  @mixin visually-hidden() {
55
- border: 0;
56
  clip: rect(1px, 1px, 1px, 1px);
57
  clip-path: inset(50%);
58
  height: 1px;
@@ -62,29 +59,6 @@ $fontSizes: (
62
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
63
  overflow-wrap: normal !important;
64
  word-wrap: normal !important;
65
- padding: 0;
66
- position: absolute !important;
67
- width: 1px;
68
- }
69
-
70
- @mixin visually-hidden-focus-reveal() {
71
- background-color: #fff;
72
- border-radius: 3px;
73
- box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6);
74
- clip: auto !important;
75
- clip-path: none;
76
- color: $input-text-active;
77
- display: block;
78
- font-size: 0.875rem;
79
- font-weight: 700;
80
- height: auto;
81
- left: 5px;
82
- line-height: normal;
83
- padding: 15px 23px 14px;
84
- text-decoration: none;
85
- top: 5px;
86
- width: auto;
87
- z-index: 100000;
88
  }
89
 
90
  @mixin reset-box() {
@@ -124,7 +98,6 @@ $fontSizes: (
124
  background: transparent;
125
  box-shadow: none;
126
  display: inline;
127
- text-shadow: none;
128
 
129
  &:hover,
130
  &:focus,
@@ -170,24 +143,7 @@ $fontSizes: (
170
  }
171
  }
172
 
173
- // Wraps the content with a media query specially targeting IE11.
174
- @mixin ie11() {
175
- @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
176
- @content;
177
- }
178
- }
179
-
180
  // Converts a px unit to em.
181
  @function em($size, $base: 16px) {
182
  @return $size / $base * 1em;
183
  }
184
-
185
- // Encodes hex colors so they can be used in URL content.
186
- @function encode-color($color) {
187
- @if type-of($color) != "color" or str-index(#{$color}, "#") != 1 {
188
- @return $color;
189
- }
190
-
191
- $hex: str-slice(ie-hex-str($color), 4);
192
- @return "%23" + unquote("#{$hex}");
193
- }
26
  // Adds animation to placeholder section
27
  @mixin placeholder() {
28
  animation: loading-fade 1.2s ease-in-out infinite;
29
+ background-color: $core-grey-light-500 !important;
30
+ border-color: $core-grey-light-500 !important;
31
+ color: $core-grey-light-500 !important;
 
32
  box-shadow: none;
33
  pointer-events: none;
 
34
 
35
  // Forces direct descendants to keep layout but lose visibility.
36
  > * {
50
 
51
  // Hide an element from sighted users, but available to screen reader users.
52
  @mixin visually-hidden() {
 
53
  clip: rect(1px, 1px, 1px, 1px);
54
  clip-path: inset(50%);
55
  height: 1px;
59
  /* Many screen reader and browser combinations announce broken words as they would appear visually. */
60
  overflow-wrap: normal !important;
61
  word-wrap: normal !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  }
63
 
64
  @mixin reset-box() {
98
  background: transparent;
99
  box-shadow: none;
100
  display: inline;
 
101
 
102
  &:hover,
103
  &:focus,
143
  }
144
  }
145
 
 
 
 
 
 
 
 
146
  // Converts a px unit to em.
147
  @function em($size, $base: 16px) {
148
  @return $size / $base * 1em;
149
  }
 
 
 
 
 
 
 
 
 
 
assets/css/abstracts/_variables.scss CHANGED
@@ -1,12 +1,22 @@
1
- @import "node_modules/@wordpress/base-styles/variables";
 
 
 
 
 
 
2
 
3
- $gap-largest: $grid-unit-50;
4
- $gap-larger: 4.5 * $grid-unit;
5
- $gap-large: $grid-unit-30;
6
- $gap: $grid-unit-20;
7
- $gap-small: $grid-unit-15;
8
- $gap-smaller: $grid-unit-10;
9
- $gap-smallest: $grid-unit-05;
 
 
 
 
10
 
11
  // Cart block
12
  $cart-image-width: 5rem;
1
+ $gap-largest: 40px;
2
+ $gap-larger: 36px;
3
+ $gap-large: 24px;
4
+ $gap: 16px;
5
+ $gap-small: 12px;
6
+ $gap-smaller: 8px;
7
+ $gap-smallest: 4px;
8
 
9
+ // Variables pulled from Gutenberg.
10
+ // Editor Widths
11
+ $sidebar-width: 280px;
12
+ $content-width: 610px; // For the visual width, subtract 30px (2 * $block-padding + 2px borders). This comes to 580px, which is optimized for 70 characters.
13
+
14
+ // Blocks
15
+ $block-padding: 14px; // Space between block footprint and focus boundaries. These are drawn outside the block footprint, and do not affect the size.
16
+ $block-spacing: 4px; // Vertical space between blocks.
17
+ $block-side-ui-width: 28px; // Width of the movers/drag handle UI.
18
+ $block-side-ui-clearance: 2px; // Space between movers/drag handle UI, and block.
19
+ $block-container-side-padding: $block-side-ui-width + $block-padding + 2 * $block-side-ui-clearance; // Total space left and right of the block footprint.
20
 
21
  // Cart block
22
  $cart-image-width: 5rem;
assets/css/editor.scss CHANGED
@@ -19,7 +19,6 @@
19
  .wc-block-grid__products {
20
  list-style: none;
21
  margin: 0 (-$gap/2) $gap;
22
- padding: 0;
23
 
24
  .wc-block-grid__product {
25
  margin: 0 0 $gap-large 0;
@@ -48,15 +47,16 @@
48
  }
49
  }
50
 
51
- // Selectors with extra specificity to override some editor styles.
52
- .woocommerce-search-list__list.woocommerce-search-list__list {
53
- box-sizing: border-box;
54
- margin: 0;
55
- padding: 0;
56
  }
57
 
58
- .woocommerce-search-list__selected.woocommerce-search-list__selected > ul {
59
- list-style: none;
60
- margin: 0;
61
- padding: 0;
 
 
 
62
  }
19
  .wc-block-grid__products {
20
  list-style: none;
21
  margin: 0 (-$gap/2) $gap;
 
22
 
23
  .wc-block-grid__product {
24
  margin: 0 0 $gap-large 0;
47
  }
48
  }
49
 
50
+ // Adds border to placeholder lists, so they can be distinguished from the white background.
51
+ .components-placeholder .woocommerce-search-list__list {
52
+ border: 1px solid $core-grey-light-500;
 
 
53
  }
54
 
55
+ // Work-around to make the SearchList component work fine with the last versions of @wordpress/components.
56
+ // Ideally it should be possible to remove this once this issue is fixed in WC Admin:
57
+ // https://github.com/woocommerce/woocommerce-admin/issues/4349
58
+ .components-placeholder .woocommerce-search-list__list .woocommerce-search-list__item {
59
+ border-radius: 0;
60
+ height: auto;
61
+ text-align: left;
62
  }
assets/css/style.scss CHANGED
@@ -21,7 +21,6 @@
21
  }
22
 
23
  img {
24
- height: auto;
25
  width: 100%;
26
 
27
  &[hidden] {
@@ -47,56 +46,38 @@
47
  margin-right: 0.5em;
48
  }
49
  }
50
- .wc-block-grid__product-add-to-cart.wp-block-button {
51
  word-break: break-word;
52
  white-space: normal;
53
- .wp-block-button__link {
 
54
  word-break: break-word;
55
  white-space: normal;
56
  margin: 0 auto !important;
57
  display: inline-flex;
58
  justify-content: center;
59
- text-align: center;
60
- // Set button font size and padding so it inherits from parent.
61
- padding: 0.5em 1em;
62
- font-size: 1em;
63
 
64
  &.loading {
65
  opacity: 0.25;
66
  }
67
 
 
 
 
 
 
68
  &.added::after {
69
  font-family: WooCommerce; /* stylelint-disable-line */
70
  content: "\e017";
71
- margin-left: 0.5em;
72
- display: inline-block;
73
- width: auto;
74
- height: auto;
75
  }
76
 
77
  &.loading::after {
78
  font-family: WooCommerce; /* stylelint-disable-line */
79
  content: "\e031";
80
  animation: spin 2s linear infinite;
81
- margin-left: 0.5em;
82
- display: inline-block;
83
- width: auto;
84
- height: auto;
85
  }
86
  }
87
  }
88
- // Remove button sugar if unlikely to fit.
89
- .has-5-columns:not(.alignfull),
90
- .has-6-columns,
91
- .has-7-columns,
92
- .has-8-columns,
93
- .has-9-columns {
94
- .wc-block-grid__product-add-to-cart.wp-block-button .wp-block-button__link::after {
95
- content: "";
96
- margin: 0;
97
- }
98
- }
99
-
100
  .wc-block-grid__product-rating {
101
  display: block;
102
 
@@ -201,9 +182,6 @@
201
  .wc-block-components-product-sale-badge {
202
  line-height: 1;
203
  }
204
- .editor-styles-wrapper .wp-block-button .wp-block-button__link:not(.has-text-color) {
205
- color: #fff;
206
- }
207
  }
208
 
209
  .theme-twentytwenty {
@@ -307,11 +285,3 @@
307
  }
308
  }
309
  }
310
-
311
- // Default screen-reader styles. Included as a fallback for themes that don't have support.
312
- .screen-reader-text {
313
- @include visually-hidden();
314
- }
315
- .screen-reader-text:focus {
316
- @include visually-hidden-focus-reveal();
317
- }
21
  }
22
 
23
  img {
 
24
  width: 100%;
25
 
26
  &[hidden] {
46
  margin-right: 0.5em;
47
  }
48
  }
49
+ .wc-block-grid__product-add-to-cart {
50
  word-break: break-word;
51
  white-space: normal;
52
+ a,
53
+ button {
54
  word-break: break-word;
55
  white-space: normal;
56
  margin: 0 auto !important;
57
  display: inline-flex;
58
  justify-content: center;
 
 
 
 
59
 
60
  &.loading {
61
  opacity: 0.25;
62
  }
63
 
64
+ &::after {
65
+ margin-left: 0.5em;
66
+ display: inline-block;
67
+ }
68
+
69
  &.added::after {
70
  font-family: WooCommerce; /* stylelint-disable-line */
71
  content: "\e017";
 
 
 
 
72
  }
73
 
74
  &.loading::after {
75
  font-family: WooCommerce; /* stylelint-disable-line */
76
  content: "\e031";
77
  animation: spin 2s linear infinite;
 
 
 
 
78
  }
79
  }
80
  }
 
 
 
 
 
 
 
 
 
 
 
 
81
  .wc-block-grid__product-rating {
82
  display: block;
83
 
182
  .wc-block-components-product-sale-badge {
183
  line-height: 1;
184
  }
 
 
 
185
  }
186
 
187
  .theme-twentytwenty {
285
  }
286
  }
287
  }
 
 
 
 
 
 
 
 
assets/img/avatar.jpg ADDED
Binary file
{images/previews → assets/img}/beanie.jpg RENAMED
File without changes
assets/img/block-error.svg ADDED
@@ -0,0 +1,2727 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg
2
+ width="208.5"
3
+ height="92"
4
+ viewBox="0 0 834 368"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <g>
8
+ <g>
9
+ <path
10
+ fill="#DCDDDE"
11
+ d="M77.3,290.2h0.3l0.3,0.1l0.2,0.1l0.4,0.1h0.1l0.4,0.2h0.1l0.2,0.2l0.3,0.2l0,0l0.3,0.3l0.2,0.3l0,0h0.4l2,0.1
12
+ l2,0.1l2.1,0.2l1.1,0.1l1.1,0.1l1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1,0.1l1.1,0.2l1,0.2l1,0.2l1,0.2l0.9,0.2
13
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2
14
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.2h0.2h1.4h0.6l0,0
15
+ l-0.2-0.3v-0.1l-0.2-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1l-0.1-0.4v-0.1l0.1-0.3v-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.2
16
+ l0.1-0.2l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
17
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1h0.4h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.7,0.1l0.7,0.1l0.7,0.1
18
+ h0.3h0.3h0.3h0.2h0.2h0.2h0.3h0.4h0.8h0.8l0.9-0.1l0.9-0.1l1-0.1l2.2-0.2l2.3-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.3-0.1
19
+ l1.2-0.1l1.3-0.1h1.2h0.7h0.7h0.7h0.6h0.7h0.6h0.7h0.6h0.7h0.6h0.6l0.6,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1l0.6,0.1l0.5,0.1
20
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2
21
+ l0.1,0.1l0.2,0.2v0.1l0.2,0.3l0,0l0.2,0.5l0,0l0.1,0.5l0,0l0.1,0.6l0,0l-0.1,0.6l0,0l-0.2,0.5h-0.1l-0.2,0.4h-0.1l-0.1,0.1
22
+ l1.9,0.3l2.3,0.4l2.2,0.4h1.1l2.5,0.1l2.2,0.1l0.7-0.1l0.6-0.1l0.5-0.1h0.5h0.5h0.6h0.6h0.6h0.6h0.6h0.6h1.1h1.1h1.1h1.1h1.1h5.2
23
+ h0.4l4-0.2l2-0.1l2-0.1l1.2-0.1l0.1-0.2l0.4-0.4l0.5-0.3l0,0l0.3-0.1l0.4-0.1l0,0l0.4-0.1h0.2h0.4h0.4h2.4h2.4h2.4h2.4h4.8
24
+ l4.8,0.1l9.5,0.1l4.8,0.1l4.7,0.1h4.8h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4h2.4l2.4-0.1l2.4-0.1l2.4-0.1l2.4-0.1h1.2h1.2h1.2h1.2
25
+ h1.2h1.2h1.2h1.2h2.5h2.4h2.4h1.2h1.2h0.2h0.2h0.5h0.5l0.5-0.1l0.7-0.1l0.7-0.1l1.4-0.2l1.4-0.2l0.8-0.1l0.7-0.1l0.8-0.1l0.7-0.1
26
+ l0.8-0.1h0.7h0.7h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.1
27
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.2v0.2
28
+ v0.2v0.2l-0.1,0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
29
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.1,0.1h0.1l0.5,0.1l0.2,0.1l0.3,0.1l0.2,0.1h0.1h0.2l0.7-0.1
30
+ l0.7-0.1l0.7-0.1l1.5-0.2l1.6-0.2l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1h0.1l0,0l0.2-0.4l0.4-0.4l0,0l0.3-0.2l0.3-0.2l0,0l0.4-0.2
31
+ h0.1l0.4-0.1h0.1l0.3-0.1h0.2h0.4h0.4h0.4h0.4h0.4h0.4h0.7l0.8,0.1l0.8,0.1l1.6,0.1l0.8,0.1h0.7h0.6h0.2h0.2h1.4h1.5h2.9h1.4h1.4
32
+ h0.7h0.7h0.7h0.7l1.9-0.1l1.9-0.1l1.8-0.1l1.9-0.1l1.9-0.1l1.9-0.1l3.8-0.3l3.7-0.3l2-0.1l1.9-0.1l1.9-0.1l1.9-0.1l2-0.1l1.9-0.1
33
+ h0.7h0.7h1.4h1.4h1.4h2.7h1.3h1.3h0.5h0.5h0.6h0.7l1.5-0.1l1.4-0.1h0.7h0.7h0.5h0.2h0.3h0.2h0.3h0.1l0.5,0.1h0.1l0.3,0.1l0.3,0.2
34
+ l0,0l0.5,0.4l0.4,0.5l0,0l0.2,0.5l0.2,0.5v0.5v0.5l0,0l-0.2,0.5L404,306l-0.2,0.4h-0.1l-0.2,0.3l-0.3,0.2l0,0l-0.5,0.3h-0.1
35
+ l-0.3,0.1l-0.2,0.1l-0.3,0.1l-1.3,0.4l-1.2,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3l-1.3,0.3l-1.4,0.3
36
+ l-2.6,0.5l-5,1l-3.5,0.7h-0.2l2-0.1l2.1-0.1l2.1-0.1l2-0.1h1.8h1.6h0.8h0.6h0.2h0.6l0.9-0.1l1.1-0.1h0.7h0.7h0.7h0.7h0.8h0.8h0.8
37
+ h0.8h0.8l0.8,0.1l0.8,0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
38
+ l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.4,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3
39
+ l0.1,0.3v0.3l0.1,0.3v0.3l-0.1,0.3v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3
40
+ l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2L407,323l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
41
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.8,0.1l-0.9,0.1
42
+ l-0.9,0.1l-0.9,0.1l-1,0.1h-0.9h-0.9h-1h-1h-1h-1h-1.1h-1h-1.1h-1h-1.1h-1l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.2-0.1v0.1v0.3v0.1
43
+ l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2l-0.3,0.2
44
+ l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.7,0.2
45
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.5,0.1l-1.1,0.1
46
+ l-0.9,0.1l-0.8,0.1l-0.7,0.1h-0.5h-0.6h-0.7h-0.7h-0.8h-0.7h-0.8h-0.8h-0.8h-0.8h-0.9h-0.9H349h-0.9h-0.9h-0.9h-1l-0.9-0.1l-1-0.1
47
+ l-1.1-0.1l-1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
48
+ l-1.1-0.2l-1.1-0.2l-1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
49
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
50
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3
51
+ l-0.3-0.3l-0.3-0.3l-0.1-0.1l-0.6,0.1l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.1,0.1l-1,0.1
52
+ h-0.9h-1h-1.2l-0.1,0.3l0,0l-0.3,0.4l-0.3,0.4l-0.4,0.3l0,0l-0.4,0.2l-0.3,0.2h-0.1l-0.5,0.1h-0.1h-0.4h-0.2h-0.3h-1.5h-1.5h-2.9
53
+ h-3l-2.9-0.1l-2.9-0.1l-2.9-0.1l-5.8-0.2l-5.7-0.2l-2.9-0.1l-2.9-0.1l-2.9-0.1h-2.8h-2.9h-1.4h-1.4h-2.1h-2.1h-2.1h-2.1h-2.1h-1.1
54
+ h-1.1h-1.1H225h-1.1h-1.1h-0.3h-0.3h-0.8h-1.8h-1h-1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
55
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4
56
+ l-0.1-0.1l-0.2-0.4v-0.1l-0.2-0.5v-0.1l-0.1-0.5v-0.1l0.1-0.5v-0.1l0.1-0.4l0.1-0.1l0.1-0.4l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.2
57
+ l0.1-0.2l0.2-0.3l0.2-0.2l0.4-0.4l0.4-0.3l0.3-0.3h-0.2h-0.1l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.7,0.3l-0.8,0.3
58
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-1.6,0.5l-1.7,0.5l-1.6,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.5l-1.7,0.4
59
+ l-1.6,0.4l-1.6,0.4l-1.6,0.4l-2.2,0.6l0.2,0.6l0.1,0.1l0.1,0.4l0.1,0.4v0.1v0.4v0.1l0.1,0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
60
+ l0.1,0.3v0.3l0.1,0.3l-0.1,0.3v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
61
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
62
+ l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H175h-0.4h-0.4h-0.4h-0.4H173h-0.8h-0.8h-0.8
63
+ h-0.8H169h-0.8l-1.5-0.1l-1.5-0.1h-0.7h-0.7h-0.6h-0.6H162h-0.2h-0.2l-6.1,0.5l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2l-3.1,0.2
64
+ l-3.1,0.2l-3.1,0.2l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.6h-1.5h-1.5h-1.5h-1.5h-1.5h-1.5h-0.4
65
+ h-0.4h-0.2l-0.4-0.1h-0.1l-0.5-0.2l0,0l-0.5-0.3l-0.4-0.4l-0.3-0.4l0,0l-0.3-0.6l-0.2-0.6v-0.6l0.1-0.6l0.2-0.6l0,0l0.2-0.4
66
+ l0.3-0.3l0.4-0.3l0,0l0.5-0.3l0,0l0.3-0.1l0.2-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.1l0.9-0.1l1-0.1l2.1-0.3l2.2-0.3l2-0.3l0.9-0.1
67
+ l0.7-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l1.9-0.2l0.9-0.1l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1
68
+ l0.6-0.2l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.1-0.3l-1.2-0.1l-2.2-0.2l-1.1-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1l-1-0.1l-0.9-0.1
69
+ l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1
70
+ l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4l-0.1-0.1l-0.3-0.4l0,0l-0.2-0.3l0,0l-0.2-0.5l0,0l-0.1-0.5l0,0v-0.5l0,0l0.1-0.5
71
+ l0,0l0.2-0.4l0,0l0.2-0.4l0,0l0.3-0.4l0.1-0.1l0.3-0.3h-0.4h-0.7h-0.7h-0.7h-0.3h-0.3h-0.2h-0.3l-0.5-0.1l-0.5-0.1l-0.5-0.1
72
+ l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.4-0.4
73
+ l-0.1-0.1l-0.3-0.5h-0.1l-0.2-0.5l0,0l-0.1-0.4v-0.4l0,0V314l0.1-0.4l0,0l0,0h-0.4l-0.8,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.8
74
+ h-0.7h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-2.7-0.1l-2.5-0.1h-1.2h-1.2h-1.1h-1.1H76.9h-0.2h-0.4h-0.8h-0.9h-0.9h-0.4h-0.4h-0.4h-0.4
75
+ h-0.3h-0.2l-0.4-0.1l-0.4-0.1l0,0l-0.5-0.3l-0.4-0.4l-0.4-0.5l0,0l-0.2-0.5l-0.2-0.6v-0.6l0.1-0.6l0,0l0.2-0.6l0.4-0.5l0.4-0.4
76
+ l0,0l0.4-0.2L71,308h0.1l0.3-0.1h0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.1l0.2-0.1l-0.1-0.1l-0.3-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.6
77
+ l0.1-0.6l0.2-0.5h0.1l0.3-0.5l0.5-0.5l0,0l0.5-0.3H75l0.4-0.2l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l-0.3-0.1
78
+ l-0.5-0.4l-0.5-0.4h-0.1h-0.9h-0.9h-0.9H73h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.7-0.1l-0.5,0.1l-0.6,0.1h-0.5h-0.6h-0.5
79
+ h-0.6H64h-0.5h-0.6h-0.5h-0.6h-0.5h-1.1h-1.1h-1l-1.1-0.1l-1.9-0.1l-1.8-0.1h-0.8h-0.7h-0.7h-0.5h-0.4h-0.9l-2.8,0.1l-3.9,0.2
80
+ l-4.3,0.2l-2.2,0.1l-2.1,0.1l-2,0.1l-1.8,0.1h-0.8h-0.7H28h-0.6h-0.5h-0.5h-0.3h-0.2l-0.4-0.1l0,0l-0.4-0.1l-0.4-0.2l0,0l-0.4-0.3
81
+ L24,300l-0.3-0.4l0,0l-0.2-0.5l-0.1-0.5v-0.1v-0.3l-0.1-0.1v-0.3l0.1-0.1v-0.3l0.1-0.1l0.1-0.3v-0.1l0.1-0.3l0.1-0.1l0.1-0.3
82
+ l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.2l0.2-0.2l0.3-0.2L26,294l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h-0.5h-0.6
83
+ h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
84
+ l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4l-0.1-0.4l0.1-0.4v-0.4l0.1-0.4l0.1-0.3
85
+ l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.3-0.2l0.1-0.1l0.2-0.2
86
+ l0.2-0.1l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.3h0.4h0.3h0.4h0.3h0.4l0.3,0.1l0.4,0.1l0.7,0.1l0.7,0.2l0.7,0.2
87
+ l0.7,0.2l0.7,0.2l0.7,0.2l1.2,0.4l1.2,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.4,0.1h0.2h0.2h0.2h0.2l1.7,0.2l1.7,0.2
88
+ l1.8,0.2l1.8,0.2l3.8,0.5l4,0.5l3.9,0.5l2,0.2l1.8,0.2l1.8,0.2l1.8,0.2l1.7,0.2l1.5,0.1h0.4h0.7h0.5l0.5-0.1l1-0.2l1-0.2l1-0.2
89
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1h0.5h0.4h0.4h0.4L77.3,290.2z M330.2,321.8l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
90
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8H316h-0.7h-0.7h-0.7h-0.1
91
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
92
+ l0.5,0.1l0.4,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.9,0.2l1,0.2l0.9,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.1l1,0.1
93
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1h0.9h0.9h0.9h0.9h0.9h0.8h0.8h0.8h0.8h0.8h0.8h0.7h0.7h0.6h0.7h0.5
94
+ h0.4l0.5-0.1l0.8-0.1l0.9-0.1l1-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.2
95
+ l0.5-0.2l0.5-0.2l0.2-0.1h-0.1l-0.3-0.1l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.7-0.2l-0.5-0.1h-0.1H363l-0.4-0.1l-0.5-0.1l-0.7-0.1
96
+ l-0.8-0.1l-0.9-0.1l-1-0.1h-0.2l-0.7-0.1h-0.2h-0.1h-0.8h-0.8h-0.8h0.2h-1.6H352h-1.7h-0.8h-0.9h-0.8h-0.9H346h-0.8h-0.3h-0.3
97
+ h-0.4h-0.4h-0.4H343l-0.9,0.1l-0.9,0.1l-1,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.3h-0.2h-0.3h-0.2l-0.3-0.1l-0.3-0.1
98
+ l-0.2-0.1l-0.3-0.1l-0.3-0.1L334,326l-0.2-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.1-0.2l-0.2-0.2
99
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.4l-0.1-0.4l-0.1-0.4V322L330.2,321.8z M172.4,323.5l-0.9,0.1l-1,0.1l-1,0.1h-0.9h-1h-0.9h-0.9
100
+ h-0.9H164h-1.7h-1.6h-1.4h-0.7h-0.5h-0.5h-0.4l-3.4,0.2h-0.1l2.2,0.2l4.7,0.4l3.6,0.3h0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
101
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.8-0.2l1.2-0.3L172.4,323.5L172.4,323.5z M394.4,320.2h-0.7H393h-0.7h-0.6l-1.1,0.1h-0.8h-0.6
102
+ h-0.4h-0.5h-0.7h-1.5h-1.8l-2,0.1l-2,0.1l-2.2,0.1l-4.5,0.2l-3,0.1l0.6,0.1l1.9,0.2l1.9,0.2l2,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1
103
+ h0.9h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9l0.9-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1
104
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1h-0.2h-0.3h-0.4h-0.3l-0.7-0.1h-0.7h-0.7h-0.7h-0.7H395h-0.6V320.2z
105
+ M185.1,311.1v0.5l-0.1,0.5l0,0l-0.2,0.5l-0.3,0.5l0,0l-0.2,0.3l-0.3,0.2l0,0l-0.2,0.2l0,0l0.4,0.4l0.1,0.1l0.2,0.3h0.1l0.2,0.3
106
+ l0,0l0.1,0.3h0.1l0.1,0.4l0,0l0.1,0.3l0,0l0.1,0.3l0,0l-0.1,0.4v0.1l-0.1,0.5v0.1l-0.2,0.4l-0.1,0.1l-0.2,0.3l-0.1,0.2l-0.2,0.3
107
+ l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l1.4-0.4l1.5-0.4l1.6-0.4l1.6-0.4l1.7-0.4l1.6-0.4
108
+ l1.6-0.5l1.7-0.5l1.6-0.5l1.6-0.5l1.6-0.5l0,0h-0.2l-1.1-0.2l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-1.1-0.3l-1-0.3l-0.5-0.2l-0.5-0.2
109
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.2h-0.1l-0.3-0.2l0,0l-0.4-0.3l0,0l-0.2-0.3l-0.2-0.3h-0.1
110
+ l-0.1-0.3l-0.5-0.1l-0.8-0.2L185.1,311.1z M222.2,319.9h0.4h1.1h1h1.1h1h1.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
111
+ l-0.4-0.2l0,0h-0.6h-0.2H224h-0.1l-0.4-0.1l-0.2-0.1h-0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
112
+ l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.2h-0.1h1.6h0.8L222.2,319.9z M297.2,316.3l-2.4,0.3l-2.4,0.3l-2.4,0.3l-4.8,0.6l-4.8,0.6
113
+ l-2.4,0.3l-2.4,0.3h1h2.9h1.6h1.7h1.7h1.8l1.8-0.1l2-0.1h0.9h0.9l1-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1l0.9-0.1
114
+ l1-0.1l0.9-0.1l0,0v-0.1l-0.1-0.3v-0.1l-0.1-0.3v-0.1v-0.3v-0.1v-0.3l0,0h-0.8h-1.2L297.2,316.3z M345.5,317.8L343,318l-0.9,0.1
115
+ l1.2,0.1l1.4,0.1l1.4,0.1h0.1l-0.1-0.2l0,0v-0.4L345.5,317.8z M159.4,308.6l-1.8,0.1l-1.8,0.1l-1.8,0.1h-0.5h-0.9h-1.3h-0.8h-0.8
116
+ h-0.9h-1h-1h-1.1h-1.1l-1.1,0.1l-1.1,0.1h-0.2l-0.1,0.2l-0.4,0.5l-0.4,0.3h0.1h0.7h0.6h0.6h0.6h0.6h1.1h1.1l1.2-0.1l1.1-0.1
117
+ l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l2.4-0.2l2.4-0.2l2-0.2l-0.8-0.2L159.4,308.6z M219.2,306.9l-2,0.1l-1.6,0.1l0.2,0.1
118
+ l0.3,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2h0.1h0.8l3,0.1l3,0.1l6,0.2l6,0.2l3.5,0.1l3.5,0.1l3.5,0.1h0.1h-0.2
119
+ l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.1-0.1h-0.6l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.1l-2-0.2l-2-0.2l-0.9-0.1l-0.9-0.1
120
+ l-0.9-0.1l-0.9-0.1l-1.8-0.2l-1.8-0.2l-1.8-0.2l-1.4-0.2H219.2z M288.8,304.3h-1.2h-0.8l1.2,0.1h0.2l2.5-0.1l2.4-0.1l0,0h-0.8
121
+ h-1.2h-1.2L288.8,304.3z"
122
+ />
123
+ <path
124
+ fill="#DCDDDE"
125
+ d="M582.2,247.8h2.8h1.4h1.4h1.4h1.4h1.4h0.7h0.7h0.7h0.7h0.7h0.7l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1
126
+ l0.7-0.1l0.7-0.1l0.7-0.1l0.5-0.1l0.6-0.1l1.1-0.2l1.2-0.1l1.1-0.1l2-0.2l0.8-0.1h0.6l0.5,0.1l0.5,0.2l0.5,0.3l0.4,0.4l0.3,0.5
127
+ l0.2,0.5l0.1,0.6v0.6l-0.1,0.6l-0.2,0.5l-0.3,0.5l-0.4,0.4l-0.5,0.3l-0.5,0.2l-0.4,0.1h1.2h1.9l0.7-0.1l1.7-0.2l0.9-0.1l0.9-0.1
128
+ l0.8-0.1l0.9-0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.4l0.4,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.5,0.1l0.4,0.1l0.4,0.1
129
+ l0.4,0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.2l0.3,0.2h0.1l0,0h0.2h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l1.1,0.1l1.1,0.2l1,0.2l1,0.1
130
+ l0.9,0.1h0.4h0.4h0.3h0.4l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1.8,0.3h0.1l1-0.1
131
+ l1.4-0.1l1.4-0.1l0.9-0.1l-0.4-0.2l-0.8-0.4l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2h-0.1l-0.2-0.3h-0.1l-0.3-0.5l0,0
132
+ l-0.1-0.3l-0.1-0.3l0,0l-0.1-0.4l-0.1-0.4l0,0l0.1-0.4l0.1-0.4l0,0l0.2-0.3l0.2-0.3l0,0l0.4-0.5l0,0l0.4-0.3h0.1l0.2-0.2l0.2-0.1
133
+ l0.2-0.1l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.8h0.8h0.8h0.8h0.7h0.7l0.6,0.1l0.7,0.1l0.7,0.1
134
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.2h1.1h0.8h0.7h0.7h0.6l1.6,0.1l1.6,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1l1.6,0.1l1.5,0.1
135
+ l3,0.3l2.6,0.2h0.3h1.8h2.2h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1l1.2,0.1l0.4,0.1l0.5,0.1l0.5,0.1h0.1
136
+ l0.1-0.1l0.2-0.2h0.1l0.4-0.2h0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1h0.2h0.2h0.3h0.2h0.3h0.6h0.6l0.6,0.1l0.5,0.2l0.5,0.3l0.5,0.4
137
+ l0.4,0.4l0.2,0.5l0.2,0.6l0,0h0.2l0.6,0.2l0.6,0.1l1.2,0.1l1.8,0.1l3.6,0.2l1.8,0.1l1.7,0.1l1.8,0.1h0.9h0.8h0.1h0.1h0.1h0.1h0.3
138
+ h0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2l1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.2h0.3h0.3
139
+ h0.2h0.3h0.3l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1l0.2,0.2l0.1,0.1
140
+ l0.2,0.3l0.1,0.1l0.1,0.3l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.3v0.3v0.1l-0.1,0.4v0.1l-0.1,0.4v0.1
141
+ l-0.1,0.1h0.2h0.9h0.8h0.9h0.9h0.9h0.5h0.6h0.6l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.3,0.1l0.4,0.1
142
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0,0l0.2,0.3h0.1l0.2,0.3l0.5-0.2l0.9-0.3l0.9-0.3
143
+ l0.9-0.3l1.6-0.5l2-0.6l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l0.9-0.3l0.9-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.3h0.1h0.4h0.1
144
+ l0.3,0.1l0.3,0.1h0.1l0.4,0.2l0.4,0.2l0.3,0.3h0.1l0.4,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0,0l-0.1,0.6l-0.1,0.5l-0.2,0.5h-0.1l-0.2,0.3
145
+ l-0.2,0.2h-0.1l-0.3,0.3l-0.1,0.1l-0.2,0.2l-0.4,0.2l-0.4,0.2l-0.6,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2
146
+ l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.3l-1.2,0.3l0.8,0.1h0.4h7.9
147
+ h4h3.9h1.9h1.2h1.5h1.5h0.8h0.8h0.8h0.9l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.9,0.1l0.8,0.1l0.9,0.1l0.8,0.1l0.8,0.1l0.4,0.1
148
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2
149
+ l0.3,0.2l0.3,0.3l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.2l0.2,0.3v0.1l0.1,0.3l0.1,0.1l0.1,0.5v0.1v0.6v0.1v0.3l-0.1,0.3v0.1l-0.1,0.3
150
+ l-0.2,0.3l0,0l-0.2,0.3l-0.2,0.3l0,0l-0.4,0.3l0,0l-0.4,0.3h-0.1l-0.3,0.1H804l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.3h-0.4h-0.4
151
+ h-0.4h-0.4h-0.4h-0.4H800l-0.8-0.1l-0.9-0.1l-1.7-0.3l-0.8-0.1h-0.4H795h-0.3h-0.3h-0.2H794h-2.6h-2.5h-1.2h-1.2h-1.2h-1.2h-1.2
152
+ l-1.2-0.1H781h-0.6h-0.7h-0.6l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
153
+ l-1.4-0.2l-1.4-0.3l-1.5-0.3l-3.3-0.6h-0.2h-3h-4h-3.9h-4h-4h-2h-2h-0.8l-0.4,0.1l-0.7,0.2l-1.4,0.5l-1.4,0.5l-0.8,0.2l-0.7,0.3
154
+ l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.7,0.1l-0.7,0.1
155
+ l-0.7,0.1h-0.8H725h-0.4h-0.4h-0.4h-0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1
156
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.3,0.2l-1.4,0.1l-1.4,0.1
157
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.3h-1.4h-1.4h-1.4H691h-1.3h-1.4H687h-1.4h-1.3l-1.2-0.1l-1.1-0.1l-1.2-0.1
158
+ h-0.6l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.4-0.2l-0.7-0.1
159
+ l-0.8-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.1
160
+ l-0.2-0.2l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.1-0.4l-0.1-0.1l-0.1-0.5v-0.1l-0.1-0.5v-0.1
161
+ l0.1-0.5v-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2
162
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.4-0.1l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2
163
+ l0.7-0.2l0.7-0.2l0.8-0.2l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.1v-0.1v-0.1l0.1-0.4V266l0.1-0.3v-0.1
164
+ l0.2-0.3v-0.1l0.1-0.1l-0.5-0.1l-0.8-0.1l-0.9-0.1l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.6-0.2h-0.2h-0.5
165
+ h-0.5h-0.5l-0.9-0.1l-0.9-0.1l-0.8-0.1L670,263h-0.7l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1h-0.1l-1.2,0.2
166
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.7,0.1l-0.6,0.1l-0.6,0.1h-0.7
167
+ H649h-0.6h-0.7h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1l-0.6-0.1l-0.5-0.1
168
+ l-0.6-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.6-0.2l-0.4-0.2l-3.7,0.5l-2.8,0.3l-2.7,0.3l-0.9,0.1l-0.9,0.1l-0.9,0.1
169
+ l-0.9,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1l-0.8,0.1h-0.8h-0.9h-0.8h-0.8l-1.6,0.1H612h-1.6h-1.6h-1.7h-1l-0.5,0.2l-0.7,0.3l-0.7,0.3
170
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.7,0.2
171
+ l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-1.5,0.3l-1.5,0.3l-1.5,0.3l-0.7,0.1l-1.1,0.4
172
+ l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.3,0.5l-1.4,0.5l-1.4,0.5l-1.3,0.5l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
173
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2L564,278l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.4,0.1l-0.4,0.1l-0.9,0.2l-2.3,0.6
174
+ l-1.4,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4
175
+ H545h-0.4h-0.4h-0.4h-0.4H543h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2
176
+ l-0.4-0.2l-0.4-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.3l-0.1-0.1l-0.2-0.4v-0.1l-0.1-0.5
177
+ l-0.1-0.1V277v-0.1v-0.5l0.1-0.1l0.1-0.5v-0.1l0.2-0.4l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.2-0.2
178
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2
179
+ l0.8-0.2l0.7-0.2l0.2-0.1l0.3-0.1l1.3-0.4l0.7-0.2l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.8-0.1l0.8-0.1
180
+ l0.7-0.1l1.4-0.2l0.7-0.1l0.7-0.1l0.8-0.1l0.9-0.2l1.1-0.2l1.2-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.2l2.9-0.4
181
+ l3-0.5l1.5-0.2l1.5-0.2l1.5-0.2h0.2l0.8-0.4l2.5-1.1l2.5-1.1l-0.1-0.1h-9.7h-0.2h-0.2h-0.4h-0.5h-0.6l-1.2,0.1l-0.7,0.1l-0.6,0.1
182
+ h-0.7h-0.5h-0.3h-0.3h-0.3h-0.3h-0.2l-0.5-0.1h-0.1l-0.3-0.1l-0.3-0.2l0,0l-0.3-0.2l-0.2-0.2h-0.1l-0.1-0.1l-0.5,0.1l-0.7,0.1
183
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7H561h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
184
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1-0.2l-2.4,0.6l-1.7,0.4l-1.8,0.4
185
+ l-2,0.4l-2,0.4L534,264l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.2L523,266l-1.1,0.2
186
+ l-1.1,0.2l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1H512h-1.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5
187
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1
188
+ l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3
189
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3l-0.1-0.2v-0.3v-0.2
190
+ l-0.1-0.3l0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3l0.1-0.1l0.1-0.3l0.1-0.1l0.2-0.3l0.1-0.1l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
191
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.1
192
+ l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.5h0.3v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3
193
+ l0.1-0.3l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1
194
+ l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.6h0.6h0.6h0.6
195
+ h0.6h0.6h1.1h2.2h1.1h1.1h8.9h0.3h0.2h0.2h0.2h0.2h0.2h0.3h0.3l0.5-0.1l0.6-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.7-0.2l1.4-0.3l0.7-0.2
196
+ l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
197
+ l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.4,0.3l0.3,0.3l0.4,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.1,0.2l0.1,0.2
198
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.5,0.1l1.5,0.2l1.4,0.2l0.7,0.1l0.6,0.1l0.6,0.1l0.5,0.1
199
+ l1,0.1l0.9,0.1l1,0.1l1,0.1l0.9,0.1h0.5l0,0l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.2l0.5-0.2l0.5-0.2
200
+ l0.5-0.2l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5
201
+ h0.4h1.5L582.2,247.8z M689.3,272.3h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
202
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
203
+ l0.5,0.1h0.5l1.1,0.1l1.1,0.1l1.1,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3l1.3-0.1l1.3-0.1l1.3-0.1l1.2-0.1l1.3-0.1
204
+ l1.3-0.1l1.3-0.1l0.6-0.1l0.7-0.1l0.7-0.1l0.6-0.1h0.2h-1.4h-1.5H706h-1.5H703h-1.5H700l-1.2-0.1l-1.2-0.1l-1.3-0.1h-0.7H695
205
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.5-0.1L689.3,272.3z M504.5,259h-0.4h-0.5h-0.5h-0.5
206
+ h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.2H500l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
207
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4
208
+ h0.4h0.5h0.4h0.5h0.4h0.5h0.5h0.9h1l1-0.1l1-0.1l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1l-1-0.1l-1.1-0.1l-1.1-0.1
209
+ l-2.1-0.2l-2.1-0.3l-2.1-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.9-0.1h-0.2h-0.5h-0.7h-0.8L504.5,259L504.5,259z M624.9,258.1
210
+ l-0.1,0.2l1.5-0.2h0.1l0,0H624.9L624.9,258.1L624.9,258.1z M707.9,257.6l0.5,0.1l0.5,0.1l0.6,0.1l0.7,0.1l1.2,0.2l1.4,0.2h0.2
211
+ l0.3-0.1l0,0l-0.4-0.2l-0.4-0.2l0,0l-0.9-0.1l-2.3-0.1l-2-0.1h-0.2H707.9z"
212
+ />
213
+ </g>
214
+ <g transform="matrix(0.998358,0.0572833,-0.0572833,0.998358,15.545,-79.3702)">
215
+ <g>
216
+ <g>
217
+ <g transform="matrix(1,0,0,1,398.965,43.2222)">
218
+ <path
219
+ fill="#0096FF"
220
+ d="M73.8,141.4c0.7,0.2-1.1-1-1.5-1.6c-0.9-1.5,2.2-4.9,2.2-4.9c3.4-5.2,7.1-9.9,11-14.8
221
+ c1.8-2.2,2.9-7.9,5.5-6.6c2.4,1.2-12.2,20.2-13.7,21.9c-1.4,1.6-4.4,6.5-4.4,4.4c0-8.8,14.7-31.8,23-34.6
222
+ c1.9-0.6-1.5,3.8-2.7,5.5c-0.4,0.5-9.3,12.1-11.5,9.9c-1.4-1.4,1.7-7,2.2-7.7c4.6-7.2,10.6-13.6,17-19.2
223
+ c2.6-2.3,5.1-4.9,7.7-7.1c1.3-1.1,3.8-5,3.8-3.3c0,5-10.9,14.5-14.3,18.1c-1.6,1.7-3.8,6-5.5,4.4c-2.2-2.2,3.5-5.2,5.5-7.7
224
+ c5.4-6.7,11-13,17.6-18.7c2-1.7,5.3-4.6,7.7-6c2-1.2,6.5-6.5,5.5-4.4c-4.5,9-22.9,15.6-11,5.5c17.2-14.6,33.4-19.6,53.8-26.3
225
+ c11.7-3.9,17.5-13.2,31.3-10.4c6.4,1.3,14.9,1.8,20.9,3.8c7.3,2.4,14.8,8.8,22.5,8.8c1.3,0-2.6,0.2-3.8,0
226
+ c-2.5-0.4-4.9-1.3-7.1-2.2c-8.1-3.2-16.5-5-24.7-7.7c-0.7-0.2-1.5-7.1-1.1-7.1c1.3,0,3.6,3.6,5.5,3.8
227
+ c12.3,1.8,20.7,8.4,32.4,13.7c22.6,10.3,41.6,23.5,58.7,40.6c13.3,13.3,10.8,40,15.9,55.4c2.8,8.5,3.1,19,5.5,28.5
228
+ c1.2,4.7,4.1,11.7,2.2,17.6c-0.7,2-0.2,4.6-1.6,6c-1,1-11-1.2-12.6-1.6c-12.4-3.1-27.3-1.1-40.1-1.1
229
+ c-13.3,0-31.3,5.8-42.8,11.5c-5.8,2.9-15.5,0.6-21.9,2.7c-6.1,2-17.2-0.7-23-2.2s-12.2-0.5-18.1-1.6c-9.3-1.9-18.1-5.5-28-7.1
230
+ c-17.9-3-41,1-58.2,4.4c-4.6,0.9-10.8,3.8-15.4,3.8c-5.9,0-11.9-0.5-17.6-0.5c-0.9,0-8.8,1.5-8.8,0.5c0-6.2,10.5-16.6,12.6-23
231
+ c6.8-20.3,4-39.2,24.7-51.6c5.3-3.2,16.3-10.1,23-7.1c10.2,4.5-3.5,26.8-5.5,30.7c-1.7,3.4-3.8,6.5-5.5,9.9
232
+ c-0.3,0.7-5.8,12.5-6.6,14.3c-0.7,1.6-2.4,6-1.1,4.9c24.9-21.4,45.1-47,72.4-65.8c7-4.9,19.9-13.4,28-18.1
233
+ c2.2-1.3,8.3-5,7.1-2.7c-2.1,4.3-14.3,15-15.4,15.9c-16.6,15-33.5,29.5-51,43.3c-2.1,1.7-10.6,10.4-14.3,8.8
234
+ c-2.9-1.3,1.7-6.1,3.3-8.8c4-6.8,4-6.4,7.7-13.2c8.7-16.1,18.3-32.5,30.7-46.1c5.2-5.8,9.5-10.4,15.4-15.4
235
+ c1.4-1.2,5.4-4.6,4.9-2.7c-1.1,4.3-7.7,8.4-11,11.5c-13.9,13.2-21.5,20.4-36.2,32.9c-3.8,3.2-7.6,6.3-11.5,9.3
236
+ c-0.2,0.2-5.1,4.2-5.1,2c0-2.4,15-17.5,17.4-20c19.7-20.9,43.7-41.6,70.3-53.3c3.7-1.6,36.7-14.9,30.5,1.6
237
+ c-0.9,2.5-2.2,4.8-3.6,7.1c-1.4,2.5-3,4.9-4.7,7.2c-4.6,6.6-11.3,15.3-16.5,21.4c-0.3,0.3-14.5,16.8-19.2,21.9
238
+ c-12.9,14.2-25.4,29.2-39,42.8c-2.3,2.3,4.9-4.3,7.1-6.6c4.2-4.4,8.3-8.9,12.6-13.2c17-16.7,34.9-32.5,53.2-47.7
239
+ c2.5-2.1,10.2-9.4,15.4-10.4c2.3-0.5-1.7,4.5-3.1,6.3c-1.5,2-3,3.9-4.5,5.7c-4.9,5.7-14,15.5-19.2,20.9
240
+ c-15,15.4-30,30.7-45,46.1c-6.9,7.1-6.8,6.8-13.2,14.3c-0.4,0.5-1.7,1.8-1.1,1.6c8.5-1.7,13-11.5,19.2-17.6
241
+ c20.5-20.2,41.2-40.1,63.6-58.2c4.9-3.9,14.5-11.4,21.2-15.7c1.4-0.9,14.5-8.4,9.5,0.8c-1.4,2.6-3.1,4.9-4.8,7.3
242
+ c-2,2.7-4.1,5.4-6.1,8c-5.8,7.5-11.3,14.2-17.6,21.4c-10.5,11.9-24.6,23.5-31.8,37.9c-1,2,3.9-2.3,5.5-3.8
243
+ c3.3-3.1,6.2-6.6,9.3-9.9c14-14.7,28.3-28.8,44.4-41.2c3.5-2.7,7.2-5.3,11-7.7c2.6-1.7,9.6-6.3,8.8-3.3
244
+ c-2.5,9.5-15.1,18.9-21.4,25.2c-21.4,21.7-43.1,45.9-67.5,64.2c-2.2,1.6,3.5-4.2,5.5-6c4-3.7,7.9-7.5,12.1-11
245
+ c16-13.6,32.5-27.1,49.9-39c4.5-3,10.5-7.2,16-9.6c2-0.9,6.8-3,6.5-0.8c-1.6,12-23.9,29.7-30.7,36.8c-5.2,5.4-15.4,9-15.4,16.5
246
+ c0,1.3,2.5-0.6,3.7-1.1c4.1-1.7,4.3-2,8.3-5.2c9.8-7.6,19-16.1,29.2-23.3c2.8-2,5.8-3.7,8.8-5.5c1-0.6,3-2.8,3.3-1.6
247
+ c1.5,5.8-14,19.7-16.5,22.5c-2.3,2.7-4.5,5.4-6.6,8.2c-0.8,1.1-2.8,4.6-1.6,3.8c5.1-3.1,8.5-6.5,13.2-10.4c2.4-2,4.7-4.1,7.1-6
248
+ c1.8-1.5,3.5-3.1,5.5-4.4c14.7-9.8-6,15.4-6,18.7c0,2.5,4.7-1.8,6.6-3.3c2.9-2.3,7.3-7.4,11.9-5.9c3.6,1.2-2.4,11.3-0.9,13.6
249
+ c2.1,3.1,8.1-3.9,9.3-2.7c0.6,0.6,0.8,5.3,0,6c-2.1,2.1-5.8-4.9-7.1-4.9"
250
+ />
251
+ <path
252
+ fill="#0096FF"
253
+ d="M210.4,9.7h1l1,0.1l1.2,0.2l1.2,0.2h0.1l1.3,0.3l1.3,0.4h0.1l1,0.4l1,0.4l0.9,0.4l1.5,0.8l1.2,0.8l1,0.7
254
+ l0.5,0.4l0.3,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
255
+ l0.7,0.3l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6L243,22l1.1,0.6l1.1,0.6l1,0.6l2,1.1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.4
256
+ l0.7,0.3l1.3,0.5l1.4,0.7l1.4,0.7l0.1,0.1l0.9,0.4l1.2,0.5l1.2,0.5l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6
257
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7
258
+ l1.1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
259
+ l1,0.8l1,0.8l1,0.8l0.9,0.8L311,64l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.8l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9l0.9,0.9
260
+ l0.9,0.9l0.9,0.9l0.5,0.6l0.6,0.6l0.6,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.7l0.5,0.6l0.5,0.6l0.4,0.7l0.4,0.7
261
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.6l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.6
262
+ l0.3,0.7l0.3,0.6l0.2,0.6l0.3,0.7l0.4,1.2l0.4,1.3l0.4,1.3l0.4,1.3l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2
263
+ l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.3,2.1l0.3,2l0.5,3.8l0.2,1.8l0.2,1.7l0.1,0.8
264
+ l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.3l0.2,0.5
265
+ l0.3,1l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.2,1.2l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1.1l0.2,1l0.2,1l0.2,1l0.3,1.9l0.5,3.7
266
+ l0.3,1.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.6l0.1,0.6l0.1,0.6v0.1v0.2l0.2,0.7l0.6,2l0.4,1.2
267
+ l0.2,0.7l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.9l0.2,0.9l0.2,1l0.2,1l0.2,1.1l0.2,1.1l0.1,1.2l0.1,1.2l0.1,1.2v0.7v0.7v0.7v0.7v0.7
268
+ v0.7v0.7l-0.1,0.7l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.6l0,0l-0.1,0.9l-0.1,1l-0.1,0.8
269
+ l-0.2,0.8l-0.2,0.8l-0.2,0.9l-0.3,1l-0.4,1.1l-0.4,1.1l-0.5,1.2l-0.6,1.3l-0.7,1.3l-0.8,1.3l-0.9,1.3l-1.1,1.3l-0.7,0.7l-1,1
270
+ l-1,0.9h-0.1l-0.9,0.7l-0.9,0.7l-1,0.6h-0.1l-1.3,0.7l-1.3,0.7l-1,0.5l-1.9,0.7l-1.6,0.4l-1.4,0.3l-1.2,0.2l-1.2,0.1l-1.5,0.1
271
+ H326h-1.2l-1-0.1l-0.9-0.1l-0.9-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.2-0.2l-1.1-0.2l-1-0.2
272
+ l-0.9-0.2l-0.8-0.2l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1h-0.4h-0.4H305
273
+ h-0.4h-0.4h-0.4h-0.4H303h-0.4h-0.5h-0.4h-1h-1h-1h-1.1h-1.1h-1.1h-1.1h-1.2h-1.2h-1.2l-2.5,0.1l-2.5,0.1l-2.6,0.1h-1.3h-1.4
274
+ H279h-1.4h-1.4h-1.3h0.1h-0.3h-0.3H274h-0.4h-0.4h-0.4h-0.4H272h-0.4l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
275
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.2
276
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.4l-1,0.4
277
+ l-1,0.4l-0.9,0.4l-0.9,0.4l-0.8,0.4l-1,0.5l-0.7,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.8,0.3l-0.9,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2
278
+ l-0.8,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.2,0.1l-1.2,0.1l-1.1,0.1l-1.1,0.1h-1h-1H223h-0.8h-1.5
279
+ h-1.3h-0.5h-0.5H218h-0.3h-0.3l0,0h-0.1l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.8,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
280
+ l-0.7,0.1l-0.7,0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-1.2l-1.3-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2
281
+ l-1.1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.9-0.2l-0.9-0.2l-1.7-0.4l-1.6-0.4l-1.4-0.3l-1.1-0.3h-0.1l0,0h-0.1h-0.1h-0.1h-0.2
282
+ h-0.2H181h-0.3h-0.3h-0.3h-0.3h-0.9h-1h-1.2h-1.3l-1.4-0.1h-0.8h-0.8l-0.8-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1
283
+ l-1.1-0.2l-1-0.2l-1.2-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1-0.3l-1-0.3l-1-0.3l-1.9-0.5l-1.9-0.5l-3.5-1l-1.6-0.5
284
+ l-1.6-0.5l-0.7-0.2l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
285
+ l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.6h-0.7h-0.7h-0.7H130h-0.7h-0.7h-0.7h-0.7h-0.7h-0.8h-0.8
286
+ h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-1.7,0.2
287
+ l-1.7,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.7,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3l-1.6,0.3
288
+ l-1.5,0.3h-0.1l0,0h-0.1h-0.2l-0.2,0.1l-0.2,0.1l-0.7,0.2l-0.8,0.2l-0.9,0.3l-1,0.3l-1.2,0.4l-1.2,0.4l-0.7,0.2l-0.7,0.2
289
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.1l-1.2,0.1l-1.2,0.1H68h-1.5h-1.3h-1.3h-1.3
290
+ h-1.2l-1.2-0.1l-2.3-0.1l-2.2-0.1h-1h-1h-0.9h-0.9h-0.3l-1.3,0.2l-0.9,0.1l-1,0.1l-1.1,0.1l-1.2,0.1l-0.7,0.1h-0.7h-0.8H43
291
+ h-1.1l-1.3-0.1l-1.7-0.2l-2-0.4l-1.8-0.5l-0.8-0.3l-1-0.4l-1-0.4h-0.1l-1.3-0.6l-1.2-0.7h-0.1l-1.1-0.7l-1.1-0.8l-1-0.8l0,0
292
+ l-1.2-1.1l-1.1-1.2l-1-1.2l0,0l-0.9-1.2l-0.8-1.3l-0.7-1.3l-0.6-1.4l0,0l-0.6-1.5l-0.5-1.6l-0.4-1.6l-0.3-1.6l0,0l-0.1-1.2
293
+ l-0.1-1.2v-1.2l0-0.9l0.1-1.4l0.2-1.3l0.2-1.3l0.2-1.2l0.3-1.1l0.3-1.1l0.3-1l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7
294
+ l0.4-0.7l0.3-0.7l0.3-0.7l0.3-0.6l0.3-0.6l0.4-0.6l0.7-1.1l0.7-1.1l0.7-1l0.7-1l0.6-0.9l0.6-0.9l1.1-1.6l1.1-1.5l0.5-0.7
295
+ l0.4-0.6l0.4-0.6l0.3-0.5l0.3-0.4l0.2-0.4l0,0l0.2-0.5l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.8l0.2-0.8l0.2-0.8
296
+ l0.2-0.8l0.2-0.8l0.4-1.7l0.4-1.7l0.8-3.6l0.4-1.9l0.2-1l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1.1l0.3-1.1L38,152l0.3-1.1l0.3-1.1
297
+ l0.4-1.1l0.4-1.1l0.4-1.2l0.4-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
298
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.6l0.5-0.6l0.5-0.6
299
+ l0.5-0.6l0.5-0.6l0.5-0.6v-0.1v-0.1l0.4-1l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
300
+ l0.5-0.9l0.5-0.9l0.5-0.9l0,0l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.8l0.3-0.7l0.3-0.7l0.3-0.7l0.5-1.1l0.5-1l0.5-0.9l0.4-0.8l0.4-0.8
301
+ l0.4-0.8l0.5-0.8l0.7-1.1l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.8l0.6-0.8l0.6-0.8l0.6-0.8l0.7-0.8l0.7-0.8l0.7-0.8
302
+ l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.8l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7
303
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.9-0.8l0.9-0.9l1-1l0.2-0.1l0.2-0.3l0.6-0.7l0.6-0.7
304
+ l0.7-0.7l0.7-0.7l0.1-0.1l0.3-0.6l0.5-1l0.6-1l0.8-1.3l0.9-1.3l0.8-1.1L97,62l0.8-0.9l0.8-0.8l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
305
+ l0.8-0.7l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6l1-0.6
306
+ l1-0.6l1-0.6l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.5l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
307
+ l1-0.4l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.7l1.9-0.6l1.9-0.6l3.7-1.2l3.7-1.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
308
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.2l0.3-0.1l0.7-0.4l0.7-0.4l0.8-0.4l1.7-1l1-0.6
309
+ l1.1-0.6l1.1-0.6l0.7-0.4l0.6-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.8-0.4l0.8-0.3l0.8-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
310
+ l0.9-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1.1-0.1l1.2-0.1h0.6h0.1l1.4-0.8l1.4-0.7l1.5-0.6l1.5-0.5
311
+ l1.5-0.4l0,0l1.6-0.3l1.6-0.2l1.6-0.1L210.4,9.7z M55.5,120.7l-0.1,0.1L55.5,120.7L55.5,120.7z"
312
+ />
313
+ </g>
314
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
315
+ <path
316
+ fill="#E2F0FD"
317
+ d="M184.1,73.1l1.4,0.1l1.3,0.2l1,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.4l1,0.5l1,0.5l1,0.6l1,0.7l0.9,0.8
318
+ l0.9,0.9l0.9,0.9l0.8,1l0.7,1.1l0.7,1.1l0.6,1.1l0.5,1.1l0.4,1l0.3,0.9l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.7l0.1,0.7l0.1,0.7
319
+ l0.1,0.7l0.1,0.7l0.1,0.7V94v0.7v0.7v0.7v0.7v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.2,0.6
320
+ l-0.2,0.6L202,104l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.6l-0.5,0.9
321
+ l-0.5,1l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
322
+ l-0.6,0.7l-0.6,0.7l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-0.6,0.6l-1.1,1l-1.1,1l-1.1,1l-1.9,1.7
323
+ l-1.7,1.5l-0.7,0.6l-0.6,0.6l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3
324
+ l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6
325
+ h-0.6l0,0l-0.5,0.3l-0.9,0.4l-0.8,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1h-1h-1.1h-1.1
326
+ l-1.1-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.3l-1-0.3l-1-0.4l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.7-0.5
327
+ l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.3-0.4l-1-0.2l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6
328
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.6-0.6l-0.6-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.5-0.9
329
+ l-0.5-1l-0.4-1l-0.4-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.7l-0.1-0.7
330
+ l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7l-0.1-1.2v-1.2l0-1.2V101v-1.1l0.1-1.1v-0.6l0.1-0.6
331
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.8l0.2-1l0.4-1.4l0.3-0.8l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.3-0.5v-0.1l0.3-0.5l0.3-0.5
332
+ l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
333
+ l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1h0.4l0.3-0.2l0.5-0.4l0.5-0.4l0.5-0.3
334
+ l0.5-0.3l0.5-0.3l0,0l0.5-0.3l0.5-0.3l0.5-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
335
+ l0.6-0.1h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.2
336
+ l0.3-0.3l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.8-0.6l0.9-0.6l1-0.6l1.1-0.6l1.2-0.6l1.3-0.5l1.2-0.4l1.1-0.3
337
+ l1.2-0.2l1.2-0.2l1.3-0.1h1.3h1.4l1.4,0.1l1.4,0.2l1.4,0.3l1.5,0.5l1.4,0.6l1.3,0.7l1.3,0.8l0.1,0.1l0.6-0.1l1-0.1l1.1-0.1h1.2
338
+ L184.1,73.1z"
339
+ />
340
+ </g>
341
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
342
+ <path
343
+ fill="#E2F0FD"
344
+ d="M104.3,122.6h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0,0
345
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
346
+ l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
347
+ l0.1,0.2v0.2l0,0v0.2v0.2v0.2v0.2v0.2v0.2l0,0.3v0.5v0.4l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6
348
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.5l-0.3,0.5l-0.3,0.5
349
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.2,0.3l-0.2,0.2l-0.3,0.3
350
+ l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.2l-0.5,0.2l-0.3,0.1l-0.2,0.1H100h-0.2h-0.1h-0.2h-0.2h-0.2H99h-0.2
351
+ h-0.1h-0.1h-0.2h-0.1h-0.2H98l-0.2,0.1l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.4,0.1h-0.2h-0.2h-0.2H94h-0.2h-0.2
352
+ h-0.2h-0.2H93h-0.2h-0.2h-0.2l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
353
+ l-0.3-0.3l-0.5-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6
354
+ v-0.6l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
355
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.8-0.6l0.6-0.5
356
+ l0.5-0.4l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.2l0.8-0.6l0.5-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.4-0.2
357
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1L104.3,122.6z"
358
+ />
359
+ </g>
360
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
361
+ <path
362
+ fill="#E2F0FD"
363
+ d="M77.7,183.2h0.2h0.2h0.2h0.1h0.2h0.2H79l0.3,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.6,0.3l0.7,0.3
364
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.5l1.7,0.9l1.6,0.9l1.6,0.9l1.4,0.9l1.3,0.8l1.1,0.7l0.5,0.3
365
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
366
+ l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.3
367
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.3l-0.2,0.3l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
368
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1H100l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.3l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
369
+ l-0.3,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.2h-0.2h-0.2h-0.1h-0.2H95h-0.2h-0.4l-0.6-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
370
+ l-0.4-0.1l-0.6-0.2l-0.5-0.2l-0.4-0.2H90l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9h-1h-1h-1h-1h-0.5h-0.5h-0.5h-0.5
371
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
372
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4
373
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.2-0.3l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
374
+ l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.2l0.1-0.2
375
+ l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.3l0.5-0.4
376
+ l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2L66,185l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1
377
+ l0.7-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6h0.4l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.2-0.1h0.2H77
378
+ l0.3-0.1l0.6-0.1L77.7,183.2z M82.6,187.1L82.6,187.1h-0.1H82.6z M72.7,185.7L72.7,185.7L72.7,185.7L72.7,185.7z"
379
+ />
380
+ </g>
381
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
382
+ <path
383
+ fill="#0065FF"
384
+ d="M154.3,188.6l1.6-0.1l1.5-0.1l1.5-0.1h0.7h0.7h0.6l0.6-0.1h0.6l0.6-0.1l0.5-0.1l0.6-0.1l3.9-0.6l2-0.3
385
+ l2-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.3l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l2.1-0.4l1-0.2l1.1-0.2l1.1-0.2l1-0.2l1-0.2l1-0.2
386
+ l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3
387
+ l0.9-0.3l0.9-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.7-0.3l0.7-0.3l0.7-0.4l0.7-0.3l0.7-0.4l0.7-0.4l0.8-0.5
388
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7
389
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8
390
+ l0.8-0.8l0.8-0.8l0.8-0.8l1.7-1.7l1.6-1.7l1.6-1.7l1.6-1.7l1.6-1.8l3.3-3.5l3.3-3.5l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.8l1.7-1.7
391
+ l0.9-0.9l0,0v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.9
392
+ l0.3-1.9l0.3-2l0.1-1.1l0.2-1.1l0.2-1.1l0.2-1.2l0.2-1.2l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.7l0.2-0.6l0.2-0.7l0.2-0.7l0.2-0.7
393
+ l0.2-0.7l0.2-0.7l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.6l0.2-0.5l0.2-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5
394
+ l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.5l0.8-0.7l0.9-0.8l0.9-0.7l0.9-0.7l0.9-0.6l0.9-0.6
395
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.8-0.1l0.8-0.1
396
+ l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.7h0.8h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1
397
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4L328,85l0.8,0.3l0.7,0.3l0.7,0.3l0.7,0.4
398
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.8,0.7l0.8,0.8l0.8,0.8l0.7,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.5,0.7
399
+ l0.5,0.7l0.5,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
400
+ l0.3,0.7l0.5,1.3l0.5,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.1l0.6,2l0.6,1.8l0.2,0.8l0.2,0.7l0.2,0.6l0.2,0.5l0.1,0.3
401
+ l0.1,0.2l0.4,1.1l0.5,1.2l0.5,1.2l0.5,1.2l0.5,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2
402
+ l0.4,1.2l0.4,1.3l0.4,1.2l0.4,1.3l0.4,1.2l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3l0.3,1.3
403
+ l0.3,1.3l0.3,1.3l0.2,1.1l0.1,0.2l0.1,0.3l0.1,0.5l0.2,0.7l0.2,0.8l0.2,0.9l0.2,1l0.2,1.1l0.1,0.6l0.1,0.6l0.1,0.7l0.1,0.7
404
+ l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8v0.9v0.9v1l-0.1,1.1l-0.1,1.1l-0.1,0.8l-0.1,0.7l-0.1,0.7l-0.2,0.7l-0.2,0.8l-0.2,0.5
405
+ l-0.1,0.3v0.1v0.1v0.1l-0.1,0.5l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.2,0.9l-0.2,1l-0.3,1.1l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.7
406
+ l-0.2,0.7L361,192l-0.3,0.7l-0.3,0.7l-0.3,0.8l-0.3,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.7l-0.5,0.7
407
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.7,0.8l-0.7,0.8l-0.6,0.7l-0.5,0.6l-0.4,0.5l-0.2,0.2l-0.1,0.1l-0.2,0.4
408
+ l-0.3,0.6l-0.3,0.5l-0.3,0.6l-0.5,0.9l-0.5,0.9l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8l-0.6,0.7l-0.6,0.7l-0.6,0.7l-0.6,0.7
409
+ l-0.6,0.7l-0.6,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.8,0.7l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.5,0.4
410
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.2
411
+ l-1.1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1
412
+ h-0.9H310h-0.9h-0.9h-0.9h-0.9h-1.7H303h-1.7h-1.7H298h-3.2h-1.5h-1.5h-1.5h-1.4h-1.4h-0.7h-0.7h-0.7h-0.7h-0.6h-0.6h-0.6h-0.6
413
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1L273,233l-3.6,0.7l-3.6,0.7
414
+ l-3.6,0.7l-7.2,1.5l-7.2,1.5l-7.3,1.5l-7.3,1.5l-3.7,0.8l-3.7,0.8l-3.7,0.8l-3.8,0.8l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1
415
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.7l-0.7-0.1l-0.7-0.1l-0.7-0.1
416
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.2-0.3
417
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.1-0.3l-2.2-0.5l-2-0.5l-2.1-0.5l-0.7-0.2l-0.8-0.2l-0.8-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
418
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.6-0.3l-0.9-0.5h-0.1h-0.3h-0.6l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2
419
+ l-0.7-0.2l-0.7-0.2l-0.8-0.3l-0.7-0.3l-0.3,0.3l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3l-1.2,0.2l-0.6,0.1
420
+ l-0.8,0.1l-0.9,0.1l-0.9,0.1l-1,0.1h-1.1h-1.1l-1.2-0.1l-1.2-0.2l-1.3-0.2l-1.2-0.3l-0.8-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3
421
+ l-0.7-0.3l-0.7-0.3l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.5l-0.5-0.6l-0.5-0.5l-0.5-0.6
422
+ l-0.4-0.6l-0.4-0.6l-0.5-0.7l-0.6-1l-0.6-1.1l-0.5-1.1l-0.4-1l-0.4-1l-0.3-0.9l-0.3-0.9l-0.2-0.9l-0.2-0.9l-0.2-0.8l-0.2-0.6
423
+ l-0.2-0.7l-0.2-0.8l-0.2-0.9l-0.2-0.9l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.8l-0.1-0.8l-0.1-1v-1.1V208
424
+ l0.1-1.4l0.2-1.2l0.3-1.2l0.4-1.3l0.3-0.7l0.3-0.8l0.4-0.8v-0.1l0.4-0.8l0.4-0.7v-0.1l0.7-1l0.7-0.9l0,0l0.5-0.6l0.6-0.6
425
+ l0.6-0.6l0,0l0.7-0.6l0.8-0.6l0.8-0.5h0.1l0.9-0.5l0.9-0.5l0.9-0.4l0.8-0.3l1.2-0.4l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2
426
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l1-0.1l0.9-0.1h0.9L154.3,188.6z
427
+ M353.1,204.9L353.1,204.9L353.1,204.9L353.1,204.9z"
428
+ />
429
+ </g>
430
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
431
+ <path
432
+ fill="#0096FF"
433
+ d="M100,290.7h0.6h0.6h0.6h0.6h0.6h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.2
434
+ l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.8,0.2l1.6,0.4l1.5,0.4l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.1
435
+ l0.6,0.1h0.1h0.1h0.3h0.3h0.3h0.4h0.4h0.4h0.4h0.5h0.5h0.5h0.5h1.1l1.2-0.1l1.2-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.8l0.8,0.1
436
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0,0l20.9,0h0.2h0.4h0.4l0.4,0.1l0,0
437
+ l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.5
438
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5l0,0v0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5
439
+ l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l0,0l-0.5,0.2
440
+ l-0.5,0.2l-0.5,0.1l-0.4,0.1l-0.7,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.2l-0.4,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.5,0.1h-0.5
441
+ h-0.5h-0.5h-0.9h-0.9h-0.8h-0.7h-2h-1h-1h-1h-1.1h-1.1l-1.1-0.1h-0.6h-0.6l-0.6,0l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
442
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.4-0.1H101h-0.6h-0.6l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3
443
+ l-0.4-0.3l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.2-0.2l-0.1,0.1l-0.6,0.3l-1.3,0.6l-1.3,0.7l-1.4,0.7l-0.7,0.4l-0.8,0.4l-0.8,0.3
444
+ l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.8,0.3l-0.5,0.2l-0.4,0.1l-0.4,0.1L82,315l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1
445
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L77,316h-0.5H76h-0.5h-0.6h-0.6h-0.4l-0.5-0.1l-0.5-0.1l-0.5-0.1l0,0l-0.5-0.2l-0.5-0.2
446
+ l-0.5-0.2l-0.5-0.2l-0.4-0.3l-0.4-0.3l0,0l-0.4-0.3l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.5
447
+ l-0.2-0.5l0,0l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5v-0.5v-0.5v-0.5l0.1-0.6l0,0l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5
448
+ l0.2-0.4l0.2-0.4l0.3-0.4l0,0l0.3-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.3l0,0l0.4-0.3L70,300h0.1l0.4-0.2l0.4-0.2l0.4-0.2
449
+ l0.2-0.1l0.1-0.4l0.2-0.4L72,298l0.3-0.5l0.4-0.6l0.5-0.7l0.3-0.4l0.3-0.3l0.3-0.3l0.4-0.4l0.6-0.5l0.5-0.4l0.5-0.4l0.6-0.3
450
+ l0.7-0.3l0.7-0.3l0.7-0.2l0.7-0.2l0.8-0.1h0.8h0.8l0.7,0.1l0.6,0.1l0.4,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l0.5,0.3
451
+ l0.2,0.2l0.5-0.2l0.7-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.8-0.3l0.5-0.2l0.4-0.1l0.4-0.1l0.5-0.1l0.6-0.2l0.6-0.1l0.6-0.1
452
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6L100,290.7z M79.4,310.3h0.2l-0.4-0.1L79.4,310.3z"
453
+ />
454
+ </g>
455
+ <g transform="matrix(1,0,0,1,396.607,49.2944)">
456
+ <path
457
+ d="M110.6,285.7h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.1l0.7,0.2
458
+ l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l1.1,0.5l1.1,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
459
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.6l0.6,0h0.6h0.7l1.3-0.1l1.4-0.1
460
+ l1.4-0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.2h0.3h0.3h0.3h0.3h0.3h0.7
461
+ h0.8h0.8h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
462
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4
463
+ l0.1,0.4l0.1,0.4v0.4v0.4v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
464
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.4
465
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.6,0.3
466
+ l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
467
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1H142h-0.6h-0.6h-0.6h-0.6H139h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
468
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-2.1-0.6
469
+ l-2.1-0.6l-1-0.3l-1-0.3h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.4h-0.4h-0.4H113h-0.5l-0.5,0.1l-0.5,0.1
470
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1L108,309l-0.5,0.1l-0.5,0.1l-0.5,0.1l-1,0.3l-1,0.3l-1,0.3l-1.8,0.6
471
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.9
472
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-1.8-0.1l-1.8-0.1l-0.9-0.1h-0.9h-0.8h-0.8h-0.8h-0.8h-0.8h-0.4h-0.4h-0.4h-0.4
473
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.4,0.1l-0.5,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.9,0.1h-0.9
474
+ h-1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1-0.1l-0.9-0.1h-0.5h-0.5l-0.5-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
475
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
476
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.2v-0.2v-0.3v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3
477
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.8l0.1-0.3l0.1-0.2l0.2-0.4l0.2-0.4
478
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
479
+ l0.3-0.3L55,293l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.7-0.3l1.3-0.6
480
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
481
+ l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4H71l0.3,0.1l0.3,0.1l0.2,0.1h0.1l0.4-0.1
482
+ l0.4-0.1l0.4-0.1l0.4-0.2l0.9-0.3l0.9-0.4l0.9-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.3h0.3
483
+ h0.3h0.3h0.3H82h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.7,0.3l0.7,0.3
484
+ l1.2,0.5l1.1,0.4l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.2,0.1H96h0.2h0.2h0.2h0.2H97h0.3h0.3h0.3h0.3h0.3
485
+ h0.3h0.3h0.3h0.3h0.3h0.3h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1
486
+ l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4L110.6,285.7z M115.3,302.4h0.6h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1
487
+ l0.3,0.1l0.3,0.1l0.3,0.1l1.1,0.3l1.1,0.3l2.1,0.6l2.1,0.6l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.2l1,0.2l1,0.2l0.5,0.1l0.5,0.1
488
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1
489
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
490
+ l0,0l0.1-0.1l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.2-0.4
491
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.1V298v-0.1v-0.1v-0.1v-0.1v-0.1
492
+ l0,0H156h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.2-0.1H155h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H153h-0.4h-0.4h-0.8h-0.8h-0.8h-0.4H149
493
+ h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6h-0.6h-0.6H140h-0.7
494
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1h-0.7h-0.7H133l-0.7,0h-0.7h-0.7h-0.7h-0.4h-0.4H129h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
495
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.1-0.5l-1.1-0.5l-1.1-0.4l-0.5-0.2
496
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.3
497
+ H112h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3H109h-0.3h-0.3h-0.3h-0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.5,0.1
498
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4H99h-0.4
499
+ h-0.4h-0.4h-0.4H97h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
500
+ l-0.6-0.2l-1.2-0.5l-1.2-0.5l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1l-0.4-0.1h-0.1l0,0l0,0
501
+ H83h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2
502
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.3h-0.3
503
+ h-0.1l-0.2,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3
504
+ l-1.3,0.6l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
505
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
506
+ l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.4,0.8l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.2
507
+ l-0.1,0.2l-0.1,0.2l0,0l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3H56h0.4h0.4h0.4l0.9,0.1l0.9,0.1h0.9h0.9h1h1h1h1h1h1
508
+ h0.9h0.9h0.9h0.9l0.8-0.1l0.8-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
509
+ h0.4h0.4h0.4h0.9h0.9H82h0.9h0.9h0.9l0.9,0.1l1.8,0.1l1.8,0.1l0.9,0.1l0.9,0.1h0.9h0.8h0.8h0.8h0.8h0.8h0.4h0.4h0.4h0.4h0.3
510
+ h0.3h0.3h0.3H99l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l1.8-0.6l1-0.3l1-0.3l1.1-0.3l0.6-0.2l0.6-0.2
511
+ l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L115.3,302.4z"
512
+ />
513
+ </g>
514
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
515
+ <path
516
+ fill="#0096FF"
517
+ d="M258.4,272.4h0.5h0.5h0.6h0.4h0.3h0.3h0.2h0.2h0.2l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1
518
+ l0.2,0.1l0.2,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2
519
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1h-0.1
520
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.8,0.3l-0.9,0.2
521
+ l-0.8,0.2v0.1l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
522
+ l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.2,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
523
+ l-0.5,0.1l-0.5,0.1l-0.6,0.1l-0.6,0.1l-0.7,0.1l-0.7,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
524
+ L249,286l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H248l-0.1,0.1l-0.2,0.1h-0.1h-0.1h-0.1h-0.1h-0.2
525
+ h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1H246h-0.1h-0.1h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
526
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2h-0.1l-0.8,0.1l-0.8,0.1h-0.8H240h-0.7h-0.7H238h-0.6h-0.5h-0.5h-0.3h-0.3l-0.3-0.1
527
+ l-0.2-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l0,0l-0.8,0.3l-0.9,0.3l-0.9,0.2l-0.5,0.1l-0.4,0.1
528
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4H227h-0.4h-0.4h-0.4h-0.4H225h-0.4h-0.4l-0.4-0.1
529
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.1l-0.2-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.2
530
+ l-0.1-0.2l0,0l-0.1-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.3v-0.3l0.1-0.3
531
+ l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.5
532
+ l0.4-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1
533
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.1-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2
534
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
535
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.6h0.6h0.6h0.6h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
536
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l4.8,1.4l0.9-0.1l1.1-0.1h1L258.4,272.4z"
537
+ />
538
+ </g>
539
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
540
+ <path
541
+ d="M240.3,267.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9h0.9l0.9,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
542
+ l0.8,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1
543
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2
544
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.3v0.2v0.3v0.3v0.1v0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
545
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.3
546
+ l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
547
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.2,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6
548
+ l-2.2,0.6l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1L234,291l-0.6,0.1
549
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6h-0.6h-0.6H228h-0.6h-0.6h-0.6h-0.6H225l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
550
+ L222,291l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2h-0.1l0,0h-0.1h-0.1H216h-0.2h-0.2h-0.2
551
+ h-0.2h-0.3h-0.3H214h-0.6h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
552
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3
553
+ l-0.2-0.3l-0.2-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V285v-0.1v-0.1v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3
554
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
555
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.5-0.2l0.4-0.2l0.4-0.1l0.3-0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.2l0.8-0.2
556
+ l1.5-0.4l1.4-0.4l1.3-0.3l0.4-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2V275v-0.3v-0.3v-0.3v-0.3
557
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1
558
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1
559
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1L240.3,267.1z M238.9,273.1
560
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1
561
+ l-0.6,0.1l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1
562
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1l0,0l-0.1,0.1l-0.2,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2
563
+ l0.1,0.2l0.1,0.2l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
564
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.2l-1.3,0.3l-1.4,0.4l-1.5,0.4l-0.7,0.2l-0.7,0.2
565
+ l-0.3,0.1h0.1h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
566
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
567
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l2.2-0.6l2.2-0.6l1.1-0.3l1.1-0.3
568
+ l1.1-0.3l1.1-0.3l1.2-0.3l1-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4
569
+ l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2v-0.1l-0.4-0.1
570
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1L253,273l-0.8-0.1h-0.8
571
+ l-0.8,0h-0.8H249h-0.8h-0.8h-0.8h-0.9h-0.9h-0.9H243h-0.9h-0.9h-0.9h-0.9h-0.9L238.9,273.1z"
572
+ />
573
+ </g>
574
+ <path
575
+ d="M708.1,249.1h0.2h0.1h0.1h0.1h0.2h0.1h0.1h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
576
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.1
577
+ v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
578
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
579
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
580
+ l-0.4,0.1h-0.4h-0.4H701h-0.4h-0.4h-0.4H699h-0.8h-0.9h-1h-0.2h-0.3h-0.2h-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.7-0.2
581
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1h-0.1h-0.2H692h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1H691l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
582
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
583
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V253v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
584
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1
585
+ l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.2h0.4h0.2h0.3h0.2h0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.3,0.1
586
+ l0.3,0.1l0.2,0.1h0.2h0.7h0.9h0.7h0.8h0.3h0.3h0.4h0.3h0.3h0.2h0.3h0.3h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
587
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h-0.1
588
+ V249.1z M693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9L693.9,255.9z"
589
+ />
590
+ <path
591
+ d="M698.7,232.2L698.7,232.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
592
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
593
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1
594
+ l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
595
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1H700h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1
596
+ l-0.2,0.1l-0.2,0.1l-0.3,0.2l-0.5,0.4l-0.7,0.4l-0.7,0.5l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
597
+ l-0.5,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1h-0.2h-0.3H691h-0.3h-0.2h-0.1h-0.1h-0.1h-0.1H690h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
598
+ h-0.1h-0.1h-0.1H689h-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
599
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1V241l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1
600
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1V239v-0.1v-0.1l0.1-0.1v-0.1v-0.1v-0.1l0.1-0.1
601
+ v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
602
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
603
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.2-0.1l0.3-0.1l0.2-0.2l0.3-0.2l0.4-0.2l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.3-0.2
604
+ l0.4-0.2l0.3-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.3-0.1l0.3-0.1h0.2h0.1h0.1h0.1h0.1L698.7,232.2L698.7,232.2z M699.1,238.1
605
+ L699.1,238.1L699.1,238.1L699.1,238.1L699.1,238.1z M692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4L692.9,237.4z"
606
+ />
607
+ <path
608
+ d="M688.9,250.5h0.5h0.5h0.5h0.2h0.2h0.2h0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1
609
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2l-0.1,0.2v0.2v0.2
610
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
611
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.5h-0.4H689h-0.4h-0.4h-0.5h-0.4h-0.4l-0.4,0.1l-0.5,0.1
612
+ l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3
613
+ l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1.8,0.6l-1.8,0.6l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-1,0.2
614
+ l-0.9,0.2l-0.9,0.2h-0.2h-0.2h-0.2H661h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1
615
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2
616
+ v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1
617
+ l0.2-0.1l0.2-0.1l0.2-0.1h0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6
618
+ l1.8-0.6l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.2l1-0.2l0.9-0.2l0.9-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
619
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5L688.9,250.5z"
620
+ />
621
+ <path
622
+ fill="#25B3FF"
623
+ d="M616.5,62.9h0.5h0.5h0.5h0.5L619,63l0.5,0.1l0.5,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1
624
+ l0.2,0.1l0.4,0.2l0.4,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.2l0.1,0.1h0.1h0.2h0.5h0.5h0.5h0.4h0.5l0.5,0.1l0.5,0.1l0.4,0.1
625
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.1,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1h0.1l0.2,0.2l0.2,0.2l0,0
626
+ l0.2,0.2l0.1,0.3l0,0l0.1,0.3l0.1,0.3l0,0v0.4v0.4l0,0l-0.1,0.3l-0.1,0.3l0,0l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2h-0.1
627
+ l-0.2,0.3h-0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
628
+ l-0.6,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.1l-1.1,0.2l-0.9,0.2l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-1,0.1h-0.1l-0.4,0.3l-0.5,0.4
629
+ l-0.5,0.4l-0.2,0.1l0.3-0.1h0.2l0.3-0.1h0.3h0.3l0,0h0.4l0.4,0.1l0.3,0.1l0.4,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3
630
+ l0.1,0.3l0.1,0.1h0.4l1.1-0.1l2.3-0.3l1.1-0.1l1.2-0.1l1.2-0.1l1.2-0.1l0.5-0.1h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.1h0.4h0.1
631
+ l0.3,0.1l0.3,0.1h0.1l0.3,0.1l0.2,0.2l0.3,0.2l0,0l0.2,0.2l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0,0l0.1,0.3v0.3v0.4l-0.1,0.4l0,0
632
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.1,0.1l-0.2,0.1l-0.2,0.1
633
+ l-0.3,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-1.3,0.6l-0.9,0.5l-0.8,0.4l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2
634
+ l-0.5,0.2l-0.6,0.2l-1.4,0.4l-0.4,0.1l-0.4,0.1l-0.9,0.2l-0.9,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3L622,87l0.1,0.1h0.1l0.1,0.3
635
+ l0.1,0.1l0.1,0.3v0.1l0.1,0.2l0.1,0.3l0.1,0.3l0,0V89l-0.1,0.3l-0.1,0.3l-0.1,0.3h-0.1l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2
636
+ l-0.2,0.2l0,0l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l0,0h-0.1l0,0l-0.3,0.4l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.9,1.2
637
+ l-0.9,1.3l-0.9,1.3l-0.5,0.7l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
638
+ l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.3,0.1h-0.1l-0.2,0.1H609h-0.3h-0.2h-0.2H608h-0.1
639
+ h-0.3h-0.2l-0.3-0.1H607l-0.4-0.1h-0.1l-0.4-0.1l-0.1-0.1l-0.3-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2l-0.1-0.1l-0.2-0.2
640
+ l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.7,0.8l-0.7,0.8
641
+ l-0.4,0.4l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.3,0.2H599l-0.2,0.1l-0.2,0.1h-0.1h-0.2
642
+ h-0.2H598h-0.2h-0.2h0.4h-0.3h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.2-0.2
643
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1l-0.1-0.3v-0.2l-0.1-0.3v-0.3V100v-0.1l-0.4,0.4l-0.6,0.9l-0.3,0.4
644
+ L593,102l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
645
+ l-0.3,0.2h-0.1l-0.2,0.1l-0.3,0.1h-0.1l-0.4,0.1h-0.4H588h-0.3h-0.4l0,0l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2
646
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l-0.1-0.2l0,0l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.3l-0.1-0.3V103v-0.2l-0.1,0.2l-0.2,0.4l-0.3,0.4
647
+ l-0.2,0.4l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1
648
+ l-0.1,0.1l-0.3,0.1h-0.1l-0.3,0.1h-0.2h-0.3h-0.3h-0.3h-0.2h-0.2h-0.2l-0.3-0.1h-0.1l-0.3-0.1h-0.1l-0.2-0.1l-0.2-0.1l0,0
649
+ l-0.2-0.1l-0.2-0.2h-0.1l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2V104
650
+ l-0.1-0.1v-0.3v-0.3V103v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.6l0.1-0.6l0.2-0.7l0.2-0.7l0.4-1.4l0.5-1.5l0.2-0.7
651
+ l0.2-0.6l-0.6,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.2,0.1l-0.6,0.7l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.4,0.5
652
+ l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
653
+ l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1H564h-0.2h-0.3h-0.2H563h-0.2l-0.3-0.1h-0.2l-0.3-0.1h-0.1
654
+ l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
655
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.3l-0.1-0.1V101v-0.2v-0.3l0,0h-0.2h-0.4l-0.4-0.1l-0.5-0.1l-0.2-0.1l-0.2-0.1
656
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1H555h-0.3h-0.2h-0.2h-0.2H554h-0.3h-0.1
657
+ l-0.3-0.1l0,0l-0.4-0.1l0,0l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.2l0,0
658
+ l-0.2-0.3l-0.1-0.3l0,0l-0.1-0.2l-0.1-0.1l-0.3,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
659
+ l-0.3,0.1H547h-0.4h-0.4h-0.3h-0.2h-0.2l-0.3-0.1h-0.1l-0.4-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2
660
+ l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3h-0.1l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2V96l0,0v-0.2l0,0l-0.4,0.3
661
+ l-0.8,0.6l-0.8,0.6l-1.7,1.2l-1.7,1.2l-0.8,0.6l-0.9,0.6l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3
662
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
663
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1h-0.2h-0.2H521h-0.1h-0.3h-0.4l0,0H520l-0.2-0.1l-0.2-0.1h-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2
664
+ l-0.2-0.2l0,0l-0.2-0.2l-0.2-0.3l-0.1-0.2l-0.3-0.2l-0.2-0.3l0,0l-0.2-0.3l-0.1-0.3l-0.1-0.1l-0.1-0.3l-0.1-0.3l-0.1-0.1v-0.2
665
+ l-0.1-0.2v-0.2v-0.4l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2
666
+ l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.4-0.3l0.3-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.7-0.3l1.2-0.6
667
+ l0.6-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.6l1.1-0.6
668
+ l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l2.2-1.1l2.2-1.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.1l0.9-0.5
669
+ l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.2-0.1l0.2-0.1l0.2-0.1l0,0
670
+ l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.3,0.2l0.4,0.2l0.2,0.2l0.2,0.3l0.1,0.1l2.1-0.4l4.8-1l2.3-0.5l2.3-0.5l0.4-0.2l0.4-0.2
671
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1h0.2h0.4h0.1h0.3h0.2h0.1h0.2l0.3,0.1l0,0l0.2,0.1l0.1-0.1
672
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.3-0.2
673
+ l0.2-0.2l0.5-0.3l0.6-0.3l0.4-0.2l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2l0.2-0.2l0,0l0.2-0.2l0.2-0.2l0,0l0.3-0.2l0.1-0.1
674
+ l0.2-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.6-0.1l0.7-0.1l1.2-0.2l1.2-0.2l0.5-0.1l0.6-0.1
675
+ l0.5-0.1l0.2-0.2l0.6-0.4l0.6-0.4l0.5-0.4l0.6-0.3l0.5-0.3l0.9-0.6l0.8-0.5l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.3l0.5-0.3l0.5-0.4
676
+ l0.5-0.4l0.5-0.4l0.6-0.4l0.5-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.1h0.2h0.4h0.2h0.4
677
+ h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.2l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0
678
+ l0.1,0.2l0.4-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.6h0.5h0.5
679
+ L616.5,62.9z M609.5,90.5L609.5,90.5l0.1,0.4l0.1,0.2l0.1,0.3v0.2l0.1,0.2v0.4l0,0.4V93v0.4l-0.1,0.4l-0.1,0.8l-0.1,0.9
680
+ l-0.1,0.9l-0.1,0.1l0.3-0.4l0.5-0.6l0.4-0.6l0.5-0.6L612,93l0.9-1.3l0.4-0.6l0,0l-0.3,0.1l-0.2,0.1l-0.3,0.1h-0.2H612h-0.1h-0.2
681
+ h-0.2h-0.1l-0.3-0.1l-0.3-0.1h-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.2-0.2l-0.2-0.2L609.5,90.5L609.5,90.5z M586.1,91.5L586.1,91.5
682
+ l-0.5,0.3l0,0l-0.1,0.4v0.2l0.2-0.3L586.1,91.5l0.1-0.1L586.1,91.5z M599.9,89l-0.8,0.1l-0.1,0.1l-0.5,0.3l-0.4,0.3l-0.5,0.3
683
+ l-0.3,0.2h0.3h0.2h0.4h0.1h0.2h0.2h0.1l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1v-0.2l0.1-0.3l0.2-0.3l0.1-0.3l0,0l0.2-0.2l0.1-0.2
684
+ l0,0L599.9,89z"
685
+ />
686
+ <path
687
+ fill="#25B3FF"
688
+ d="M474.6,336.5h0.3h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.5,0.3
689
+ l0.5,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.3,0.2l0.1,0.1l0.1,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
690
+ l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l1.8,0.4l0.8,0.2l0.8,0.2l0,0l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2l0.5,0.1
691
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2
692
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
693
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.2,0.1
694
+ l-0.2,0.1h-0.1h-0.2h-0.2h-0.2h-0.3h-0.2h-0.3h-0.2H493l-0.5-0.1l-0.5-0.1v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
695
+ l-0.1,0.2l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2l0,0h-0.2h-0.1h-0.2h-0.6
696
+ h-0.6h-0.5h-0.6l-1.2,0.1h-1.2h-0.6h-0.7h-0.6h-0.7h-0.7h-0.7l-0.7-0.1h-0.1H479h-0.8h-0.8h-0.8h-0.8h-1.5h-1.5h-1.5h0.7
697
+ l-0.9,0.4l-1.1,0.5l-0.7,0.3l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.5,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
698
+ l-0.2,0.1l-0.3,0.1l-0.2,0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.1h-0.1h-0.2h-0.2h-0.1h-0.1h-0.2h-0.2l-0.2-0.1l-0.2-0.1h-0.1
699
+ l-0.4,0.1l-0.6,0.2l-0.6,0.1l-0.4,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.4H460h-0.3h-0.3H459h-0.3h-0.4h-0.2h-0.2h-0.2h-0.1h-0.1h-0.2
700
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2
701
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2L455,351v-0.2v-0.2l0,0v-0.2l0.1-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0,0
702
+ l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.2-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2
703
+ l0.4-0.2l0.5-0.2l0.8-0.3l0,0l0.1-0.2l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
704
+ l0.1-0.1l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.8-0.4l0.7-0.3l0.2-0.1
705
+ l0,0l1.2-0.6l0.8-0.4l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.2-0.1h0.1l0,0v-0.1v-0.1v-0.2v-0.1l0.1-0.2v-0.2v-0.1l0.1-0.1
706
+ v-0.1l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1
707
+ l0.3-0.1h0.2h0.3L474.6,336.5z"
708
+ />
709
+ <path
710
+ fill="#25B3FF"
711
+ d="M632.9,316.7h0.5h0.5h0.4h0.2h0.2l0.2,0h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.2,0.1
712
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2v0.2v0.2l-0.1,0.2v0.2
713
+ l-0.1,0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1
714
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2l-0.4,0h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4,0.1
715
+ l-0.4,0.1l-0.4,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.3,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
716
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.2l-0.7,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.5,0.1
717
+ l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-7,0.8h-0.5h-0.6h-0.5h-0.6h-0.8h-0.2h-0.2h-0.2h-0.2h-0.2l-0.1-0.1l-0.2-0.1l-0.2-0.1
718
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
719
+ l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
720
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.4h0.4h0.4h0.4
721
+ l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.5-0.1
722
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1h0.6h0.6h0.6h0.6l1.2-0.1h1.1h0.4l1.3-0.3l1.7-0.4l0.9-0.2l0.8-0.2l0.9-0.2l0.9-0.2l0.9-0.2
723
+ l0.9-0.2l0.9-0.2l0.9-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.5L632.9,316.7z"
724
+ />
725
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
726
+ <path
727
+ d="M208.6,8l0.8,0h0.8l0.8,0h0.8l0.8,0h0.8l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.1
728
+ l0.8,0.1l0.8,0.1l0.8,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2
729
+ l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3L239,14l0.8,0.3l1.5,0.6l1.5,0.6l1.5,0.6l1.4,0.6l1.4,0.6
730
+ l1.4,0.6l1.3,0.6l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.9,0.4
731
+ l0.9,0.3l0.9,0.3l0.9,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2,0.6l2.1,0.6l2.1,0.6l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.4l1.1,0.4l1.1,0.4
732
+ l1.1,0.4l1.1,0.4l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.6,0.2L284,31l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.5,0.3l0.5,0.3l0.9,0.5
733
+ l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6
734
+ l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6
735
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7
736
+ l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.6,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7
737
+ l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.7l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8l0.5,0.8
738
+ l0.5,0.8l0.5,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8
739
+ l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.9l0.4,0.9l0.7,1.7l0.7,1.7l0.7,1.7l0.7,1.8
740
+ l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.6,1.8l0.5,1.9l0.5,1.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
741
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.3,0.8l0.3,0.7l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.8,1.6l0.4,0.8l0.4,0.8l0.4,0.9
742
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5
743
+ l0.1,0.5l0.1,0.5l0.1,0.6l0.1,0.5l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6v0.6v0.6v0.6v0.5l-0.1,0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8
744
+ l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.1H360l-0.9-0.1l-0.9-0.3l-0.8-0.4l-0.7-0.5l-0.7-0.6l-0.6-0.7l-0.4-0.8
745
+ l-0.3-0.8l-0.2-0.9l-0.1-0.9v-0.4v-0.3v-0.3v-0.3V153v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
746
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.3-0.7l-0.3-0.7
747
+ l-0.4-0.7l-0.4-0.7l-0.4-0.8l-0.4-0.8l-0.8-1.6l-0.4-0.8l-0.4-0.8l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.2-0.5
748
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.5-1.8l-0.5-1.8l-0.5-1.8l-0.5-1.7
749
+ l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.7l-0.6-1.6l-0.6-1.6l-0.7-1.6l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
750
+ l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.7l-0.4-0.7
751
+ L331,94l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7L327,87l-0.4-0.7l-0.4-0.7l-0.4-0.7
752
+ l-0.4-0.7l-0.4-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
753
+ l-0.5-0.6l-0.5-0.6L318,74l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.5-0.6l-0.6-0.6
754
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6
755
+ l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5
756
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5
757
+ l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
758
+ l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.9-0.4l-0.9-0.4l-0.9-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2-0.6
759
+ l-2.1-0.6l-2.1-0.6l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.6-0.2l-0.5-0.2l-0.5-0.2
760
+ l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1.1-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.2-0.6l-1.3-0.6l-1.3-0.6l-1.3-0.6
761
+ l-1.3-0.5l-1.4-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.2l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L230,24l-0.7-0.2
762
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L223,22l-0.7-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1
763
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.1h-0.6h-0.6h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
764
+ h-0.6h-0.5l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
765
+ l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
766
+ l-0.9,0.3l-0.9,0.3l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4
767
+ l-0.9,0.4l-0.9,0.4l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-3.4,1.9l-3.4,1.9l-0.5,0.3
768
+ l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-1.2,0.5l-1.2,0.5l-1.2,0.5l-1.2,0.4
769
+ l-1.2,0.4l-2.3,0.9l-2.3,0.8l-1.1,0.4l-1.1,0.4L132,51l-1.1,0.4l-1.1,0.4l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
770
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
771
+ l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-1.1,1.1l-1.2,1.2l-2.3,2.3l-2.4,2.3l-2.4,2.3
772
+ l-4.7,4.6l-2.3,2.3l-2.3,2.3L99,77.9L97.8,79l-1.2,1.1l-1.1,1.2l-1.1,1.1l-1.1,1.2l-1.1,1.2L91.1,86L90,87.2l-1.1,1.2l-1.1,1.2
773
+ l-1.1,1.2L85.6,92l-1.1,1.2l-1.1,1.2l-1,1.2l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.2
774
+ l-0.9,1.2l-0.9,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.2l-0.8,1.3l-0.8,1.3l-0.8,1.3
775
+ l-0.8,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.7,1.3l-0.6,1.3l-0.6,1.3
776
+ l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.6,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.5,1.4l-0.4,1.4
777
+ l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.4,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.3,1.4l-0.2,1.4l-0.1,0.7
778
+ l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7l-0.1,0.7
779
+ l-0.1,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7L42,187l-0.2,0.7l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
780
+ l-0.2,0.6l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.5,1.1l-1,2.2l-0.1,0.3l-0.2,0.3l-0.3,0.7l-0.2,0.4l-0.2,0.4l-0.2,0.4
781
+ l-0.2,0.4l-0.2,0.4l0,0v0.1v0.9l-0.2,0.9l-0.3,0.8l-0.4,0.8l-0.5,0.7l-0.6,0.6l-0.7,0.5l-0.8,0.4l-0.8,0.3l-0.9,0.2h-0.9
782
+ l-0.9-0.1l-0.9-0.2l-0.8-0.4l-0.7-0.5l-0.7-0.6l0,0l-0.6-0.6l0,0l-0.4-0.7l0,0l-0.3-0.7v-0.1l-0.2-0.6l-0.1-0.3l-0.1-0.5
783
+ l-0.1-0.5v-0.5v-0.7l0.1-0.6l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.1-0.4l0.3-0.6l0.3-0.6l0.3-0.6
784
+ l0.3-0.5l0.2-0.5l0.4-0.7l0.1-0.1l0.9-2l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
785
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.7l0.1-0.8
786
+ l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.1-0.8l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.3-1.5l0.4-1.5l0.4-1.5
787
+ l0.4-1.5l0.4-1.5l0.4-1.5l0.4-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.5-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5l0.6-1.5
788
+ l0.6-1.5l0.6-1.5l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4l0.8-1.4
789
+ l0.8-1.4l0.8-1.4l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.3l0.9-1.2l0.9-1.2l0.9-1.2
790
+ l0.9-1.2l0.9-1.2l0.9-1.2l1-1.2l1-1.2l1-1.2l1-1.1l1.1-1.3l1.1-1.3l1.1-1.3l1.1-1.2l1.1-1.2l1.1-1.2l1.1-1.2l1.2-1.2l1.2-1.2
791
+ l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l1.2-1.2l2.4-2.3l2.4-2.3l4.7-4.6l2.3-2.3l2.3-2.3l2.3-2.3l1.1-1.1l1.2-1.2
792
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.3l0.6-0.3l0.6-0.3
793
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.3l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5
794
+ l1.2-0.4l2.3-0.9l2.3-0.8l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.4-0.2
795
+ l0.4-0.2l0.4-0.2l0.4-0.2l3.4-1.8l3.4-1.9l1.7-0.9l1.7-0.9l1.7-0.9l1.8-0.9l1.8-0.9l1.8-0.9l1.8-0.9L167,22l0.9-0.4l0.9-0.4
796
+ l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4L176,18l0.9-0.4l0.9-0.4l0.9-0.4l0.9-0.4l1-0.4l1-0.4l1-0.4l1-0.4
797
+ l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1
798
+ l1-0.1l1.1-0.1l0.8-0.1l0.8-0.1L208.6,8z M35.3,198.2l-0.1-0.2l-0.1-0.1L35.3,198.2z M34.9,197.7l-0.2-0.3l-0.3-0.3L34.9,197.7
799
+ z"
800
+ />
801
+ </g>
802
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
803
+ <path
804
+ d="M223.3,0.9l1.4-0.1l1.4-0.1l1.4-0.1l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0l1.4,0.1
805
+ l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.2
806
+ l1.4,0.2l1.4,0.2l1.4,0.2l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4
807
+ l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.4l1.3,0.5L292,10l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.5l1.3,0.6l1.3,0.6l1.2,0.6l1.2,0.6l1.2,0.6
808
+ l1.2,0.6l1.2,0.6l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.7l1.2,0.8l1.1,0.8l1.1,0.8l1.1,0.8l0.6,0.4l0.6,0.4l0.6,0.4
809
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.5l0.5,0.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5
810
+ l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.6
811
+ l0.5,0.5l0.5,0.6l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
812
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.1l0.1,0.2
813
+ l0.1,0.1l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.5,0.4l0.5,0.4l1,0.9l1.1,1l0.6,0.5l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6
814
+ l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5
815
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.5,0.8
816
+ l0.5,0.8l0.5,0.8l0.5,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l0.6,0.8l1.3,1.7l1.3,1.7l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9l0.7,0.9
817
+ l0.7,0.9l0.7,1l0.7,1l0.6,1l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7
818
+ l0.3,0.7l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2
819
+ l0.4,1.2l0.3,1.2l0.3,1.2l0.3,1.2l0.6,2.3l0.6,2.3l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5
820
+ l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.6l0.2,0.4l0.2,0.5l0.2,0.4
821
+ l0.2,0.5l0.3,0.9l0.3,1l0.4,1.1l0.4,1.1l0.4,1.2l0.4,1.3l0.8,2.7l0.9,2.8l0.9,2.9l0.9,2.9l0.4,1.4l0.4,1.4l0.4,1.3l0.4,1.3
822
+ l0.4,1.2l0.4,1.1l0.4,1l0.3,0.9l0.2,0.4l0.1,0.3l0.1,0.1l0.7,0.9l0.6,0.9l0.5,1l0.4,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1
823
+ l-0.3,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l0,0l-0.8,0.6l-0.8,0.5l0,0l-0.9,0.4l-1,0.3l0,0l-1,0.2l-1,0.1l0,0h-1l-1-0.1h-0.1
824
+ l-0.7-0.2l-0.7-0.2h-0.1l-0.6-0.3l-0.6-0.3h-0.1l-0.9-0.6l-0.3-0.3l-0.6-0.5l-0.5-0.5l-0.4-0.4l-0.3-0.4l-0.4-0.6l-0.4-0.6
825
+ l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.4-1.1l-0.4-1.2l-0.4-1.3l-0.4-1.3l-0.5-1.4
826
+ l-0.5-1.4l-0.5-1.4l-0.5-1.5l-0.9-3l-0.9-2.9l-0.9-2.8l-0.8-2.6l-0.4-1.2l-0.4-1.1l-0.3-1l-0.3-0.9l-0.3-0.7l-0.2-0.6l-0.1-0.2
827
+ l-0.1-0.1l0,0l0,0l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7
828
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.4-1.3l-0.4-1.3l-0.4-1.3l-0.4-1.2l-0.3-1.2l-0.3-1.2l-0.3-1.2l-0.6-2.3l-0.6-2.3L366,118
829
+ l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
830
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.5l-0.2-0.4L361,104l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L360,102
831
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-0.6-0.8l-1.3-1.7
832
+ l-1.3-1.7l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-0.9l-0.7-1l-0.7-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
833
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.2-0.5l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
834
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
835
+ l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-1.1-1l-1.1-1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.6l-0.6-0.7l-0.6-0.7l-0.3-0.4
836
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.4-0.6l-0.3-0.5l-0.3-0.5l-0.3-0.5
837
+ l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
838
+ l-0.4-0.5l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
839
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
840
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.4l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.9-0.7l-0.9-0.6
841
+ l-0.9-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5l-1.1-0.5
842
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4L278,23l-1.2-0.3l-1.2-0.3l-1.2-0.3
843
+ l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.3l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
844
+ l-1.2-0.2l-1.2-0.2l-1.2-0.1l-1.2-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1H241
845
+ l-1.3,0h-1.3h-1.3h-1.3h-1.3l-1.3,0h-1.3h-1.3h-1.3H228l-1.3,0l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1
846
+ l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.2l-1.3,0.2l-1.3,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
847
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3
848
+ l-1.3,0.3l-1.3,0.3l-1.3,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.2,0.4l-1.1,0.4l-1.1,0.4
849
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5l-1,0.5
850
+ l-1,0.5l-1,0.5l-1,0.5l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6
851
+ l-0.9,0.6l-0.9,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
852
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7L127,55l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
853
+ l-0.7,0.8l-0.1,0.1l-0.1,0.2l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.5,0.9l-0.5,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9l-0.6,0.9
854
+ l-0.6,0.9l-0.6,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.8
855
+ l-0.7,0.8l-0.7,0.8l-0.7,0.8l-1.5,1.6l-1.5,1.6l-1.5,1.6l-1.1,1.2l-0.2,0.3l-1.4,2l-1.4,2l-1.4,2l-1.4,2l-2.8,4.1l-2.9,4.1
856
+ l-2.9,4.2l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.5,2.1l-1.2,1.7l-0.4,0.9l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2
857
+ l-0.9,2.5l-0.9,2.5l-0.9,2.5l-0.9,2.6l-0.9,2.6l-1.8,5.2l-0.9,2.6l-0.9,2.6l-0.9,2.6l-1,2.6l-1,2.6l-0.5,1.3l-0.5,1.3l-0.5,1.3
858
+ l-0.5,1.3l-0.5,1.3l-0.5,1.4l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9l-0.4,0.9
859
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-1.8,3l-0.9,1.5l-0.8,1.5
860
+ l-0.2,0.3l-0.2,0.4l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.6,1.4l-1.4,3l-0.7,1.5l-0.7,1.5l-0.4,0.7l-0.3,0.7l-0.3,0.7
861
+ l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.5l-0.5,0.5l-0.3,0.3l-0.7,0.6l-0.1,0.1l-0.5,0.4
862
+ l-0.6,0.4h-0.1l-0.7,0.3l-0.7,0.3l0,0l-0.6,0.2l-0.6,0.2l0,0l-0.7,0.1l-0.7,0.1l0,0h-0.9l-0.9-0.1l0,0l-0.9-0.2l-0.9-0.3l0,0
863
+ l-0.9-0.4l-0.8-0.5l0,0l-0.6-0.5l-0.6-0.5l0,0l-0.5-0.5l-0.5-0.6l0,0l-0.5-0.7l-0.4-0.7v-0.1l-0.3-0.7l-0.2-0.7v-0.1l-0.2-1
864
+ l-0.1-0.5l-0.1-0.8v-0.6v-0.6v-0.4l0.1-1.1l0.3-1.1l0.4-1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l0.3-0.2l0.5-1.1l0.7-1.4l1.2-2.6v-0.1
865
+ v-0.5v-0.7V188v-0.7v-0.7v-0.7l0-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
866
+ l0.1-0.7l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7
867
+ l0.2-0.7l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.6-1.4l0.7-1.4l0.7-1.4
868
+ l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.4l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.2
869
+ l0.8-1.2l0.8-1.2l0.8-1.2l0.3-0.4l0.6-1.1l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9l0.5-0.9
870
+ l0.5-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.6-0.9l0.4-0.7l0.2-0.5l0.6-1.3l0.6-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3l0.7-1.3
871
+ l0.7-1.3l0.7-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.8-1.3l0.9-1.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
872
+ l0.5-0.7l0.5-0.7l0.5-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7
873
+ l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.7l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l0.6-0.6l1.5-1.5l0.9-0.9l1-1l1-1l1.1-1
874
+ l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.6-0.4l0.4-0.2l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3
875
+ l0.6-0.3l0.8-0.3l0.5-0.1l1-0.2h0.1l0,0l0.2-0.2l0.8-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8
876
+ l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l1-0.8l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1.1-0.7
877
+ l1.1-0.7l1.1-0.7l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.1-0.6l1.2-0.6l1.2-0.6l1.2-0.5l1.2-0.5l1.2-0.5
878
+ l1.2-0.5l1.2-0.5l1.2-0.5l1.2-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.5l1.3-0.4L170,9l1.3-0.4l1.3-0.4l1.4-0.4l1.4-0.4l1.4-0.4
879
+ l1.4-0.4l1.4-0.4l1.4-0.3l1.4-0.3l1.4-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
880
+ l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.4-0.2l1.4-0.2l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1
881
+ l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1L223.3,0.9z M388.7,162.8l-0.7,0.6l0.9-0.7l0.8-0.4L388.7,162.8z M390.5,161.8l-0.5,0.3
882
+ l0.9-0.4L390.5,161.8z M392.2,161.4l0.4-0.1h-0.2L392.2,161.4z"
883
+ />
884
+ <path
885
+ d="M156.3,235.9l1.3-0.1l1.3-0.1h1.4h1.3h1.3h1.4h1.3h1.4h1.3h1.3h1.3h1.3h1.3h1.3l1.3,0.1l1.3,0.1l1.3,0.1
886
+ l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.7,0.2l2.6,0.2l2.6,0.2l5.3,0.4l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l1.3,0.1l1.3,0.1
887
+ l1.3,0.1l1.3,0.1h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.2h1.2l1.2,0h1.2h1.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
888
+ l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2l1.1-0.2l1.1-0.2l0.9-0.2l0.9-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.3l1-0.3l1-0.3l1-0.3
889
+ l2.1-0.6l2.1-0.6l2.1-0.6l4.3-1.3l2.2-0.6l2.2-0.6l2.2-0.6l2.3-0.6l1.1-0.3l1.1-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3l1.2-0.3
890
+ l1.2-0.3l1.2-0.3l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
891
+ l1.2-0.1h1.2h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
892
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l2.6,0.5l2.6,0.5l5.4,1.1l2.8,0.6l2.8,0.6l2.9,0.6l2.9,0.6l2.9,0.6l3,0.6l1.5,0.3
893
+ l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.3l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2l1.5,0.2
894
+ l1.5,0.2l1.5,0.2l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.5,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1h1.4h1.4h1.4h1.4h1.4h1.3l1.3-0.1
895
+ h0.6h0.7h0.7h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
896
+ l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1-0.1l1-0.1l1-0.1l1-0.1l2-0.1l1.9-0.1h0.9
897
+ l0.9-0.1l0.9-0.1l0.8-0.1l0.8-0.1h0.4h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
898
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1
899
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1v-0.1
900
+ v-0.1v-0.1v-0.1v-0.1V228l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1
901
+ v-0.1v-0.1v-0.1v-0.1V227v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
902
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.1l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
903
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
904
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3
905
+ l-0.9-0.3l-1.7-0.6l-1.8-0.6l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.8-0.3l-0.8-0.2l-0.8-0.2l-0.3-0.1l-0.8,0.4l-0.5,0.2
906
+ l-0.6,0.3l-0.7,0.2l-0.4,0.1l-0.9,0.2l-0.9,0.1l0,0h-1l-0.9-0.1l-0.9-0.2l-0.9-0.3l0,0l-1.1-0.5l-1-0.6l-0.9-0.7l-0.8-0.9
907
+ l-0.7-1l0,0l-0.5-0.9l-0.4-1l-0.3-1l-0.1-1v-1l0,0l0.1-1.1l0.2-1.1l0.4-1l0,0l0.4-0.8l0.5-0.8v-0.1l0.7-0.8l0.2-0.3l0.3-0.3
908
+ l0.9-0.8l1-0.7l1.1-0.5l1.2-0.4h0.1l0.2-0.1l0.7-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.1l0.7-0.1l0.8-0.1
909
+ l0.8-0.1h0.6h0.5l0.6,0.1l0.5,0.1l0.7,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.3l1.1,0.3l1,0.3l1,0.3l1,0.3l1,0.3
910
+ l1,0.3l1.8,0.6l1.7,0.6l0.8,0.3l0.8,0.3l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
911
+ l0.7,0.3l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5
912
+ l0.6,0.5l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.7l0.6,0.7l0.3,0.4l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4
913
+ l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.5l0.1,0.5
914
+ l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.5
915
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
916
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5
917
+ l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2
918
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
919
+ l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1.1,0.1l-1,0.1l-2,0.1l-1.9,0.1h-0.9l-0.9,0.1l-0.8,0.1l-0.8,0.1h-0.3h-0.4h-0.3h-0.3h-0.3
920
+ l-0.3,0.1H414l-0.3,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
921
+ l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.8h-0.8h-0.8h-0.8l-1.5,0.1h-1.5h-1.5h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1
922
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2
923
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.6-0.3l-1.5-0.3l-1.5-0.3l-1.5-0.3l-3-0.6l-3-0.6
924
+ l-3-0.6l-2.9-0.6l-2.9-0.6l-2.8-0.6l-5.4-1.1l-2.6-0.5l-2.5-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
925
+ l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-1l-1,0.1l-1,0.1l-1,0.1
926
+ l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1.1,0.2l-1.1,0.2l-1.1,0.3l-1.1,0.3
927
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-2.2,0.6l-4.3,1.3l-2.2,0.6l-2.2,0.6l-2.2,0.6l-1.1,0.3
928
+ l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.2l-1.1,0.2l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2
929
+ l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0h-1.4h-1.4h-1.4
930
+ h-1.4H220h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2l-2.7-0.2
931
+ l-5.3-0.4l-2.6-0.2l-2.6-0.2l-2.6-0.2l-2.6-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.2-0.1h-1.2h-1.2H167h-1.2
932
+ h-1.2h-1.2h-1.2H161h-1.2h-1.2h-1.3h-1.2h-1.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-2.6,0.2l-2.6,0.2l-2.6,0.2
933
+ l-2.6,0.2l-5.3,0.4l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1
934
+ l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1
935
+ l-1.4-0.1l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.4-0.2l-1.3-0.2l-1-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1
936
+ l-0.9-0.1L69,253l-0.9-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1l-2-0.1l-2-0.1l-2-0.1l-2-0.1h-2h-2l-4.1-0.1l-2.1-0.1
937
+ l-2.1-0.1l-2.1-0.1l-2.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
938
+ l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2l-1.1-0.2
939
+ l-1.1-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2L7,246.9l-0.7-0.2l-0.7-0.2L5,246.2l-0.6-0.3l-0.6-0.3l-0.6-0.3
940
+ L2.6,245L2,244.7l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4
941
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
942
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6l0-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.5
943
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4
944
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
945
+ l0.3-0.4l0.4-0.4l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.7-0.7l0.8-0.7l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
946
+ l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.4l0.7-0.4l0.1-0.1l0,0l0,0h0.1h0.1l0,0l0.2-0.1l0.2-0.2l0.2-0.2
947
+ l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.8-0.8l0.9-0.8l0.9-0.9l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.5l0.6-0.5l0.6-0.5
948
+ l0.6-0.5l0.6-0.5l0.7-0.5l0.7-0.5l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.3-0.2l1.1-0.5l1.2-0.3l1.2-0.2
949
+ h1.2l1.2,0.2l1.2,0.3l1.1,0.5l1,0.6l0.9,0.8l0.8,0.9l0.7,1l0.6,1.1l0.4,1.1l0.2,1.2l0.1,1.2l-0.1,1.2l-0.3,1.2l-0.4,1.1
950
+ l-0.6,1.1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.6l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2
951
+ l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.9,0.9l-0.9,0.9l-0.5,0.5
952
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.5l-0.6,0.4l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
953
+ l-0.3,0.2l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.3l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4l-0.6,0.4
954
+ l-0.6,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
955
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2L9.6,225l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L9.1,226
956
+ L9,226.2l-0.1,0.2l-0.1,0.2l-0.1,0.2L8.6,227l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1l0,0l0,0l0,0
957
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1
958
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
959
+ l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l0.9,0.1l1,0.1l1,0.1
960
+ l1,0.1l1,0.1h1h1l2,0.1l2,0.1l2,0.1l2,0.1l4.1,0.1h2.1h2.1l2.1,0.1l2.1,0.1l2.1,0.1l2.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
961
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.2l1,0.2l1.2,0.2l1.2,0.2l1.2,0.2
962
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1h1.2h1.2h1.2h1.3h1.3h1.3h1.3h1.3h1.3h1.3h1.3
963
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l2.6-0.2l2.6-0.2l2.6-0.2l2.6-0.2l2.7-0.2l5.3-0.4l2.7-0.2l2.7-0.2
964
+ l2.7-0.2l2.7-0.2l1.4-0.1l1.3-0.1l1.3-0.1L156.3,235.9z M411.9,211.1L411.9,211.1l0.5-0.6l0.1-0.1L411.9,211.1z"
965
+ />
966
+ </g>
967
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
968
+ <path
969
+ d="M6,210.5h0.6h0.6h0.6H9h1.2h1.1h1.1l1.1,0h1h1l1.9,0.1h0.8H19h0.7h0.6l1,0.1l0.9,0.2l0.9,0.4l0.8,0.5
970
+ l0.7,0.7l0.6,0.8l0.5,0.9l0.3,0.9l0.2,1v1l-0.2,1l-0.3,0.9l-0.5,0.9l-0.6,0.8l-0.7,0.7l-0.8,0.5l-0.9,0.4l-0.9,0.2l-1,0.1h-0.7
971
+ h-0.8H18h-0.9l-1.8-0.1h-1h-1h-1l-1,0h-1h-1h-1H7.8H7.3H6.8H6.3H5.8H5.3H4.8H4.3l-0.5,0.1l-0.4,0.1L3,222.8l-0.4,0.1L2.2,223
972
+ l-0.4,0.1l-0.4,0.1L1,223.3l-0.4,0.1l-0.3,0.1L0,223.6l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l0,0l0.2,0.2l0.2,0.2
973
+ l0.2,0.2l0.2,0.1l0.3,0.1L0,225l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l1.6,0.7l1.6,0.7l1.6,0.7l1.7,0.7l1.7,0.7
974
+ l0.8,0.3l0.9,0.3L12,230l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.2l0.9,0.2l0.8,0.2
975
+ l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.4H31h0.4h0.5h0.5h0.5
976
+ h0.5h0.5h0.5h0.5h0.5h1.1h1.1h1.1l1.1-0.1L41,235l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
977
+ l1.2-0.2l1.2-0.2l2.3-0.3l2.2-0.3l4-0.6l0.5-0.1l0.5-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1h0.9h0.9H70h0.9h0.9h0.9h0.9l1.7,0.1
978
+ l1.7,0.1l1.6,0.1h1.6H81h0.8h0.8h0.8h0.8h0.7h0.7h0.7H87l0.7-0.1l0.7-0.1h0.3h0.4l1.7-0.2l1.8-0.2l1.8-0.2l1.8-0.2L98,231
979
+ l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.2l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1
980
+ l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1l1.8-0.1h1.8h1.8h1.8h1.8h1.8h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1,0.1l1,0.1l1,0.1
981
+ l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
982
+ l0.9,0.2l0.9,0.2l1.8,0.4l1.8,0.4l1.8,0.5l1.8,0.5l1.8,0.5l1.7,0.5l3.5,1l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.5l1.8,0.4
983
+ l1.8,0.4l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
984
+ h0.4h0.4h0.4l0.4,0h0.4l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.9-0.2l0.9-0.2
985
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.9-0.6l1.9-0.7l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1.4-0.4l1.4-0.4
986
+ l1.4-0.4l1.4-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.4l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3
987
+ l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.3l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2l1.5-0.2
988
+ l1.1-0.2l1.2-0.1l1.2-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1h1.1l1.1,0.1l1.1,0.1l1.1,0.1
989
+ l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l2.1,0.3l2.1,0.3l2.1,0.3l2.1,0.3l4.1,0.6l2,0.3
990
+ l2,0.3l2,0.3l2,0.3l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1h1h1h1h1h1h0.9h0.9h0.9h0.9h0.9h0.9h0.9
991
+ h0.9l0.9,0.1l0.9,0.1l1.7,0.1l1.7,0.1l1.7,0.1l1.7,0.2l1.7,0.2l3.3,0.3l3.3,0.3l1.6,0.2l1.6,0.2l1.6,0.2l1.6,0.1l1.6,0.1
992
+ l1.6,0.1l0.8,0.1h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8h0.8l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
993
+ l0.8-0.1l0.8-0.1l0.7-0.1l0.9-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.2
994
+ l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
995
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0,0v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2V225v-0.2v-0.2v-0.2v-0.2V224
996
+ v-0.2v-0.2v-0.2v-0.2V223v-0.2v-0.2v-0.2v-0.2v-0.1V222v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V221v-0.1l0-0.1v-0.1
997
+ v-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
998
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
999
+ l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1000
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4H406h-0.4h-0.4h-0.4h-0.4H404h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1001
+ l-0.4,0.1l-0.6,0.2l-0.4,0.1l-0.4,0.1l-0.7,0.1l-0.8,0.1l-0.9,0.1l-1,0.1l-1.1,0.1l-1.1,0.1l-1.2,0.1l-1.2,0.1h-0.6h-0.6h-0.6
1002
+ h-0.5h-0.5h-0.5h-0.5h-0.5l-0.6-0.1l-0.6-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.5-0.2h-0.1l-0.6-0.3h-0.1l-0.5-0.3l-0.4-0.4l0,0
1003
+ l-0.5-0.5l-0.4-0.6l0,0l-0.3-0.6l-0.3-0.6l-0.2-0.7l0,0l-0.1-1v-1l0.2-1l0.3-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.5l0.9-0.4
1004
+ l0.9-0.2l1-0.1l1,0.1l0.9,0.2l0.1,0.1h0.2h0.3h0.4h0.4h0.5h0.5h1l1-0.1l1-0.1l1-0.1l0.9-0.1l0.7-0.1l0.6-0.1h0.2l0.4-0.1
1005
+ l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1006
+ l0.7,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.5,0.4l0.3,0.2
1007
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1008
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.4
1009
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4l0,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4
1010
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4L425,228l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.5l-0.2,0.5
1011
+ l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3
1012
+ l-0.3,0.3l-0.3,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1013
+ l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
1014
+ l-0.6,0.1l-0.6,0.1l-1,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9H395h-0.9h-0.9
1015
+ h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9h-0.9H386h-0.9l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1.7-0.1l-1.7-0.1l-1.7-0.2l-1.7-0.2l-1.6-0.2
1016
+ l-1.6-0.2l-3.3-0.3l-3.2-0.3l-1.6-0.2l-1.6-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-0.8-0.1h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8h-0.8
1017
+ h-0.8h-1.1h-1.1h-1.1h-1.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1l-1.1-0.1
1018
+ l-1.1-0.1l-1.1-0.1l-2.1-0.3l-2.1-0.3l-2.1-0.3l-2.1-0.3l-4.1-0.6l-2-0.3l-2-0.3l-2-0.3l-2-0.3l-1-0.1l-1-0.1l-1-0.1l-1-0.1
1019
+ l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-1-0.1h-1h-1h-1h-1h-1h-1h-1h-1h-1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1
1020
+ l-1,0.1l-1,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3
1021
+ l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.3l-1.4,0.4
1022
+ l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-1.4,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3
1023
+ l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1.1,0.3l-1.1,0.3l-1.1,0.3l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.6,0.1
1024
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1h-0.6h-0.6l-0.6,0h-0.6h-0.6h-0.6h-0.6
1025
+ h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-1.9-0.5
1026
+ l-1.9-0.5l-1.9-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-1.8-0.5l-3.5-1l-1.7-0.5l-1.7-0.5l-1.7-0.4l-1.7-0.4l-1.7-0.4l-1.7-0.4
1027
+ l-0.8-0.2l-0.8-0.2l-0.9-0.2l-0.8-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.1l-0.9-0.1l-0.9-0.1
1028
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1H151h-1h-1h-1h-1h-1.7h-1.7h-1.7
1029
+ h-1.7h-1.7l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1
1030
+ l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.8,0.2l-1.7,0.2l-1.7,0.2l-1.7,0.2
1031
+ l-1.7,0.2l-1.7,0.2l-0.4,0.1l-0.5,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9H85h-0.9h-0.9H82h-0.9h-0.9h-0.9l-1.7-0.1l-1.7-0.1
1032
+ l-1.6-0.1l-1.6-0.1h-0.8h-0.8h-0.8h-0.8h-0.8H68h-0.7h-0.7h-0.7l-0.7,0.1l-0.7,0.1h-0.3h-0.4l-3.9,0.6l-2.2,0.3l-2.3,0.3
1033
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1h-1.3
1034
+ h-1.3H35h-0.6h-0.6h-0.6h-0.6H32h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.5-0.1
1035
+ l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2L21,245l-0.9-0.2l-0.9-0.2l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3
1036
+ l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3l-0.9-0.3L8.4,241l-0.9-0.3l-0.9-0.3l-0.9-0.3l-1.8-0.7l-1.8-0.7L0.4,238l-1.7-0.7
1037
+ l-1.7-0.7l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1038
+ l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.5l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1039
+ l-0.2-0.3l-0.2-0.3l-0.2-0.4L-13,228l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.5l-0.1-0.5v-0.5V224v-0.5l0-0.5
1040
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
1041
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3
1042
+ l0.6-0.3l0.6-0.3l0.6-0.3l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1043
+ l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1h0.6h0.6L6,210.5z M389.5,208l-0.3-0.4l-0.1-0.1L389.5,208z"
1044
+ />
1045
+ </g>
1046
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1047
+ <path
1048
+ d="M168.7,64h0.7h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.2
1049
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3
1050
+ l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4
1051
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5L199,78l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.6
1052
+ l0.3,0.6l0.3,0.6l0.3,0.6L203,84l0.3,0.6l0.3,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.1,0.6L205,90l0.1,0.6
1053
+ l0.1,0.6l0.1,0.6l0.1,0.6V93v0.6v0.6v0.6v0.6V96v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6L205,99l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6
1054
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1055
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6
1056
+ l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5
1057
+ l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.9,1l-0.9,0.9l-0.9,0.9l-1,0.9l-1,0.9
1058
+ l-1,0.9l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.7l-0.9,0.6L173,141l-0.9,0.6l-0.9,0.6l-0.9,0.5l-0.9,0.5
1059
+ l-0.8,0.5l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.7,0.2l-0.7,0.2
1060
+ l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.7H153h-0.7h-0.7h-0.7h-0.7
1061
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1062
+ l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4
1063
+ l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5
1064
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6
1065
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6
1066
+ l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.1-0.6l-0.1-0.7l-0.1-0.7
1067
+ l-0.1-0.6l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.7v-0.7v-0.7v-0.7v-0.7l0-0.7v-0.7
1068
+ v-0.7V101l0.1-0.7l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.3-1.5l0.3-1.7l0.3-1.8l0.2-0.9l0.2-0.9l0.2-1l0.2-1
1069
+ l0.2-1l0.2-1l0.2-1l0.3-1l0.3-1l0.3-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1070
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3
1071
+ l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3L132,69l0.3,0.1
1072
+ l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1073
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2
1074
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1075
+ l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.3,0.9
1076
+ l-0.3,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.2,0.9l-0.3,1.8l-0.3,1.7l-0.3,1.5l-0.1,0.6
1077
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.5l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6l0.1,0.6
1078
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
1079
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1080
+ l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.4,0.4l0.4,0.4
1081
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1082
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.1
1083
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5l0.5-0.1l0.5-0.1l0.5-0.1
1084
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.3l0.6-0.3l0.6-0.3l0.3-0.2
1085
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7
1086
+ l0.9-0.7l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.9l0.9-0.9l0.9-0.9l0.4-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1087
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
1088
+ l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.5
1089
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
1090
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5V96v-0.5V95v-0.5V94v-0.5V93v-0.5V92l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.5
1091
+ l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1092
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
1093
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1094
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1095
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5
1096
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
1097
+ l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1098
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.8,0.5l-0.7,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.5,0.4l-0.5,0.4
1099
+ l-0.5,0.4l-0.5,0.4l-0.2,0.2h-0.1v0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2
1100
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.2h-0.2h-0.3h-0.1h-0.2h-0.2h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.2l0,0
1101
+ l-0.2-0.1l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0v-0.3v-0.3V79v-0.2v-0.2v-0.1
1102
+ v-0.2l0.1-0.2V78l0.1-0.3l0.1-0.2l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1103
+ l0.6-0.5l0.6-0.5l0.6-0.4l0.6-0.4l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.5l0.8-0.5l0.8-0.5l0.9-0.5l0.9-0.5l0.5-0.3l0.5-0.3l0.5-0.3
1104
+ L157,68l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2L162,66l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1105
+ l0.5-0.1L165,65l0.5-0.1l0.5-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1h0.7L168.7,64z M146,75.9L146,75.9L146,75.9L146,75.9z"
1106
+ />
1107
+ </g>
1108
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1109
+ <path
1110
+ d="M102.5,119.3h0.5h0.5h0.5h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2
1111
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1112
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3
1113
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3
1114
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1115
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.5,0.5
1116
+ l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4
1117
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1118
+ l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.3,0.1h-0.2l-0.6,0.1l-0.6,0.1h-0.6h-0.5h-0.5
1119
+ h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L87,156l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1120
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3L83,153l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4
1121
+ l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V147v-0.4v-0.4v-0.4v-0.4V145
1122
+ v-0.4v-0.4v-0.4v-0.4V143v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4
1123
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.5L83,135l0.3-0.8l0.4-0.9l0.4-1l0.5-1l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5
1124
+ l0.2-0.5l0.2-0.5v-0.1V128v-0.2v-0.2v-0.2l0.1-0.2L86,127l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.3-0.3
1125
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3L89,124l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.2l0.5-0.2l0.5-0.2
1126
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1
1127
+ l0.5-0.1h0.5L102.5,119.3z M102,125.2h-0.4h-0.4l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1L98,126
1128
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l0,0
1129
+ v0.1v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1
1130
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4L90,133l-0.2,0.5l-0.2,0.5l-0.4,0.9l-0.4,0.9
1131
+ l-0.4,0.8l-0.3,0.7l-0.2,0.6l-0.2,0.4l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
1132
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l0.1,0.2
1133
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1h0.1h0.1H89h0.1h0.1h0.1h0.1h0.2h0.2h0.3h0.3h0.3H91h0.3h0.4l0.4-0.1h0.1h0.1
1135
+ l0.2-0.1l0.2-0.1L93,150l0.3-0.1l0.3-0.1l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1136
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.5-0.4l0.4-0.4l0.4-0.5
1137
+ l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.2-0.4
1138
+ l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2v-0.2v-0.2V131v-0.2v-0.2v-0.2v-0.2
1139
+ V130v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V129v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1140
+ l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.3-0.1l-0.3-0.1
1142
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4h-0.4L102,125.2z"
1143
+ />
1144
+ </g>
1145
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1146
+ <path
1147
+ d="M80.8,178.7h0.4h0.4H82h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.6,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
1148
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
1149
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.7,0.5l0.7,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l1.2,1l1.2,1.1l0.6,0.5
1150
+ l0.7,0.6l0.7,0.6l0.7,0.6l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.6l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
1151
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.6,0.2l0.6,0.2
1152
+ l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.5,0.2l0.6,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.3
1153
+ l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.3,0.4l0.2,0.2l0.2,0.2l0.2,0.2
1154
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3
1155
+ v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2
1156
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
1157
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1
1158
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3
1159
+ l-0.7-0.3l-1.4-0.6l-0.7-0.3l-0.6-0.3l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.1h-0.2l-0.3-0.1
1160
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
1161
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.8-0.6l-0.8-0.6l-0.8-0.6l-0.4-0.3l-0.4-0.3l-0.4-0.3
1162
+ l-0.4-0.3l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1163
+ l-0.5-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
1164
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.6h-0.5h-1.1l-1.1,0.1l-1.1,0.1l-2.3,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2h-0.6H72h-0.6
1165
+ H69h-0.6h-0.6h-0.6h-0.6H66h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.2l-0.6-0.2
1166
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2L55,202l-0.5-0.3l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1167
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4
1168
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4V194v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1169
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1170
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.2-0.1l0,0v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
1171
+ l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2h0.1l0.5-0.1l0.3-0.1l0.3-0.1l0.3-0.1
1172
+ h0.3h0.4h0.4h0.4h0.4l0.4,0.1h0.3l0.2,0.1L66,181l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1173
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l1.1-0.4
1174
+ l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.4L80.8,178.7z
1175
+ M80.5,184.6h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2,0.1l-0.2,0.1l-0.4,0.1L78,185l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1.1,0.4l-0.6,0.2
1176
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4H70h-0.4h-0.4h-0.4h-0.4H68h-0.4
1177
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1L66,187l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.2-0.1l0,0h-0.1H64h-0.2h-0.2h-0.2h-0.2l-0.5,0.1
1178
+ l-0.5,0.1l-0.5,0.1h-0.2l-0.2,0.2L61,187l-0.3,0.1l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1179
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2
1180
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2l0,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
1181
+ v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2
1182
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1183
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.5h0.5h0.5h0.5h0.6h0.6h0.6H71h1.1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
1184
+ l2.3-0.2l1.2-0.1l1.2-0.1h1.2h0.6h0.6h0.6H85h0.6h0.6h0.6h0.6H88h0.6l0.6,0.1l0.6,0.1l0.6,0.1L91,199l0.6,0.1l0.6,0.1l0.6,0.1
1185
+ l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.5,0.3l0.5,0.3
1186
+ l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.4,0.3l0.4,0.3l0.8,0.7l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.4,0.2l0.4,0.2
1187
+ l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2l0.2,0.1
1188
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.2l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l1.4,0.6l0.7,0.3l0.7,0.3l0.7,0.3
1189
+ l0.7,0.3l0.7,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.3h0.3h0.2h0.2h0.2h0.2
1190
+ h0.2h0.2h0.2h0.1h0.1h0.1l0,0h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1V213v-0.1v-0.1
1191
+ l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.3
1192
+ l-0.2-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1193
+ l-0.3-0.2l-0.2-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1194
+ l-0.5-0.2l-0.5-0.2l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2
1195
+ l-0.6-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.2-0.2l-0.9-0.7l-0.9-0.7l-0.8-0.6
1196
+ l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.6l-1.2-1.1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.6-0.4l-0.5-0.4l-0.6-0.4
1197
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2
1198
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2H80
1199
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2L80.5,184.6z"
1200
+ />
1201
+ </g>
1202
+ <g transform="matrix(1,0,0,1,400.214,44.558)">
1203
+ <path
1204
+ d="M332.3,146.1h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0,0l0.6,0.1
1205
+ l0.6,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1206
+ l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4
1207
+ l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8
1208
+ l0.2,0.8l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.3,0.5
1209
+ l0.3,0.7l0.4,0.7l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.5l0.1,0.3v0.3v0.3
1210
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L350,181l-0.2,0.3l-0.2,0.3
1211
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.3h-0.2
1212
+ h-0.3h-0.3h-0.2H345h-0.2h-0.2h-0.2h-0.2H344h-0.2l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1213
+ l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1214
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1215
+ l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.3-0.7l-0.3-0.6l-0.3-0.6l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1216
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4V163v-0.4v-0.4v-0.4v-0.4V161v-0.9v-0.9v-0.8v-1.6v-1.6
1217
+ v-0.7v-0.8v-0.2v-0.1v-0.1v-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.1-0.2l0,0v-0.1v-0.1
1218
+ l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1
1219
+ l0.1-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2L332.3,146.1z M334.7,152.9l-0.1,0.3l-0.1,0.3v0.1v0.1
1220
+ l0,0v0.6v0.8l-0.1,1.6v1.6v0.8v0.8v0.8v0.4v0.4v0.4v0.4v0.4v0.3v0.3v0.3v0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1v0.1
1221
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.5l0.2,0.5l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.2,0.3l0.2,0.3l0.2,0.3
1222
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.2l0.2,0.2l0.2,0.2
1223
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2l0,0h0.1h0.1h0.1
1224
+ h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1V177l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1225
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.3l-0.3-0.7l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5
1226
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.9l-0.2-0.9l-0.2-0.9
1227
+ l-0.2-0.9l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.7l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
1228
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1229
+ l-0.2-0.1h-0.1h-0.1l-0.1-0.1h-0.1l-0.1-0.1h-0.1h-0.1H336h-0.1h-0.1h-0.1h-0.1l-0.3-0.1l-0.3-0.1h-0.1L334.7,152.9z"
1230
+ />
1231
+ </g>
1232
+ </g>
1233
+ </g>
1234
+ </g>
1235
+ <g>
1236
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1237
+ <path
1238
+ fill="#B5A47D"
1239
+ d="M-204.2,1379.2L-204.2,1379.2l-0.4-0.9l-0.3-0.8l-0.3-0.9l-0.4-0.9l-0.4-0.9l-0.7-1.9l-0.6-1.7l-0.3-0.8
1240
+ l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.3-1.2l-0.2-1l-0.2-0.9l-0.2-0.9l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.2-1.6
1241
+ l-0.2-1.6l-0.2-1.5l-0.2-1.5l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1242
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.2-0.6l-0.5-1.6l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.7l-0.5-1.8l-0.5-1.8l-0.4-1.8l-0.4-1.8
1243
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8
1244
+ l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-1.8l-0.2-1.8l-0.2-1.8l-0.1-1.2l-0.2-1.2l-0.2-1.2
1245
+ l-0.2-1.2l-0.2-1.2l-0.2-1.2l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.5
1246
+ l-0.1-0.5l-0.1-0.5l-0.1-0.5l-0.1-0.4l-0.1-0.3l-0.5-0.3l-0.6-0.4l-0.4-0.3l-0.4-0.4l-0.6-0.5l-0.4-0.4l-0.8-0.8l-0.1-0.1l-0.8-1
1247
+ l0,0l-0.6-1l0,0l-0.4-0.7l-0.3-0.8l0,0l-0.4-1.2l-0.2-1.2l0,0l-0.1-1.4v-1.4l0,0l0.2-1.2l0.3-1.2l0.4-1.1l0,0l0.3-0.7l-0.1-0.2
1248
+ l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.3h-0.2l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1249
+ l-0.5-0.2l-0.5-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3
1250
+ l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7
1251
+ l-0.4-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.1-0.3l-0.1-0.1l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.5-0.7
1252
+ l-0.5-0.7l-0.4-0.7l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.4-0.9l-0.3-0.8l-0.3-0.6l-0.2-0.4l-0.1-0.2
1253
+ l-0.8-1.1l-0.5-0.7l-0.5-0.7l-0.5-0.8l-0.6-0.9l-0.6-0.9l-0.6-1l-0.6-1l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6
1254
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8
1255
+ l-0.1-0.9l-0.1-0.8v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.5
1256
+ l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4
1257
+ l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.7-0.2l0.8-0.2l0.8-0.2
1258
+ l0.8-0.1l0.9-0.1l0.8-0.1h0.8h0.9l0.9,0.1h0.4l0.1-0.2l0.4-0.6l0.4-0.6l0.5-0.6l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.4
1259
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.8-0.3l0.8-0.3l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1260
+ l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.8-0.4
1261
+ l0.8-0.4l0.8-0.3l0.8-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.7-0.1l0.6-0.1h0.6h0.6h0.6
1262
+ h0.6h0.7h1.2h1.2h1.2h1.2h1.1l1.1,0.1l1.1,0.1l1,0.1l1.9,0.1l1.7,0.1l1.3,0.1h0.5h0.3h0.1l3-0.1l3.2-0.1l3.2-0.1l3.2-0.1l3.2-0.1
1263
+ l3.2-0.1l3.6-0.2l0.6-0.5l1.2-0.8l1.3-0.6l1.3-0.4l0,0l1.1-0.2l1.2-0.1h1.2h0.1l0.8,0.1l0.8,0.1l0.5,0.1l0.8,0.2l0.6,0.2l0.7,0.2
1264
+ l0.5,0.2l0.4,0.2l0.4,0.2h0.1h0.3h0.7h0.8h0.9h1h0.6h0.5h0.6h0.6h0.6h0.6h0.6h0.6h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
1265
+ l0.6-0.1l0.6-0.1l1.2-0.2l1.2-0.2l1.3-0.2l2.7-0.5l1.4-0.2l1.5-0.2l1.5-0.2l0.8-0.1l0.8-0.1l2.5-0.3l2.5-0.3l2.5-0.3l2.5-0.3
1266
+ l2.4-0.2l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1l1.2-0.1
1267
+ l1.2-0.1h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2h1.2l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1
1268
+ l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.1l1.2,0.2l1.2,0.2l1.3,0.2
1269
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l1.3,0.3l1.3,0.3l1.3,0.3l1.3,0.3l1.2,0.3l1.2,0.3l2.4,0.6h0.1
1270
+ h0.7l1.2-0.1l1.2-0.1h1.2h1.2h0.3l0.7-0.6l1.1-0.7l1.2-0.6l1.2-0.5l1.3-0.3l1.3-0.2l0,0h1.2l1.2,0.1l1.2,0.2l0,0l1.1,0.3l1,0.4
1271
+ l0.4,0.2l0.9,0.4l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1272
+ l0.8,0.3h0.6h0.4h0.4h0.4h0.3h0.2l0.3-0.2l0.8-0.5l0.5-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.6-0.4l0.7-0.4l0.8-0.4l0.8-0.3l0.5-0.2
1273
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.9h0.9l0.9,0.1l1,0.1l1.1,0.2l1,0.3l0.5,0.2l1,0.5l0.1,0.1
1274
+ l0.9,0.5l0.5,0.4l0.5,0.4l0.8,0.7l0.4,0.4l0.8,0.8l0.7,0.9l0.6,0.9l0.5,0.9l0.4,0.8l0.3,0.9l0.3,0.9l0.2,1l0.1,0.5l0.1,1.1v0.6
1275
+ v0.6l-0.1,0.8l0.3,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.3,0.7l0.3,0.6l0.3,0.7l0.1,0.3
1276
+ l0.9,0.5l0.1,0.1l1,0.7l0.1,0.1l0.9,0.8l0.1,0.1l0.9,1l0.1,0.1l0.7,1l0.1,0.1l0.6,1l0.1,0.1l0.5,1l0.3,0.6l0.3,1.1l0.2,1l0.1,1
1277
+ l0.1,0.9v0.8v0.8l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8
1278
+ l-0.3,0.8l-0.4,0.8l-0.3,0.7l-0.4,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.5l-0.1,0.1v0.1
1279
+ l-0.3,0.5l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.5l-0.7,1l-0.7,1l-0.7,1l-0.7,1l-0.7,0.9l-0.2,0.4
1280
+ l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.5,0.7l-0.5,0.7
1281
+ l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7l-0.5,0.7
1282
+ l-0.5,0.7l-0.4,0.5l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.5,0.8l-0.6,0.9l-0.3,0.5l-0.4,0.5l-0.4,0.5
1283
+ l-0.4,0.5l-0.5,0.6l-0.5,0.6l-0.6,0.6l-0.4,0.4l-0.4,0.4l-0.4,0.3v1.2l-0.1,1.4l-0.3,1.4l-0.4,1.3l-0.2,0.5l-0.5,1.1l-0.3,0.7
1284
+ l-0.3,0.8l-0.3,0.8l-0.2,0.5l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5
1285
+ l-0.4,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.5
1286
+ l-0.9,0.8l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.4,0.3v0.4l-0.1,0.8l-0.1,0.8l-0.1,0.9l-0.2,0.9l-0.2,0.9
1287
+ l-0.2,0.8l-0.2,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.5l-0.2,0.4l-0.1,0.2l0,0l-0.2,0.4
1288
+ l-0.3,0.5l-0.3,0.6l-0.7,1.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.5,0.7l-0.7,0.8l-0.6,0.6
1289
+ l-0.3,0.3l-0.8,0.7l0,0l-0.6,0.4l-0.2,0.5l-1,2.3l-1,2.3l-2,4.6l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.4l-3.2,7.5l-3.2,7.4l-3.2,7.5
1290
+ l-3.2,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-3.1,7.5l-6.3,15l-6.3,15l-2.4,5.7l-2.4,5.7l-2.4,5.7l-1.2,2.9l-1.2,2.9l-1.2,2.9l-1.2,2.9
1291
+ l-1.1,2.9l-1.1,2.9l-1.1,2.8l-1.1,2.9l-1.1,2.9l-1.1,2.9l-0.5,1.3l-0.5,1.2l-0.4,1.1l-0.4,1l-0.4,0.9l-0.3,0.8l-0.6,1.4l-0.6,1.4
1292
+ l-0.7,1.5l-0.4,0.9l-0.4,1l-0.5,1.1l-0.5,1.3l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.3,0.7l-0.4,0.8l-0.4,0.8l-0.3,0.5l-0.3,0.5l-0.3,0.5
1293
+ l-0.3,0.5l-0.3,0.5l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.7,0.7l-0.5,0.5l-0.5,0.4l-0.6,0.4l-0.7,0.5l-0.8,0.5l-1,0.5l-0.6,0.2
1294
+ l-1.1,0.4h-0.1l-1.2,0.3h-0.1l-0.7,0.1h-0.4l-0.1,0.4l-0.3,0.9l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.8
1295
+ l-0.4,0.6l-0.5,0.6l-0.6,0.7l-0.3,0.4l-0.8,0.8h-0.1l-1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.9,0.4l-0.4,0.1l-0.8,2l-0.8,2.1
1296
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.7,2.1l-0.3,1l-0.3,0.8l0,0v0.2v0.2l-0.1,0.6l-0.2,1.6
1297
+ l-0.1,0.9l-0.1,0.5l-0.1,0.5l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.7l-0.2,0.8l-0.3,0.8l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.7
1298
+ l-0.5,0.8l-0.6,0.8l-0.4,0.4l-0.9,0.9l-0.1,0.1l-1.1,0.8h-0.1l-0.7,0.4l-0.7,0.4h-0.1l-0.8,0.3l-0.6,0.2v0.1l-0.1,0.9v0.1v0.3
1299
+ v0.8v1l-0.1,2.6v1.5l-0.1,1.5v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.5l-0.1,0.5
1300
+ l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.8l-0.5,0.9l-0.4,0.5l-0.7,0.9l-0.1,0.1l-0.8,0.8l-0.9,0.7l0,0
1301
+ l-0.9,0.6l-1,0.5l-1,0.4l0,0l-1.1,0.4l-1.1,0.2l-1.1,0.1h-1.1l0,0l-1.3-0.1l-1.3-0.2l-1.2-0.4l0,0l-1.2-0.5l-1.1-0.6l-1.1-0.8
1302
+ l0,0l-0.8-0.7l-0.7-0.8l-0.6-0.8l0,0l-0.5-0.7l-0.4-0.7l-0.3-0.5l-0.3-0.8l-0.2-0.6l-0.2-0.5l-0.2-0.7l-0.2-0.7l-0.1-0.6
1303
+ l-0.1-0.6l-0.1-0.6l-0.1-0.7l-0.2-1.3l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.2-1.4l-0.4-2.5l-0.2-1.6l-0.1-0.3l-0.2-0.6l-0.2-0.6
1304
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.1-1.1l-0.1-1.1
1305
+ l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-1.1l-0.1-2l-0.3-3.9l-0.1-1.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8
1306
+ l-0.1-0.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.4-2.9l-0.4-2.8l-0.9-5.7l-0.9-5.7
1307
+ l-0.9-5.7l-1.8-11.5l-0.9-5.8l-0.9-5.8l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.4-2.9l-0.3-2.3
1308
+ l-0.3-2.2l-0.6-4.5l-0.3-2.2l-0.2-1.3l-0.2-0.4l-0.3-1.3l-0.2-1.3l-0.6-3.2l-0.7-3.9l-0.3-1.9l-0.3-1.6l-0.2-0.8l-0.2-0.8
1309
+ l-0.2-0.9l-0.2-0.9l-0.2-1l-0.2-1.1l-0.2-1.1l-0.1-0.6l-0.1-0.6l-0.2-1.1l-0.2-1.1l-0.1-1l-0.1-1l-0.1-0.9l-0.1-0.9l-0.1-0.8
1310
+ v-0.1l-0.3-1.1l-0.1-0.2l-0.1-0.3l-0.3-1l-0.8-2.2l-0.3-1.1l-0.2-0.6l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-1.2v-1.2l0,0l0.1-1.4
1311
+ l0.3-1.3l0.4-1.3l0.6-1.2L-204.2,1379.2z M-182.3,1308.4l0.3,1.6h0.1l0,0v-0.1l0.2-0.6l0.1-0.4l-0.1-0.2l-0.7-0.9L-182.3,1308.4z
1312
+ "
1313
+ />
1314
+ </g>
1315
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1316
+ <path
1317
+ fill="#836F40"
1318
+ d="M-165.2,1548.9l0.5-0.9l0.3-0.5l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1319
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1320
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.4-0.3l0.8-0.6l0.5-0.3l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1
1321
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2
1322
+ h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.2h0.1h0.2h0.1h0.1h0.1
1323
+ l0.2,0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.5,0.2l0.9,0.4l0.4,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1324
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1325
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1326
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
1327
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1v0.2v0.1v0.1v0.2v0.1v0.2v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
1328
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.1v0.2v0.1v0.1v0.1l-0.1,0.1l-0.1,0.1
1329
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1330
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.2v0.2v0.1v0.1v0.2v0.1v0.1l-0.1,0.1l-0.1,0.1
1331
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1332
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1333
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1334
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1335
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
1336
+ l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.2h-0.2h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1337
+ h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.1h-0.2h-0.2
1338
+ h-0.1h-0.1h-0.2h-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1339
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1340
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1341
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1342
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
1343
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.2v-0.2v-0.2
1344
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.5v-0.6v-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-0.5l0.1-0.5l0.1-0.5
1345
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.2-0.6l0.3-0.7L-165.2,1548.9z M-158.6,1564.1L-158.6,1564.1L-158.6,1564.1L-158.6,1564.1l-0.2-0.1
1346
+ l-0.1-0.1L-158.6,1564.1z"
1347
+ />
1348
+ </g>
1349
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1350
+ <path
1351
+ fill="#836F40"
1352
+ d="M-49.4,1288.3l0.6-1.3l0.6-1.3l0.6-1.2l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
1353
+ l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.6l0.2-0.2l0.4-0.6l0.5-0.8l0.5-1l0.6-1l0.3-0.6l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.6
1354
+ l0.4-0.6l0.5-0.6l0.5-0.7l0.5-0.6l0.3-0.4l0.3-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.5-0.4l0.6-0.4l0.7-0.5l0.8-0.5l1-0.4
1355
+ l0.6-0.2l1.1-0.3h0.1l0.6-0.1l0.6-0.1h0.1l0.7-0.1h0.7h0.1h0.8l0.8,0.1h0.1l0.8,0.1l0.8,0.2h0.1l0.8,0.2l0.8,0.3h0.1l0.7,0.3
1356
+ l0.7,0.4l0.1,0.1l0.6,0.4l0.6,0.4l0.1,0.1l0.6,0.5l0.5,0.5l0.1,0.1l0.5,0.5l0.5,0.6l0.1,0.1l0.4,0.5l0.4,0.6l0.1,0.1l0.3,0.5
1357
+ l0.3,0.6l0.1,0.1l0.4,1l0.2,0.6l0.3,1.1l0.2,1l0.1,0.9l0.1,0.8v0.8v0.7v0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.1,0.5l-0.1,0.5
1358
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6
1359
+ l-0.3,0.5l-0.5,0.9l-0.4,0.8l-0.3,0.6l-0.1,0.2l-0.3,0.5l-0.4,0.9l-0.9,1.6l-0.9,1.6l-0.8,1.6l-1.7,3.1l-0.8,1.5l-0.8,1.5
1360
+ l-0.7,1.4l-0.7,1.4l-1.4,2.8l-1.4,2.9l-1.5,2.9l-0.7,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.8,1.5
1361
+ l-0.9,1.5l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.5,0.8l-0.5,0.8l-0.3,0.5l-0.1,0.2l-0.4,0.8l-0.3,0.7l-0.1,0.3l-0.1,0.6l-0.2,0.6
1362
+ l-0.2,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.5l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l0,0l-0.6,1.6l-0.8,2.1
1363
+ l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.8,2.1l-0.9,2l-0.9,2l-0.9,2l-0.7,1.7v0.1l-0.1,0.3l-0.1,0.5l-0.2,0.6
1364
+ l-0.2,0.7l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.3,0.6l-0.3,0.7l-0.4,0.7l-0.5,0.8l-0.6,0.8l-0.7,0.9l-0.7,0.8l-0.6,0.5
1365
+ l-0.5,0.4l-0.5,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l0,0l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7
1366
+ l-0.3,0.7l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.5,1.1l-0.4,1l-0.4,0.9l-0.3,0.7l-0.3,0.7l-0.6,1.3l-0.7,1.4l-0.7,1.4l-0.8,1.5l-0.7,1.4
1367
+ l0,0l-0.1,0.7l-0.1,0.7l-0.1,0.6l-0.1,0.6l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6
1368
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.1l-1.1,1.8l-0.4,0.7l-0.1,0.2l-0.1,0.3l-1.1,2.1l-1.2,2.1l-1.2,2.1l-1.2,2.1
1369
+ l-1.2,2.1l-1.2,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-1.3,2.1l-0.1,0.2l-0.5,1.1l-0.8,1.5l-0.7,1.5l-0.7,1.5
1370
+ l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.7,1.5l-0.1,0.1v0.1v0.4l-0.1,0.7l-0.1,0.8
1371
+ l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1l-0.6,2.4l-0.6,2.5l-0.6,2.5l-0.3,1.3l-0.3,1.3l-0.3,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3l-0.4,1.3
1372
+ l-0.4,1.3l-0.4,1.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.7l0,0v0.1v0.7v0.6v0.6l-0.1,0.6
1373
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.8l-0.2,0.8l-0.3,0.8l-0.3,0.7l-0.3,0.7l-0.3,0.7l-0.3,0.6l-0.3,0.6
1374
+ l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.6,1l-0.6,1l-0.5,0.9l-0.9,1.5l-0.4,0.6l-0.3,0.5l-0.7,1.2l-0.7,1.1
1375
+ l-0.6,1l-0.6,0.9l-0.5,0.7l-0.3,0.8l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1
1376
+ l-0.5,1l-0.6,1l-0.5,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-0.6,1l-1.2,1.9l-1.2,1.9l-2.3,3.7l-0.2,0.4l-0.3,0.5l-0.8,1.4
1377
+ l-0.5,0.8l-0.5,0.9l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.4,1l-0.3,1l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4
1378
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3v0.3v0.3v0.3v0.2v0.2v0.2v0.2v0.1v0.1l0,0v0.1l0.2,1.2
1379
+ l0.1,1.2v1.2l-0.2,1.2l-0.3,1.2l-0.4,1.1l-0.5,1.1l-0.6,1l-0.7,1l-0.8,0.9l-0.9,0.8l-1,0.7l-1,0.6l-1.1,0.5l-1.1,0.4l-1.2,0.3
1380
+ l-1.2,0.1h-1.2l-1.2-0.1l-1.2-0.2l-1.1-0.3l-1.1-0.5l-1.1-0.6l-1-0.7l-0.9-0.8l-0.8-0.9l-0.7-0.9l-0.6-1l-0.5-1.1l-0.4-1.1
1381
+ l-0.3-1.2l-0.1-0.6l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
1382
+ l0.1-0.7l0.1-0.7l0.1-0.7l0.2-0.7l-0.1-0.2l-0.4-1l-0.3-1l-0.2-1l-0.1-1.1l0,0v-1l0.1-1l0.2-1l0.2-1l0,0l0.3-0.8l0.3-0.8l0,0
1383
+ l0.3-0.6l0.4-0.6l0.3-0.5l0.5-0.7l0.4-0.5l0.3-0.4l0.5-0.6l0.4-0.5l0.2-0.2l2.2-3l0.1-0.1l0.3-0.7l0.3-0.8l0.3-0.8l0.7-1.8
1384
+ l0.7-1.8l0.6-1.5l0.6-1.6l1.5-3.9l1.5-3.9l3-7.7l3-7.7l1.5-3.8l1.5-3.8l1-2.6l1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6
1385
+ l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.1-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l1.2-2.6l0.2-0.4v-0.2l0.1-0.5l0.1-0.5
1386
+ l0.1-0.5l0.1-0.5l0.2-0.6l0.3-0.8l0.4-0.8l0.4-0.8l0.4-0.7l0.4-0.7l0.4-0.6l0.4-0.6l0.3-0.4l0.1-0.3l0.3-0.8l0.3-0.8l0.3-0.8
1387
+ l0.3-0.8l0.4-1.3h-0.1l-1-0.1h-0.1l-0.8-0.2l-0.8-0.2l-0.8-0.3h-0.1l-0.9-0.4l-0.9-0.5l-0.8-0.5l0,0l-0.8-0.6l-0.7-0.7l-0.7-0.8
1388
+ l0,0l-0.5-0.7l-0.5-0.8l-0.4-0.8v-0.1l-0.4-1l-0.3-1.1v-0.1l-0.2-0.9l-0.1-0.9v-0.1l-0.1-0.7v-0.7v-0.1l0.1-1.1v-0.5l0.1-0.8
1389
+ l0.2-0.7l0.2-0.7l0.3-0.9l0.3-0.8l0.3-0.7l0.3-0.6l0.3-0.6l0.3-0.5l0.3-0.5l0.3-0.5l0.3-0.5l0.5-0.9l0.5-0.9l0.5-0.8l0.9-1.5
1390
+ l0.3-0.5l0.2-0.4l0.6-1.1l0.6-1.1l0.6-1l0.5-0.9l0.5-0.8l0.5-0.7l0.8-1.2l0.7-1.1l0.3-0.5l0.4-0.6l0.4-0.7l0.5-0.8l0.6-1l0.6-1.1
1391
+ l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l1-1.9l0.9-1.9l0.9-2l0.9-2l0.9-2l0.9-2l0.7-1.5l0.5-1.3l0.5-1.3l0.5-1.3
1392
+ l0.5-1.2l0.9-2.3l0.4-1.1l0.4-1l0.4-0.9l0.3-0.9l0.3-0.8l0.1-0.3l0.1-0.4v-0.1l0.5-1.1l0.6-1.1l0.7-1l0.8-0.9l0.9-0.9l0.9-0.8
1393
+ l1-0.7l1.1-0.6l1.1-0.4l1.2-0.3l1.2-0.2l1.2-0.1l1.2,0.1l1.2,0.2l1.2,0.3l1.1,0.4l0.6,0.3l0.7-1.4l1.4-2.7l1.4-2.7l1.3-2.7
1394
+ l1.3-2.7l1.3-2.7l0.6-1.3l0.7-1.4l0.3-0.7l0.4-0.7l0.4-0.6l0.5-0.8l0.4-0.5l0.7-0.8l0.8-0.7l0,0l0.7-0.6l0.2-0.1l0.5-1.1l0.6-1.2
1395
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.6-1.1l0.6-1.1l1.2-1.9l0.5-0.9l0.4-0.8l0,0l0.1-0.1l0.1-0.3l0.2-0.4l0.2-0.5l0.3-0.6l0.3-0.7
1396
+ l0.4-0.7l0.3-0.5l0.3-0.4l0.3-0.5l0.4-0.5l0.5-0.6l0.6-0.7l0.4-0.4l0.8-0.8l0.1-0.1l0.9-0.7l0.4-0.3l0.8-0.5l0.5-0.2l0.6-0.3l0,0
1397
+ l0.8-2.2l1.1-2.8l0.5-1.4l0.5-1.4l0.5-1.4l0.6-1.4l0.6-1.4l0.6-1.4L-49.4,1288.3z"
1398
+ />
1399
+ </g>
1400
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1401
+ <path
1402
+ fill="#836F40"
1403
+ d="M-235.9,1180.2l0.5-0.9l0.5-0.8l0.6-0.8l0.7-0.7l0.7-0.7l0.8-0.6l0.8-0.5l0.9-0.5l0.9-0.4l0.9-0.3l1-0.2
1404
+ l1-0.2l1-0.1h0.1h0.5h0.3h0.1l0,0l0.4-0.3l0.4-0.2l0.5-0.3l0.5-0.2l0.5-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.1
1405
+ l0.7-0.1l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.8,0.4l0.8,0.4l0.4,0.2l1.1-0.1l1.2-0.1
1406
+ l1.2-0.1l1.2-0.1l1.2-0.1l2.5-0.2l2.5-0.2l2.5-0.3l2.5-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l5.2-0.7
1407
+ l5.2-0.7l5.2-0.7l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2.6-0.3l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.2l2-0.1l2-0.1l2-0.1
1408
+ l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l2-0.1l1.9-0.1l2-0.1l1.9-0.1l2-0.1h1.9h2h1.9h2l3.9-0.1h3.9h3.9h3.9h3.9h3.9h3.9h3.8
1409
+ h3.8l7.7,0.1l7.7,0.1l7.6,0.1h3.8h3.8h3.8h3.8h1l1,0.1l1,0.2l0.9,0.3l0.9,0.4l0.9,0.4l0.8,0.5l0.8,0.6l0.7,0.6l0.7,0.7l0.6,0.8
1410
+ l0.6,0.8l0.5,0.8l0.4,0.9l0.4-0.2l0.6-0.2l0.7-0.3l0.8-0.3l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.2l0.6-0.1l0.6-0.1l0.6-0.1l0.7-0.1
1411
+ l0.8-0.1l0.8-0.1h0.9h1l0.7,0.1l0.6,0.1l0.7,0.1l0.7,0.2l0.8,0.2l0.8,0.3l0.9,0.4l0.9,0.5l0.5,0.3l0.4,0.3l0.4,0.3l0.1,0.1
1412
+ l0.4,0.3l0.4,0.4l0.1,0.1l0.4,0.4l0.4,0.4l0.1,0.1l0.4,0.5l0.4,0.5l0.1,0.1l0.3,0.5l0.3,0.5v0.1l0.3,0.5l0.3,0.5v0.1l0.2,0.5
1413
+ l0.2,0.5l0.2,0.6l0.3,1.1l0.2,1.1l0.1,1v0.8v0.8v0.7l-0.1,0.7l-0.1,0.7l-0.1,0.8l-0.2,0.7l-0.2,0.7L14,1187l-0.3,0.7l-0.3,0.7
1414
+ l-0.3,0.7l-0.3,0.7l-0.4,0.7l-0.4,0.7l-0.4,0.6l-0.4,0.6l-0.5,0.6l-0.5,0.6l-0.5,0.5l-0.5,0.5l-0.5,0.5l-0.5,0.4l-0.5,0.4
1415
+ l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
1416
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.9,0.1l-1,0.1l-1,0.1h-1h-0.9
1417
+ h-0.9h-0.9h-0.9h-0.9h-0.9l-0.9-0.1l-0.9-0.1l-0.9,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-0.9,0.2
1418
+ l-0.9,0.2l-1.7,0.4l-1.6,0.3l-1.4,0.3l-1.1,0.2l-1.1,0.2l-0.7,0.1l-0.8,0.1l-0.6,0.1h-0.6h-0.6h-0.6l-1.3,0.1l-1.5,0.1l-1.6,0.1
1419
+ h-1.6H-45h-1.6h-1.5h-2.7h-0.3l-1.1,0.2l-1.4,0.3l-1.4,0.2l-1.4,0.2l-1.4,0.2l-0.9,0.1l-0.1,0.1h-0.1l-0.7,0.3l-0.7,0.3l-0.4,0.2
1420
+ l-0.8,0.3l-0.7,0.2l-0.6,0.1l-0.5,0.1l-0.5,0.1l-0.8,0.1l-0.8,0.1l-0.8,0.1h-0.9h-0.6h-0.6h-0.6h-0.6h-1h-1h-0.9h-0.8h-0.7h-0.3
1421
+ h-0.3h-1l-1,0.1l-1,0.1l-1,0.1l-2.2,0.2l-2.2,0.2l-0.8,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-1.9,0.2l-1.9,0.2l-1,0.1l-1,0.1l-1,0.1
1422
+ l-1.1,0.1l-1.1,0.1h-1.1h-1.1h-1.2h-0.8h-0.5l-0.8-0.1l-0.8-0.2l-0.8-0.2l0,0l-0.6-0.2h-1.1h-1.4l-1.4-0.1l-1.4-0.1l-1.4-0.1
1423
+ l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-0.7-0.1l-0.8-0.1l-0.9-0.1l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2
1424
+ l-0.9-0.2l-0.9-0.2l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.8-0.3l-0.7-0.3l-0.7-0.3
1425
+ l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.9,0.1l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.4,0.1
1426
+ l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1l-1.4,0.1h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.4h-1.3
1427
+ l-1.5-0.1l-0.7-0.1l-0.8-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
1428
+ l-0.4-0.2l-0.5-0.2l-0.2-0.1h-0.7l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.1l-1.4-0.2l-1.3-0.2l-1.4-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
1429
+ l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.3l-1.3-0.4l-1.2-0.4l-1.2-0.4l-1.2-0.4l-0.4-0.1h-0.1l-1.3,0.1
1430
+ l-1.3,0.1h-1.3h-1.3h-1.3h-1.3h-1.3h-1.3h-0.4h-1l-1-0.1l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.4l-0.9-0.5l-0.8-0.6l-0.8-0.7l-0.7-0.7
1431
+ l-0.6-0.8l-0.6-0.8l-0.5-0.9l-0.4-0.9l-0.3-0.9l-0.3-1l-0.2-1l-0.1-1v-1l0.1-1l0.1-1l0.2-1l0.3-0.9L-235.9,1180.2z"
1432
+ />
1433
+ </g>
1434
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1435
+ <path
1436
+ d="M-214.1,1345.5L-214.1,1345.5l0.2-0.3l0.1-0.1l0.2-0.3l0.3-0.4l0.2-0.2l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3
1437
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1438
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l1.3-1.1l1.4-1.1l2.8-2.3l1.4-1.2l1.4-1.2l1.4-1.2l0.7-0.6
1439
+ l0.7-0.6l0.7-0.6l0.7-0.6l0.8-0.6l0.7-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5l0.8-0.5
1440
+ l0.8-0.5l0.8-0.4l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.5l0.9-0.6l0.9-0.6l0.9-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1441
+ l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l1.5-1.4l1.5-1.4
1442
+ l1.5-1.4l1.5-1.4l1.5-1.4l3-2.9l3-2.9l1.5-1.5l1.5-1.5l1.5-1.4l1.6-1.4l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7
1443
+ l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.8-0.7l0.3-0.2l0.4-0.3l0.9-0.7l2.4-1.8l1.4-1.1l1.5-1.1l0.8-0.6l0.8-0.6l0.8-0.6l0.8-0.6
1444
+ l0.8-0.6l0.8-0.6l0.7-0.6l0.7-0.6l0.7-0.6l0.6-0.6l0.6-0.5l0.5-0.5l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2
1445
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1h0.4h0.4l0.4,0.1
1446
+ l0.4,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.2v0.3v0.3l-0.1,0.3l-0.1,0.4l-0.2,0.4
1447
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.6,0.6
1448
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-0.8,0.6l-1.5,1.2l-1.4,1.1
1449
+ l-2.4,1.8l-0.9,0.7l-0.3,0.3l-0.3,0.2l-0.8,0.6l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1450
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-1.5,1.4l-1.5,1.4l-1.5,1.4l-1.5,1.4l-3,2.9l-3,2.9l-1.5,1.5l-1.5,1.5l-1.5,1.4l-1.5,1.4l-1.6,1.4
1451
+ l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7l-0.8,0.7
1452
+ l-0.9,0.7l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.5
1453
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5l-0.7,0.5
1454
+ l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-0.7,0.6l-1.4,1.2l-1.4,1.2l-1.4,1.2l-2.8,2.3l-1.4,1.1l-1.4,1.1l-0.4,0.4l-0.5,0.4
1455
+ l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3
1456
+ l-0.4,0.2l0,0l0,0l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.2,0.3l-0.1,0.1l0,0l-0.2,0.3
1457
+ l-0.3,0.3l0,0l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.4h-0.4l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.3
1458
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-214.1,1345.5z M-112,1262.3L-112,1262.3L-112,1262.3
1459
+ L-112,1262.3L-112,1262.3z M-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5L-209,1348.5z"
1460
+ />
1461
+ </g>
1462
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1463
+ <path
1464
+ d="M-199.4,1433l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.4l0.3-0.4l0.7-0.8l0.7-0.8l0.8-0.8
1465
+ l0.8-0.8l0.8-0.8l1.5-1.5l2.3-2.3l1-1l1-1l1-1l1-1l1-1l1-1l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l2-1.9l1-1l1-1
1466
+ l1-1l1-1l1-1l1-1l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.8-1.6l1.8-1.6l1.8-1.6
1467
+ l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l3.6-3.2l7.2-6.3l7.2-6.3l3.6-3.2l3.6-3.2l3.6-3.2
1468
+ l3.6-3.2l3.5-3.2l1.8-1.6l1.8-1.6l1.8-1.6l1.8-1.6l1.7-1.6l1.8-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6l1.7-1.6
1469
+ l1.7-1.6l1.7-1.7l1.7-1.7l1.7-1.7l1.7-1.7l0.9-0.9l0.9-0.9l0.9-0.9l0.9-0.9l1-0.9l1-0.9l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8l1-0.8
1470
+ l2-1.6l2-1.6l1.9-1.6l1.9-1.6l1-0.8l1-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.9-0.8l0.8-0.8
1471
+ l0.4-0.4l0.5-0.5l1.3-1.4l0.7-0.8l0.8-0.8l0.8-0.9l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4
1472
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2h0.3h0.1h0.5
1473
+ l0.5,0.1l0.5,0.2l0.4,0.3l0.4,0.3l0.3,0.4l0.2,0.5l0.2,0.5l0.1,0.5v0.5l-0.1,0.5l-0.2,0.5l-0.3,0.4l-0.3,0.4l-0.4,0.3l-0.5,0.2
1474
+ l-0.5,0.2h-0.3l0,0h-0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.3l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4
1475
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.8l-0.8,0.8l-0.7,0.8l-1.3,1.4l-0.5,0.6l-0.5,0.5l-0.9,0.9l-0.9,0.9
1476
+ l-0.9,0.9l-0.9,0.9l-0.9,0.9l-0.9,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1.9,1.6l-2,1.6l-1.9,1.6l-1.9,1.6l-1,0.8
1477
+ l-1,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.8l-0.9,0.9l-0.9,0.9l-1.7,1.7l-1.7,1.7l-1.7,1.7
1478
+ l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6
1479
+ l-1.8,1.6l-1.8,1.6l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2l-7.2,6.3l-7.2,6.3l-3.6,3.2l-3.6,3.2l-3.6,3.2l-3.6,3.2
1480
+ l-3.5,3.2l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.8,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6l-1.7,1.6
1481
+ l-1.7,1.6l-1.7,1.6l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1.7,1.7l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9
1482
+ l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-2,1.9l-1,1l-1,1l-1,1l-1,1l-1,1l-1,1l-2.3,2.3l-1.5,1.5l-0.8,0.8l-0.8,0.8l-0.7,0.8l-0.7,0.7
1483
+ l-0.6,0.7l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l0,0l-0.2,0.4l-0.3,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.2l-0.5,0.1
1484
+ l-0.5,0.1h-0.5l-0.5-0.1l-0.5-0.2l-0.4-0.3l-0.4-0.4l-0.3-0.4l-0.2-0.5l-0.1-0.5v-0.5v-0.5v-0.1l0.1-0.4v-0.1l0.1-0.3l0.1-0.2
1485
+ L-199.4,1433z M-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3L-1.4,1257.3z M-194.1,1435.5L-194.1,1435.5l0.1-0.3v-0.1
1486
+ L-194.1,1435.5z"
1487
+ />
1488
+ </g>
1489
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1490
+ <path
1491
+ d="M-186.5,1518.6l0.2-0.4l0.2-0.5l0.3-0.5l0.3-0.6l0.4-0.6l0.4-0.6l0.4-0.7l0.4-0.6l0.4-0.6l0.2-0.3l0.2-0.3
1492
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.3-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.4
1493
+ l0.2-0.4l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.4-0.8l0.2-0.4l0.2-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1494
+ l0.3-0.4l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l0.9-1.1l1.7-2.2l1.7-2.3l1.7-2.3l1.7-2.3
1495
+ l1.7-2.3l1.7-2.3l1.7-2.3l3.3-4.6l3.3-4.6l0.9-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3l1-1.3
1496
+ l1-1.3l2-2.5l2-2.5l2-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.5l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.1-2.4l2.2-2.4l2.2-2.4l2.2-2.4
1497
+ l2.2-2.4l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l2.2-2.3l0.3-0.3l0.3-0.3l0.6-0.7l0.7-0.7l0.7-0.8
1498
+ l0.7-0.8l0.7-0.8l0.7-0.9l0.7-0.9l1.5-1.8l1.6-1.9l1.6-1.9l0.8-1l0.8-1l0.8-1l0.8-1l0.8-0.9l0.8-0.9l0.8-0.9l0.4-0.4l0.4-0.4
1499
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
1500
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.5h0.5l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.3l0.3,0.3l0.2,0.4l0.2,0.4
1501
+ l0.1,0.4v0.5v0.5l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
1502
+ l-0.3,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1503
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,0.9l-0.8,1l-1.6,1.9l-1.6,1.9l-1.5,1.9l-0.8,0.9
1504
+ l-0.7,0.9l-0.7,0.9l-0.7,0.8l-0.7,0.8l-0.7,0.8l-0.7,0.7l-0.3,0.4l-0.3,0.3l-2.2,2.2l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3
1505
+ l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.3l-2.2,2.4l-2.2,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4l-2.1,2.4
1506
+ l-2.1,2.4l-2.1,2.4l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-2,2.5l-1,1.2l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3l-1,1.3
1507
+ l-0.9,1.3l-0.9,1.3l-0.9,1.3l-0.9,1.3l-3.3,4.6l-3.3,4.6l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3l-1.7,2.3
1508
+ l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.9,1.1l-0.2,0.3l-0.2,0.3l-0.2,0.3
1509
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.4,0.8l-0.2,0.4
1510
+ l-0.2,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.1,0.1l-0.1,0.1
1511
+ l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.5l-0.4,0.5l-0.4,0.6l-0.3,0.6l-0.3,0.5l-0.3,0.5l-0.1,0.2l-0.1,0.2l-0.2,0.4
1512
+ l-0.2,0.4l-0.1,0.2l-0.2,0.2l-0.1,0.1l-0.2,0.2l-0.2,0.2l0,0l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4l0,0h-0.5l-0.5-0.1
1513
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.4l-0.2-0.4l-0.2-0.4l0,0l-0.1-0.4v-0.4v-0.4l0.1-0.4l0,0l0.1-0.4l0.1-0.1L-186.5,1518.6z"
1514
+ />
1515
+ </g>
1516
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1517
+ <path
1518
+ d="M-226.1,1292.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.9-0.6l0.9-0.6l1-0.7l1.1-0.7
1519
+ l1.1-0.8l1.2-0.8l1.2-0.9l1.3-0.9l2.7-1.9l2.8-2l2.9-2.1l1.5-1.1l1.5-1.1l1.5-1.1l1.5-1.1l1.6-1.1l1.6-1.1l1.6-1.1l1.6-1l1.6-1
1520
+ l1.6-1l1.5-1l1.5-1l0.8-0.5l0.8-0.5l0.8-0.4l0.8-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.3l0.2-0.1
1521
+ l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.1,0.2l0.1,0.2
1522
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
1523
+ l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.7,0.3l-0.7,0.3l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4
1524
+ l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-1.5,0.9l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1l-1.5,1.1l-1.5,1.1l-1.5,1.1l-1.5,1.1
1525
+ l-1.5,1.1l-1.5,1.1l-2.9,2.1l-2.8,2l-2.7,1.9l-1.3,0.9l-1.2,0.9l-1.2,0.8l-1.1,0.8l-1.1,0.7l-1,0.7l-1,0.6l-0.9,0.6l-0.2,0.1
1526
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1527
+ l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2
1528
+ L-226.1,1292.2z"
1529
+ />
1530
+ </g>
1531
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1532
+ <path
1533
+ d="M-223.1,1301.8l0.2-0.4l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.4h0.4l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1
1534
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.3l1,0.5l1,0.6l1,0.6
1535
+ l1,0.6l1,0.6l1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l2,1.3l1.9,1.3l1.8,1.2l1.7,1.1l0.8,0.5l0.8,0.5l0.8,0.5l0.7,0.4l1.9,1.1
1536
+ l1.9,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.8,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1l1.7,1.1
1537
+ l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.7,1.2l1.6,1.2l1.7,1.2l1.6,1.2l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.3l1.7,1.4l1.7,1.4
1538
+ l1.7,1.4l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.6,0.5l0.7,0.5l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4
1539
+ l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l2.8,1.6l2.8,1.5l2.8,1.6l1.4,0.8
1540
+ l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l1.4,0.8l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.8,0.5l0.7,0.5l0.7,0.5
1541
+ l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l1.3,1l1.2,1l1.2,1l1.2,1l1.2,0.9l0.6,0.5l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1542
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.7,0.4l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4v0.4
1543
+ l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.4l-0.3,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4h-0.4l-0.4-0.1l-0.4-0.2l-0.8-0.4
1544
+ l-0.8-0.4l-0.8-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-1.2-1
1545
+ l-1.2-1l-1.2-1l-1.2-1l-1.2-1l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.4l-0.6-0.4
1546
+ l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.7-0.4l-1.3-0.8l-1.3-0.8l-1.3-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-2.8-1.5l-2.8-1.6
1547
+ l-2.9-1.6l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.8l-1.4-0.9l-1.4-0.9l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.5
1548
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5
1549
+ l-1.7-1.4l-1.7-1.4l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.3l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2l-1.6-1.2
1550
+ l-1.6-1.2l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.6-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1l-1.7-1.1
1551
+ l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.8-1.1l-1.9-1.1l-0.8-0.5l-0.8-0.5l-0.8-0.5l-0.9-0.6l-1.8-1.2l-1.8-1.2l-1.9-1.3l-2-1.3
1552
+ l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.5l-0.9-0.5l-0.9-0.5l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1553
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
1554
+ l-0.4-0.2l-0.4-0.3l-0.3-0.3l-0.3-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4l0.1-0.4L-223.1,1301.8z"
1555
+ />
1556
+ </g>
1557
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1558
+ <path
1559
+ d="M-183.5,1261.5l0.2-0.3l0.3-0.3l0.3-0.3l0.4-0.2l0.4-0.2l0.4-0.1h0.1l0.2-0.1l0.3-0.1l0.4-0.1l0.3-0.1h0.2
1560
+ h0.3h0.1h0.3h0.1l0.4,0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.3,0.1l0.5,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4
1561
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.5,0.4l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l2.6,2.3l2.6,2.2l1.3,1.1
1562
+ l1.3,1.1l1.3,1.1l1.3,1.1l1.3,1.1l0.6,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.7
1563
+ l2.2,1.7l4.3,3.3l4.3,3.3l4.3,3.3l4.3,3.4l4.3,3.3l4.3,3.3l4.3,3.3l2.2,1.7l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6
1564
+ l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l2.2,1.6l0.3,0.2l0.4,0.3l0.7,0.6l0.8,0.6l0.8,0.6l0.8,0.7l0.8,0.7l1.7,1.5l1.8,1.5l0.9,0.8
1565
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3
1566
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1h0.2
1567
+ h0.2h0.2h0.2h0.1h0.1h0.1h0.2h0.4l0.4,0.1l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4
1568
+ l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1H-50h-0.2h-0.3h-0.3h-0.3h-0.3h-0.3H-52h-0.3l-0.5-0.1
1569
+ l-0.6-0.1l-0.6-0.1l-0.5-0.2l-0.6-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3
1570
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-1.1-0.8l-1-0.8
1571
+ l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1.8-1.6l-1.7-1.5l-0.8-0.7l-0.8-0.6l-0.7-0.6l-0.7-0.6l-0.7-0.5l-0.3-0.2l-0.3-0.2
1572
+ l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.6l-2.2-1.7l-2.2-1.7l-4.3-3.3
1573
+ l-4.3-3.3l-4.3-3.3l-4.3-3.4l-4.3-3.3l-4.3-3.3l-4.3-3.3l-2.1-1.6l-2.2-1.6l-2.1-1.6l-2.1-1.6l-2.2-1.6l-2.2-1.6l-0.7-0.5
1574
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-1.3-1.1l-2.6-2.2l-2.6-2.2l-1.3-1.1
1575
+ l-1.3-1.1l-1.3-1.1l-1.3-1.1l-0.4-0.3l-0.4-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3
1576
+ l-0.6-0.3l-0.6-0.3l-0.5-0.3l-0.4-0.2l-0.2,0.1l-0.3,0.1l0,0h-0.2h-0.2l0,0h-0.3h-0.3l0,0l-0.4-0.1l-0.4-0.1l-0.3-0.2l0,0
1577
+ l-0.3-0.2l-0.3-0.2l-0.2-0.3l-0.2-0.3l0,0l-0.2-0.4l-0.1-0.4l-0.1-0.4l0,0v-0.4v-0.4l0,0v-0.2v-0.2l0,0l0.1-0.4L-183.5,1261.5z
1578
+ M-178.1,1263.7v-0.2v-0.2V1263.7z M-178,1263.2v-0.2v-0.1V1263.2z"
1579
+ />
1580
+ </g>
1581
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1582
+ <path
1583
+ d="M-82.3,1264.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1
1584
+ l0.3-0.1h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.3l0.3,0.3l0.3,0.3
1585
+ l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.5l0.3,0.5l0.3,0.5l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1
1586
+ l0.1,0.1l0,0l0,0l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.5l0.7,0.6l0.7,0.6l0.7,0.6l0.6,0.6l0.6,0.6l0.6,0.6l0.6,0.6
1587
+ l0.6,0.6l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l1.2,1.2l2.4,2.4l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.5,0.4
1588
+ l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8l1.2,0.8
1589
+ l1.2,0.8l2.3,1.5l0.3,0.2l0.4,0.2l0.9,0.6l0.5,0.3l0.6,0.3l0.6,0.4l0.6,0.4l0.6,0.4l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
1590
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.2l0.1,0.3v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.3v0.3v0.3
1591
+ l-0.1,0.3l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1592
+ h-0.3H-30h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1
1593
+ l0,0l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-1-0.6l-0.4-0.3
1594
+ l-0.4-0.2l-2.3-1.5l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.8l-1.2-0.9l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.5l-0.6-0.5
1595
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-2.4-2.4l-1.2-1.2
1596
+ l-1.2-1.2l-1.2-1.2l-1.2-1.2l-1.2-1.1l-1.2-1.1l-1.2-1.1l-0.6-0.5l-0.6-0.6l-0.6-0.6l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5
1597
+ l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.6-0.5l-0.7-0.5l-0.2-0.1l-0.2-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3
1598
+ l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.3-0.4l-0.1-0.2l-0.1-0.2l0,0h-0.1H-80h-0.3l-0.3-0.1
1599
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3
1600
+ v-0.3l0.1-0.3l0.1-0.2L-82.3,1264.1z M-33,1307.9L-33,1307.9L-33,1307.9L-33,1307.9z"
1601
+ />
1602
+ </g>
1603
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1604
+ <path
1605
+ d="M-214.8,1340L-214.8,1340l0.2-0.3l0.1-0.2l0,0l0.2-0.2l0,0l0.3-0.3l0,0l0.3-0.2l0,0l0.3-0.2l0,0l0.3-0.1l0,0
1606
+ l0.2-0.1h0.2h0.1h0.3h0.3h0.1h0.2h0.2h0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1607
+ l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.9,0.9l0.9,1l0.5,0.5l0.5,0.5l0.5,0.5l0.5,0.4l0.4,0.4l0.4,0.4l0.4,0.4
1608
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.5,0.3l0.5,0.3l0.5,0.3l0.5,0.3l1.1,0.6
1609
+ l1.1,0.6l1.1,0.6l1,0.6l1,0.6l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1.9,1.5l1.9,1.5
1610
+ l1.9,1.5l1.9,1.5l1.9,1.5l1.8,1.4l3.7,2.9l3.7,2.9l3.7,2.9l3.7,2.9l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.7,3l3.6,3l3.6,3l3.6,3
1611
+ l3.6,3.1l3.6,3.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.6,0.4l0.6,0.4l0.6,0.4l0.7,0.4l0.7,0.5l0.7,0.5l1.5,1l1.5,1l1.6,1l0.8,0.5
1612
+ l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.6l0.8,0.6l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
1613
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.4l0.3,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.1,0.4
1614
+ l0.1,0.4v0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1h-0.4H-91l-0.4-0.1
1615
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1616
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.2l-0.3-0.3l-0.3-0.2
1617
+ l-0.3-0.3l-0.3-0.2l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.8-0.5l-0.8-0.5l-0.8-0.5l-1.5-1l-1.5-1l-1.5-1l-0.7-0.5l-0.7-0.5
1618
+ l-0.7-0.5l-0.7-0.5l-0.7-0.5l-0.6-0.5l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-3.6-3.1l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3l-3.6-3
1619
+ l-3.7-3l-3.7-3l-3.7-3l-3.7-3l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-3.7-2.9l-1.8-1.4l-1.9-1.5l-1.9-1.5l-1.9-1.5l-1.9-1.5
1620
+ l-1.9-1.5l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.6l-1-0.6l-1-0.6l-1-0.6l-1-0.6
1621
+ l-1-0.6l-1-0.5l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1622
+ l-0.3-0.2l-0.3-0.2l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.9-1l-0.9-0.9l-0.4-0.4l-0.4-0.4l-0.4-0.4
1623
+ l-0.3-0.3h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.3v-0.3
1624
+ l0.1-0.3v-0.1l0.1-0.4v-0.1l0.1-0.2L-214.8,1340z"
1625
+ />
1626
+ </g>
1627
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1628
+ <path
1629
+ d="M-204.5,1408.5l0.2-0.3l0.2-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1h0.4h0.4h0.4l0.3,0.1l0.3,0.1
1630
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1631
+ l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.8,0.8l0.9,0.8l0.9,0.8l0.9,0.8
1632
+ l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1.1,0.8l2.1,1.6l2.1,1.6l2.1,1.6l1,0.8l1,0.8l1,0.8l0.9,0.8l0.9,0.8l0.9,0.7l3.8,3.3l3.9,3.3
1633
+ l1.9,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.7l2,1.6l2,1.6l2,1.6l2,1.6l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8l1,0.8
1634
+ l1,0.8l1,0.8l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.7l1.1,0.6
1635
+ l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l1.1,0.6l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3l0.2,0.3l0.1,0.3
1636
+ l0.1,0.3l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.4,0.1
1637
+ h-0.4h-0.4l-0.4-0.1l-0.3-0.1l-0.3-0.1l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.6l-1.1-0.7l-1.1-0.7
1638
+ l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.7l-1.1-0.8
1639
+ l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-2.1-1.6l-2.1-1.6
1640
+ l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-2-1.7l-3.9-3.3l-3.8-3.3l-0.8-0.7l-0.9-0.7l-0.9-0.7l-0.9-0.8l-1-0.8
1641
+ l-1-0.8l-2.1-1.6l-2.1-1.6l-2.1-1.6l-1.1-0.8l-1.1-0.8l-1.1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-1-0.8l-0.9-0.8l-0.9-0.8l-0.4-0.4
1642
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4
1643
+ l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.3l-0.1-0.3v-0.4v-0.4v-0.4l0.1-0.3l0.1-0.3L-204.5,1408.5z"
1644
+ />
1645
+ </g>
1646
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1647
+ <path
1648
+ d="M-196.1,1467.1l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0,0l0.2-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3
1649
+ h0.3h0.3l0,0l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.1l0.2,0.2l0.3,0.4l0.4,0.4l0.4,0.5
1650
+ l0.5,0.5l1,1.1l0.9,1l0.7,0.7l0.2,0.2l0.1,0.1l0.4,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.5,0.4l0.9,0.7l0.9,0.7
1651
+ l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l1,0.7l2,1.4l2.1,1.4l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.6l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5l0.9,0.5
1652
+ l0.9,0.5l0.9,0.5l0.9,0.5l1.8,1l1.8,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l1.9,1l0.9,0.5l0.9,0.5l0.9,0.5l1,0.5l0.5,0.3l0.6,0.3
1653
+ l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l1.2,0.8l1.2,0.9l1.2,0.9l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4l0.6,0.4
1654
+ l0.6,0.3l0.6,0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1655
+ l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3
1656
+ l0.1,0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1
1657
+ l-0.3,0.1h-0.3h-0.3h-0.3h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
1658
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.7-0.4
1659
+ l-0.7-0.4l-0.7-0.4l-0.7-0.4l-0.6-0.4l-1.3-0.9l-1.2-0.9l-1.2-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.4-0.3
1660
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.5l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-1.9-1l-0.9-0.5l-0.9-0.5l-0.9-0.5
1661
+ l-0.9-0.5l-0.9-0.5l-0.9-0.5l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-0.9-0.6l-2.1-1.4l-2-1.4l-1-0.7l-1-0.7l-1-0.7
1662
+ l-1-0.7l-1-0.7l-1-0.7l-1-0.7l-1-0.8l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.2-0.2
1663
+ l-0.3-0.3l-0.8-0.8l-0.9-1l-1-1.1l-0.5-0.6l-0.5-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.4l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.3v-0.1
1664
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.3v-0.3v-0.3v-0.3l0,0l0.1-0.3l0.1-0.3L-196.1,1467.1z"
1665
+ />
1666
+ </g>
1667
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1668
+ <path
1669
+ fill="#DACEB3"
1670
+ d="M-197.1,1289.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
1671
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.2-0.1l0.3-0.1h0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.1h0.3h0.1h0.2h0.2h0.1h0.3h0.1h0.3h0.1
1672
+ l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0,0l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
1673
+ l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0h0.2h0.2l0,0l0.2,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.1,0.1
1674
+ l0.2,0.2l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.3,0.5l0.3,0.6l0.3,0.6l0.4,0.6l0.4,0.7
1675
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.2,0.3l0.2,0.1l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3
1676
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.2l0.2,0.4l0.2,0.5l0.2,0.5l0.1,0.5l0.1,0.4l0.1,0.3v0.2l0.1,0.8
1677
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.5l0.1,1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.7l0,0l0.2,0.2
1678
+ l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2v0.1v0.2v0.2v0.2l0.1,0.6v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5
1679
+ v0.5v0.5v0.1v0.2v0.5v0.5v0.5v0.5v0.5v0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.8
1680
+ l-0.2,0.8l-0.2,0.8l-0.2,0.8l-0.1,0.3l-0.2,0.7l-0.1,2l-0.1,3l-0.1,3v0.4v0.5v1.1v1.3v1.5v0.8v0.8v0.8v0.9v0.9v0.9l-0.1,0.9
1681
+ l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
1682
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.3,0.3l-0.3,0.3
1683
+ l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3
1684
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1h-0.1l-0.2,0.1l0,0l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l0,0
1685
+ l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2
1686
+ v-0.3v-0.2l-0.1-0.4v-0.5v-0.6v-0.7v-0.8l-0.1-1.7l0,0v-0.1l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.9l-0.3-0.9
1687
+ l-0.3-0.9l-0.3-0.9l-0.6-1.8l-0.6-1.8l-0.5-1.7l-0.5-1.6l-0.8-2.5v-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
1688
+ v-0.2l-0.1-0.3l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.1-0.8l-0.1-0.8
1689
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.6l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3
1690
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.2-0.5l-0.2-0.5l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
1691
+ l-0.1-0.6l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.5v-0.1v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6
1692
+ v-0.6v-0.6v-0.6l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.1-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.2-1.2l0.4-2.3l0.4-2.3
1693
+ l0.1-0.5l0.1-0.5l0.2-1.3l0.1-0.7l0.1-0.7l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-197.1,1289.5l0-0.4l0.2-0.4
1694
+ L-197.1,1289.5z M-184.6,1294.6L-184.6,1294.6v-0.2l-0.1-0.3L-184.6,1294.6z"
1695
+ />
1696
+ </g>
1697
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1698
+ <path
1699
+ fill="#DACEB3"
1700
+ d="M-182,1397.3L-182,1397.3L-182,1397.3l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0v-0.3
1701
+ v-0.1v-0.1v-0.1l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1702
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.1h0.2h0.1l0.1,0.1l0.1,0.1
1703
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
1704
+ v0.1v0.1v0.2v0.4v0.4v0.5l0.1,1.3v0.7h0.1h0.1h0.1h0.1l0,0h0.1h0.1h0.1h0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1
1705
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1v0.1v0.1v0.1v0.1
1706
+ v0.1v0.1v0.1v0.1v0.2v0.2v0.1v0.1v0.3v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.6l-0.2,0.6l-0.1,0.3v0.1v0.5v0.5v0.6v0.6
1707
+ v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6v0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3
1708
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1
1709
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0h-0.1h-0.1h-0.1l0,0h-0.1h-0.1
1710
+ h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l0,0h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1h-0.1h-0.1h-0.1l-0.1-0.1
1711
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0
1712
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4v-0.2l0,0l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4
1713
+ l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.8l0.1-0.8l0.1-0.9l0.1-0.6
1714
+ v-0.1v-0.5v-0.6v-0.6v-0.4v-0.6v-0.8v-0.8v-0.8v-0.8v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3v-0.1
1715
+ v-0.1v-0.1l0.1-0.1L-182,1397.3z"
1716
+ />
1717
+ </g>
1718
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1719
+ <path
1720
+ fill="#DACEB3"
1721
+ d="M-240.6,1222l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
1722
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.4-0.2l0.4-0.2l0.3-0.1l0.5-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.2-0.1l0,0l0.1-0.1l0.1-0.1
1723
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.4-0.1l0.4-0.1
1724
+ h0.4h0.3h0.3h0.3h0.3h0.3h0.3l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1l0.8,0.2h0.2h0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1
1725
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.5,0.2h0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1726
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l1.5,0.7l1.5,0.7l1.5,0.7l1.5,0.7l1.4,0.7l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3l0.7,0.3
1727
+ l0.7,0.3l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.7,0.2l0.3,0.1l0.4,0.1l0.3,0.1h0.2h0.2h0.4h0.5h0.5h0.5h0.5l0.5,0.1l1,0.1
1728
+ l0.5,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0,0
1729
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.2,0.2
1730
+ l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.2l0,0l0.1,0.2l0.1,0.2v0.2
1731
+ l0,0v0.2v0.2l0,0v0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0
1732
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3l-0.5,0.1h-0.5
1733
+ h-0.5h-0.5h-0.5h-0.5h-0.6h-0.6h-0.6h-0.6h-0.6l-1.1-0.1l-1.1-0.1l-1-0.1l-0.9-0.1l-0.8-0.1l-0.6-0.1l-0.3-0.1l-0.3-0.1l-0.7-0.2
1734
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
1735
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.3l-0.7-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-2.5-0.4l-2.5-0.4
1736
+ l-2.5-0.4l-2.5-0.5h-0.1h-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1737
+ l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
1738
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.2v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2v-0.2v-0.1v-0.2
1739
+ v-0.2v-0.1v-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2L-240.6,1222z"
1740
+ />
1741
+ </g>
1742
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1743
+ <path
1744
+ d="M-236.9,1244.6l0.5-0.8l0.6-0.7l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5
1745
+ l0.7,0.6l0.1,0.1l0.5,0.6l0.1,0.1l0.4,0.6v0.1l0.3,0.7v0.1l0.2,0.8v0.1l0.1,0.6v0.1v0.7v0.1v0.5v0.3l-0.1,0.5l-0.1,0.5l-0.1,0.4
1746
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.1,0.2v0.1v0.4v0.4v0.3l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.3,1.6l0.3,1.6
1747
+ l0.3,1.6l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.6,2.9l0.6,2.9l0.6,2.9l1.2,5.9l0.6,3l0.6,3l0.6,3l0.3,1.5l0.3,1.5
1748
+ l0.3,1.5l0.3,1.5l0.3,1.5l0.3,1.5l0.2,1.5l0.2,1.6l0.2,1.6l0.3,2.4l0.1,0.8l0.1,0.9l0.1,0.8l0.3,1.7l0.3,1.7l0.3,1.7l0.3,1.7
1749
+ l0.3,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.4,1.7l0.8,3.5l0.8,3.5l0.8,3.5l0.8,3.5l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8l0.4,1.8
1750
+ l0.4,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.3,1.8l0.1,0.9l0.1,0.9l0.1,0.9l0.1,0.9l0.5,3.8l0.5,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8
1751
+ l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l0.6,3.8l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5l2.6,15l1.3,7.5l1.3,7.5l1.3,7.5l1.3,7.5
1752
+ l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.4,2.6l0.7,5.2l0.7,5.2l0.7,5.1l0.7,5.1l0.7,5.1l0.4,2.5l0.4,2.5
1753
+ l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.4,2.5l0.5,2.5l0.5,2.5l0.5,2.5v0.2v0.2l0.1,0.2v0.2l0.1,0.4
1754
+ l0.1,0.4l0.1,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.4l0.2,0.5l0.2,0.5l0.2,0.5l0.5,1l1.1,2.1l0.6,1.1l0.3,0.6
1755
+ l0.3,0.6l0.3,0.6l0,0l0.2-0.4l0.4-1l0.4-1.1l0.2-0.6l0.2-0.6l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.4-0.6
1756
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7l0.5-0.7
1757
+ l0.5-0.7l0.5-0.7l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.5l0.9-1.5l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l0.9-1.6l1.7-3.3l1.7-3.3
1758
+ l1.8-3.3l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.7l0.9-1.6l1-1.6l1-1.6l0.5-0.8l0.5-0.8l0.5-0.8l0.5-0.8l0.9-1.4l0.9-1.4l0.9-1.4
1759
+ l0.8-1.4l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.5l0.8-1.6
1760
+ l1.5-3.1l3-6.3l1.5-3.2l1.5-3.1l0.8-1.6l0.8-1.6l0.8-1.6l0.8-1.6l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7
1761
+ l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.3-2.7l1.2-2.7l1.2-2.7l1.2-2.7l1.2-2.7l2.5-5.5l2.4-5.5l2.4-5.5l2.4-5.5l4.9-11l2.4-5.5
1762
+ l2.4-5.5l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3.1
1763
+ l1.4-3.1l1.4-3.1l1.4-3.1l1.4-3l1.4-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.5-3l1.1-2.1
1764
+ l1.1-2.1l1-2.1l1-2.1l1-2.2l1-2.2l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.5-1.1l0.4-1.1l0.4-1.1
1765
+ l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.4-1.1l0.1-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
1766
+ l0.2-0.3l0.2-0.3l0.4-0.6l0.4-0.6l0.6-1l0.3-0.4l0.2-0.4l0.1-0.2l0.1-0.1l0.1-0.1v-0.1l0.1-0.4l0.3-0.9l0.4-0.8l0.5-0.8l0.6-0.7
1767
+ l0.7-0.6l0.8-0.4l0.9-0.3l0.9-0.2h0.9l0.9,0.1l0.9,0.3l0.8,0.4l0.8,0.5l0.7,0.6l0.6,0.7l0.4,0.8l0.3,0.9l0.2,0.9v0.9v0.4
1768
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.5l-0.2,0.5l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.4,0.6l-0.4,0.6l-0.7,1
1769
+ l-0.3,0.4l-0.3,0.4l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1v0.1v0.1l0,0v0.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1770
+ l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1
1771
+ l-0.5,1.1l-1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.2l-1.1,2.1l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3l-1.5,3
1772
+ l-1.5,3l-1.5,3l-1.5,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1
1773
+ l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-1.4,3.1l-2.4,5.5l-2.4,5.5l-4.9,11l-2.4,5.5l-2.4,5.5l-2.5,5.5
1774
+ l-2.5,5.5l-1.2,2.8l-1.2,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.8l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7
1775
+ l-1.3,2.7l-1.3,2.7l-1.3,2.7l-1.3,2.7l-0.8,1.5l-0.8,1.5l-0.8,1.5l-0.7,1.5l-1.5,3.1l-1.5,3.1l-3,6.3l-1.5,3.2l-0.8,1.6l-0.8,1.6
1776
+ l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.8,1.6l-0.9,1.6l-0.9,1.5l-0.9,1.5l-0.9,1.5
1777
+ l-0.9,1.5l-0.9,1.5l-0.9,1.5l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6
1778
+ l-0.9,1.6l-0.9,1.6l-1.7,3.3l-1.7,3.3l-1.7,3.3l-0.9,1.7l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-0.9,1.6l-1,1.6l-0.5,0.8
1779
+ l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.5,0.8l-0.6,0.8
1780
+ l-0.6,0.8l-0.5,0.7l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4
1781
+ l-0.2,0.4l-0.2,0.5l-0.2,0.5l-0.4,1l-0.4,1.1l-0.5,1.1l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.4,0.6
1782
+ l-0.4,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.4,0.3
1783
+ l-0.5,0.3l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4h-0.5h-0.4l-0.5-0.1l-0.4-0.1l-0.6-0.2l-0.5-0.2
1784
+ l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3
1785
+ l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.4l-0.3-0.4l-0.3-0.5l-0.2-0.5l-0.2-0.7l-0.2-0.5l-0.2-0.5l-0.2-0.5
1786
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.5-1l-1.1-2.1l-0.6-1.1l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6
1787
+ l-0.3-0.6l-0.3-0.7l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.5-2.6l-0.5-2.5
1788
+ l-0.5-2.5l-0.5-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.7-5.1
1789
+ l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.7-5.1l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.6l-0.4-2.5l-0.4-2.5l-0.4-2.5l-1.2-7.4
1790
+ l-1.3-7.4l-1.3-7.5l-1.3-7.5l-2.6-15l-1.3-7.5l-1.3-7.5l-1.3-7.5l-1.3-7.5l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8
1791
+ l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.6-3.8l-0.5-3.8l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.8l-0.3-1.7l-0.3-1.7
1792
+ l-0.3-1.7l-0.3-1.7l-0.3-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.4-1.7l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.8-3.5l-0.4-1.8
1793
+ l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.4-1.8l-0.3-1.8l-0.3-1.8l-0.3-1.8l-0.2-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9
1794
+ l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.2-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.6-3l-0.6-2.9l-0.6-2.9l-1.2-5.9
1795
+ l-0.6-3l-0.6-3l-0.6-3l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.5l-0.3-1.6l-0.3-1.6l-0.3-1.7l-0.1-0.9l-0.1-0.9
1796
+ l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9l-0.1-0.9v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5l0.1-0.5l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4
1797
+ l0.2-0.5l0.1-0.2v-0.3l0.1-0.9l0.3-0.9L-236.9,1244.6z M-3,1245.6v0.2l0,0V1245.6L-3,1245.6z M-236.3,1251.3l0.2,0.2l-0.4-0.6
1798
+ L-236.3,1251.3z"
1799
+ />
1800
+ </g>
1801
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1802
+ <path
1803
+ d="M-269.9,1186.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1804
+ l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2
1805
+ l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1806
+ l0.1,0.3v0.3l0,0v0.3v0.3v0.3v0.3l0,0v0.2v0.2l-0.1,0.2l-0.1,0.3l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,0.9l-0.4,0.9l-0.3,0.8
1807
+ l-0.1,0.3l-0.1,0.2l-0.2,1.4l-0.1,0.9l-0.1,0.9l-0.1,1l-0.1,1l-0.1,0.5l-0.1,0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.4v0.4v0.4v0.4v0.4
1808
+ v0.3v0.3v0.3v0.3l0.1,0.2v0.1v0.1v0.1v0.1l0.4,1.1l0.4,1.2l0.5,1.3l0.2,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
1809
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7
1810
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.5,0.7l0.5,0.7l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.6l0.5,0.5l0.2,0.3l0.2,0.3
1811
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
1812
+ l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
1813
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1814
+ l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3
1815
+ l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1816
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1817
+ l-0.3,0.1h-0.3h-0.3h1.6h-0.4h-0.5h-0.5h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
1818
+ l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2
1819
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.4-0.3
1820
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.6-0.7l-0.6-0.7l-0.6-0.7l-0.6-0.8l-0.6-0.8l-0.6-0.8
1821
+ l-0.6-0.8l-0.6-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.5-0.8l-0.4-0.8l-0.4-0.8
1822
+ l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.3-0.8
1823
+ l-0.3-0.8l-0.3-0.7l-0.3-0.7l-0.5-1.4l-0.5-1.4l-0.4-1.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.6l-0.1-0.7l-0.1-0.7
1824
+ l-0.1-0.7l-0.1-0.7v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-1.1l0.1-1.1l0.2-1l0.2-1
1825
+ l0.3-1.8l0.1-0.3l0.1-0.4l0.1-0.5l0.2-0.5l0.2-0.5l0.4-1l0.4-1l0.3-0.9l0.3-0.7v-0.1v-0.2l0.1-0.3l0.1-0.3L-269.9,1186.4z
1826
+ M-270.5,1188.7v0.6v-0.3V1188.7l0.1-0.3v-0.1L-270.5,1188.7z M-270.4,1187.7L-270.4,1187.7L-270.4,1187.7L-270.4,1187.7z"
1827
+ />
1828
+ </g>
1829
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1830
+ <path
1831
+ d="M-5,1240.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1832
+ l0.3-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
1833
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.3l0.3-0.3l0.3-0.3
1834
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.3
1835
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4
1836
+ l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.5-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9l0.4-0.9
1837
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.3-1l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9
1838
+ l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9v-0.9v-0.9v-0.9v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.3l0.2-0.3l0.2-0.3
1839
+ l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1h0.4h0.4h0.4h0.4
1840
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1841
+ l0.2,0.3l0.2,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v1v1.1v1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1
1842
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1
1843
+ l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.4,1.1l-0.5,1.1l-0.5,1.1l-0.5,1.1l-0.5,1l-0.5,1l-0.5,1l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1844
+ l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5l-0.3,0.5
1845
+ l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
1846
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.5,0.3l-0.5,0.3
1847
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2
1848
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1H0.8H0.4H0h-0.4l-0.4-0.1
1849
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3
1850
+ l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.4l-0.1-0.4l-0.1-0.4v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4L-5,1240.4z"
1851
+ />
1852
+ </g>
1853
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1854
+ <path
1855
+ d="M-271.2,1188.2l0.2-0.4l0.2-0.4l0.1-0.2l0.3-0.4l0.3-0.4l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.3-0.3l0.3-0.3
1856
+ l0.3-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3
1857
+ l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.6-0.2l0.4-0.1l0.4-0.1l0.5-0.1h0.5h0.5h0.4h0.4h0.4h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1
1858
+ l0.4,0.1l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.2l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3l0.8,0.3
1859
+ l0.8,0.3l1.5,0.6l1.4,0.5l1.3,0.5l1.1,0.5l1,0.4l1.1,0.4l1,0.4l1.1,0.4l1,0.4l1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4
1860
+ l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.4l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3
1861
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2
1862
+ l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.2l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1l1.1,0.1
1863
+ l1.1,0.1l1.1,0.1l1.1,0.1h1.1h1.1h1.1h1.1h1.1h1.1h1.6h1.6h1.6h1.6h1.6l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1
1864
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.3l3.2,0.3l3.2,0.3l6.5,0.6l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3l3.2,0.3
1865
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6
1866
+ h1.6h1.6h1.6h1.6l1.6-0.1l1.6-0.1l1.6-0.1l1.6-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1
1867
+ l0.9-0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.3
1868
+ l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l0.9-0.3l1.8-0.7l1.8-0.7l1.8-0.7
1869
+ l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l1.8-0.7l3.5-1.5l3.5-1.5l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1870
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3l1.1-0.7l1.1-0.7l1.2-0.7l1.2-0.7l0.6-0.4l0.6-0.4l0.6-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.7-0.4
1871
+ l0.7-0.4l0.7-0.3l0.7-0.3l0.7-0.3l0.8-0.3l0.8-0.3l0.4-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.5l0.5,0.1
1872
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
1873
+ l0.2,0.2l0.2,0.3l0.4,0.4l0.3,0.4l0.3,0.4l0.5,0.7l0.2,0.3l0.2,0.2v0.1l0.5,0.1l0.7,0.3l0.7,0.4l0.6,0.4l0.6,0.5l0.5,0.6l0.4,0.7
1874
+ l0.3,0.7l0.2,0.7l0.1,0.8v0.8l-0.1,0.8l-0.2,0.8l-0.3,0.7l-0.4,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.7,0.4l-0.7,0.3l-0.7,0.2
1875
+ l-0.8,0.1h-0.8h-0.4h-0.5l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.3l-0.3-0.3
1876
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.3l-0.3,0.1
1877
+ l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.5,0.3l-1.1,0.7l-1.2,0.7
1878
+ l-1.2,0.8l-1.2,0.8l-0.6,0.4l-0.6,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.4l-0.7,0.3l-0.7,0.3l-0.7,0.3l-3.6,1.5
1879
+ l-3.6,1.5l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.8l-1.8,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1.9,0.7l-1,0.3l-1,0.3l-1,0.3
1880
+ l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.3l-1,0.2l-1,0.2l-1,0.2l-1,0.2
1881
+ l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.2l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1.7,0.1
1882
+ l-1.7,0.1l-1.7,0.1l-1.7,0.1h-1.7h-1.7h-1.7h-1.7h-1.7h-1.7H-80h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1883
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.3-0.3l-3.3-0.3l-3.3-0.3l-3.2-0.3l-3.2-0.3
1884
+ l-6.5-0.6l-3.2-0.3l-3.2-0.3l-3.2-0.3l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1
1885
+ l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6h-1.2h-1.2h-1.2h-1.2h-1.2h-1.2l-1.2-0.1l-1.2-0.1l-1.2-0.1
1886
+ l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.1l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2
1887
+ l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.2l-1.2-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
1888
+ l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.4l-1.1-0.4
1889
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4l-1.1-0.4
1890
+ l-1.1-0.4l-1.1-0.4l-1.1-0.4l-0.9-0.4l-1.1-0.4l-1.2-0.5l-1.3-0.5l-1.4-0.5l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.3
1891
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.1l-0.6-0.1l-0.6-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2
1892
+ h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0l0,0l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
1893
+ l-0.4,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.2,0.3v0.1l0.1-0.1l-0.4,0.6l-0.5,0.6
1894
+ l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.2l-0.8,0.1h-0.8l0,0l-0.8-0.1l-0.8-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.4l-0.6-0.5l-0.5-0.6
1895
+ l-0.4-0.7l-0.3-0.7l-0.2-0.7l-0.1-0.8v-0.8l0.1-0.8l0.2-0.8L-271.2,1188.2L-271.2,1188.2z M-260.6,1193.4l0.2-0.4l0,0
1896
+ L-260.6,1193.4L-260.6,1193.4z"
1897
+ />
1898
+ </g>
1899
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1900
+ <path
1901
+ d="M-265.5,1181.6l0.4-0.7l0.5-0.6l0.6-0.5l0.4-0.3l0.4-0.4l0.4-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
1902
+ l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
1903
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.9-0.3l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l1.8-0.3l1.7-0.3l0.8-0.2l0.8-0.2l0.8-0.2
1904
+ l0.8-0.2l0.8-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.4l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3
1905
+ l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.3l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2l1.3-0.2
1906
+ l1.4-0.2l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l1.4-0.1l5.1-0.3l5.1-0.3l5.2-0.3l5.2-0.3l10.4-0.7l5.2-0.3l5.2-0.3l5.2-0.3
1907
+ l5.2-0.3l5.2-0.3l5.2-0.3l5.2-0.3l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1l2.6-0.1
1908
+ l2.6-0.1l2.6-0.1l2.6-0.1h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6h2.6l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1
1909
+ l2.6,0.1l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l2.6,0.2l3.2,0.3l3.2,0.3l1.7,0.1l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2l1.7,0.2
1910
+ l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.9,0.2
1911
+ l0.9,0.2l0.9,0.2l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.9,0.3l0.8,0.3l0.8,0.3l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4l0.8,0.4
1912
+ l0.8,0.4l0.8,0.4l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.8,0.5l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3
1913
+ l0.4,0.3l0.4,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.5,0.6l0.4,0.6l0.3,0.7l0.3,0.7l0.2,0.8l0.1,0.8v0.8l-0.1,0.8l-0.2,0.7
1914
+ l-0.3,0.7l-0.4,0.6l-0.5,0.6l-0.6,0.5l-0.6,0.4l-0.7,0.3l-0.7,0.3l-0.8,0.2l-0.8,0.1H22l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.6-0.4
1915
+ l-0.6-0.5l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
1916
+ l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.7-0.3
1917
+ l-0.7-0.3l-0.7-0.3l-0.7-0.3l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
1918
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1L-9,1173l-0.8-0.1l-0.8-0.1l-0.8-0.1
1919
+ l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.2l-1.6-0.1l-3.2-0.3l-3.2-0.3l-2.6-0.2l-2.5-0.2l-2.5-0.2l-2.5-0.2l-2.6-0.2
1920
+ l-2.6-0.2l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1l-2.6-0.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
1921
+ h-2.6h-2.6l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1l-2.6,0.1
1922
+ l-2.6,0.1l-2.6,0.1l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-5.2,0.3l-10.4,0.7l-5.2,0.3l-5.2,0.3l-5.2,0.3
1923
+ l-5.1,0.3l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.3,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2
1924
+ l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1925
+ l-1.2,0.3l-1.2,0.3l-1.3,0.3l-1.3,0.3l-1.3,0.4l-1.3,0.4l-1.3,0.4l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
1926
+ l-0.9,0.2l-0.9,0.2l-1.7,0.3l-1.7,0.3l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.4,0.1l-0.4,0.1
1927
+ l-0.4,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
1928
+ l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.6,0.5l-0.7,0.4
1929
+ l-0.7,0.3l-0.8,0.2l-0.8,0.1h-0.8l-0.8-0.1l-0.7-0.2l-0.7-0.3l-0.7-0.4l-0.6-0.5l-0.5-0.6l-0.5-0.6l-0.4-0.7l-0.3-0.7l-0.2-0.8
1930
+ l-0.1-0.8v-0.8l0.1-0.8l0.2-0.7L-265.5,1181.6z"
1931
+ />
1932
+ </g>
1933
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1934
+ <path
1935
+ d="M-231.8,1244l0.4-0.6l0.4-0.5l0.5-0.5l0.5-0.4l0.6-0.4l0,0l0.5-0.2l0.5-0.2l0.6-0.1l0.6-0.1l0,0h0.5h0.5h0.3
1936
+ l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.8,0.3l0.9,0.3l1,0.4l2.1,0.8l2.2,0.9l1.1,0.4l1,0.4l0.9,0.3l0.4,0.1l0.4,0.1l0.3,0.1
1937
+ l0.2,0.1h0.2h0.1l1.5,0.3l1.6,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l6.1,1.6l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.4l1.5,0.3
1938
+ l1.5,0.3l1.5,0.3l1.5,0.3l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
1939
+ l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.6-0.1l1.6-0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6
1940
+ l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2l3.2,0.2
1941
+ l3.2,0.2l3.2,0.2l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1l1.6,0.1h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6h1.6l1.6-0.1l1.5-0.1
1942
+ l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.1l1.5-0.2l1.5-0.2l1.5-0.2l1.2-0.1l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.2-0.2l1.1-0.2
1943
+ l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.2l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3
1944
+ l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.3l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1.1-0.4l1-0.4l1-0.4l1-0.4l1-0.4
1945
+ l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.4l1-0.5l1-0.5l1-0.5l2.1-0.9l2.1-1l2.1-1l2.1-1l2.1-1l2.1-1L5,1233
1946
+ l0.6-0.3l0.7-0.2l0.7-0.1h0.7h0.7l0.7,0.1l0.7,0.2l0.6,0.3l0.6,0.3l0.5,0.4l0.5,0.5l0.4,0.5l0.4,0.6l0.3,0.6l0.2,0.6l0.2,0.7
1947
+ l0.1,0.7v0.7l-0.1,0.7l-0.2,0.7l-0.2,0.6l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.5,0.5l-0.6,0.4l-0.6,0.3l-2.2,1.1l-2.2,1.1l-2.2,1
1948
+ l-2.2,1l-2.2,1l-2.2,1l-2.2,1l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.5l-1.1,0.4l-1.1,0.4l-1.1,0.4
1949
+ l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4
1950
+ l-1.1,0.4l-1.1,0.4l-1.1,0.3l-1.1,0.3l-1.1,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3l-1.2,0.3
1951
+ l-1.2,0.3l-1.2,0.3l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.3,0.2l-1.3,0.2
1952
+ l-1.3,0.2l-1.6,0.2l-1.7,0.2l-1.6,0.2l-1.7,0.1l-1.6,0.1l-1.7,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1l-1.6,0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1953
+ h-1.6h-1.6h-1.6h-1.6h-1.6l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2
1954
+ l-3.2-0.2l-3.2-0.2l-3.2-0.2l-3.2-0.2l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1l-1.6-0.1h-1.6h-1.6h-1.6h-1.6h-1.6
1955
+ h-1.6h-1.6h-1.6h-1.5h-1.5h-1.5l-1.5,0.1l-1.6,0.1h-0.8h-0.9h-0.9h-0.9h-0.9h-0.9h-0.8h-0.8h-0.9l-0.8-0.1l-0.8-0.1l-0.8-0.1
1956
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
1957
+ l-0.8-0.2l-1.6-0.3l-1.6-0.3l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.6-0.4l-1.5-0.4l-3.1-0.8l-3-0.8l-1.5-0.4l-1.5-0.4
1958
+ l-1.5-0.4l-1.5-0.4l-1.5-0.3l-1.5-0.3l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.4l-1.1-0.4l-1.1-0.4l-2.3-0.9
1959
+ l-2.1-0.8l-0.9-0.4l-0.8-0.3l-0.6-0.2h-0.1h-0.1l-0.7-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.5-0.5l-0.5-0.5l-0.4-0.6l-0.3-0.6
1960
+ l-0.3-0.6l-0.2-0.7l-0.1-0.7v-0.7l0.1-0.7l0.1-0.7l0.2-0.7L-231.8,1244z M-226.5,1252.7l0.5-0.1l0,0L-226.5,1252.7h-0.3H-226.5z"
1961
+ />
1962
+ </g>
1963
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
1964
+ <path
1965
+ d="M-196.9,1287.6l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0,0
1966
+ l0.2-0.1h0.3l0,0h0.3h0.3h0.3l0,0h0.3l0.3,0.1l0.2,0.1h0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.2l0.3-0.1l0.3-0.1
1967
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1
1968
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4
1969
+ l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.4l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5
1970
+ l0.3,0.5l0.3,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.4,0.9l0.4,0.9l0.4,0.9l0.3,0.8l0.3,0.8l0.3,0.8l0.2,0.7
1971
+ l0.2,0.7l0.2,0.6l0.2,0.8l0.2,0.8l0.2,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1972
+ l0.1,0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,1.6l-0.2,1.6
1973
+ l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.6l-0.2,1.5l-0.2,1.5l-0.4,3.1l-0.4,3l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.2,1.5l-0.1,1.1l-0.1,1.2
1974
+ l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.1,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6
1975
+ l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.3,0.6l-0.3,0.6l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
1976
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
1977
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3
1978
+ h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1
1979
+ l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.4l-0.3-0.4l-0.3-0.4
1980
+ l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.4-0.8l-0.4-0.8l-0.4-0.8
1981
+ l-0.4-0.8l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.5-1.1l-0.4-0.8l-0.1-0.3l-0.1-0.2l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7
1982
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8l-0.2-0.8
1983
+ l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8l-0.1-0.8
1984
+ l-0.1-0.8v-0.8v-0.8v-0.8v-0.8l-0.1-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-1.6v-3.1v-3.1v-1.5v-1.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5
1985
+ l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.2-0.5l0.3-1l0.3-1l0.3-1
1986
+ l0.3-0.9l0.3-0.9l0.3-0.9l0.3-0.9l0.1-0.3l0.1-0.3l0.3-0.6l0.3-0.6l0.3-0.6l0.7-1.3l0.3-0.6l0.3-0.6v-0.1v-0.2v-0.3v-0.3v-0.3
1987
+ l0.1-0.3l0.1-0.3L-196.9,1287.6z M-194.5,1297.5l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.3,0.9l-0.1,0.4l-0.1,0.4
1988
+ l-0.1,0.5l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.4v0.4v1.5
1989
+ v1.5v3.1v3.1v1.6v1.6v1.6v1.6v1.6v1.6v1.6v1.6v0.8v0.8v0.8v0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
1990
+ l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.1,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7
1991
+ l0.2,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.7l0.1,0.3l0.2,0.4l0.4,0.9l0.5,1.1l0.3,0.6l0.3,0.6
1992
+ l0.3,0.7l0.3,0.7l0.3,0.7l0.4,0.7l0.4,0.7l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
1993
+ l0.2,0.3l0.2,0.3l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.2,0.1l0,0h0.1h0.1l0,0l0,0h0.1h0.1l0,0l0,0
1994
+ l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2
1995
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.5
1996
+ l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6l0.1-0.6
1997
+ l0.1-0.6l0.1-0.6l0.1-0.5l0.1-1.1l0.1-1.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5l0.4-3l0.4-3.1l0.2-1.5l0.2-1.5l0.2-1.5l0.2-1.5
1998
+ l0.2-1.5l0.2-1.5l0.1-1.5l0.1-1.5l0.1-0.8l0.1-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.8v-0.7v-0.8v-0.7v-0.7v-0.7v-0.7v-0.7
1999
+ v-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.2-0.7
2000
+ l-0.2-0.7l-0.1-0.5l-0.2-0.5l-0.2-0.6l-0.2-0.7l-0.3-0.7l-0.3-0.8l-0.3-0.8l-0.3-0.8l-0.4-0.8l-0.2-0.4l-0.2-0.4l-0.2-0.4
2001
+ l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4
2002
+ l-0.2-0.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2
2003
+ l-0.2-0.1h-0.1l-0.1-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0h-0.1
2004
+ h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3l-0.3-0.1l-0.2-0.1
2005
+ l-0.1,0.1l-0.1,0.3l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.3,0.6l-0.6,1.2l-0.3,0.6l-0.3,0.5l-0.2,0.5l-0.1,0.2l-0.1,0.2L-194.5,1297.5z"
2006
+ />
2007
+ </g>
2008
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2009
+ <path
2010
+ d="M-181.5,1393.6L-181.5,1393.6l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2
2011
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.2h0.3h0.4h0.5h0.4l0.4,0.1l0.4,0.1l0.4,0.1
2012
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3
2013
+ l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.4l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4
2014
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4v0.4l-0.1,0.4
2015
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2016
+ l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2017
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1
2018
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.4,0.1h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2
2019
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.3
2020
+ l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.1-0.5l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6
2021
+ l-0.1-0.6l-0.1-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-0.6v-1.1v-1.1v-1l0.1-0.9v-0.4v-0.4v-0.4v-0.4l0.1-0.4l0.1-0.3
2022
+ l0.1-0.3l0.1-0.3l0.1-0.4l0.1-0.2l0.1-0.2l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0,0l0,0l-0.1-0.2v-0.2v-0.2v-0.2
2023
+ v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2L-181.5,1393.6z M-176.3,1397.1v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2v0.2
2024
+ l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0v0.1v0.3v0.3v0.3v0.4l-0.1,0.8v0.9v0.9v1v0.5v0.5v0.5v0.5v0.5v0.6v0.5v0.5v0.5
2025
+ v0.5v0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.3l0.1,0.2l0,0l0.1-0.1l0.1-0.2
2026
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2027
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3v-0.3v-0.3v-0.4v-0.3v-0.3v-0.3v-0.3
2028
+ v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3v-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.2
2029
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1
2030
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.2h-0.2L-176.3,1397.1L-176.3,1397.1L-176.3,1397.1z M-180.9,1400.2
2031
+ l0.2,0.1l-0.1-0.1H-180.9L-180.9,1400.2l-0.2-0.2L-180.9,1400.2z"
2032
+ />
2033
+ </g>
2034
+ <g transform="matrix(0.380231,0.924892,-0.924892,0.380231,1549.4,-185.872)">
2035
+ <path
2036
+ d="M-240.4,1219l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2037
+ l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2038
+ l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.3h0.3h0.4h0.3h0.1h0.1h0.1l0.2,0.1l0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1
2039
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2l0,0v0.2v0.2l0,0v0.2v0.2
2040
+ v0.1v0.2v0.2v0.1v0.1v0.1v0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1
2041
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.3h-0.2h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l0,0l0,0h-0.2h-0.2
2042
+ h-0.2h-0.2l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0l0,0h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2
2043
+ l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.2v0.2v0.2v0.2l0,0v0.1l0,0v0.1v0.1l0,0
2044
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.1l0.2,0.1l0.4,0.3l0.4,0.3l0.5,0.3
2045
+ l0.5,0.3l0.5,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2
2046
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l1.3,0.2l1.3,0.2l1.3,0.2l1.3,0.2l2.7,0.3l1.3,0.2l1.3,0.2
2047
+ l1.3,0.2l1.3,0.2l1.3,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.7,0.2
2048
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1h0.5h0.5h0.4h0.4h0.4h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2
2049
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0v-0.1v-0.1v-0.1v-0.1l0,0v-0.1l0,0l0,0l0,0
2050
+ v-0.1l0,0v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2051
+ l-0.1-0.1l-0.1-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2052
+ l-0.3-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-1-0.3l-1-0.3
2053
+ l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-1-0.3l-2.1-0.5l-2.1-0.5l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3l-1.1-0.3
2054
+ l-1.1-0.3l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.5-0.2
2055
+ l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2
2056
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.3v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2
2057
+ l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1h0.2h0.2h0.3h0.2l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.3
2058
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2059
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l1,0.3l2.1,0.5l2.1,0.5l1.1,0.3l1.1,0.3l1.1,0.3
2060
+ l1.1,0.3l1.1,0.3l1.1,0.3l1.1,0.3l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.3,0.1l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2
2061
+ l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.2,0.2l0.2,0.2l0.2,0.2
2062
+ l0.2,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3v0.3v0.3
2063
+ v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2064
+ l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2065
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.3h-0.6h-0.6h-0.6h-0.6l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1
2066
+ l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.8-0.2l-0.7-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1
2067
+ l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-1.2-0.2l-1.2-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-2.7-0.3l-1.4-0.2l-1.4-0.2
2068
+ l-1.4-0.2l-1.4-0.2l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2
2069
+ l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.2l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3
2070
+ l-0.6-0.4l-0.6-0.4l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2
2071
+ l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2072
+ l-0.1-0.3v-0.2v-0.3v-0.2v-0.2v-0.2v-0.2v-0.3v-0.4l0.1-0.5l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.2-0.4L-240.4,1219z
2073
+ M-233.2,1215.7L-233.2,1215.7L-233.2,1215.7L-233.2,1215.7z"
2074
+ />
2075
+ </g>
2076
+ <path
2077
+ d="M402.7,260L402.7,260h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2078
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1
2079
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2080
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2081
+ l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1L403,266l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2082
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.1,0.2
2083
+ l-0.2,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.2,0.7l-0.2,0.7l-0.2,0.7l-0.1,0.5
2084
+ l-0.1,0.3l0,0v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2085
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2086
+ h-0.1h-0.1h-0.1H394h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H393h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2087
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2088
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V275v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.3l0.1-0.5l0.1-0.6
2089
+ l0.2-0.7l0.2-0.8l0.2-0.8l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2090
+ l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2091
+ l0.3-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1
2092
+ h1.5V260z"
2093
+ />
2094
+ <path
2095
+ d="M413.3,271L413.3,271h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2096
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1
2097
+ v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1L416,275l-0.1,0.1l-0.1,0.1
2098
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L415,276l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2099
+ l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.5,0.3l-0.5,0.3l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2100
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.1,0.1v0.1l0,0v0.1l0.1,0.2
2101
+ l0.1,0.4l0.1,0.4l0.1,0.4l0.2,0.5l0.1,0.5l0.1,0.3l0.1,0.3l0.1,0.3v0.2v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1v0.1v0.1l-0.1,0.1v0.1
2102
+ l0,0l-0.1,0.1v0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1h-0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1
2103
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1H407l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1l0,0h-0.1
2104
+ h-0.1h-0.1h-0.1H406h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l0,0h-0.1H405h-0.1h-0.2l-0.3-0.1h-0.2h-0.1H404h-0.1h-0.1h-0.1
2105
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2106
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1V286v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1
2107
+ v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0,0l-0.1-0.1l-0.1-0.5l-0.2-0.5l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.4
2108
+ v-0.4v-0.4l0.1-0.4v-0.3l0.1-0.2l0.1-0.3l0.1-0.3l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2109
+ l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.7-0.5l0.7-0.4l0.7-0.4l0.6-0.4
2110
+ l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h1.2V271z M406.4,283.1L406.4,283.1
2111
+ L406.4,283.1L406.4,283.1z"
2112
+ />
2113
+ <path
2114
+ d="M393,250.3L393,250.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2115
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2116
+ l0.1,0.1v0.1v0.1l0.1,0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2117
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1L395,255l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.3,0.2
2118
+ l-0.3,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.5,0.3l-0.5,0.3l-0.5,0.2l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1
2119
+ l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2120
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.4l-0.1,0.4l-0.2,0.9l-0.1,0.5l-0.1,0.3l-0.1,0.3l-0.1,0.3
2121
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3L385,266l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2122
+ L384,267l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H383h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1H382h-0.1
2123
+ h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2124
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1
2125
+ v-0.1v-0.1v-0.1v-0.1v-0.1V264l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2126
+ l0.1-0.1l0.1-0.1l0,0h0.1v-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.4l0.2-0.9l0.1-0.5l0.2-0.5l0.1-0.3l0.1-0.3l0.1-0.3
2127
+ l0.2-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.2-0.2
2128
+ l0.3-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.5-0.3l0.5-0.3l0.5-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.1-0.1
2129
+ l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1h0.1h0.1h0.1h0.1
2130
+ h0.1h0.1h0.1h0.1h0.1h0.1h0.1L393,250.3z"
2131
+ />
2132
+ <path
2133
+ d="M400,91h0.2h0.1h0.2h0.1h0.2h0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2134
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1L403,93l0,0v0.1l0.1,0.1v0.1v0.1v0.1l0,0v0.1
2135
+ l-0.1,0.1v0.1v0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l-0.1,0.2l-0.1,0.3l-0.1,0.3l-0.3,0.5l-0.2,0.5l-0.4,0.6l-0.7,1.2l-0.7,1.2l-0.4,0.6
2136
+ l-0.2,0.5l-0.2,0.4l-0.1,0.2l-0.1,0.1l-0.3,0.8l-0.4,0.8l-0.3,0.8l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.2,0.4l-0.1,0.4l-0.1,0.4
2137
+ l-0.2,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.1,0.4
2138
+ l-0.1,0.4v0.4l-0.1,0.4l-0.1,0.4v0.4v0.4v0.4v0.2l-0.1,0.2v0.2v0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2139
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.1
2140
+ h-0.2H393h-0.2h-0.2h-0.1h-0.2h-0.2H392h-0.2h-0.2h-0.1h-0.2l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2141
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.2V114v-0.2
2142
+ v-0.2v-0.5v-0.5l0.1-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.5
2143
+ l0.2-0.5l0.1-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.1-0.5l0.2-0.5l0.2-0.5l0.4-0.9l0.4-0.9l0.4-0.9l0.1-0.3l0.2-0.3
2144
+ l0.2-0.6l0.4-0.6l0.4-0.6l0.7-1.2l0.7-1.2l0.2-0.3l0,0v-0.2v-0.2l0.1-0.2V92l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2145
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.1-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1h0.1h0.1
2146
+ h0.1h0.2h0.1h0.1h0.2l0,0h0.1h0.2V91z"
2147
+ />
2148
+ <path
2149
+ d="M408.1,107.3h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2150
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1
2151
+ v0.1v0.1l0,0v0.1v0.1v0.1v0.1v0.1v0.1v0.1l-0.1,0.1v0.3l-0.1,0.4l-0.1,0.4l-0.1,0.4l-0.2,0.4l-0.3,0.9l-0.4,1l-0.4,1.1l-0.5,1.2
2152
+ l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.2l-0.5,1.1l-0.4,1l-0.4,0.8l-0.3,0.7l-0.2,0.4l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2153
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2154
+ h-0.1h-0.2h-0.1h-0.1h-0.1h-0.3h-0.1H402h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2155
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2156
+ l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1v-0.1V124l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2157
+ l0.2-0.4l0.3-0.6l0.4-0.8l0.4-0.9l0.4-1.1l0.5-1.1l0.5-1.2l0.5-1.2l0.5-1.2l0.5-1.2l0.4-1.1l0.4-1l0.3-0.8l0.1-0.3l0.1-0.3
2158
+ l0.1-0.2V110v-0.1v-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2159
+ l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.1h-0.2V107.3z
2160
+ M405,110.4v0.2V110.4L405,110.4L405,110.4L405,110.4z"
2161
+ />
2162
+ <path
2163
+ fill="#25B3FF"
2164
+ d="M483.4,329.1L483.4,329.1h0.3h0.1h0.1h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2165
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1h0.1l1.4-0.3l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.6-0.1h0.4
2166
+ h0.4h0.2h0.3h0.2h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2l0.1,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0
2167
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.2v0.2v0.1v0.2l-0.1,0.2
2168
+ v0.1v0.2l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2169
+ l-0.1,0.1l0,0L494,334l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2170
+ l-0.4,0.1l-0.9,0.2l-0.8,0.2l-0.9,0.2l-0.2,0.1h-0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l0,0l-0.2,0.1l-0.1,0.1h-0.1h-0.1h-0.1
2171
+ h-0.2h-0.1h-0.1H486l-1.4,0.1l-0.5,0.1l-0.5,0.1h-0.1l0,0l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.1h-0.2h-0.1h-0.2h-0.2
2172
+ h-0.1h-0.2h-0.2h-0.1h-0.1l-0.7,0.4l-0.8,0.4l-0.8,0.4l-0.5,0.2l-0.4,0.2l-0.4,0.2l-0.5,0.2l-0.4,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2
2173
+ l-0.5,0.2l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h0.4H472h-0.3h-0.3l-0.3-0.1l-0.2-0.1h-0.1l-0.1-0.1h-0.1
2174
+ l-0.1-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2175
+ l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1v-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2v-0.2l0,0v-0.1v-0.1v-0.1
2176
+ l0.1-0.1v-0.1l0.1-0.1V337v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1V336l0.1-0.1l0.1-0.1
2177
+ l0.1-0.1l0.1-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1l0.2-0.1
2178
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.5-0.1l0.4-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.9-0.2l0.4-0.1
2179
+ l0.1-0.1v-0.2l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1
2180
+ l0.2-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1L483.4,329.1L483.4,329.1z"
2181
+ />
2182
+ <path
2183
+ fill="#25B3FF"
2184
+ d="M489.4,325L489.4,325h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2185
+ l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.2l0.2,0.2l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.3
2186
+ l0.1,0.1v0.1l0.1,0.1l0.1,0.3l0.1,0.4l0.1,0.4v0.4v0.4v0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3
2187
+ l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.4
2188
+ l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3L486,339l-0.4,0.3l-0.3,0.2l-0.3,0.2l-0.2,0.2l0,0l-0.3,0.4
2189
+ l-0.4,0.5l-0.4,0.5l-0.5,0.7l-0.7,0.8l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2190
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1h-0.1H481h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.1h-0.1
2191
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0h-0.1L478,343l-0.3-0.1l-0.1-0.1h-0.1
2192
+ h-0.1h-0.1h-0.1h-0.1H477h-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.2L476,342l-0.2-0.2l-0.1-0.2l-0.1-0.2v-0.1
2193
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1V340v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2
2194
+ V339l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.3-0.3l0.2-0.3
2195
+ l0.3-0.3l0.5-0.6l0.3-0.3l-0.1-0.3l-0.1-0.2l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1
2196
+ v-0.1l-0.1-0.1v-0.1v-0.1V331v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1l0.1-0.1l0,0v-0.1V330l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1
2197
+ h0.1l0.1-0.1v-0.1l0.1-0.1l0.1-0.1h0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.4-0.2l0.3-0.2l0.4-0.2
2198
+ l0.3-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.8-0.2l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2199
+ l0.4-0.1l0.4-0.1l0.4-0.1h0.3h0.4h0.3L489.4,325L489.4,325z"
2200
+ />
2201
+ </g>
2202
+ <path
2203
+ fill="#0096FF"
2204
+ d="M447.3,221.9h0.8h0.8h0.7h0.7h0.7h0.7l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.1
2205
+ l0.5,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.3l0.1,0.2l0.1,0.1
2206
+ l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.1l0.1,0.2v0.2l0.1,0.1v0.2l0.1,0.2v0.1v0.1v0.1v0.2v0.3l-0.1,0.2
2207
+ v0.3l-0.1,0.3l-0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3
2208
+ l0.1,0.2l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.3,0.3l0.3,0.3l0.1,0.2l0.1,0.2l0.5,0.8l0.2,0.4
2209
+ l0.1,0.1l0.1,0.1l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6
2210
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.2l0.4,1.2l0.4,1.2l0.4,1.2l0.3,1.2l0.7,2.5
2211
+ l0.4,1.2l0.3,1.2l0.4,1.1l0.2,0.4l0.4,0.5l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.1,0.3
2212
+ l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3
2213
+ l-0.1,0.3v0.2l0.1,0.6l0.2,1.1l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5l0.1,0.5v0.5v0.4v0.3v0.2v0.2l-0.1,0.3
2214
+ l-0.1,0.3l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.1,0.2l-0.2,0.1h-0.1l-0.1,0.1
2215
+ l-0.1,0.1h-0.1l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.2
2216
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1h-0.1l-0.1,0.1l-0.2,0.1l0,0h-0.1h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2h-0.1h-0.1H476h-0.1h-0.1h-0.2h-0.2
2217
+ h-0.1h-0.2l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2
2218
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.3-0.5l-0.3-0.5l-0.2-0.4h-0.1h-0.4H470h-0.4h-0.4h-0.4h-0.4
2219
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1L466,280l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.3-0.2
2220
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.3l-0.4-0.3l-0.3-0.3
2221
+ l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.3-0.3l-0.6-0.6l-0.7-0.6l-0.5-0.6l-0.6-0.6l-0.6-0.7l-0.5-0.7l-0.5-0.7l-0.5-0.7
2222
+ l-0.5-0.7l-0.5-0.7l-0.5-0.7l-0.4-0.7l-0.5-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.4-0.7l-0.2-0.4l-0.1-0.4l-0.1-0.2
2223
+ l0,0h-0.1h-0.1l-0.5-0.1l-0.5-0.2l-0.5-0.2l-0.5-0.2l-0.4-0.2l-0.5-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2
2224
+ l-0.2-0.2l-0.2-0.2l-0.5-0.4l-0.5-0.5l-0.7-0.6l-0.7-0.7l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.5l-0.4-0.5l-0.4-0.5
2225
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5L433,249l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2226
+ l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l0,0h-0.1l-0.4-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4l-0.4-0.4
2227
+ l-0.3-0.4l-0.4-0.4l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.2h-0.1l-0.1-0.1l-0.3-0.2l-0.2-0.3l-0.3-0.3
2228
+ l-0.3-0.3l-0.2-0.3l-0.1-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.2l-0.1-0.1v-0.1v-0.2l-0.1-0.2v-0.1l0.1-0.1v-0.1
2229
+ v-0.1v-0.1v-0.1l0.1-0.1v-0.1l0.1-0.2l0.1-0.2l0.1-0.1l0,0l-0.1-0.1l0,0l-0.5-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2230
+ l-0.4-0.1l-0.4-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2H420
2231
+ l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.3l0,0v-0.2v-0.2v-0.1v-0.1l0.1-0.1v-0.3l0.1-0.4l0.1-0.4l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3
2232
+ l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1
2233
+ l0.3-0.1l0.6-0.2l0.6-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.8-0.1l0.7-0.1l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1
2234
+ l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.8-0.1h0.8h0.8h0.8h0.8h0.8h0.8h2.5V221.9z M463.1,271.3l-0.2,0.1l0,0l-0.2,0.1
2235
+ l-0.2,0.1h-0.1h-0.2H462h-0.2l0,0l0,0l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2
2236
+ l0.2,0.1l0.3,0.1l0.2,0.1l0.1,0.1l-0.7-0.9l-0.7-1L463.1,271.3l-0.1-0.1l-0.2-0.1L463.1,271.3z"
2237
+ />
2238
+ <path
2239
+ d="M438.7,215.5h0.6h0.6h0.5h0.6h0.5h0.6h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1,0.1l0.9,0.2l0.9,0.2
2240
+ l0.8,0.2l0.8,0.2l0.7,0.2l0,0h0.1h0.2h0.2h0.2h0.3l0.6-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.8-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4
2241
+ l0.4,0.1l0.4,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.5,0.5l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5
2242
+ l0.5,0.5l0.4,0.5l0.5,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.5,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6
2243
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2244
+ l0.3,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.2,0.7l0.1,0.8l0.2,0.8l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8
2245
+ l0.1,0.8l0.1,0.8l0.1,0.8l0.1,0.8v0.8v0.8v0.8l-0.1,0.8v0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.8l-0.1,0.4l-0.1,0.4l-0.1,0.5
2246
+ l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.1,0.4l-0.2,0.4l-0.1,0.4l-0.2,0.4l-0.1,0.4
2247
+ l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.2,0.3
2248
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.3l-0.2,0.3l-0.3,0.2l-0.2,0.2
2249
+ l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.3,0.2l-0.3,0.1l-0.4,0.1l-0.3,0.1
2250
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4h-0.4h-0.3h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4
2251
+ h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2252
+ l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.3-0.2
2253
+ l-0.4-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3l-0.4-0.3l-0.3-0.3
2254
+ l-0.4-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.4-0.4l-0.3-0.4l-0.3-0.4l-0.4-0.4l-1-1.4l-1-1.3l-0.9-1.3
2255
+ l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.9-1.3l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6
2256
+ l-0.4-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.7l-0.2-0.7
2257
+ l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2258
+ l-0.1-0.7l-0.1-0.7v-0.7v-0.7V231l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2259
+ l-0.1-0.2L419,229l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3
2260
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2261
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.5-0.2
2262
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.6-0.2l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.6-0.1l0.6-0.1h0.6h0.5h0.6h0.6h0.6h0.6h3.2
2263
+ V215.5z M437.6,221.4h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.4,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1L432,222l-0.4,0.1l-0.4,0.1
2264
+ l-0.4,0.1l-0.4,0.1l-0.3,0.1l-0.4,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l0.1,0.2l0.1,0.2
2265
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.7l-0.1,0.6l-0.1,0.6v0.6l-0.1,0.6v0.6v0.6v0.6v0.6v0.6l0.1,0.6v0.6
2266
+ l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.1,0.6l0.2,0.6l0.1,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6
2267
+ l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.3,0.6l0.2,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.3,0.6l0.4,0.6l0.3,0.6l0.4,0.6l0.3,0.6
2268
+ l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.4,0.6l0.8,1.2l0.9,1.2l0.9,1.3l0.9,1.3l0.9,1.3l0.9,1.3l1,1.3l0.3,0.4
2269
+ l0.3,0.4l0.3,0.4l0.3,0.4l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.3
2270
+ l0.3,0.3l0.3,0.3l0.2,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.3,0.2
2271
+ l0.2,0.2l0.2,0.2l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2272
+ l0.2,0.1l0.2,0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.2-0.1l0.2-0.1
2273
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.2
2274
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.1-0.3
2275
+ l0.2-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.2-0.3l0.1-0.3l0.1-0.3l0.1-0.4l0.2-0.4l0.1-0.4
2276
+ l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.4l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.7
2277
+ l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7v-0.6v-0.7v-0.7v-0.7l-0.1-0.7V252l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7
2278
+ l-0.2-0.7l-0.1-0.7l-0.2-0.7l-0.1-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.3-0.6l-0.2-0.6
2279
+ l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.4-0.6l-0.3-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.6l-0.4-0.5
2280
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.4-0.4l-0.4-0.4
2281
+ l-0.4-0.4l-0.4-0.4l-0.4-0.4h-0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1h-0.4h-0.4H450h-0.4
2282
+ h-0.4h-0.4h-0.4l-0.3-0.1l-0.8-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.1l-0.8-0.1l-0.9-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1h-0.5h-0.5h-0.5h-0.5
2283
+ h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h0.7V221.4z"
2284
+ />
2285
+ <path
2286
+ fill="#0096FF"
2287
+ d="M481.7,317.6L481.7,317.6h0.3h0.2h0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.2l0.4,0.2
2288
+ l0.4,0.2l0.7,0.4l0.2,0.2l0.2,0.1l0.2,0.1h0.1l0,0l0.2,0.1l0.7,0.2l0.9,0.3l1,0.3l0.6,0.2l0.6,0.2l0.7,0.2l0.7,0.2l0.7,0.3l0.7,0.3
2289
+ l0.7,0.3l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.3
2290
+ l0.3,0.3l0.2,0.3l0.2,0.3l0,0l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.5-0.1l0.5-0.1h0.5h0.5h0.4h0.5h0.5h0.5l0.5,0.1l0.4,0.1
2291
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.9,0.2l0.9,0.2l0.4,0.1l0.2-0.1l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.1
2292
+ l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.8-0.1l0.7-0.1h0.5h0.3h0.2h0.3l0.3,0.1l0.2,0.1l0.2,0.1
2293
+ l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.1l0.2,0.2l0.2,0.2h0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2h0.1l0.1,0.2l0.1,0.2h0.1
2294
+ l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0,0l0.2,0.2l0.2,0.2l0,0l0.1,0.2l0.1,0.2
2295
+ l0.1,0.2l0,0l0.1,0.2v0.2l0.1,0.2l0,0v0.2l-0.1,0.2v0.2l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.2,0.2l0,0l-0.1,0.2
2296
+ l-0.2,0.2l0,0l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1H523l-0.1,0.3
2297
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.3l-0.3,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4
2298
+ l-0.4,0.4l-0.7,0.8l-0.2,0.2v0.1l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3
2299
+ l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l0,0l-0.1,0.1l-0.2,0.1h-0.1l-0.2,0.1l-0.2,0.1h-0.1
2300
+ l-0.2,0.1h-0.2h-0.2l0,0h-0.3h-0.2h-0.3h-0.1h-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l0,0
2301
+ l-0.2-0.2l-0.1-0.2l-0.2-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2l0,0v-0.1v-0.1l-0.1-0.2v-0.3v-0.2l0.1-0.3v-0.2l0.1-0.3
2302
+ l0.1-0.3l0.1-0.1l-0.4,0.5l-0.4,0.5l-0.3,0.4l-0.2,0.4l-0.2,0.3l-0.2,0.3l-0.1,0.2l0,0l-0.1,0.1v0.1v0.1l-0.1,0.1l0,0l0.1,0.1
2303
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4l-0.1,0.4l0.5,0.2
2304
+ l0.8,0.3l0.8,0.3l0.8,0.3l0.2,0.1h0.2l1.3,0.2l0.7,0.1l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.5,0.2l0.4,0.1l0.5-0.1l0.4-0.1
2305
+ l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.4h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2306
+ l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.2,0.1l0.2,0.1h0.1l0.2,0.2l0,0
2307
+ l0.2,0.1l0.1,0.1h0.1l0.1,0.2l0.2,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0,0v0.2v0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2
2308
+ l0,0l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1H535h-0.2h-0.1h-0.2h-0.1
2309
+ h-0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.4,0.1l-0.2,0.1h-0.3h-0.3l-0.5,0.1h-0.6h-0.5h-0.6l-1.2,0.1h-0.5h-0.5h-0.4h-0.3h-0.2h-0.4
2310
+ l-0.7,0.1l-0.8,0.1l-0.8,0.1l-0.9,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5h-0.5l-0.5-0.1h-0.3h-0.1
2311
+ l-0.9,0.4l-1,0.4l-1.1,0.4l-1.1,0.4l-1.1,0.4l-0.7,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2
2312
+ l-0.7,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.6,0.1h-0.7h-0.7h-0.6h-0.3h-0.3h-0.4h-0.3h-0.3H496
2313
+ h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.2
2314
+ l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l0,0h-0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1
2315
+ l-0.5,0.1h-0.4H487h-0.4h-0.4h-0.4h-0.5h-0.8h-0.9h-0.8H482h-0.8h-0.9h-0.8l-0.8-0.1l-1.5-0.1l-1.5-0.1l-1.4-0.1h-0.7H473h-0.6
2316
+ h-0.5h-0.2h-0.2h-0.6h-0.7l-0.8,0.1l-0.8,0.1l-0.8,0.1H467h-0.4h-0.4h-0.4h-0.4H465h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.2-0.1
2317
+ l-0.3-0.1l-0.3-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.2l-0.2-0.2H461l-0.1-0.2l-0.1-0.2v-0.1
2318
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2v-0.2v-0.2v-0.1v-0.3v-0.3v-0.1l0.1-0.2l0.1-0.2V356l0.1-0.2l0.1-0.2v-0.1l0.1-0.1
2319
+ l0.1-0.1v-0.1l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.2l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1
2320
+ l0.5-0.1l0.4-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.6-0.1l1.1-0.2l0.6-0.1l0,0l0.1-0.2l0.1-0.2l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4
2321
+ l0.3-0.4l0.2-0.4l0.3-0.4l0.3-0.4l0.4-0.4l0.3-0.3l0.3-0.4l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.4-0.3l0.3-0.3l0.3-0.3l0.3-0.3
2322
+ l0.3-0.2l0.3-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3l0.6-0.3l0.5-0.4l0.7-0.4l0.7-0.4l0.7-0.4l0.4-0.2l0,0l-0.3-0.1l-0.3-0.1
2323
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.2l-0.3-0.2l-0.3-0.2
2324
+ l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1h-3.7
2325
+ h-0.3h-0.2l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3
2326
+ l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.3-0.1l0.2-0.1
2327
+ l0.3-0.1h0.2h0.3h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.6-0.2l0.5-0.2l0.6-0.2
2328
+ l0.6-0.2l0.3-0.1l-0.1-0.2v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2329
+ l0.2-0.1l0.3-0.1h0.3h0.3h0.2h0.1h0.4h0.4l0.5-0.1l0.5-0.1l0.5-0.1h0.2l0.1-0.1l0.3-0.3l0.2-0.3l0.3-0.3l0.3-0.3l0.3-0.2l0.3-0.2
2330
+ l0.3-0.2l0.3-0.2l0.2-0.2l-0.4-0.1l-0.5-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2
2331
+ l-0.3-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2
2332
+ l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.2l-0.1-0.1v-0.2v-0.2l-0.1-0.1v-0.2v-0.2l0.1-0.1v-0.2v-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.1l0,0
2333
+ l0.1-0.2l0.1-0.2l0,0l0.1-0.2l0.1-0.2l0,0l0.1-0.1l0.2-0.1l0,0l0.2-0.2l0.2-0.1l0,0l0.2-0.1l0.2-0.1h0.1l0.2-0.1l0.2-0.1l0,0
2334
+ l0.2-0.1l0.2-0.1l0,0h0.2h0.2h0.1h0.3L481.7,317.6z M492.7,346.7l-1.1,0.8l-1.1,0.8l-1.1,0.8l-1.2,0.8l-1.1,0.8l-0.8,0.6l0.4-0.1
2335
+ l0.6-0.2l0.7-0.2l0.5-0.2l0.2-0.1l0.2-0.2l0.7-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.6-0.4l0.9-0.7l0,0v-0.1v-0.1v-0.1v-0.1v-0.1V347v-0.1
2336
+ v-0.1l-0.1-0.1v-0.1L492.7,346.7L492.7,346.7L492.7,346.7L492.7,346.7z M491.1,334.8v0.3l0.1,0.3v0.3l0,0h0.2l0.3,0.1l0.2,0.1
2337
+ l0.2,0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.1-0.1h-0.2h-0.4h-0.5h-0.4h-0.4H491L491.1,334.8z"
2338
+ />
2339
+ <path
2340
+ d="M521.4,320.1h0.5h0.5l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.2l0.2,0.1l0.2,0.1l0.2,0.1
2341
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.4l0.2,0.4
2342
+ l0.1,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4v0.4v0.3l-0.1,0.4l-0.1,0.3l-0.1,0.3
2343
+ l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3
2344
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.4,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.5,0.3l-0.5,0.3l-0.5,0.3
2345
+ l-0.5,0.3l-0.5,0.3l-0.5,0.3l-0.9,0.6l-0.9,0.6l-0.8,0.5l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.2l-0.2,0.2
2346
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l0,0l0,0h-0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0
2347
+ l0,0v0.1v0.1l0,0l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1h0.2h0.3h0.3h0.4l0.8,0.1
2348
+ l0.9,0.1l1.1,0.1l2.4,0.1l1.2,0.1l1.4,0.1l1.3,0.1l1.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2349
+ l0.7,0.1l0.7,0.1l0.6,0.1l0.7,0.1l0.6,0.2l0.7,0.2l0.6,0.2l0.5,0.2l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2350
+ l0.2,0.1l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3
2351
+ l0.1,0.3l0.1,0.3l0.1,0.4l0.1,0.4l0.1,0.4v0.4v0.4l-0.1,0.4l-0.1,0.4l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2352
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.3,0.4l-0.3,0.4l-0.3,0.4l-0.4,0.4l-0.3,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2353
+ l-0.4,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1
2354
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1h-0.4h-0.4H530h-0.4h-0.8H528h-0.8h-0.8h-0.8h-1.5h-1.5h-0.7h-0.7h-0.7h-0.7h-0.7
2355
+ h-0.3h-0.4l-2.6,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.2l-2.7,0.1l-1.4,0.1l-1.4,0.1
2356
+ l-1.3,0.1H486h-1.4h-1.3h-1.4h-1.4h-1.4h-1.3h-1.4H475h-0.3h-0.4h-0.4h-0.4l-1.1,0.1l-1.2,0.1l-1.3,0.1l-1.4,0.1l-0.7,0.1h-0.7
2357
+ h-0.8h-0.7h-0.8H464h-0.7h-0.8h-0.7h-0.7h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1
2358
+ l-0.3-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.2-0.3
2359
+ l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3l-0.1-0.3v-0.3l0.1-0.3v-0.3l0.1-0.3l0.1-0.3
2360
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.4
2361
+ l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.5-0.4l0.4-0.4l0.5-0.4l0.5-0.3l0.5-0.3l0.4-0.3l0.5-0.3l0.5-0.3l0.5-0.3l0.5-0.3
2362
+ l0.5-0.3l1-0.6l1-0.6l0.9-0.6l1-0.6l0.9-0.5l1.8-1l0.8-0.5l0.7-0.4l0.3-0.2l0.3-0.2l0.3-0.2l0.2-0.2l0.2-0.1l0.2-0.1l0.1-0.1l0,0
2363
+ h0.1l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0h-0.1l0,0l0,0h-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2364
+ l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.2l-0.2-0.2l-0.3-0.2l-0.3-0.2l-0.4-0.2l-0.3-0.1l-0.4-0.1l-0.4-0.1
2365
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.8-0.3l-0.8-0.3l-1.6-0.5l-0.8-0.2l-0.7-0.2l-0.7-0.2l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1
2366
+ l-0.3-0.1l-0.3-0.2l-0.4-0.2l-0.3-0.2L457,339l-0.3-0.3l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.1l-0.1-0.2v-0.1
2367
+ l-0.1-0.2l-0.1-0.2v-0.1l-0.1-0.2l-0.1-0.2v-0.1v-0.2v-0.2v-0.1v-0.2v-0.2v-0.1l0.1-0.2v-0.2l0.1-0.1v-0.2l0.1-0.2l0.1-0.1l0.1-0.1
2368
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.2-0.2l0.1-0.1l0.2-0.2l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2369
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.4-0.2l0.4-0.2
2370
+ l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.4-0.2l0.5-0.2h0.1L470,325l-0.3-0.3l-0.2-0.3l-0.3-0.3l-0.1-0.2
2371
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.2l-0.1-0.3v-0.3v-0.3v-0.2V321l0.1-0.2l0.1-0.2l0.1-0.2
2372
+ l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.3l0.2-0.4l0.2-0.3l0.3-0.3l0.2-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2
2373
+ l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.4-0.1l0.6-0.3l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l0.7-0.2l1.2-0.3
2374
+ l1.1-0.3l0.4-0.1l0.4-0.1h0.5h0.4h0.4h0.4h0.4l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.3,0.1l0.4,0.2l0.4,0.2
2375
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.3,0.2l0.4,0.2l0.6,0.4l0.6,0.4l0.7,0.4l0.6,0.4l0.6,0.4l0.5,0.4l0.6,0.4l1.1,0.8l0.5,0.4l0.5,0.4
2376
+ l0.5,0.4l0.5,0.3l0.5,0.3l0.5,0.3l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1h0.1h0.1h0.1l0,0h0.1
2377
+ h0.1h0.2h0.2h0.2h0.3h0.2h0.3l0.7-0.1l0.8-0.1l0.8-0.1l0.8-0.1l0.9-0.1l2-0.3l1-0.2l1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.1l1-0.1
2378
+ h0.5h0.5h0.5h0.5h0.5h0.5h0.5h0.5L521.4,320.1z M485.3,319L485.3,319L485.3,319h-0.2l-1.1,0.3l-1.2,0.3l-0.6,0.2l-0.6,0.2l-0.6,0.2
2379
+ l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.1h0.1l0.2,0.2l0.3,0.2l0.4,0.2
2380
+ l0.4,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3h0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2381
+ l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2
2382
+ l-0.2,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1H480h-0.1l-0.3,0.1l-0.7,0.1l-1.9,0.3l-1.1,0.2l-0.9,0.2l-0.4,0.1l-0.4,0.1H474h-0.1l-0.4,0.1
2383
+ l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2
2384
+ l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.2,0.1l0.5,0.1l1.6,0.5l0.8,0.3l0.9,0.3l0.4,0.2l0.5,0.2
2385
+ l0.4,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.5,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.2,0.2
2386
+ l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2387
+ l0.1,0.3l0.1,0.3v0.3l0.1,0.3v0.3v0.3v0.3l-0.1,0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2
2388
+ l-0.2,0.2l-0.1,0.2l-0.2,0.2l-0.2,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.3,0.2l-0.4,0.2l-0.4,0.2l-0.8,0.5
2389
+ l-0.8,0.5l-1.8,1l-0.9,0.5l-0.9,0.5l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.4,0.3l-0.5,0.3l-0.5,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3
2390
+ l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.3,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2391
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1l-0.1,0.1v0.1l0,0l0,0h-0.1l0,0l0,0l0,0h0.1v0.1h0.1l0.1,0.1v0.1h0.1h0.1h0.1h0.1h0.1h0.1
2392
+ h0.2h0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.3h0.2h0.6h0.7h0.6h0.7h0.7h0.7h0.7h0.7h0.7h0.7l1.4-0.1l1.3-0.1l1.2-0.1l1.1-0.1h0.5
2393
+ h0.5h0.5h0.5h1.3h1.4h1.3h1.3h1.3h1.4h1.3h1.4h1.3l1.3-0.1l1.4-0.1l1.3-0.1l2.6-0.1l2.7-0.2l2.7-0.2l2.7-0.2l2.6-0.2l2.7-0.2
2394
+ l2.7-0.2l2.6-0.2l2.7-0.2l2.7-0.2h0.4h0.4h0.8h0.8h0.8h0.8h0.8h1.5h1.5h0.7h0.7h0.7h0.7h0.7h0.4h0.3h0.3h0.4h0.3h0.3l0.3-0.1
2395
+ l0.3-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1l0.2-0.1
2396
+ l0.2-0.1l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.3l0.2-0.3l0.1-0.1l0.1-0.1l0.1-0.1
2397
+ l0.1-0.1l0.1-0.1v-0.1l0,0h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1
2398
+ l-0.2-0.1l-0.2-0.1l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1
2399
+ l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.1l-1.3-0.1l-2.4-0.1l-1.1-0.1l-1.1-0.1l-0.9-0.1h-0.5l-0.4-0.1
2400
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2401
+ l-0.4-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.1-0.3l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3
2402
+ L510,346l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.1-0.3
2403
+ l0.2-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.5-0.3
2404
+ l0.4-0.3l0.5-0.3l0.4-0.3l0.9-0.6l0.9-0.6l0.9-0.6l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.3-0.3l0.4-0.3
2405
+ l0.3-0.3l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1v-0.1
2406
+ l0.1-0.1l0.1-0.1l0.1-0.1v-0.1l0.1-0.1v-0.1l0.1-0.1V330v-0.1v-0.1v-0.1v-0.1v-0.1v-0.1v-0.2l-0.1-0.2v-0.2l-0.1-0.2l-0.1-0.2
2407
+ l-0.1-0.2L524,328l-0.1-0.2l-0.1-0.2l-0.1-0.2v-0.1h-0.1l0,0h-0.1l-0.2-0.1l-0.1-0.1L523,327h-0.2h-0.2h-0.3H522h-0.4h-0.3h-0.4
2408
+ h-0.4h-0.4h-0.4h-0.4h-0.4h-0.5H518h-0.5l-0.9,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-1,0.1l-0.9,0.1l-2,0.3l-0.9,0.1l-0.9,0.1l-0.8,0.1
2409
+ l-0.8,0.1l-0.8,0.1h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4h-0.4l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.3-0.1l-0.4-0.1l-0.3-0.1
2410
+ l-0.3-0.1l-0.4-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.6-0.4l-0.5-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.6-0.4l-1.1-0.8
2411
+ l-0.5-0.4l-0.5-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.3l-0.5-0.3l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1L487,320
2412
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.2h-0.2h-0.1h-0.1h-0.1h-0.1h-0.2V319z"
2413
+ />
2414
+ <path
2415
+ fill="#25B3FF"
2416
+ d="M486.3,321.2h0.2h0.1h0.2h0.1h0.2h0.1l0.1,0.1l0.2,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.2l0.2,0.2
2417
+ l0.1,0.1l0,0h0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.4,0.1h0.1
2418
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2
2419
+ l0.1,0.2l0.1,0.2v0.2l0.1,0.1h0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.2,0.1l0.3,0.1
2420
+ l0.2,0.1l0.3,0.1l0.3,0.1l0.2,0.2l0.3,0.2l0.1,0.1h0.2h0.3h0.3h0.3h0.3h0.3h0.3h0.3l0.3,0.1l0.4,0.1l0.3,0.1l0.3,0.1l0.4,0.1
2421
+ l0.3,0.2l0.4,0.2l0.3,0.2l0.4,0.2l0.3,0.3l0.3,0.3l0.2,0.3l0.2,0.4l0.2,0.4l0.2,0.4l0.1,0.4l0.1,0.4l0.1,0.3v0.2v0.2v0.2v0.3v0.3
2422
+ l-0.1,0.2l-0.1,0.2v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2423
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.1l-0.3,0.1l-0.3,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1
2424
+ l-0.5,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.4,0.1h-0.4h-0.4H500l-0.9,0.1h-0.3l0.1,0.1l0.1,0.2l0.1,0.2l0,0l0.1,0.2l0.1,0.2
2425
+ v0.2l0.1,0.2v0.2v0.1v0.2l-0.1,0.2v0.2v0.2l-0.1,0.1v0.1l-0.1,0.1L499,341v0.1l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.2,0.3l-0.1,0.2
2426
+ l-0.2,0.2l-0.2,0.2l-0.3,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.8,0.6l-0.9,0.6l-0.9,0.6l-0.8,0.5
2427
+ l-0.8,0.5l-0.2,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.2l0.1,0.1l0.1,0.2l0,0l0.1,0.1v0.1l0.1,0.1l0,0v0.1l0.1,0.1v0.2l0,0
2428
+ l-0.1,0.2v0.2l0,0v0.2l-0.1,0.2l0,0l-0.1,0.1v0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2429
+ l-0.1,0.2l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.5,0.5l-0.5,0.5l-1.1,0.9l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.1,0.1
2430
+ l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.2,0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2l-0.2-0.1l-0.2-0.1
2431
+ l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2
2432
+ l-0.1-0.2l-0.1-0.2V354v-0.2v-0.2v-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.2-0.1
2433
+ l0.2-0.3l0.3-0.3l0.5-0.5l0.1-0.1l-0.1-0.1L482,350l-0.1-0.1l0,0l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1
2434
+ l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0v-0.2l-0.1-0.2v-0.2l0,0V348v-0.2v-0.1l0,0v-0.2v-0.2l0.1-0.2l0,0
2435
+ l0.1-0.2l0.1-0.2l0.1-0.2v-0.1l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.1l0.2-0.1
2436
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.7-0.4l0.7-0.3l0.2-0.1l0.2-0.1l0.5-0.3l0.5-0.3l0.6-0.4l0.3-0.2h-0.1H487h-0.4l-0.4-0.1l-0.4-0.1
2437
+ l-0.4-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1
2438
+ l-0.1-0.1l-0.1-0.1l-0.1-0.2h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l0,0v-0.1h-0.1h-0.1l-0.5,0.2l-0.5,0.2l-0.5,0.2
2439
+ l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1l-0.5,0.1h-0.2h-0.2h-0.3h-0.2h-0.3h-0.3l-0.3-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2440
+ l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1L474,339l-0.1-0.1l-0.1-0.1
2441
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1l-0.1-0.2l-0.1-0.1l-0.8-0.2l-0.4-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1
2442
+ l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.2
2443
+ l-0.1-0.2l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.2l-0.1-0.2v-0.2v-0.2v-0.2v-0.2l0.1-0.2v-0.2l0.1-0.2l0.1-0.2l0.1-0.2l0,0
2444
+ l0.1-0.2l0.1-0.2l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1h0.1l0.1-0.1l0.2-0.1l0.2-0.1h0.1h0.2
2445
+ h0.1h0.2h0.1h0.2h0.2h0.6h0.3h0.1l0.2-0.1l0.4-0.1l0.4-0.1l0.4-0.1l0.5-0.1l0.4-0.1h-0.1v-0.2L475,330l0,0v-0.2l-0.1-0.2v-0.2v-0.2
2446
+ V329l0.1-0.1v-0.1v-0.2l0.1-0.1v-0.1l0.1-0.2v-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.1-0.3l0.2-0.4
2447
+ l0.3-0.3l0.2-0.3l0.3-0.3l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2448
+ l0.4-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.2l0,0l0.1-0.2v-0.1l0.1-0.2v-0.2h0.1v-0.1l0.1-0.1l0.1-0.1l0,0l0.1-0.1l0.1-0.1l0.1-0.1
2449
+ l0.1-0.1h0.1l0.1-0.2l0.1-0.1l0.1-0.1l0.2-0.1l0,0l0.1-0.1l0.2-0.1l0.1-0.1l0.2-0.1l0.1-0.1h0.1l0.2-0.1l0.1-0.1h0.2h0.2h0.2l0,0
2450
+ h0.2h0.2L486.3,321.2z"
2451
+ />
2452
+ <path
2453
+ fill="#25B3FF"
2454
+ d="M455.7,235.5L455.7,235.5h0.2h0.1h0.1h0.2l0,0h0.1h0.2l0.1,0.1l0,0l0.2,0.1l0.1,0.1l0.2,0.1l0,0l0.1,0.1
2455
+ l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1v0.1h0.1v0.1
2456
+ l0.1,0.1v0.1l0,0l0.1,0.2v0.2v0.2v0.2v0.2v0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1l0.1,0.1
2457
+ l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1
2458
+ l0.1,0.1l0,0l0.1,0.2l0.1,0.2l0,0l0.1,0.1l0.1,0.1v0.1l0.1,0.1v0.1l0.1,0.2v0.3v0.2v0.1v0.1v0.1v0.1l-0.1,0.2v0.2l-0.1,0.2
2459
+ l-0.1,0.4l-0.2,0.5l-0.2,0.5l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.2,0.6l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.2l0,0l0.1,0.1l0.1,0.2
2460
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2v0.2l0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1
2461
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1l-0.2,0.1l-0.1,0.1l-0.2,0.1h-0.2h-0.2H459
2462
+ h-0.2h-0.2h-0.2h-0.1h-0.1H458h-0.1h-0.1h-0.2h-0.1l-0.2-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1
2463
+ h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.2v-0.1l-0.1-0.1l-0.1-0.1
2464
+ l-0.1-0.1v-0.1l-0.1-0.1l-0.1-0.2l-0.1-0.3l-0.1-0.3V249v-0.3v-0.4l0.1-0.4v-0.4l0.1-0.1h-0.1l-0.6,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2
2465
+ l-0.4,0.2l-0.4,0.2l-0.4,0.2l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.4,0.1l-0.5,0.1l-0.5,0.1l-0.4,0.1l-0.5,0.1L447,250h-0.5H446h-0.5h-0.3
2466
+ H445h-0.2h-0.2h-0.3l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2467
+ l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1L441,248l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2468
+ l-0.1-0.1l-0.1-0.1l0,0v-0.1h-0.1h-0.1h-0.2H440h-0.2h-0.1h-0.1h-0.1l-0.2-0.1l-0.2-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.2-0.1l-0.1-0.1
2469
+ l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2470
+ l-0.1-0.1v-0.1l-0.1-0.1v-0.1l-0.1-0.1v-0.1v-0.1v-0.2v-0.1v-0.1l0,0l0.1-0.2V244l0.1-0.2l0,0l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2471
+ l0.1-0.1l0.1-0.1l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.3l0.3-0.3l0.3-0.2l0.2-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.6-0.4l0.7-0.4l0.7-0.4
2472
+ l0.5-0.3H442l-0.8,0.1h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5h-0.4h-0.4h-0.4h-0.5l-0.4-0.1l-0.4-0.1l-0.5-0.1l-0.4-0.1l-0.2-0.1l-0.2-0.1
2473
+ l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.1-0.1l-0.1-0.1l-0.1-0.1h-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l0,0l-0.1-0.1l-0.1-0.1
2474
+ l-0.1-0.1h-0.1l-0.1-0.2l-0.1-0.2l-0.1-0.2l0,0l-0.1-0.1v-0.1l-0.1-0.1l0,0l0,0l-0.4-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.2-0.1
2475
+ l-0.2-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1
2476
+ v-0.1l-0.1-0.2l-0.1-0.2L429,234l-0.1-0.2v-0.1v-0.2l-0.1-0.2v-0.2v-0.2v-0.1v-0.2v-0.2l0.1-0.2V232l0.1-0.1v-0.1l0.1-0.1l0.1-0.1
2477
+ v-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.2l0.3-0.3l0.2-0.2l0.2-0.2l0.3-0.2l0.2-0.2l0.2-0.2l0.3-0.1
2478
+ l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.2-0.1l0.3-0.1l0.3-0.1l0.2-0.1l0.5-0.1l0.6-0.1l0.5-0.1l0.5-0.1l0.6-0.1l0.6-0.1l0.5-0.1h0.6
2479
+ h0.5h0.6l1.1-0.1l2.1-0.1l0.9-0.1h0.4h0.4h0.3h0.3h0.2h0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.8-0.2l0.1-0.1l0.2-0.1l0.2-0.1l0.5-0.2
2480
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.4-0.2l0.5-0.1l0.2-0.1h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2h0.2l0.2,0.1l0.1,0.1l0.2,0.1l0.2,0.1
2481
+ l0.1,0.1l0.1,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2v0.2l0.1,0.2
2482
+ v0.2v0.2v0.2v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l-0.1,0.1l-0.1,0.1l0,0l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1
2483
+ l-0.1,0.1l-0.1,0.1l-0.2,0.1l-0.1,0.1l0,0l-0.2,0.1L454,231l-0.2,0.1l-0.4,0.2l-0.6,0.2l-0.7,0.3l-0.5,0.2l0,0l0.1,0.2v0.2v0.2v0.2
2484
+ v0.2l-0.1,0.2v0.2l-0.1,0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.1l0.2,0.1l0.2,0.1l0.1,0.1l0.1,0.1l0,0l0.1,0.1l0.1,0.1h0.1l0.1,0.1
2485
+ l0.1,0.1h0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1v0.1l0.1,0.2l0.1,0.2v0.1l0.1,0.1v0.1l0.1,0.1v0.1v0.1v0.1
2486
+ l0.2-0.1h0.1h0.2h0.1h0.1h0.1h0.1h0.1h0.1h0.2h0.1L455.7,235.5z M458.8,246.9L458.8,246.9h-0.2H458.8z"
2487
+ />
2488
+ <g>
2489
+ <g transform="matrix(1,0,0,1,454.698,46.683)">
2490
+ <path
2491
+ d="M343.4,257.1h0.9h0.9h0.9h0.9h0.5h0.2l0.3-0.1l0.4-0.1h0.4h0.4h0.4h0.4h0.4h0.4h0.3h0.3h0.3h0.3h0.3h0.3h0.3
2492
+ l0.3,0.1l0.7,0.1l0.7,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.4,0.1l0.6,0.1l0.6,0.1h0.2h0.2h0.3h0.3l0.8,0.1
2493
+ l0.9,0.1l1,0.1l1.1,0.1l1.1,0.2l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.5,0.1l0.5,0.2l0.5,0.2
2494
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.3
2495
+ l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3v0.2v0.2v0.2v0.1v0.2v0.2l0,0v0.3v0.3l0,0v0.2l-0.1,0.2l-0.1,0.2l0,0l-0.1,0.2l-0.1,0.2
2496
+ l-0.1,0.2l0,0l-0.2,0.2l-0.2,0.2l-0.2,0.2l0,0l-0.2,0.1l-0.2,0.1l-0.2,0.1l0,0l-0.2,0.1l-0.2,0.1l0,0H374h-0.2l0,0h-0.3h-0.1
2497
+ h-0.2H373h-0.1l-0.3-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.5-0.2l-0.5-0.2l-1.1-0.5l-0.5-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1
2498
+ l-0.2-0.1l-0.2-0.1h-0.1h-0.1h-0.1l0,0h-0.3h-0.4h-0.4h-0.3h-0.3h-0.3h-0.3H365l-0.3-0.1l-0.3-0.1l-0.7-0.1l-0.7-0.1l-0.6-0.2
2499
+ l-0.6-0.2l-0.6-0.2l-0.6-0.2l-0.6-0.2l-1.2-0.4l-0.5-0.2l-0.4-0.1l-0.6-0.1l-0.6-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1
2500
+ l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1H349l-0.4,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2501
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1l-1.5,0.1h-1.5h-1.5h-1.5h-1.5h-2.4h-0.9l0,0
2502
+ l-0.8,0.2l-0.8,0.2l-0.8,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.3l-0.7,0.3l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2503
+ l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2504
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1h0.1l0.3,0.1l0.3,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.9,0.1l1,0.1l1,0.1
2505
+ l1,0.1l2,0.2l1,0.1l1,0.1l0.9,0.1l0.5,0.1l0.5,0.1l0.5,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1
2506
+ l0.4,0.2l0.4,0.2l0.2,0.1l0.3,0.2h0.1l0.1,0.1l0.1,0.1l0.4,0.2l0.4,0.2l0.5,0.2l0.5,0.3l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2
2507
+ l0.3,0.2l0.3,0.2l0.3,0.3l0.3,0.3l0.3,0.3l0.2,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.2l0.1,0.3l0.1,0.3
2508
+ l0.1,0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2
2509
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.3,0.1l-0.3,0.1
2510
+ l-0.5,0.2l-0.5,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1
2511
+ l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-1.4,0.2l-1.4,0.1l-1.4,0.1l-1.3,0.1L312,289l-1.2,0.1
2512
+ l-1.2,0.1l-1.1,0.1h-1l-1.8,0.1h-1.3h-0.5h-0.2h-0.1h-0.3H303h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l0,0l-0.3-0.2l-0.2-0.2l-0.2-0.2
2513
+ l-0.2-0.2l-0.2-0.2l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3V286l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0,0l0.2-0.2l0.2-0.2
2514
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0,0h0.2h0.2h0.2h0.4h0.5h1.3l1.7-0.1h1l1.1-0.1l1.1-0.1l1.2-0.1l1.2-0.1
2515
+ l1.3-0.1l1.3-0.1l1.3-0.1l1.3-0.1l0.7-0.1l0.7-0.1l0.7-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1
2516
+ l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.4-0.1l0.4-0.1l0.4-0.2l0.3-0.2l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0.1-0.1l0,0
2517
+ h-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.4-0.2l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.2-0.1l0,0h-0.1h-0.1
2518
+ l-0.1-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.4-0.1l-0.4-0.1l-0.4-0.1h-0.4l-0.9-0.1l-0.9-0.1l-1-0.1
2519
+ l-2-0.2l-1-0.1l-1-0.1l-1-0.1l-1-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.4-0.1l-0.4-0.1
2520
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.4-0.2l-0.4-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.2l-0.2-0.2l-0.2-0.2
2521
+ l-0.2-0.2l-0.2-0.2l-0.2-0.2l-0.2-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3l-0.1-0.3v-0.3v-0.3v-0.3v-0.3l0.1-0.3l0.1-0.3
2522
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.1-0.2l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.3l0.3-0.3
2523
+ l0.3-0.3l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0,0l-1.4-0.1l-1.4-0.1l-1.3-0.1l-1.3-0.1l-1.2-0.2l-0.4-0.1h-0.5l-1.1-0.1
2524
+ l-1.2-0.1l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.4-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2525
+ l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.2l-0.3-0.3
2526
+ l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.2-0.3l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4l-0.1-0.4V255
2527
+ v-0.5V254v-0.5l0.1-0.5l0.1-0.5l0.1-0.5l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.3l0.1-0.2l0.2-0.2l0.2-0.2l0.2-0.2
2528
+ l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2
2529
+ l0.4-0.2l0.4-0.2l0.4-0.2l0.8-0.4l0.8-0.4l1.4-0.7l0.6-0.3l0.5-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2530
+ l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3h0.6h0.6h0.6h0.5h0.5l0.5,0.1l0.5,0.1l0.5,0.1l0.5,0.1
2531
+ l0.5,0.1l0.5,0.1l1,0.2l0.9,0.2l0.9,0.2l0.9,0.2l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2532
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1h0.7h0.7h0.8h0.8h0.8l1.5,0.1h1.5h1.5h1.5h1.5h3h2.9h1.1h1.1h1.1l1.1-0.1l1.1-0.1l1.1-0.1
2533
+ l1.1-0.1l1.1-0.1l1.1-0.1l1.1-0.2l1.1-0.2l1.1-0.2l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1l0.5-0.1h0.1h0.1
2534
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.3-0.1l0.6-0.3l0.6-0.3l0.6-0.3l0.7-0.3l0.6-0.3l0.6-0.3l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1
2535
+ l0.4-0.1l0.3-0.1h0.3h0.2h0.2h0.2h0.1h0.2h0.2l0,0l0.3,0.1l0.3,0.1l0,0l0.2,0.1l0.2,0.1l0.2,0.2l0,0l0.2,0.2l0.2,0.2l0.2,0.2l0,0
2536
+ l0.1,0.2l0.1,0.2l0.1,0.3l0,0l0.1,0.2v0.2v0.2l0,0v0.3v0.3v0.1v0.2v0.2v0.1l-0.1,0.3l-0.1,0.2l-0.1,0.3l-0.1,0.2l-0.1,0.2
2537
+ l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3h-0.2l0,0l-0.6,0.3l-0.6,0.3
2538
+ l-0.7,0.3l-0.7,0.3l-0.7,0.3l-0.4,0.2l-0.4,0.2l-0.4,0.1L357,248l-0.4,0.1l-0.3,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1
2539
+ l-0.6,0.1l-0.6,0.1l-0.6,0.1l-0.6,0.1l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.2l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1l-1.2,0.1h-1.2
2540
+ h-1.2h-1.2h-2.9h-3h-1.5h-1.6h-1.6h-1.6l-1.6-0.1h-0.8h-0.8h-0.8h-0.8l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2541
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1-0.2l-0.9-0.2l-0.9-0.2l-0.9-0.2l-0.4-0.1l-0.4-0.1
2542
+ l-0.4-0.1l-0.4-0.1l-0.4-0.1H304h-0.4h-0.4h-0.4h-0.4H302h-0.2h-0.2h-0.2h-0.2H301h-0.2h-0.2h-0.2h-0.2H300l-0.2,0.1l-0.2,0.1
2543
+ l-0.2,0.1l-0.2,0.1L299,248l-0.2,0.1l-0.2,0.1l-0.2,0.1l-0.6,0.3l-0.7,0.3l-1.4,0.6l-0.7,0.3l-0.7,0.4l-0.4,0.2l-0.3,0.2
2544
+ l-0.3,0.2L293,251l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.1,0.1l-0.1,0.1l-0.1,0.1
2545
+ l-0.1,0.1l-0.1,0.1l-0.1,0.1l-0.1,0.1v0.1v0.1v0.1l0,0l0,0l0,0l0,0l0,0l0,0v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1
2546
+ v0.1v0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1
2547
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1
2548
+ l0.6,0.1l1.1,0.1l1.1,0.1l0.5,0.1l0.5,0.1l1.2,0.1l1.2,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1l1.4,0.1
2549
+ l1.4,0.1l1.5,0.1h1.5h1.4h0.1l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.2l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l0.9-0.1l1-0.1l0.9-0.1
2550
+ l1-0.1l1-0.1h0.9h0.9h0.9h0.9h0.9h0.9h0.9L343.4,257.1z M303.7,289.4L303.7,289.4L303.7,289.4L303.7,289.4z"
2551
+ />
2552
+ </g>
2553
+ <g transform="matrix(1,0,0,1,381.866,45.2348)">
2554
+ <path
2555
+ d="M-30.6-41.7h1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.1l1,0.2l1,0.2l1,0.2l1,0.2l1,0.2l1,0.3l1,0.3l0.5,0.2
2556
+ l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2l0.5,0.2
2557
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.3l0.4,0.2l0.9,0.7l0.8,0.8l0.7,0.9l0.6,1l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1
2558
+ l-0.1,1.1l-0.2,1.1L-2-23.3l-0.5,1l-0.6,0.9l-0.7,0.8l-0.8,0.8l-0.9,0.6l-1,0.5l-1,0.4L-8.6-18l-1.1,0.1h-1.1l-1.1-0.2l-1.1-0.3
2559
+ l-1-0.4l-1-0.6l-0.3-0.2l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.2-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1
2560
+ l-0.3-0.1l-0.3-0.1L-19-21l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.6-0.2
2561
+ l-0.6-0.2l-0.6-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7h-0.7
2562
+ h-0.7l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.1l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.7,0.2l-0.6,0.2l-0.6,0.2
2563
+ l-0.6,0.2l-0.6,0.2l-0.6,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1
2564
+ l-0.3,0.1l-0.3,0.2l-0.3,0.1l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2
2565
+ l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.7,0.7l-0.7,0.7l-1.4,1.4l-1.5,1.4
2566
+ l-1.5,1.4l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.7,0.7l-0.6,0.7l-0.3,0.3L-66.5-3l-0.3,0.4
2567
+ l-0.3,0.3L-67.4-2l-0.3,0.3L-68-1.4l-0.3,0.3l-0.3,0.3l-0.2,0.3L-69-0.2l-0.2,0.3l-0.2,0.3l-0.2,0.3L-69.8,1L-70,1.3l-0.2,0.3
2568
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3L-71,2.8l-0.1,0.3l-0.1,0.3l-0.1,0.3L-71.4,4l-0.1,0.3l-0.1,0.3l-0.1,0.3l0,0.1v0.2v0.1v0.2v0.4v0.4
2569
+ l-0.1,0.5l-0.1,1.3l-0.2,3l-0.1,1.7l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.1,0.9l-0.2,0.9l-0.2,0.9l-0.1,0.5
2570
+ l-0.1,0.4l-0.1,0.5l-0.1,0.5l-0.1,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.2,0.5l-0.3,0.5l-0.3,0.6l-0.4,0.6l-0.4,0.6l-0.7,0.4
2571
+ l-0.3,0.4l-0.6,0.6l-0.4,0.3l-0.5,0.4L-79,30l-0.5,0.3l-0.4,0.2l-1.9,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,0.9l-1.7,1l-1.7,1
2572
+ l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1l-1.7,1.1
2573
+ l-1.7,1.1l-1.7,1.1l-1.7,1.2l-1.7,1.2l-3.4,2.3l-3.4,2.4l-3.4,2.4l-6.9,4.8l-3.5,2.4l-3.5,2.4l-3.5,2.4l-3.5,2.4l-1.8,1.2
2574
+ l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.2l-1.8,1.1l-1.8,1.1l-1.8,1.1L-177,93l-1.8,1.1l-1.8,1.1
2575
+ l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.8,1.1l-1.9,1l-1.8,1l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-4.2,2.4l-2.1,1.2l-2.1,1.2
2576
+ l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.2l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3l-2.1,1.3
2577
+ l-2.1,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.3l-2,1.4l-2,1.4
2578
+ l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-2,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4l-1.9,1.4
2579
+ l-1.9,1.4l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1.9,1.5l-1,0.8l-1,0.8l-1,0.8l-1,0.8l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7l-1,0.7
2580
+ l-1,0.7l-1,0.7l-2,1.3l-2,1.3l-4,2.6l-2,1.3l-1,0.6l-1,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.6l-0.9,0.7
2581
+ l-0.9,0.7l-0.5,0.4l-0.5,0.4l-0.5,0.4l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2v0.4l-0.1,1.1l-0.2,1.1l-0.3,1.1l-0.5,1l-0.6,0.9
2582
+ l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-1-0.5l-0.9-0.7l-0.8-0.8l-0.7-0.9
2583
+ l-0.3-0.4l-0.4-0.6l-0.3-0.6l-0.3-0.6l-0.3-0.7l-0.2-0.7l-0.2-0.7l-0.1-0.7l-0.1-0.7l-0.1-0.7v-0.7v-0.6l0.1-0.6l0.1-0.6l0.1-0.6
2584
+ l0.1-0.6l0.1-0.5l0.2-0.5l0.2-0.5l0.2-0.5l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.2-0.4l0.4-0.6l0.4-0.6l0.4-0.6l0.5-0.5
2585
+ l0.4-0.5l0.4-0.5l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.7-0.6l0.7-0.5l0.6-0.5l1-0.8l1-0.7l1-0.7l1-0.7
2586
+ l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l1-0.7l2-1.3l4-2.6l2-1.3l2-1.3l1-0.6l1-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.6l0.9-0.7l0.9-0.7
2587
+ l0.9-0.7l0.9-0.7l0.9-0.7l0.9-0.7l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l1.9-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.5l2-1.4l2-1.4
2588
+ l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2-1.4l2.1-1.4l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2589
+ l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3l2.1-1.3
2590
+ l2.1-1.3l2.1-1.2l2.1-1.2l2.1-1.2l2.1-1.2l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l4.2-2.4l1.8-1l1.7-1l1.7-1l1.7-1l1.8-1l1.7-1
2591
+ l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.1l1.7-1.2l1.7-1.2l1.7-1.2l3.5-2.4
2592
+ l3.5-2.4l3.5-2.4l3.5-2.4l6.9-4.8l3.5-2.4l3.5-2.4l3.5-2.4l1.7-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.2l1.8-1.1
2593
+ l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1.1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1.8-1l1-0.5
2594
+ v-0.2l0.1-0.6l0.1-0.6l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.8l0.1-0.8l0.1-1.5l0.2-3l0.1-1.4l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7l0.1-0.7
2595
+ l0.1-0.4l0.1-0.4l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.6
2596
+ l0.3-0.6l0.3-0.6l0.3-0.6l0.3-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5l0.4-0.5
2597
+ l0.4-0.5l0.4-0.5l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.9l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l0.8-0.8l1.5-1.5l1.5-1.4l1.4-1.3l0.6-0.6
2598
+ l0.6-0.6l0.3-0.3l0.4-0.4l0.4-0.4l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3
2599
+ l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.3l0.4-0.2l0.5-0.2l0.5-0.2l0.4-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2
2600
+ l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.4l1-0.4l1-0.3l1-0.3l1-0.3l1-0.3l1-0.3l1-0.2l1-0.2l1-0.2l1-0.2l1-0.2l1-0.1l1-0.1l1-0.1l1-0.1
2601
+ l1-0.1l1-0.1h1h1h1L-30.6-41.7z M-356,204.7l-0.1-0.1l-0.2-0.3v-0.1L-356,204.7z"
2602
+ />
2603
+ <path
2604
+ d="M-5.6-32.2l0.8,0.1l0.7,0.2l0,0l0.7,0.2l0.7,0.3l0.6,0.3l0,0l0.8,0.5l0.7,0.6l0,0l0.4,0.4l0.4,0.5l0.3,0.3
2605
+ l0.4,0.5l0.3,0.4l0.3,0.6l0.3,0.5l0.3,0.5l0.4,0.9l0.4,0.9l0.2,0.3l0.1,0.3l0.1,0.1l0,0l0.1,0.1l0.2,0.2l0.6,0.6l0.4,0.4L5-22
2606
+ l0.4,0.6L5.7-21l0.2,0.4l0.3,0.4l0.3,0.4l0.3,0.5L7-18.8l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.6L8-16.1l0.1,0.4l0.1,0.5l0.1,0.4
2607
+ l0.1,0.5l0.2,0.5l0.2,0.6L9-12.6l0.2,0.7l0.2,0.7l0.3,0.7L10-9.7l0.3,0.8l0.3,0.8l0.3,0.8l0.3,0.8l0.4,0.8L12-4.9l0.4,0.8
2608
+ l0.4,0.8l0.4,0.8l0.2,0.3l0.2,0.3l0.2,0.3L14-1.3L14.2-1l0.2,0.3l0.2,0.3l0.2,0.3L15,0.2l0.2,0.2l0.2,0.2l0.2,0.2L15.8,1l0.1,0.2
2609
+ L16,1.4l0.1,0.1l0.1,0.1l0.1,0.1l0,0l0.2,0.1L17,2.1l0.5,0.3L18,2.7L18.5,3L19,3.3l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4L21,5.3
2610
+ l0.4,0.4l0.4,0.4l0.3,0.4l0.3,0.4l0.3,0.4L23,7.7l0.3,0.4l0.3,0.4l0.2,0.4L24,9.3l0.2,0.4l0.2,0.4l0.2,0.4l0.4,0.7l0.3,0.7
2611
+ l0.3,0.7l0.3,0.7l0.3,0.6l0.3,0.6l0.5,1.1l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.3l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1
2612
+ l0.1,0.1l0.1,0.1v0.1l0.1,0.1l0,0l0.1,0.1l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.4l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5l0.4,0.5
2613
+ l0.4,0.5l0.4,0.5l0.4,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.3,0.5l0.6,1l0.6,1l0.6,1l0.6,1l0.5,1l0.5,1l0.5,1
2614
+ l0.5,1l0.5,1l0.5,1l0.5,1l0.5,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.4,1l0.8,2l0.8,2l1.5,4l0.8,2l0.8,2l0.4,1l0.4,1l0.4,0.9l0.4,0.9
2615
+ l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.9l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.4,0.8l0.5,0.8l0.2,0.3
2616
+ l0.2,0.4l0.2,0.4l0.2,0.3l0.2,0.4l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.3,0.3l0.3,0.4l0.5,0.6l0.5,0.6l0.5,0.6l0.4,0.7
2617
+ l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.4,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7l0.3,0.7
2618
+ l0.3,0.7l0.3,0.7l0.2,0.7l0.2,0.6l0.2,0.6l0.2,0.6l0.2,0.6l0.4,1.3l0.4,1.3l0.4,1.2l0.4,1.2l0.4,1.2l0.7,2.4l0.3,1.1l0.3,1.1
2619
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.4,1.1l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.5l0.2,0.4l0.2,0.4
2620
+ l0.2,0.5l0.9,1.7l0.9,1.8l0.9,1.8l0.9,1.8l0.9,1.9l0.9,1.9l0.9,1.9l0.9,2l0.9,2l0.9,2l0.9,2l0.8,2l0.8,2.1l0.8,2.1l0.8,2.1
2621
+ l0.8,2.1l0.8,2.1l0.8,2.2l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.4,1.1l0.3,1.1l0.3,1.1
2622
+ l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.1l0.3,1.2l0.3,1.1l0.3,1.2
2623
+ l0.3,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.2,1.2l0.1,1.2
2624
+ l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.2l0.1,1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1v1.1
2625
+ l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.1,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.2,1.1
2626
+ l-0.2,1.1l-0.2,1.1l-0.2,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.3,1.1l-0.4,1.1l-0.4,1l-0.4,1l-0.4,1l-0.4,1
2627
+ l-0.4,1l-0.5,1l-0.5,1l-0.5,1.1l-0.3,0.6l-0.4,0.6l-0.4,0.5l-0.4,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.3,0.2
2628
+ l-0.3,0.2l-0.4,0.2l-0.6,0.4l-0.6,0.3l-0.6,0.3L89,261l-0.6,0.3l-0.6,0.2l-0.6,0.2l-0.5,0.2l-0.5,0.2l-0.5,0.2l-1,0.4l-1,0.3
2629
+ l-0.9,0.3l-0.8,0.3l-0.3,0.1l-0.3,0.1l-0.2,0.1L81,264l-0.1,0.1l-0.4,0.3l-0.4,0.3l-0.4,0.3l-0.4,0.2l-0.4,0.3l-0.8,0.5l-0.8,0.4
2630
+ l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.4l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.3l-0.9,0.2l-0.9,0.2l-0.9,0.2l-0.9,0.2
2631
+ l-0.9,0.2l-0.9,0.2l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1l-0.9,0.1h-0.9h-0.9h-0.9h-0.9h-0.9H53h-0.9h-0.9h-0.9l-0.9-0.1
2632
+ l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1l-0.8-0.1
2633
+ l-0.8-0.2l-0.8-0.2l-0.8-0.2L35,269l-1.6-0.3l-1.6-0.4l-1.5-0.4l-1.5-0.4l-1.6-0.4l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.6-0.3
2634
+ l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-0.6-0.3l-1.1-0.5l-2.1-1.1l-1-0.5l-0.9-0.4l-0.4-0.2l-0.4-0.2l-0.3-0.2l-0.3-0.1l-0.2-0.1
2635
+ l-0.2-0.1h-0.1h-0.3l-1-0.2l-0.9-0.3l-0.9-0.4l-0.9-0.5L9,259.1l-0.7-0.7l-0.6-0.8l-0.6-0.8l-0.5-0.9L6.2,255L6,254l-0.1-1v-1
2636
+ l0.1-1l0.2-1l0.3-0.9l0.4-0.9l0.5-0.9l0.6-0.8l0.7-0.7l0.8-0.6l0.8-0.6l0.9-0.5l0.9-0.4l1-0.3l1-0.1h1h0.3h0.5l0.5,0.1l0.5,0.1
2637
+ l0.4,0.1l0.4,0.1l0.4,0.1l0.4,0.1l0.7,0.2l0.7,0.2l0.7,0.2l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l0.6,0.3l1.1,0.5l1.1,0.5l2.1,1l1,0.5
2638
+ l0.4,0.2l0.4,0.2l0.4,0.2l0.4,0.2l0.3,0.1l0.3,0.1l0.2,0.1l0.2,0.1h0.1h0.2l1.3,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3l1.4,0.3
2639
+ l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1
2640
+ l0.7,0.1H52h0.6h0.6h0.6h0.6H55h0.6h0.6h0.6h0.6H58h0.6l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.6-0.1l0.5-0.1l0.5-0.1
2641
+ l0.5-0.1l0.5-0.1l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.3l0.5-0.3l0.2-0.1l0.2-0.1
2642
+ l0.2-0.1l0.2-0.1l0.2-0.1l0.4-0.3l0.5-0.3l0.6-0.3l0.6-0.3l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.5-0.2l0.9-0.3l0.9-0.3l0.9-0.3
2643
+ l0.9-0.3l0.4-0.1l0.4-0.1l0.4-0.1l0.3-0.1l0.2-0.4l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.3-0.8l0.2-0.8
2644
+ l0.2-0.8l0.2-0.8l0.2-0.8l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.2-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9l0.1-0.9
2645
+ l0.1-0.9l0.1-0.9l0.1-0.9V221v-1v-1v-1v-1v-1v-1v-1v-1v-1v-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1l-0.1-1
2646
+ l-0.1-1l-0.1-1l-0.1-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1l-0.2-1.1l-0.2-1.1l-0.2-1.1l-0.2-1.1
2647
+ l-0.2-1.1l-0.2-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1l-0.3-1l-0.3-1.1l-0.3-1
2648
+ l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.3-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.7-2l-0.8-2l-0.8-2l-0.8-2l-0.8-2
2649
+ l-0.8-2l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.9l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.8l-0.8-1.7l-0.8-1.7l-0.8-1.7l-0.3-0.6
2650
+ l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.7l-0.3-0.6l-0.2-0.7l-0.2-0.7l-0.2-0.6l-0.2-0.7l-0.4-1.3l-0.4-1.3
2651
+ l-0.4-1.2l-0.4-1.2l-0.4-1.2l-0.3-1.2l-0.7-2.3l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.3-1.1l-0.4-1.1l-0.2-0.5l-0.2-0.5l-0.2-0.5
2652
+ L51,99.4l-0.2-0.5l-0.2-0.5l-0.2-0.5l-0.2-0.5L50,96.9l-0.2-0.5l-0.2-0.5l-0.2-0.4l-0.2-0.4L49,94.7l-0.2-0.4l-0.2-0.4l-0.2-0.4
2653
+ l-0.2-0.4L48,92.7l-0.2-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4l-0.3-0.4L46,89.9l-0.3-0.4L45.3,89l-0.4-0.5L44.5,88l-0.4-0.5
2654
+ L43.8,87l-0.3-0.5L43.2,86l-0.3-0.5L42.6,85l-0.3-0.5L42,84l-0.6-1l-0.6-1l-0.6-1l-0.6-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.5-1
2655
+ l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1L34,68l-0.4-1l-0.4-1l-0.8-2l-0.8-2l-1.5-4l-0.8-2l-0.8-2l-0.4-1l-0.4-0.9l-0.4-0.9
2656
+ l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.9l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8l-0.4-0.8
2657
+ l-0.5-0.8l-0.5-0.7l-0.2-0.3l-0.2-0.4l-0.2-0.3l-0.2-0.3L20.1,37l-0.2-0.3l-0.2-0.3l-0.2-0.3l-0.2-0.3L19,35.5l-0.2-0.3l-0.3-0.3
2658
+ l-0.3-0.3l-0.3-0.3L17.6,34l-0.3-0.3L17,33.4l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.3-0.3l-0.4-0.4l-0.3-0.4L14.8,31l-0.3-0.4l-0.3-0.4
2659
+ l-0.3-0.4l-0.3-0.4L13.4,29l-0.2-0.4L13,28.2l-0.2-0.4l-0.4-0.7L12,26.4l-0.3-0.7L11.4,25l-0.3-0.6l-0.3-0.6l-0.5-1.1l-0.2-0.5
2660
+ l-0.2-0.5l-0.2-0.4l-0.2-0.4l-0.2-0.4l-0.2-0.4L9,20l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1l-0.1-0.1v-0.1
2661
+ l-0.1-0.1L8.1,19l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l0,0l-0.2-0.1l-0.5-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4L5.1,17
2662
+ l-0.5-0.4l-0.5-0.4l-0.4-0.4l-0.4-0.4L2.9,15l-0.4-0.4l-0.4-0.5l-0.4-0.4l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5
2663
+ l-0.3-0.5l-0.3-0.5L-1,9.2l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.5l-0.5-1l-0.5-1l-0.5-1l-0.5-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1l-0.4-1
2664
+ l-0.4-1l-0.3-1l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.3-0.9l-0.2-0.8L-8.5-9l-0.2-0.7l-0.2-0.2l-0.3-0.3l-0.4-0.4l-0.4-0.5l-0.4-0.5
2665
+ l-0.3-0.4l-0.2-0.4l-0.2-0.4l-0.3-0.4l-0.3-0.6l-0.3-0.5l-0.2-0.5l-0.2-0.5l-0.3-0.7l-0.5-0.5l-0.5-0.8l-0.5-0.9l-0.4-0.9l-0.2-1
2666
+ l-0.1-1v-0.5v-0.5v-0.7l0.1-0.7v-0.1l0.1-0.7l0.2-0.7l0.2-0.6l0,0l0.3-0.7l0.4-0.7l0.4-0.7l0,0l0.6-0.7L-12-29l0.7-0.5l0.7-0.5
2667
+ l0,0l0.7-0.4l0.8-0.3l0.8-0.2l0.8-0.2l0.8-0.1l0,0h0.8L-5.6-32.2z M14.2,260.9h0.2l0,0H14H14.2z M2.1-22.5L2.1-22.5v-0.2V-22.5z
2668
+ M2.1-23.1v-0.5v-0.2V-23.1z"
2669
+ />
2670
+ <path
2671
+ d="M-358.4,223.5l1.1,0.2l0,0l0.6,0.2l0.6,0.2l0.2,0.1l1.3,0.5l1.7,0.7l0.7,0.3l0.5,0.2l0.2,0.1l0.2,0.1
2672
+ l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.4,0.1l0.5,0.1l0.5,0.1l0.5,0.1l1.2,0.2l1.3,0.3l0.7,0.2l0.8,0.2l0.8,0.2l0.7,0.2
2673
+ l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.7,0.1l0.8,0.1
2674
+ l0.8,0.1l1.6,0.1l1.6,0.1l1.7,0.1l1.7,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l0.9,0.1l1,0.1l1,0.1l1,0.2l1,0.2l0.9,0.2l1.2,0.2
2675
+ l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.2l1.2,0.1l1.2,0.1
2676
+ l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l1.3,0.1l2.6,0.2l2.6,0.1l2.6,0.1
2677
+ l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1l2.6,0.1h2.6h2.6h2.6h2.6h2.5h2.5h5h5.3h5.3h5.3l5.3,0.1l5.3,0.1l5.3,0.1
2678
+ l5.3,0.1l5.3,0.1l5.3,0.1l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.2l5.3,0.3l5.3,0.3l5.3,0.3
2679
+ l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.3l5.3,0.4l5.3,0.4l5.2,0.4l1.7,0.1l1.7,0.1l3.4,0.2l3.4,0.2
2680
+ l3.4,0.2l3.5,0.2l3.5,0.2l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.5,0.1l3.4,0.1h3.4h3.4h3.4h3.3h0.6h0.6h0.7h0.7h0.7l0.8-0.1l1.7-0.1
2681
+ l1.8-0.1l1.9-0.1l1-0.1l1-0.1l1-0.1l1-0.1h1h1.1h1.1h1.1h1.1h0.6h0.5h0.5h0.5h0.5h0.5l0.5,0.1L12,245l0.6,0.1l0.5,0.1l0.6,0.1
2682
+ l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.1l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.2l0.6,0.3l0.4,0.2l1,0.5l0.9,0.7l0.8,0.8l0.7,0.9
2683
+ l0.6,0.9l0.5,1l0.3,1.1l0.2,1.1l0.1,1.1l-0.1,1.1l-0.2,1.1l-0.4,1.1l-0.5,1l-0.6,0.9l-0.7,0.9l-0.8,0.8l-0.9,0.7l-1,0.5l-1,0.4
2684
+ l-1.1,0.3l-1.1,0.1h-1.1l-1.1-0.1l-1.1-0.3l-1-0.4l-0.2-0.1l0,0h-0.1h-0.1H12h-0.1h-0.2h-0.2h-0.2h-0.2h-0.2h-0.2h-0.3h-0.3H9.8
2685
+ H9.5H9.2H8.9H8.6H8.3H7.9H7.6H6.8H6H5.2H4.4H3.5H2.6l-0.9,0.1l-0.9,0.1l-0.9,0.1l-1.8,0.1l-1.8,0.1l-1.8,0.1l-0.9,0.1l-0.9,0.1
2686
+ h-0.9h-0.9H-10h-0.8h-3.5h-3.5h-3.5h-3.5l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.1l-3.5-0.2l-3.5-0.2l-3.5-0.2
2687
+ l-3.5-0.2l-3.5-0.2l-1.7-0.1l-1.7-0.1l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.4l-5.2-0.3l-5.2-0.3l-5.2-0.3l-5.3-0.3l-5.2-0.3
2688
+ l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.3l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2l-5.3-0.2
2689
+ l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.3-0.1l-5.2-0.1l-5.2-0.1l-5.2-0.1h-5.2h-5.2h-5.2h-5.1h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6h-2.6
2690
+ l-2.6-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.1l-2.7-0.2l-2.7-0.2l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1
2691
+ l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.1l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2
2692
+ l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.3-0.2l-1.2-0.2l-0.7-0.1l-0.7-0.1
2693
+ l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.7-0.1l-0.8-0.1l-0.8-0.1l-1.6-0.1l-1.6-0.1l-1.7-0.1l-1.7-0.1l-0.9-0.1
2694
+ l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-0.9-0.1l-1-0.1l-1-0.2l-1-0.2l-1-0.2l-1-0.2l-0.5-0.1l-0.5-0.1l-0.5-0.1
2695
+ l-0.4-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-0.5-0.1l-1.2-0.2l-1.3-0.3l-0.7-0.2l-0.7-0.2l-0.8-0.2l-0.8-0.2l-0.8-0.2l-0.4-0.1
2696
+ l-0.4-0.1l-0.4-0.1l-0.4-0.2l-0.5-0.2l-0.5-0.2l-0.8-0.3l-0.9-0.4l-1.7-0.8l-0.8-0.3l-0.7-0.3l-0.3-0.1l-1-0.6l-0.9-0.7l-0.8-0.8
2697
+ l-0.7-0.9l-0.6-1l-0.4-1l-0.3-1.1l-0.2-1.1v-1.1l0.1-1.1l0.3-1.1l0.4-1.1l0.5-1l0.7-0.9l0.8-0.8l0.9-0.7l1-0.6l1-0.5l1.1-0.4
2698
+ l1.1-0.2l1.1-0.1L-358.4,223.5z"
2699
+ />
2700
+ <path
2701
+ d="M-365,199.4h0.3h0.3h0.3l0.4,0.1l0.7,0.2l0.4,0.1l0.3,0.1l0.3,0.1l0.3,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1
2702
+ l0.2,0.1h0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.2h0.1l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.1,0.1l0.2,0.2l0.2,0.2
2703
+ l0.2,0.2l0.2,0.2l0.2,0.3l0.2,0.3v0.1l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.1l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3
2704
+ l0.1,0.3v0.3v0.1v0.3v0.3v0.3v0.3v0.3v0.1v0.3v0.3v0.3v0.3l-0.1,0.3v0.1l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3v0.1l-0.1,0.3
2705
+ l-0.1,0.3l-0.1,0.3l-0.2,0.4l-0.4,0.7l-0.3,0.5l-0.3,0.4l-0.3,0.4l-0.5,0.6l-0.5,0.5l-0.4,0.4l-0.4,0.4l-0.4,0.4l-0.7,0.6
2706
+ l-0.7,0.6l-0.3,0.3l-0.3,0.3l-0.3,0.2l-0.1,0.1l-0.1,0.5v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.2v0.2v0.2
2707
+ v0.2v0.2v0.2v0.2v0.2v0.2v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1v0.1l0,0v0.1h0.1l0.1,0.1h0.1l0.1,0.1
2708
+ l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.1,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.2,0.1l0.4,0.1l0.3,0.1l0.3,0.1
2709
+ l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.1l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.3,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2l0.2,0.2
2710
+ l0.2,0.2l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.2,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3l0.1,0.3v0.3
2711
+ v0.3v0.3v0.3v0.3v0.3v0.3v0.3v0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.1,0.3l-0.2,0.3
2712
+ l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.3l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.2,0.2l-0.3,0.2l-0.3,0.2l-0.3,0.2
2713
+ l-0.3,0.2l-0.3,0.2l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1l-0.3,0.1h-0.3h-0.3h-0.3
2714
+ h-0.3h-0.3h-0.3h-0.3h-0.3l-0.3-0.1l-0.3-0.1l-0.3-0.1l-0.6-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.2l-0.7-0.3l-0.7-0.3l-0.6-0.3l-0.6-0.3
2715
+ l-0.6-0.3l-0.6-0.3l-0.6-0.4l-0.6-0.4l-0.6-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.4l-0.5-0.5l-0.5-0.5l-0.5-0.5l-0.4-0.5l-0.4-0.5
2716
+ l-0.4-0.5l-0.4-0.5l-0.4-0.5l-0.3-0.5l-0.3-0.5l-0.3-0.6l-0.3-0.6l-0.3-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6l-0.2-0.6
2717
+ l-0.2-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.6l-0.1-0.5l-0.1-0.6v-0.6v-0.5v-0.5v-0.5v-0.5v-0.5v-0.6v-0.5
2718
+ v-0.5v-0.5v-0.5v-0.5v-0.5l0.1-0.5l0.1-0.5l0.1-1l0.1-1l0.2-1.1l0.1-0.7l0.2-0.7l0.2-0.7l0.2-0.6l0.3-0.6l0.3-0.5l0.3-0.5
2719
+ l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.4l0.3-0.3l0.3-0.3l0.3-0.3l0.5-0.5l0.5-0.5l0.5-0.5l0.5-0.4l0.5-0.4l0.4-0.4l0,0l0.1-0.2l0.1-0.3
2720
+ l0.1-0.3l0.1-0.3l0.1-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.3l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.2-0.2l0.3-0.2
2721
+ l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.2l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1l0.3-0.1h0.3h0.3h0.3h0.3h0.3
2722
+ L-365,199.4z M-366.9,217h0.1H-366.9L-366.9,217z"
2723
+ />
2724
+ </g>
2725
+ </g>
2726
+ </g>
2727
+ </svg>
{images/previews → assets/img}/cap.jpg RENAMED
File without changes
{images/previews → assets/img}/collection.jpg RENAMED
File without changes
assets/img/grid.svg ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="231" height="252" fill="none">
2
+ <rect width="65.374" height="65.374" x=".162" y=".779" fill="#E1E3E6" rx="3"/>
3
+ <rect width="47.266" height="5.148" x="9.216" y="76.153" fill="#E1E3E6" rx="2.574"/>
4
+ <rect width="62.8" height="15" x="1.565" y="101.448" fill="#E1E3E6" rx="5"/>
5
+ <rect width="65.374" height="65.374" x=".162" y="136.277" fill="#E1E3E6" rx="3"/>
6
+ <rect width="47.266" height="5.148" x="9.216" y="211.651" fill="#E1E3E6" rx="2.574"/>
7
+ <rect width="62.8" height="15" x="1.565" y="236.946" fill="#E1E3E6" rx="5"/>
8
+ <rect width="65.374" height="65.374" x="82.478" y=".779" fill="#E1E3E6" rx="3"/>
9
+ <rect width="47.266" height="5.148" x="91.532" y="76.153" fill="#E1E3E6" rx="2.574"/>
10
+ <rect width="62.8" height="15" x="83.882" y="101.448" fill="#E1E3E6" rx="5"/>
11
+ <rect width="65.374" height="65.374" x="82.478" y="136.277" fill="#E1E3E6" rx="3"/>
12
+ <rect width="47.266" height="5.148" x="91.532" y="211.651" fill="#E1E3E6" rx="2.574"/>
13
+ <rect width="62.8" height="15" x="83.882" y="236.946" fill="#E1E3E6" rx="5"/>
14
+ <rect width="65.374" height="65.374" x="164.788" y=".779" fill="#E1E3E6" rx="3"/>
15
+ <rect width="47.266" height="5.148" x="173.843" y="76.153" fill="#E1E3E6" rx="2.574"/>
16
+ <rect width="62.8" height="15" x="166.192" y="101.448" fill="#E1E3E6" rx="5"/>
17
+ <rect width="65.374" height="65.374" x="164.788" y="136.277" fill="#E1E3E6" rx="3"/>
18
+ <rect width="47.266" height="5.148" x="173.843" y="211.651" fill="#E1E3E6" rx="2.574"/>
19
+ <rect width="62.8" height="15" x="166.192" y="236.946" fill="#E1E3E6" rx="5"/>
20
+ <rect width="6.177" height="6.177" x="13.283" y="86.301" fill="#E1E3E6" rx="3"/>
21
+ <rect width="6.177" height="6.177" x="21.498" y="86.301" fill="#E1E3E6" rx="3"/>
22
+ <rect width="6.177" height="6.177" x="29.713" y="86.301" fill="#E1E3E6" rx="3"/>
23
+ <rect width="6.177" height="6.177" x="37.927" y="86.301" fill="#E1E3E6" rx="3"/>
24
+ <rect width="6.177" height="6.177" x="46.238" y="86.301" fill="#E1E3E6" rx="3"/>
25
+ <rect width="6.177" height="6.177" x="95.599" y="86.301" fill="#E1E3E6" rx="3"/>
26
+ <rect width="6.177" height="6.177" x="103.814" y="86.301" fill="#E1E3E6" rx="3"/>
27
+ <rect width="6.177" height="6.177" x="112.029" y="86.301" fill="#E1E3E6" rx="3"/>
28
+ <rect width="6.177" height="6.177" x="120.243" y="86.301" fill="#E1E3E6" rx="3"/>
29
+ <rect width="6.177" height="6.177" x="128.554" y="86.301" fill="#E1E3E6" rx="3"/>
30
+ <rect width="6.177" height="6.177" x="177.909" y="86.301" fill="#E1E3E6" rx="3"/>
31
+ <rect width="6.177" height="6.177" x="186.124" y="86.301" fill="#E1E3E6" rx="3"/>
32
+ <rect width="6.177" height="6.177" x="194.339" y="86.301" fill="#E1E3E6" rx="3"/>
33
+ <rect width="6.177" height="6.177" x="202.553" y="86.301" fill="#E1E3E6" rx="3"/>
34
+ <rect width="6.177" height="6.177" x="210.864" y="86.301" fill="#E1E3E6" rx="3"/>
35
+ <rect width="6.177" height="6.177" x="13.283" y="221.798" fill="#E1E3E6" rx="3"/>
36
+ <rect width="6.177" height="6.177" x="21.498" y="221.798" fill="#E1E3E6" rx="3"/>
37
+ <rect width="6.177" height="6.177" x="29.713" y="221.798" fill="#E1E3E6" rx="3"/>
38
+ <rect width="6.177" height="6.177" x="37.927" y="221.798" fill="#E1E3E6" rx="3"/>
39
+ <rect width="6.177" height="6.177" x="46.238" y="221.798" fill="#E1E3E6" rx="3"/>
40
+ <rect width="6.177" height="6.177" x="95.599" y="221.798" fill="#E1E3E6" rx="3"/>
41
+ <rect width="6.177" height="6.177" x="103.814" y="221.798" fill="#E1E3E6" rx="3"/>
42
+ <rect width="6.177" height="6.177" x="112.029" y="221.798" fill="#E1E3E6" rx="3"/>
43
+ <rect width="6.177" height="6.177" x="120.243" y="221.798" fill="#E1E3E6" rx="3"/>
44
+ <rect width="6.177" height="6.177" x="128.554" y="221.798" fill="#E1E3E6" rx="3"/>
45
+ <rect width="6.177" height="6.177" x="177.909" y="221.798" fill="#E1E3E6" rx="3"/>
46
+ <rect width="6.177" height="6.177" x="186.124" y="221.798" fill="#E1E3E6" rx="3"/>
47
+ <rect width="6.177" height="6.177" x="194.339" y="221.798" fill="#E1E3E6" rx="3"/>
48
+ <rect width="6.177" height="6.177" x="202.553" y="221.798" fill="#E1E3E6" rx="3"/>
49
+ <rect width="6.177" height="6.177" x="210.864" y="221.798" fill="#E1E3E6" rx="3"/>
50
+ </svg>
assets/img/no-matching-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 797.12 564.08" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m216.92 118.87 1 .15 1 .25.61.2.7.28.25.12.67.35.25.13.63.4.54.37.78.63.7.7.63.72.55.73.52.8.42.77.36.81.29.8.23.8.17.77.11.77.07.71v2.14l-.13 1.16-.22 1.2-.26 1.17-.34 1.13-.45 1.07-.42 1.1-.45 1.1-.5 1.09-.28.61.41.57.37.6.08.13.27.52.22.53.06.17.3 1v.18l.07.28.72-.48.75-.48.76-.47.79-.45.83-.43.9-.4 1-.39.73-.23.79-.18.4-.09.76-.11.49-.07h1.35l.78.08h.17l.86.17h.15l.95.3.14.05.5.2.46.23.14.08.5.29.46.33.14.08.43.35.42.39.11.1.39.4.36.43.1.12.32.41.28.45.09.14.45.86.08.17.3.8.07.18.21.74.12.53.13.85.07.82v1.21l-.07 1.2-.13 1.19-.2 1.15-.27 1.11-.31 1.09-.35 1.06-.09.24.62-.34 1-.55 1.1-.53 1.12-.48.72-.29.71-.23.8-.22.87-.18.62-.08.76-.07h1.52l.57.07.57.1.25.05.63.17.63.21.24.09.68.3.67.38.2.12.66.45.62.51.18.17.55.57.5.61.15.2.4.6.35.64.14.25.25.56.21.6.1.3.22.84.17.8.15 1.11.06 1.1v1.67h.17l1.45-.08h2.88l1.44.07 1.43.11 1.42.15 1.41.2 1.42.24 1.4.26.58.12 1.14-.27 1.35-.25 1.35-.18 1.38-.15 1.4-.1h5.85l1.52.08 1.55.12 1.58.15 1.6.17 1.63.2 1.65.21 1.67.25 1.7.27 1.7.3 1.73.32 1.74.35 1.75.35 1.76.38 1.79.4 1.78.42 1.8.43 1.78.47 1.8.46 1.8.49 1.8.5 1.79.51 1.78.54 1.78.53 1.77.57 1.77.55 1.75.58 1.71.58 1.72.6 1.7.6 1.67.62 1.65.62 1.61.63 1.6.63 1.57.64 1.53.65 1.52.65 1.47.66 1.43.65 1.4.67 1.37.67 1.31.68 1.29.68 1.23.69 1.2.68 1.17.7 1.1.72 1.08.71 1 .74 1 .76.95.8.91.84.85.86.74.82.66.8.64.83.6.85.56.87.52.87.48.88.47.9.42.9.4.9.36.92.35.91.32.94.28.91.27.94.25.93.22.93.2.94.18.93.17.93.16.94.14 1 .23 1.84.17 1.86.13 1.87.1 1.85.07 1.83v1.15l.09.14.83 1.38.82 1.43.78 1.47.73 1.48.7 1.52.65 1.52.29.68.56.05h.15l.87.17h.15l.88.27h.14l.8.35.15.07.73.4.13.1.65.45.14.1.56.46.37.35.55.59.3.38.48.67.22.31.45.79.35.7.42 1 .31 1 .25 1 .2.93.17.92.12.92.08.91.08.92.05.93v4.82l-.08 2-.12 2-.17 2.05-.18 2.07v.62l.15.35.32.8.25.8.23.8.18.8.14.78.1.78.08.77v.53l.18-.21 1.23-1.6.65-.8.55-1.15.42-.8.38-.69.37-.6.52-.83.7-1.07.85-1.26 1-1.4.58-.77.58-.77.64-.8.66-.78.69-.82.73-.8.77-.8.81-.78.87-.78.92-.77 1-.75 1-.67.62-.36.6-.34.61-.31.65-.3.7-.27.74-.25.78-.22.82-.16.86-.14.92-.06h.93l1 .08 1 .15 1 .25 1 .33.94.42.9.5.83.55.78.62.65.6.59.6.5.53.48.57.47.56.45.57.41.6.42.58.38.62.39.6.38.67.63 1.21.6 1.29.55 1.3.49 1.33.43 1.33.38 1.35.34 1.37.3 1.38.25 1.39.21 1.4.19 1.41.13 1.42.12 1.43.08 1.44.05 1.45v3.91l.66.27.72.4.13.07.65.43.6.48.14.12.48.47.45.51.12.14.33.46.32.47.1.17.45.85.08.2.3.71.18.54.22.83.15.77.1.73.07.7.05.68v3.29l-.06 1.61-.12 1.62-.17 1.62-.2 1.6-.25 1.58-.3 1.58-.33 1.57-.38 1.55-.4 1.55-.45 1.53-.49 1.54-.51 1.51-.55 1.5-.59 1.49-.6 1.48-.63 1.47-.67 1.46-.68 1.45-.7 1.44-.73 1.43-.75 1.42-.77 1.41-.78 1.4-.82 1.39-.82 1.38-.85 1.37-.85 1.36-.86 1.35-.87 1.34-.9 1.35-.43.61-.77 3.07-.43 1.63-.42 1.54-.42 1.43-.43 1.4-.59 1.56-.5 1.4-.55 1.4-.6 1.49-.68 1.56-.75 1.7-1.82 4.05-.36.75-.44.82-.46.83-.52.84-.55.83-.58.85-.62.85-.68.87-.77.86-.83.84-.6.51-.64.5-.46.3-.67.4-.18.1-.49.24-.5.21-.16.07-.67.22-.68.16h-.17l-.93.13h-1.09l-.76-.05-.75-.14-.75-.2-.14-.05-.78-.28-.43-.22-1.45 2-1.33 1.88-.24.35-.23.37-.23.38-.22.4-.52 1-.51 1.05-.54 1.16-.58 1.25-.62 1.32-.66 1.38-.74 1.4-.41.77-.45.75-.47.75-.5.77-.55.76-.58.77-.64.75-.7.75-.73.73-.8.72-.4.32-.45 1.06-.8 1.84-.8 1.8-.83 1.76-.84 1.75-.85 1.74-.88 1.7-.88 1.66-.92 1.65-.93 1.62-.95 1.57-1 1.55-1 1.5-1 1.48-1 1.43-1.08 1.39-1.1 1.35-1.15 1.3-1.15 1.23-.62.63-.61.6-.62.59-.63.56-.64.55-.65.55-.66.52-.67.52-.7.5-.75.51-.57.35-.7.37-.43.2-.73.27-.15.05-.85.23h-.14l-1 .15h-1.98l-.59-.09h-.11l-.62-.13-.6-.19h-.1l-.57-.21-.55-.27-.1-.05-.51-.3-.5-.32-.09-.08-.43-.32-.38-.35-.1-.08-.65-.7-.09-.1-.51-.65-.07-.12-.53-.88-.13-.31-.23-.46-.18-.49-.12-.31-.25-.77-.08-.32v.05l-.2 1.15-.24 1.1-.26 1.07-.3 1.05-.34 1-.36 1-.44 1-.5 1-.4.65-.4.6-.75.94-.73.85-.77.8-.8.76-.81.72-.85.68-.89.64-.88.58-.92.55-.91.5-.95.47-.95.41-1 .39-1 .35-1 .3-1 .26-1 .24-1 .18-1 .17-1 .13-1 .1-1 .07-1 .05h-2l-1-.05-1-.05-1-.1-1-.12-1-.13-1-.15-.95-.19-.95-.21-.95-.22-.94-.25-.15-.05-.06.07-.84.55-.83.55-.87.51-.88.49-.9.46-.92.45-.93.4-.95.39-1 .35-1 .31-.8.22-.81.18-.79.15-.8.14-.76.08-.77.07h-2.98l-1.34-.08-1.33-.15-1-.14-.2.1-1.17.59-1.2.55-1.23.51-1.25.45-1.28.4-1.27.34-.72.16-.68.14-.7.1-.7.08-.72.07h-2.26l-.79-.06-.81-.1-.84-.17-.85-.22-.88-.28-.87-.37-.88-.43-.8-.5-.82-.57-.71-.55-.22-.18-.92.2-1.48.3-1.48.25-1.42.18-.8.09-.73.05h-2.35l-.82-.07-.88-.13-.89-.18-.88-.25-.83-.29-.8-.33-.77-.38-.75-.4-.7-.45-.67-.49-.63-.5-.6-.51-.55-.54-.19-.55-.49-.57-.46-.58-.44-.59-.4-.58-.38-.62-.35-.6-.32-.6-.31-.61-.3-.67-.5-1.18-.44-1.24-.38-1.25-.33-1.25-.27-1.25-.22-1.25-.18-1.25-.13-1.25-.09-1.25-.01-1.21v-2.42l.07-1.2.11-1.2.15-1.18.2-1.17.24-1.17.3-1.15.36-1.15.42-1.15.48-1.06.34-.65.25-.42.5-.78.16-.24.59-.7.41-.46.65-.64.64-.56.65-.55.7-.57.71-.55-.06-.22-.19-.81-.13-.69-.1-.68-.07-.68v-.25l-.82.05h-.18l-.69-.05-.66-.09h-.17l-.85-.2-.82-.28h-.15l-.91-.44-.85-.55-.14-.1-.56-.45-.54-.5-.48-.55-.08-.11-.6-.84-.49-.9-.06-.15-.32-.8-.25-.81v-.19l-.14-.66-.06-.67v-1.78l.06-1 .14-1 .16-.95.22-.92.25-.92.28-.88.32-.85.35-.83.37-.84.38-.8.2-.4-.9-.53-1.92-1.17-1.91-1.2-1.94-1.25-1.97-1.29-2-1.3-2-1.34-2-1.35-2-1.4-2-1.4-2-1.43-2-1.45-1.95-1.48-2-1.49-1.93-1.5-1.95-1.53-1.92-1.53-1.92-1.54-1.88-1.55-1.88-1.56-1.85-1.57-1.57-1.58-1.8-1.58-1.79-1.59-1.75-1.56-1.71-1.57-1.7-1.57-.49-.45-.56.32-1.2.55-1.25.53-1.26.54-1.3.51-1.34.49-1.33.46-1.37.44-1.36.41-1.4.4-1.39.35-1.41.34-1.4.28-1.42.25-1.4.2-1.42.17-1.43.1-1.32-.02h-1.5l-.71-.05-.74-.06-.73-.09-.75-.11-.75-.15-.77-.19-.76-.21-.77-.27-.78-.3-.85-.4-.64-.35-.73-.47-.3-.2-.77-.61-.25-.24-.4-.36-.36-.4-.2-.25-.37-.45-.32-.49-.16-.25-.32-.51-.27-.54-.11-.28-.24-.53-.18-.57-.08-.3-.14-.55-.11-.55v-.3l-.06-.53v-2.09l.12-.83.11-.68.12-.4h-.4l-.85-.05-.48-.05-.79-.13-.78-.2-.78-.27-.74-.31-.73-.37-.68-.42-.64-.46-.58-.49-.37-.33-.51-.55-.49-.58v-.07l-.46-.72-.4-.76-.32-.8v-.09l-.21-.71-.14-.74-.08-.73v-.92l.07-.81v-.1l.12-.6.15-.62v-.12l.29-.8.06-.13.4-.85.17-.28.4-.65.37-.54.53-.7.5-.61.52-.59 1-1.1 1.06-1.13 1.05-1.13 1-1.17.47-.55.45-.55.43-.52.39-.51.33-.47.28-.42.09-.15-.09-.3-.15-.73v-.17l-.1-.88v-1.38l.07-.62.12-.62v-.11l.15-.64.22-.61v-.1l.26-.62.32-.58.05-.1.33-.52.35-.48.09-.09.33-.4.37-.38.08-.08.43-.39.45-.35.2-.15.74-.46.33-.75.42-.95.4-1 .4-1 .36-1 .37-1 .37-1.05.35-1.07.23-.73h-.67l-1-.06-1-.19-1-.31-.92-.42-.86-.53-.79-.64-.71-.73-.62-.8-.27-.47-1 .17-1 .05-1-.05-1-.19-.92-.28-.88-.37-.74-.46-.7-.51-.65-.59-.58-.63-.5-.7v-.08l-.44-.75-.36-.8-.27-.84v-.11l-.15-.69-.09-.68v-2.18l.13-1 .13-.82-.33-.5-.16.25-.54.71-.53.72-.55.68-.58.67-.64.67-.66.65-.77.66-.57.44-.63.41-.33.2-.84.45-.3.15-.85.34-.46.15-.47.11-.75.17h-.13l-.85.08h-1.48l-1-.11-.52-.1-.48-.14-.79-.26-.11-.05-.82-.35-.12-.07-.78-.47-.12-.06-.76-.59-.1-.08-.69-.65-.08-.08-.63-.75-.07-.1-.5-.74-.07-.11-.4-.77v-.12l-.21-.51-.19-.55-.08-.25-.15-.62-.12-.63v-.29l-.08-1v-1.83l.15-.93.19-.85.21-.77.24-.73.23-.69.28-.7.5-1.2.57-1.2.57-1.13.56-1.07 1-1.83.82-1.5.58-1.08.65-1.14.65-1.11.67-1.1.67-1.09.66-1.08 1.35-2.05 1.35-2 1.32-2 1.3-1.94 1.27-1.9 3.05-4.7.15-.26 1-1.94 1.39-2.6.45-.86-.17-1-.25-1.65-.22-1.67-.18-1.7h-.2l-1-.07h-.1l-.95-.16-.93-.29h-.1l-.8-.35-.75-.4-.1-.07-.59-.4-.55-.43-.1-.1-.4-.38-.38-.4-.1-.12-.55-.72-.3-.41-.42-.72-.31-.67-.25-.56-.3-.79-.27-.73-.25-.75-.25-.78-.42-1.47-.36-1.52-.3-1.53-.25-1.53-.2-1.54-.15-1.56-.1-1.55v-4.7l.08-1.59.12-1.56.16-1.59.22-1.58.23-1.58.27-1.59.32-1.56.05-.25-.27-.42-.42-.7-.36-.68-.32-.7-.3-.7-.25-.7-.22-.69-.18-.7-.15-.66-.13-.69-.12-.73-.15-1.23-.08-1.3v-2.54l.07-1.23.12-1.22.15-1.2.18-1.2.22-1.16.23-1.15.25-1.14.27-1.11.26-1.09.3-1.06.3-1.07.6-1.95.6-1.83.57-1.67 1-2.68.36-.95.4-1 .42-1 .47-1 .48-1 .5-1.05.55-1 .57-1.07.58-1.08.62-1.09.63-1.1.67-1.1.68-1.11.72-1.12.73-1.12.75-1.13.78-1.13.8-1.14.82-1.13.83-1.13.87-1.14.88-1.13.9-1.13.92-1.14.93-1.11 1-1.1 1-1.12 1-1.08 1-1.09 1-1.06 1-1.07 1-1 1.06-1 1.09-1 1.1-1 1.11-1 1.14-1 1.15-.94 1.15-.9 1.18-.86 1.18-.85 1.2-.84 1.24-.78 1.23-.77 1.25-.71 1.27-.7 1.28-.65 1.3-.62 1.32-.57 1.33-.53 1.35-.48 1.37-.42 1.4-.38 1.4-.32 1.43-.27 1.38-.2.79-.06.73-.07h3.7l.75.07.73.08.75.1.75.12.75.15.75.16.74.19.75.21.88.27.47.2.81.37.2.1.84.5.16.11.79.62.15.13.71.7.14.15.63.79.12.16.48.77.08.18.39.8.08.19.27.73.18.55.18.88.12.84.05.76v1.52l-.11 1.13-.14.65.24-.15 1-.56.62-.3.6-.27.63-.25.65-.23.7-.22.72-.18.78-.15.82-.12h1.75zm129.63 298.13.09.2.06.2v-.6zm-128.31-72.17.33.25-.1-.31zm-4.72-18.38v2.33h.5l.16-.05-.48-2-.12-.5zm84.25-11.62.4 1.1.33 1.12.3 1.12.25 1.11.24 1.14.2 1.16.06.49.17-.55.2-.79.15-.73.13-.73v-3.09l-.09-.07-.31-.25-.35-.28-.35-.25-.34-.23-.33-.22-.32-.2-.25-.15zm-143.22-.53v.05zm83.1-12.25-.36 1-.34 1-.31 1-.3 1-.29.95-.28.95-.23.95-.24.94-.21.93-.2.92-.07.35.48-.55.89-1.07.1-.53.4-2 .45-2 .45-2 .45-1.85-.27-.17zm-55.83 6.58-.22.7.5.1-.11-1.2v-.2zm235.7-17.1-1.75 1.94-1.2 1.33.05.18.18.77.15.75.12.77.1.73.07.75.05.73v1.4l.05-.06.75-1.45.75-1.4.75-1.35.25-.45v-.07l.18-1.32.19-1.31.16-1.32.14-1.3.06-.55zm.3-19-.38 1.13-.42 1.1-.47 1.1-.35.84.49.21.88.54.8.65.65.66-.07-1.1-.08-1.05-.1-1-.12-1-.15-.95-.16-.91-.19-.87-.06-.22zm-60-41.38.47-.07.71-.08h.42l-.1-.06-.42-.25-.42-.24-.4-.2-.4-.18-.23-.12zm-7.7-26.54.23 1.3.24 1.09.08.36.1.37.42 1.53.73 2.67.15.55h2.73l1 .06 1 .12 1 .13 1 .19.86.2-.06-.2-.19-.5-.18-.47-.2-.47-.2-.43-.22-.42-.21-.38-.24-.38-.23-.35-.23-.34-.25-.33-.25-.3-.24-.27-.23-.25-.33-.28-.42-.35-.52-.4-.6-.43-.7-.47-.76-.48-.84-.52-.91-.52-1-.55-.56-.3zm-105.47 1.85.19.64.31 1 .12.49.43.06 1.1.22-.45-.7-.78-1.23-.38-.65zm25.4-4.35h-2.76l-1.4.08-1.44.1-1.43.13h-.1l.1.12.48.51.49.52.48.5.52.5.5.48.53.47.53.47.54.46.55.45.55.44.4.3.43-.65.45-.64.43-.6.47-.58.48-.57.5-.58.54-.55.56-.57.62-.53.37-.32h-2.04zm48.82-10.11 1.37 1 .28.2.3.2.43.27.55.3.64.33.7.35 1.66.82 1.84.86 2 1 2.05 1 .9.46v-2.85l-1.25-.43-1.61-.55-1.62-.53-1.63-.52-1.65-.52-1.65-.5-1.67-.5-1.57-.45zm-121.77-39-1.35 1.3-1.35 1.34-1.35 1.36-1.35 1.37-1.35 1.36-1.33 1.4-1.32 1.4-1.31 1.42-1.3 1.43-1.3 1.44-1.29 1.45-1.25 1.46-.26.3-.49.92-1.58 3.05-3.22 6.16-.4.75.39-.51.56-.75.74-1 1.85-2.27 5.13-6.25 2-2.5 1.2-1.67 1.4-1.93 1.42-1.92 1.45-1.91 1.5-1.92 1.53-1.92 1.57-1.88.83-1 .82-.95.33-.36.35-.49zm480.9-96.23.8.13.52.13.76.25h.17l.9.4.15.07.55.3.52.35.11.08.57.44.53.5.1.1.39.41.36.45.4.55.55.87.47.9.38 1 .3.93.22 1 .15.94v.25l1.18-.84 1.73-1.23 1.8-1.27 1-.65 1-.63 1-.65 1-.62 1-.6 1.08-.58 1.12-.57 1.16-.51 1.17-.45.68-.25.65-.2.67-.19.67-.16.7-.15.71-.14.78-.13.76-.08h2.37l.8.09.83.13.84.17.81.23.82.27.82.33.8.37.76.43.75.47.72.5.73.56.64.57.63.65.55.67.5.7.45.71.38.72.34.72.28.71.25.7.2.72.17.68.11.69.1.66.09.74.08 1.23v1.28l-.05 1.27-.12 1.25-.16 1.25-.2 1.27-.25 1.26-.29 1.27-.33 1.28-.35 1.3-.38 1.3-.45 1.33-.43 1.33-.25.72h.55l.78-.05h1.57l.8.07.88.11.68.14.77.2.35.1.8.3.33.13.8.38.3.17.8.5.27.2.62.48h.05l.56-.23h.09l.75-.25.75-.18h.1l.91-.1h1l1 .1 1 .23h.09l.93.34.88.43h.09l.73.47.67.55.08.06.52.52.46.55.09.08.31.45.3.47.07.12.42.81.2.44.16.48.24.77.18.68.27 1.53.18 1.44.13 1.45.07 1.46v2.92l-.07 1.48-.1 1.49-.15 1.5-.18 1.5-.23 1.51-.25 1.52-.29 1.53-.31 1.54-.35 1.55-.37 1.56-.4 1.57-.4 1.48-.45 1.58-.46 1.58-.49 1.6-.5 1.6-.53 1.62-.53 1.6-.55 1.62-.59 1.63-1.18 3.23-1.22 3.24-1.3 3.25-1.29 3.23-1.3 3.2-1.31 3.17-1.32 3.13-2.57 6.12-2.46 5.87-1.15 2.8-1.1 2.71-1 2.62-1 2.48-.88 2.39-.38 1.1-.39 1.1-.33 1.05-.32 1-.28.95-.12.4-.16 1.25-.29 2.1-.36 2.7-.47 3.21-.52 3.57-.63 3.8-.34 2-.35 2-.38 2-.38 2-.42 2-.42 1.91-.45 1.87-.43 1.72-.48 1.75-.5 1.65-.27.85-.28.78-.28.78-.32.79-.32.75-.36.76-.39.77-.45.78-.53.8-.42.55-.48.59-.25.25-.53.53-.07.77-.13 1.2-.17 1.2-.2 1.2-.22 1.18-.26 1.2-.29 1.18-.3 1.2-.35 1.19-.35 1.18-.38 1.18-.42 1.19-.43 1.18-.45 1.18-.47 1.19-.5 1.18-.5 1.17-.53 1.18-.55 1.17-.55 1.16-.58 1.17-.59 1.17-.61 1.16-.64 1.17-1.26 2.28-1.32 2.29-1.37 2.26-.61.95-.4 2.07-.24 1.17-.3 1.35-.7 3-1.78 7.28-1 4.14-.52 2.15-.5 2.2-.5 2.23-.5 2.27-.46 2.26-.19.94.6.06.84.12.68.15.77.2.38.12.8.3.35.15.83.41.32.19.82.51.28.22.75.62.25.23.68.72.22.25.57.76.2.29.45.76.16.32.35.75.14.33.25.72.2.68.21 1 .14 1 .06.95v1.75l-.09.83-.11.82-.14.78-.16.78-.19.75-.2.75-.21.72-.25.73-.25.7-.29.75-.56 1.35-.64 1.35-.66 1.32-.7 1.3-.75 1.25-.77 1.23-.8 1.17-.82 1.13-.85 1.09-.86 1-.89 1-.51.51-.5.47-.52.47-.57.45-.61.45-.67.45-.77.43-.55.27-.7.3-.23.08-.9.28-.22.05-.58.12-.57.08h-.21l-.72.05h-.9l-.82-.1-.78-.17h-.18l-.85-.28-.82-.37-.17-.08-.78-.47-.73-.53-.15-.14-.6-.55-.55-.61-.14-.17-.31-.43-.3-.45-.47-.77-.55-1.07-.47-1.06-.38-1.07-.33-1.05-.27-1.07-.23-1.06-.19-1.07-.15-1.07-.11-1.08-.07-.82-1.13.55-1.33.76-1.33.8-1.34.84-1.36.86-1.35.89-1 .66-.07.62-.11.77-.14.75-.16.75-.2.73-.22.72-.23.71-.25.7-.29.69-.3.66-.31.65-.34.65-.35.64-.36.61-.39.62-.41.65-.79 1.12-.88 1.13-.92 1.08-1 1.05-1 1-1.05 1-.67.58-.13.53-.2.69-.25.66-.25.65-.29.62-.3.62-.31.56-.37.64-.67 1-.73 1-.77.92-.8.86-.81.8-.84.77-.83.7-.85.68-.85.64-.85.6-.85.56-.85.54-.83.51-.85.5-1.57.87-1.53.8-1.4.7-1.27.6-1 .47-.37.18-.47.25-1.36.75-1.59.88-.91.5-1 .47-1 .47-1.05.43-.72.23-.75.22-.51.1-.77.13h-.23l-.52.05h-1.47l-.73-.12h-.17l-1-.25-1-.4-.13-.07-.79-.42-.71-.48-.67-.58-.12-.1-.63-.67-.57-.75-.43-.75-.25.23-.8.62-.88.5-.94.4-1 .28-1 .17h-1l-1-.08-1-.2-1-.33-.92-.44-.85-.55-.67-.55-.78 2.35-1 2.9-.51 1.47-.33 1.38-.53 1.43-.55 1.45-.57 1.42-.6 1.4-.63 1.38-.67 1.39-.7 1.33-.75 1.28-.42.69-.41.65-.45.63-.47.63-.48.62-.5.62-.54.6-.63.65-.8.73-.65.52-.4.26-.68.44-.15.06-.47.25-.48.2-.14.05-.7.24-.71.18h-.12l-1 .13h-1.09l-.85-.08-.81-.17-.82-.25h-.07l-.83-.35-.77-.45-.73-.52-.07-.07-.58-.51-.53-.57-.49-.62-.05-.06-.46-.77-.4-.82v-.1l-.23-.61-.18-.64v-.11l-.16-.9v-.15l-.07-1v-1.19l.06-.7.15-1 .19-.88.2-.87.23-.85.25-.88.55-1.75v-.12l-.38-.48-.62-.95-.52-.95-.4-.9-.35-.88-.33-.87-.3-.9-.28-.92-.29-1-.28-1-.53-2.09-.57-2.25-.2-.86-.47-.09.14 1.07.1 1v1.89l-.11.85-.2.83-.29.8-.36.78-.55.87-.65.81-.75.72-.82.62-.9.51-1 .39-1 .28-.8.12-.1.81-.17 1-.2 1-.22 1-.26 1-.32 1-.37 1-.41 1-.5 1-.57 1-.65 1-.77 1-.81.87-.55.52-.52.41-.53.42-.57.38-.6.37-.65.33-1 .47-1 .38-1.05.34-1 .25-1 .18-1.05.12-1 .05h-1l-1-.06-1-.1-1-.14-.95-.18-.92-.23-.9-.25-.88-.29-.87-.31-.85-.34-.83-.35-.82-.38-.8-.4-.78-.43-.77-.44-.77-.45-.75-.48-.75-.48-.73-.49-.72-.51-.73-.54-1.35-1.05-1.49-1.04-1.32-1.14-1.26-1.16-1.22-1.19-.92-.91-.6.28-.66.28-.69.24-.71.2-.74.16-.76.12-.79.07h-1.6l-.8-.08-.8-.15-.76-.19-.77-.25-.73-.28-.67-.32-.75-.38-.68-.4-.67-.43-.65-.47-.63-.47-.6-.5-.57-.51-.55-.55-.53-.55-.5-.57-.49-.58-.45-.59-.43-.61-.42-.62-.38-.62-.37-.63-.35-.65-.33-.65-.1-.22-.37.32-.78.62-.87.51-.91.4-1 .3-1 .19h-1l-1-.07-1-.18-1-.3-.82-.47-.85-.51-.8-.62-.7-.72-.61-.8-.52-.86-.42-.92-.28-1-.18-1-.05-1 .06-1 .19-1 .3-1 .41-.91.54-.85.61-.79.59-.58.1-.13.11-.22.14-.28.16-.33.17-.39.18-.43.19-.45.4-1.1.41-1.22.42-1.33.43-1.4.9-3.12.94-3.3.48-1.71.5-1.74.53-1.73.55-1.73.59-1.74.61-1.71.65-1.67.37-.87.37-.83.38-.83.4-.82.42-.82.43-.8.48-.8.5-.78.54-.78.58-.77.62-.75.68-.75.75-.73.8-.7.9-.67.67-.43.08-.15.82-1.27.86-1.23.9-1.2.94-1.15 1-1.14 1-1 .57-.55.55-.51.56-.5.57-.5.58-.47.6-.47.62-.45.63-.43.64-.4.66-.4.67-.38.68-.37v-.01l.15-1.37.18-1.38.2-1.42.24-1.43.25-1.45.26-1.47.3-1.48.32-1.5.35-1.5.35-1.52.4-1.52.4-1.51.42-1.54.45-1.51.46-1.5.5-1.52.5-1.5.54-1.47.55-1.48.56-1.45.59-1.42.6-1.41.63-1.39.65-1.36.67-1.32.7-1.32.73-1.26.22-.35.45-1 .48-1.05.52-1 .53-1 .55-1 .58-1 .6-1 .65-1 .67-.93.7-.92.73-.9.79-.86.9-.95.51-.47.65-.52.42-.31.42-.27.8-.42.11-.06.52-.22.53-.2h.12l.67-.19.68-.11h.1l.82-.08h.91l.92.1.88.2h.1l.87.3.82.38.08.05.75.45.68.52.07.06.53.5.5.55.07.07.35.47.32.46.4.17.8.37.78.41.75.45.72.49.36.28.29-.25.73-.63.75-.62.77-.58.78-.59.8-.55.82-.55.83-.51.83-.49.87-.46.87-.45.9-.44.9-.4.91-.36.94-.35 1-.32 1-.28 1-.27 1-.23 1-.19 1-.16 1-.15 1-.1 1.05-.07h2.31l-.41-.61-.1-.17-.37-.67-.23-.5-.3-.78-.22-.67-.23-.85-.19-.78-.18-.78-.17-.8-.15-.79-.15-.81-.21-1.55-.15-1.57-.1-1.58v-3.15l.06-1.57.1-1.55.15-1.57.2-1.55.24-1.53.16-1.64.32-1.54.35-1.51.38-1.52.42-1.52.45-1.5.47-1.5.5-1.48.51-1.48.55-1.49.57-1.46.58-1.47.62-1.47.47-1.11v-.09l-.72-3.18-.68-3.2-.63-3.25-.25-1.35-.42.42-.7.75-.73.76-.75.75-.75.74-.79.71-.78.7-.8.69-.8.66-.83.65-.85.62-.87.6-.88.57-.92.55-.93.53-1 .48-1 .45-1 .42-1 .38-.82.24-.87.21-.6.09-.82.15h-1.97l-.55-.08h-.2l-.63-.14-.62-.18-.18-.07-.69-.26-.65-.34-.16-.08-.67-.42-.62-.46-.15-.12-.56-.52-.52-.56-.12-.14-.43-.58-.4-.63-.1-.17-.28-.55-.25-.58-.07-.19-.18-.53-.15-.53v-.22l-.15-.88v-.22l-.06-.77v-1.25l-.16-.56-.27-1.19-.2-1.23-.13-1.23-.07-1.22v-2.4l.1-1.18.14-1.19.18-1.16.22-1.17.25-1.15.28-1.15.32-1.15.33-1.15.37-1.15.4-1.15.41-1.13.12-.32-.18-.22-.42-.53-.4-.53-.38-.57-.37-.57-.35-.58-.33-.58-.3-.6-.27-.6-.27-.6-.23-.62-.23-.68-.35-1.19-.29-1.25-.2-1.25-.13-1.23-.07-1.23v-1.22l.07-1.22.11-1.18.17-1.17.23-1.16.27-1.14.3-1.13.33-1.1.39-1.1.41-1.08.44-1.07.46-1.05.5-1 .52-1 .55-1 .55-1 .6-1 .6-1 .62-1 .65-1 .65-.95.66-.93.69-.92.7-.92.71-.9.72-.88.72-.87.73-.86.75-.84.75-.83.75-.82.77-.81 1.5-1.52 1.53-1.47 1.52-1.4 1.51-1.31 1.5-1.24 1.45-1.13.75-.57.74-.51.71-.5.55-.37.12-1.4.27-3.25.33-3.22.35-3.18.38-3.1.39-3.18.28-2.12.33-2.4.42-2.6.25-1.38.25-1.42.28-1.45.32-1.47.33-1.5.37-1.5.4-1.51.43-1.52.47-1.52.52-1.51.55-1.5.6-1.5.63-1.44.37-.75.36-.73.4-.72.4-.71.42-.7.45-.7.47-.7.5-.67.51-.68.55-.65.59-.65.61-.64.67-.61.68-.59.74-.56.78-.55.82-.5.8-.44 1-.48.94-.42 1-.38.95-.37 1-.31 1-.29 1-.23 1-.22 1-.16 1-.12 1-.08h1l.42-.25.6-.33.61-.33.64-.32.65-.28.66-.29.69-.25.7-.23.71-.22.74-.18.75-.15.76-.13.77-.1.78-.05h1.62l.82.05.81.09.82.11.83.17.82.22.8.23.82.28.78.34.78.35.77.4.75.43.45.3.7-.47 1.52-.95.93-.57 1-.58 1.05-.6 1.13-.62 1.18-.65.97-.79 1.3-.65 1.35-.65 1.39-.63 1.41-.64 1.47-.6 1.48-.56 1.52-.54 1.53-.5 1.54-.43.81-.22.8-.18.82-.17.8-.15.83-.13.82-.1.85-.08.85-.07h2.65l.92.09 1 .15 1 .2 1 .25 1 .35 1 .41 1 .5.95.6.93.69.88.78.55.6.49.55.5.65.66 1 .55 1 .44 1 .31.85.27.76.15.54.3-.09 1-.31 1-.29 1-.26 1-.25 1-.22 1-.2 1-.17 1-.13 1.08-.08h1.08l.75.05zm-149 296.91-.48.89-.5.86-.5.84-.52.81-.15.22-.1.3-.38 1.12-.39 1v1.15l-.07 2.09v1.86l-.12 1-.1.42.33.33 1 .92 1 .88 1 .85 1 .8 1 .77.47.33.47.33.46.34.47.3.47.28.45.27.43.25.42.23.41.2.4.18.37.17.37.13.33.14.32.1.28.08.27.05.23.05h.15l.1-.33.08-.43.1-.49.09-.51.08-.59.07-.61.05-.67v-4.63l-.07-1.77-.1-1.82-.15-1.85-.18-1.9-.2-1.91-.13-1.1-3-.95-3.9-1.2-1.15-.34zm136.2-52.88-.48.6-1.13 1.42-1.22 1.53-1.3 1.65-.78 1 .76-.38 1.45-.68 1.44-.65.56-.25.14-.82.43-2.45.18-1zm-34.2 3.82-1.77 2.2.89-.09h1.23l1.12.05-.12-.65-.15-1.27-.08-1.26v-.34zm-29.5-12.25v.83l-.06.52-.1.5.75.41.45.29.68.5.57.5.55.51.66.74.65.8.55.81.49.8.43.82.38.82.32.8.3.8.25.81.23.8.2.8.1.42 1-1.3 2.62-3.28.75-.95-.45-.1-.72-.19-.71-.21-.72-.24-.7-.28-.7-.3-.7-.33-.67-.37-.66-.4-.64-.43-.63-.45-.62-.49-.6-.5-.56-.53-.84-.83-.78-.85-.75-.9-.27-.35zm-22-24.77-.78.58-.77.59-.75.58-.7.55-1.28 1.1-1.15 1-.93.85-.67.64-.32.31-.31.37-.34.4-.35.43-.35.49-.36.53-.37.57-.38.6-.39.63-.36.67-.39.7-.36.73-.39.77-.36.78-.35.8-.37.85-.35.85-.33.87 1.33-1.62 1.87-2.35 1.86-2.35 1.85-2.37 3.67-4.73 1.82-2.35 1.26-1.6zm17.12 13-.43 1.28-.45 1.3-.15.4.51.22.14.05.51.26.5.3.12.09.17.13-.24-.88-.23-1.07-.17-1.07-.13-1.06v-.37zm40.38-12.53-.45.7-1.48 2.23-1 1.5-1.07 1.68-1.26 1.82-.82 1.16.72-.55.55-.41.3-.39 2.91-3.85 1.59-2.11.26-2v-.18zm-17-4.55-.47.61-.45.64-.45.63-.43.63-.43.62-.4.63-.39.62-.1.17.12-.07 1.14-1.6 1.08-1.59 1-1.51v-.09zm-9.85-14.9h-1.32v.68l.1 1v.31l.37-.45 1.35-1.55zm-18.68-5.7-.5.86-.5.85-.54.84-.13.2h.5l.83.05.82.1v-3.72zm36.23-12.7-.32.95-.31.91-.34.9-.35.9-.35.85.67-.48 1-.73v-.62l.18-2.45.12-1.4zm52.73-36.69-1.6 3.79-.43 1 .43.14.82.31.77.4.55.38v-7.39zm-60.2-23.4-.46.72-.49.7-.45.72-.93 1.5-.88 1.51-.87 1.57-.83 1.58-.82 1.62-.78 1.65-.79 1.68-.73 1.7-.73 1.72-.52 1.27 1.9-2.92.13-.2.49-1.1.7-1.55.4-.85.41-.83.45-.85.49-.85.51-.87.57-.87.62-.86.7-.89.76-.86.57-.57.23-1 .39-1.95.18-1.05v-.2zm-30.83 5.94-.1.13.2 1.65.08.58.2-.38v-2.45zm49.12-40.7-2.52 1.56-2.55 1.59-2.6 1.58-5.18 3.13-2.14 1.29h.09l.86-.26.37-.09.5-.1.53-.08h1.84l.63.05.65.1.28.05.67.15.65.22.27.1.61.25.6.32.25.13.55.33.52.39.23.18.44.37.41.4.2.21.55.64 1-2.72 1.25-3.32 1.27-3.3 1.32-3.26.45-1.07zm76.9-28.07-.8.65-.84.72-.86.75-.89.81-.88.85-.92.92-.91.93-.94 1-.95 1-1 1-.33.37-.27.53-1.35 2.5-1.3 2.4-1.18 2.34-1.18 2.11v1.22l-.05.57-.1.86-.13.95-.32 2.22-.37 2.55-.35 2.6-.15 1.18-.11 1.09-.09.88v.68l-.05 1.12v2.92l.15-.35 1.11-2.69 1.15-2.68 2.29-5.28 2.31-5.25 2.32-5.2 2.32-5.29.36-.75.52-1 .63-1.33.75-1.6.82-1.82.4-.93.42-1 .4-1 .38-1 .23-.61zm-107.42-8.3-1 1.5-1 1.5-1 1.53-1 1.55-1 1.55-.95 1.57-1 1.58-.35.62.08.06.33.35.62-.91 1.45-2.19 1.42-2.21 1.4-2.27.66-1.12.67-1.13.65-1.13.22-.39v-.8zm49.22 6h.06l.42-.47zm48.15-30.5-.62.33-.66.39-.7.43-.74.47-.75.5-.76.51-1.65 1.17-.34.23v.27l.06.92v2.7l-.06.88-.09.88-.11.87-.12.88-.17.87-.16.87-.19.88-.2.87-.23.9-.47 1.7-.53 1.75-.58 1.75-.62 1.75-.61 1.73-.68 1.75-.72 1.75-.72 1.7.14.2.26.45.44-.81 1.3-2.59 1.28-2.61 1.25-2.62 1.22-2.6 1.16-2.55 1.1-2.57.5-1.22.5-1.23.46-1.2.44-1.18.41-1.17.4-1.12.35-1.08.34-1 .3-1 .26-1 .22-.92.2-.85.15-.8.07-.35zm-55.18-10.15-.35.05-.39.07-.4.06-.43.09-.45.11-.43.1-1 .3-1 .34-1.08.38-1.1.43-1.12.45-1.13.5-1.12.5-1.08.54-1.11.53-1 .53-1 .54-.94.51-.86.5-.8.47-.7.42-1.2.75-.15.11.08.37.17.73.15.75.11.75.1.74.07.75v.73l.05.75v.53l.82-.78.91-.87.94-.86.93-.84 1-.83 1-.82 1-.81 1-.79 1-.78 1-.77 1-.75 1-.73 1-.72 1.05-.71 1.06-.69 1.09-.66 1.1-.67 1.02-.65.31-.17v-.23l-.05-.27zm-150.99 344.98 1.34.1 1.33.15 1.37.2.7.14.71.16.7.19.69.21.66.24.67.28.67.28.63.34.62.35.6.38.58.4.57.43.53.45.52.47.48.48.47.5.43.54.42.51.36.54.42.61.58 1 .07.13.43-.33 1.34-.95 1.3-.87.71-.45.69-.4.7-.4.7-.37.73-.35.75-.35.78-.3.82-.3.87-.25.93-.21 1-.15.71-.07h2.09l.33.05.52.1.53.11.3.09.38.11.39.14.38.15.27.13.4.18.38.2.37.24.25.15.36.26.37.27.33.3.24.2.31.3.3.32.29.33.2.23.25.34.23.33.22.35.16.28.19.34.18.35.22.5.3.71.25.72.21.77.17.78.12.78.08.8v1.64l-.08.8-.12.8-.18.76-.23.75-.27.74-.28.68-.34.65-.35.62-.38.6-.38.56-.42.54-.42.5-.48.53-.83.82-.92.8-.95.71-1 .67-1 .6-1 .57-1 .53-1 .5-1.05.47-1.08.45-1.1.41-1.12.39-1.13.38-1.15.35-1.17.35-1.18.32-1.18.3-1.22.3-1.22.26-1.21.27-1.22.23-.33.37-.54.72-1.51 2-.62.8-.3.35-.38.42-.44.42-.43.36-.48.34-.5.3-.52.28-.53.23-.55.19-.55.16-.57.12-.58.07-.59.05h-1.16l-.57-.1-.57-.12-.56-.17-.55-.2-.52-.25-.52-.26-.5-.32-.46-.35-.44-.38-.41-.4-.39-.44-.36-.46-.32-.49-.28-.51-.25-.52-.1-.25h-5.38l-1-.05-1-.07-1-.08-1-.1-1-.12-.95-.15-.94-.16-.93-.2-.93-.25-.95-.3-1-.39-.68-.31-.35-.19-.33-.18-.64-.37-1-.7-.77-.6-.37.33-.4.3-.42.27-.43.27-.43.21-.55.27-.7.3-.72.27-.72.23-.72.39-.72.16-.72.15-.71.14-.7.1-.7.06-.7.05h-2.1l-1.27-.08-1.28-.17-1.25-.21-1.22-.27h-.18l-.45.07-1.07.37-1.08.35-1.12.32-1.11.28-1.14.27-1.16.21-1.19.2-1.2.15-1.21.1-1.24.07h-1.65l-.55-.05-.55-.07-.53-.13-.53-.15-.54-.19-.5-.21-.5-.27-.47-.28-.43-.32-.32.1-.56.14-.59.08-.58.05h-1.15l-.58-.08-.57-.12-.57-.15-.55-.18-.53-.23-.52-.27h-.05l-.58-.07-1.17-.18-1.2-.22-.71-.18-.72-.19-.75-.25-.8-.3-.87-.38-.6-.32-.33-.18-.32-.22-.28-.18-.38-.28-.39-.3-.23-.2-.3-.25-.28-.29-.27-.28-.18-.22-.34-.4-.3-.41-.08-.12-.2-.32-.2-.31-.07-.12-.21-.42-.2-.43-.09-.2-.2-.52-.16-.53-.05-.2-.1-.4-.07-.4-.07-.42v-2.45l.07-.41v-.19l.09-.38.1-.38.11-.39.07-.16.18-.5.22-.49.08-.18.22-.42.25-.4.1-.16.23-.35.25-.34.35-.43.6-.63.57-.54.63-.51.2-.14v-.27l.05-.43.08-.43.1-.44.07-.3.13-.45.17-.43.25-.65.45-.93.48-.82.48-.75.52-.68.42-.49v-.26l.06-1.14.14-1.11.18-1.1.23-1.07.27-1.05.32-1 .36-1 .39-1 .43-1 .47-1 .5-.91.51-.92.55-.9.59-.87.6-.86.61-.84.65-.81.69-.8.68-.79.72-.76.73-.74.75-.73.77-.7.78-.68.82-.67.81-.63.85-.62.85-.6.87-.57.88-.55.92-.51.92-.5.93-.47.95-.43 1-.4 1-.39 1-.33 1-.3 1-.27 1.05-.23 1.07-.18 1.07-.14 1.1-.08h2.4l.41.07.44.08.25.07.5.11.48.17.48.18.22.1.52.24.5.28.46.32.19.11.36.27.34.28.33.3.32.32.15.17.35.41.33.44.3.45.12.2.23.41.22.44.2.45.08.21.13.39.14.36.1.39.05.25.1.5.06.48v1.67l-.05.9v.11h.19l.88.07.92.11.95.17 1 .27.68.23.4.15.39.17.35.16.46.24.45.26.3.2.47.32.43.33.27.22.3.27.28.28.27.28.22.25.25.29.23.31.23.32.19.27.3.5.26.51.15.3.22.49.18.5.1.31.15.47.12.48.07.35.08.44.05.45v1.86l-.08 1.05-.1.69.2-.09 1.07-.41 1.06-.4 1.1-.37 1.14-.35 1.13-.33 1.15-.29 1.18-.26 1.2-.24 1.22-.18 1.25-.17 1.25-.11 1.27-.07h2.6zm-.2 17.3-.45.6-.48.59-.5.53-.35.33 1.75-.11 1.83-.17v-1.57l-.05-.23-.05-.2-.05-.15h-.08l-.79-.11-.33-.05z" fill="#808080"/><path d="m105.75 43.78.9.19 1 .31.92.42.85.53.8.64.7.71v.07l.55.7.46.75.39.8v.13l.2.54.16.55.12.46.1.55.13 1.09v1.08l-.03 1.08-.3 1-.43 1v.1l-.13 1.27-.19 1.92-.3 3.3-.25 2.03-.17 1.9-.16 1.91-.14 1.94-.13 1.91-.12 1.94-.1 2-.08 1.93-.15 3.9-.1 3.88-.07 3.9v9.36l-.05 2.78-.09 2.77-.1 2.76-.11 2.77-.14 2.75-.15 2.77-.33 5.46-.37 5.47-.4 5.43-.44 5.47-.4 5.42-.4 5.38-.35 5.37-.33 5.35-.13 2.65-.14 2.66-.11 2.67-.1 2.65-.07 2.65-.07 2.63v82.92l-.06 15.6v7.8l-.07 7.8-.08 7.82-.1 7.8-.12 7.81-.15 7.8-.17 7.82-.18 7.8-.22 7.8-.25 7.82-.28 7.8-.3 7.8-.35 7.78-.37 7.8-.41 7.78-.45 7.79-.5 7.76-.54 7.77-.58 7.77-.62 7.73-.15 1.07-.3 1.05-.43 1-.57.93-.66.87-.79.75-.88.65-1 .53-1 .4-1.07.27-1.08.13h-1.08l-1.09-.23-1-.29-1-.43-.93-.57-.85-.66-.77-.79-.65-.88-.53-1-.4-1-.27-1.05-.13-1.08v-1.08l.61-7.69.59-7.66.51-7.69.49-7.68.45-7.7.41-7.7.37-7.72.35-7.71.3-7.74.27-7.73.25-7.73.21-7.75.19-7.75.16-7.77.15-7.75.12-7.77.1-7.76.08-7.77.07-7.77.05-7.78.07-15.55v-83.12l.06-2.78.09-2.77.1-2.77.11-2.75.14-2.76.15-2.75.33-5.47.37-5.47.38-5.45.42-5.41.4-5.4.38-5.39.37-5.36.33-5.37.13-2.65.14-2.67.11-2.65.09-2.65.08-2.65.07-2.65v-13.35l.1-4.08.17-4.07.08-2.07.12-2.05.12-2 .13-2 .15-2 .17-2 .18-2 .18-2 .3-3.28.2-2.05.22-2 .12-1 .13-1 .18-1 .15-.69.22-.73v-.15l.37-1 .06-.1.39-.73.45-.69.53-.63.05-.07.8-.76.9-.67 1-.53 1-.39.88-.22.9-.12h.92zm-9.12 10.47.1.35-.1-.37z"/><path d="m619.78 0 1.3.1 1.29.14 1.25.16 1.21.22 1.17.26 1.16.25 1.14.29 1.11.3 1.07.3 1.08.31 2 .64 2 .65 1.88.6 1.83.58.87.25.87.23.85.24.83.2.82.18.81.17.8.13.82.12 2.63.3 2.7.3 2.7.25 2.72.23 2.73.2 2.75.2 2.75.15 2.79.15 2.78.12 2.8.11 2.8.1 2.82.09 5.68.13 5.7.12 11.48.2 5.79.13 5.78.17 2.9.1 2.92.11 2.9.14 2.91.15 2.9.16 2.92.2 2.92.22 2.91.25 1.37.15 1.37.15 1.33.17 1.32.16 1.3.2 1.26.22 1.27.23 1.23.25 1.2.25 1.2.29 1.17.3 1.15.3 1.13.33 1.1.33 1.1.37 1.07.38 1 .39 1 .41 1 .44 1 .43 1 .47 1 .48.94.5.91.52.9.53.87.55.87.57.83.58.82.6.8.62.78.63.75.65.73.67.72.66.7.7.67.72.65.72.63.73.6.75.58.77.57.76.55.79.52.8.5.8.48.81.45.84.43.83.42.83.4.85.38.85.37.87.33.87.34.86.3.89.3.88.26.88.27.89.23.9.24.9.21 1 .39 1.78.31 1.85.29 1.85.23 1.87.2 1.88.15 1.9.12 1.92.08 1.91.05 1.94v6l-.05 2-.07 2-.08 2-.08 2-.24 4.05-.26 4.12-.23 4.06-.3 4.12-.25 4.2-.24 4.23-.1 2.1-.08 2.12-.07 2.11v26.73l.05 6.84.06 6.81.1 6.85.1 6.85.12 6.85.13 6.85.15 6.87.19 6.87.18 6.86.2 6.89.22 6.86.23 6.89.27 6.86.26 6.87.3 6.88.3 6.87.34 6.87.33 6.85.37 6.85.38 6.85.4 6.85.42 6.83.43 6.83.47 6.82.46 6.8.5 6.8.52 6.78.53 6.77.55 6.77.82 9.8.78 9.73.39 4.87.35 4.85.35 4.85.31 4.86.3 4.89.25 4.88.24 4.92.2 4.93.16 5 .12 5 .07 5.05v6.35l.1 1.65.13 1.88.15 2.08.17 2.24.16 2.36.12 2.44.05 1.28v3.87l-.05 1.31-.08 1.32-.12 1.33-.15 1.34-.2 1.33-.27 1.35-.3 1.28-.21.74-.2.66-.24.69-.25.68-.26.67-.3.68-.34.68-.36.67-.4.67-.42.66-.47.65-.5.65-.53.62-.58.6-.54.53-.56.49-.59.45-.6.43-.63.38-.65.37-.65.32-.67.3-.66.25-.67.21-.68.17-.65.15-.67.12-.73.08-1.17.08h-1.2l-1.15-.09-1.08-.15-1.05-.18-1-.23-.95-.25-.9-.29-.86-.28-.84-.32-.81-.3-1.49-.6-1.38-.58-1.27-.52-1.15-.45-.46-.16-.45-.15-.39-.12-.26-.07-.27-.05-.25-.05-1.28-.17-1.42-.17-1.45-.16-1.48-.14-1.54-.11-1.55-.12-1.58-.08-1.62-.09-1.63-.05h-8.4l-1.7.05-1.7.06-1.7.1-1.68.1-1.69.12-1.66.15-1.65.17-1.64.18-1.6.2-1.58.22-1.55.23-1.52.27-1.46.26-1.45.29-1.39.31-1.35.32-1.28.35-1.25.35-2 .62-2 .66-2 .69-2 .73-2 .77-2 .78-2 .82-2 .83-2.05.85-2 .87-4.13 1.78-4.17 1.82-4.2 1.81-2.11.92-2.15.9-2.15.88-2.17.89-2.18.85-2.2.85-2.24.81-2.23.79-2.27.75-2.28.71-2.3.69-2.33.65-2.34.58-1.2.3-1.2.27-1.2.25-1.2.23-1.21.23-1.22.2-1.93.32-2 .28-1.92.25-1.93.22-1.92.2-1.9.17-1.9.13-1.9.13-1.88.09-1.89.08-1.86.05h-9.25l-1.84-.07-1.81-.08-1.82-.08-1.83-.12-3.59-.25-3.58-.3-3.55-.33-3.55-.35-3.52-.4-3.5-.4-7-.84-6.9-.83-3.43-.4-3.42-.37-3.41-.35-3.4-.31-3.42-.27-1.68-.12-1.7-.11-1.7-.1-1.7-.09-1.7-.06-1.69-.05h-10.2l-1.73.04-1.73.08-25.8 1.55-25.8 1.52-12.9.75-12.9.71-12.92.69-12.9.65-6.46.3-6.47.3-6.47.28-6.46.25-6.47.25-6.47.23-6.48.22-6.48.2-6.49.18-6.48.15-6.5.14-6.5.11-6.5.09-6.52.06h-21.2l-2.73-.05-5.43-.14-5.42-.18-5.42-.22-5.38-.25-5.4-.28-5.37-.3-10.71-.62-10.69-.67-5.32-.3-5.31-.28-5.29-.25-5.28-.24-5.27-.2-5.26-.15-2.62-.06h-15.67l-2.6.05-2.6.07-2.58.08-2.6.08-2.58.14-2.57.06-2.58.15-2.58.18-2.57.2-2.58.24-2.57.25-2.57.28-2.55.3-2.56.32-2.55.36-2.57.37-2.55.42-2.55.43-2.53.47-2.55.5-2.6.53-1.9.4-2.84.55-3.63.68-4.27.77-4.78.83-2.57.42-2.63.43-2.7.42-2.75.42-2.78.4-2.8.38-2.8.37-2.8.33-2.75.32-2.74.26-2.66.24-2.59.2-2.51.15-2.4.08h-5.67l-1.07-.07-1-.08-1-.13-1-.15-1-.2-1-.25-1.07-.32-1.23-.45-1.07-.52-.7-.42-.61-.43-.64-.5-.38-.33-.6-.62-.22-.25-.6-.77-.18-.26-.45-.72-.17-.3-.33-.68-.28-.64-.32-.95-.25-.9-.18-.86-.14-.85-.08-.8-.07-.82v-2.33l.05-.82.11-1.52.17-1.56.22-1.57.26-1.6.3-1.62.34-1.63.35-1.65.36-1.65.39-1.65.8-3.27.81-3.21.77-3.07.7-2.88.32-1.32.26-1.25.25-1.13.19-1 .15-.88.1-.73.06-.59v-.45l.15-1.44.42-1.4.63-1.3.85-1.18 1-1 1.22-.82 1.32-.58 1.41-.35 1.45-.1 1.44.17 1.4.4 1.3.63 1.18.85 1 1.05.82 1.22.58 1.31.35 1.42.1 1.45v1.25l-.12 1.27-.18 1.31-.22 1.34-.26 1.36-.29 1.4-.31 1.44-.35 1.48-.74 3-.8 3.11-.78 3.15-.77 3.14-.35 1.51-.35 1.5-.3 1.45-.28 1.4-.25 1.34-.2 1.23-.17 1.17-.08.76h4.03l2.09-.08 2.2-.14 2.35-.16 2.43-.22 2.53-.27 2.6-.28 2.65-.33 2.69-.34 2.68-.38 2.68-.38 2.65-.4 2.62-.4 2.55-.42 2.47-.4 4.67-.74 4.15-.73 3.48-.67 2.7-.53 1.82-.37 2.67-.55 2.73-.53 2.73-.5 2.74-.48 2.73-.44 2.73-.4 2.74-.38 2.73-.35 2.73-.32 2.72-.3 2.73-.26 2.72-.24 2.73-.21 2.72-.19 2.72-.18 2.71-.13 2.72-.14 2.72-.1 2.71-.08 2.72-.07h16.23l2.7.05 2.72.05 5.38.16 5.39.2 5.38.24 5.37.25 5.36.3 5.37.3 10.7.61 10.67.64 5.31.28 5.32.28 5.32.25 5.3.22 5.3.17 5.3.13 2.63.05h20.8l6.45-.07 6.45-.08 6.43-.12 6.44-.13 6.45-.15 6.43-.19 6.42-.18 6.43-.22 6.43-.23 6.44-.25 6.41-.27 6.44-.26 6.43-.3 6.42-.3 12.86-.65 12.85-.69 12.87-.71 12.87-.74 25.8-1.53 25.85-1.53 1.88-.1 1.9-.09 1.88-.05h7.49l1.86.05h1.84l1.85.06 1.81.1 1.84.1 1.81.12 1.82.13 3.6.29 3.57.33 3.56.35 3.54.4 3.5.4 7 .83 6.9.84 3.44.4 3.4.36 3.41.35 3.39.32 3.38.28 3.4.24 1.67.1 1.68.08 1.68.08 1.69.05h10.08l1.68-.06 1.69-.09 1.68-.1 1.68-.13 1.7-.15 1.69-.17 1.7-.2 1.7-.21 1.7-.25 1.7-.27 1-.17 1-.2 1-.2 1-.2 1-.23 1-.23 2-.52 2-.55 2-.6 2-.63 2-.67 2-.72 2-.73 2-.77 2-.8 2-.81 2-.85 2.05-.87 2-.87 4.15-1.8 4.17-1.81 4.2-1.82 2.13-.9 2.15-.9 2.15-.88 2.17-.87 2.18-.85 2.22-.83 2.21-.8 2.25-.79 2.25-.73 2.3-.72 1.59-.45 1.63-.43 1.67-.4 1.7-.38 1.71-.35 1.75-.32 1.77-.3 1.8-.28 1.8-.25 1.83-.22 1.85-.22 1.85-.18 1.87-.15 1.87-.15 1.88-.12 1.88-.1 1.89-.06 1.86-.07h9.3l1.82.06 1.8.09 1.77.1 1.76.11 1.74.15 1.7.15 1.66.19 1.65.2 1.69.21 1 .17 1 .22.93.25.89.26.86.29.85.31 1.5.59 1.44.58 1.33.55 1.25.52.53.2.52.18.48.17.44.13.38.1h.1v-.11l.07-.2.08-.24.07-.23.06-.23.15-.64.14-.66.11-.75.09-.79.08-.86v-5.84l-.1-2.15-.15-2.17.12-2.08-.16-2.12-.14-2.06-.11-2v-6.9l-.07-4.89-.11-4.85-.15-4.83-.2-4.82-.22-4.78-.27-4.78-.28-4.79-.32-4.78-.33-4.78-.35-4.8-.38-4.8-.79-9.69-.81-9.8-.55-6.8-.54-6.81-.51-6.84-.5-6.85-.49-6.85-.45-6.86-.45-6.87-.41-6.88-.4-6.9-.39-6.89-.36-6.9-.35-6.91-.34-6.9-.3-6.92-.3-6.92-.26-6.91-.27-6.92-.23-6.92-.24-6.9-.2-6.91-.18-6.92-.17-6.9-.16-6.92-.14-6.9-.11-6.88-.1-6.88-.09-6.89-.08-6.86v-29.69l.05-2.26v-2.27l.07-2.23.08-2.24.1-2.21.25-4.37.25-4.3.29-4.2.26-4.13.27-4 .22-3.93.08-1.9.08-1.89.07-1.85v-8.78l-.08-1.64-.09-1.6-.13-1.55-.15-1.51-.36-1.47-.22-1.43-.25-1.39-.28-1.35-.15-.61-.17-.64-.17-.61-.16-.62-.19-.6-.2-.58-.2-.59-.2-.55-.21-.55-.24-.55-.23-.51-.25-.52-.25-.5-.25-.5-.27-.48-.28-.47-.28-.47-.3-.45-.3-.45-.32-.43-.33-.42-.3-.43-.35-.4-.36-.4-.39-.4-.38-.38-.4-.39-.42-.38-.43-.37-.45-.36-.45-.35-.48-.37-.5-.35-.52-.33-.55-.34-.55-.33-.57-.32-.6-.31-.6-.32-.63-.3-.67-.3-.68-.3-.72-.28-.73-.27-.77-.27-.78-.26-.82-.25-.83-.25-.87-.24-.9-.21-.92-.22-1-.2-1-.2-1-.18-1-.17-1-.17-1.1-.15-1.1-.13-1.15-.13-1.18-.12-2.78-.2-2.77-.2-2.77-.2-2.78-.17-2.8-.13-2.8-.14-2.82-.16-2.81-.1-5.67-.15-5.7-.14-11.45-.18-5.75-.11-5.76-.15-2.89-.09-2.9-.1-2.88-.1-2.88-.13-2.94-.15-2.89-.17-2.88-.2-2.86-.23-2.89-.25-2.88-.27-2.88-.32-2.9-.35-1.25-.16-1.24-.22-1.21-.23-1.19-.2-1.16-.28-1.14-.3-1.1-.3-1.08-.34-2.05-.63-2-.63-1.89-.62-1.81-.57-.85-.25-.85-.25-.84-.21-.8-.2-.78-.17-.78-.17-.75-.11-.74-.1-.71-.09-.72-.05h-2.07l-.7.05-.68.1-.73.12-1 .23-1.05.25-1 .3-1.07.33-1.06.37-1.09.4-1.08.43-1.08.45-1.1.5-1.12.52-1.12.53-1.11.57-1.14.58-1.11.6-2.32 1.29-2.33 1.31-2.4 1.34-2.39 1.4-2.41 1.4-2.45 1.38-1.25.7-1.25.69-1.29.66-1.28.65-1.28.64-1.3.61-2 .89-1.95.86-2 .85-2 .84-2 .83-2.05.82-2.09.8-2.08.78-2.12.78-2.13.75-2.15.75-2.17.74-2.18.71-2.22.72-2.21.68-2.24.69-2.25.66-2.26.65-2.29.64-2.28.61-2.3.62-2.32.58-2.31.59-2.34.55-2.33.55-2.35.53-2.37.5-2.35.5-2.38.48-2.37.47-2.33.45-2.37.43-2.38.42-2.4.4-2.38.38-2.39.35-2.38.35-2.38.34-2.39.31-2.38.29-2.38.28-2.37.25-2.36.23-2.37.24-2.35.2-2.35.18-2.35.15-2.33.15-2.34.12-2.31.11-2.3.09h-13.59l-2.21-.06-2.2-.09-2.19-.11-2.18-.01-2.15-.17-2.12-.16-2.1-.2-3.68-.47-3.65-.4-3.64-.4-3.61-.43-7.17-.88-7.12-.89-7.06-.86-3.52-.42-3.5-.42-3.5-.38-3.48-.38-3.47-.35-3.47-.32-3.45-.3-3.45-.27-3.43-.2-3.45-.18-3.43-.17-3.45-.1-3.45-.07h-8.57l-1.73.05-1.72.07-1.71.1-1.74.08-1.71.12-1.74.13-1.71.15-1.74.17-1.73.16-1.73.2-1.74.22-1.73.23-1.75.25-1.7.27-1.7.28-3.45.59-3.45.63-3.47.72-3.48.71-3.47.74-3.5.76-3.5.79-7.07 1.63-7.08 1.63-3.57.84-3.58.8-3.6.8-3.6.78-3.63.75-3.64.73-3.65.69-3.66.65-3.67.6-1.85.28-1.85.28-1.87.25-1.85.25-1.86.22-1.87.22-1.87.18-1.88.18-1.87.15-1.88.15-1.9.12-1.88.08-1.9.09h-9.54l-1.91-.05-1.94-.1-1.91-.12-1.94-.08-1.63-.15-1.63-.18-1.64-.2-1.6-.23-1.63-.24-1.6-.29-1.6-.3-1.59-.31-1.58-.34-1.57-.36-1.54-.4-1.52-.4-1.55-.4-1.55-.42-1.53-.43-1.55-.45-3-.92-3-1-3-1-3-1-2.95-1-2.92-1-5.8-2-2.85-1-2.83-1-2.82-.92-2.78-.87-2.87-.69-1.37-.38-1.37-.39-1.35-.36-1.33-.37-1.35-.32-1.35-.32-1.33-.3-1.32-.26-1.31-.25-1.32-.24-1.32-.21-1.28-.2-1.3-.17-1.28-.13-1.29-.12-1.26-.1-1.27-.07h-5l-1.32.07h-1.46l-1.42-.38-1.35-.55-1.22-.77-1.08-1-.9-1.14-.67-1.28-.45-1.38-.2-1.45v-1.45l.3-1.42.55-1.35.82-1.21 1-1.07 1.14-.9 1.28-.68 1.38-.44 1.45-.2 1.52-.08h4.82l1.6.06 1.6.09 1.58.11 1.58.15 1.57.19 1.57.2 1.56.23 1.55.25 1.57.27 1.53.3 1.55.31 1.54.35 1.53.35 1.52.37 1.51.4 1.52.4 1.52.42 1.51.43 3 .88 3 .94 3 1 2.95 1 2.93 1 5.82 2 2.9 1 2.88 1 2.87 1 2.85.94 2.83.9 2.85.85 1.38.4 1.4.4 1.4.38 1.4.37 1.4.33 1.39.33 1.38.32 1.38.3 1.29.15 1.37.25 1.36.24 1.37.21 1.37.2 1.35.17 1.35.15 1.35.12 1.7.13 1.68.1 1.7.08 1.7.07h6.8l1.7-.05 1.7-.07 1.7-.1 1.72-.1 1.7-.13 1.71-.14 1.72-.16 1.72-.19 1.71-.18 1.72-.22 1.72-.21 1.73-.24 1.72-.25 1.71-.26 3.49-.59 3.46-.61 3.47-.65 3.5-.7 3.48-.72 3.5-.77 3.52-.76 3.52-.8 3.53-.82 7.1-1.65 7.1-1.63 3.58-.8 3.6-.79 3.59-.76 3.61-.74 3.62-.71 3.63-.67 3.64-.62 1.83-.3 1.83-.28 1.92-.27 1.9-.26 1.9-.24 1.9-.21 1.88-.19 1.9-.18 1.89-.17 1.86-.13 1.89-.13 1.86-.1 1.87-.1 1.87-.07h11.07l3.65.06 3.66.12 3.64.17 3.63.2 3.62.23 3.61.28 3.6.32 3.59.33 3.61.29 3.58.39 3.57.41 3.57.42 3.55.42 7.11.88 7.1.88 7.12.87 3.55.42 3.57.41 3.56.39 3.55.36 1.94.19 1.93.15 1.95.15 2 .11 2 .1 2 .07 2.05.07h10.55l2.15-.07 2.17-.08 2.17-.09 2.2-.11 2.2-.15 2.21-.15 2.22-.17 2.23-.18 2.24-.22 2.25-.22 2.25-.25 2.25-.26 2.26-.27 2.27-.3 2.27-.32 2.26-.33 2.27-.33 2.27-.37 2.26-.38 2.27-.4 2.27-.4 2.26-.44 2.27-.45 2.25-.45 2.25-.46 2.23-.5 2.24-.5 2.23-.52 2.22-.53 2.2-.55 2.2-.55 2.18-.59 2.17-.58 2.16-.6 2.15-.62 2.12-.63 2.12-.63 2.1-.67 2.08-.67 2-.66 2.05-.7 2-.7 2-.72 2-.72 1.95-.73 1.93-.75 1.9-.77 1.89-.76 1.85-.77 1.83-.78 1.8-.8 1.75-.8 1.07-.52 1.06-.52 1.09-.55 1.1-.58 1.1-.6 1.11-.6 2.29-1.3 2.36-1.37 2.37-1.4 2.43-1.4 2.45-1.42 2.54-1.4 1.3-.7 1.34-.68 1.34-.67 1.33-.65 1.37-.63 1.38-.62 1.4-.58 1.41-.57 1.45-.53 1.47-.5 1.5-.47 1.52-.43 1.57-.35 1.58-.38 1.4-.25 1.42-.19 1.4-.11 1.38-.07h1.35z"/><path d="m201.17 342.78h1.11l.35.07.27.06.28.07.27.08.28.09.35.13.22.1.22.1.21.1.22.12.22.1.28.18.2.12.2.15.2.13.2.15.18.15.25.22.2.18.2.18.19.19.16.2.24.28.15.17.13.2.15.18.12.18.18.3.13.22.12.22.12.23.16.33.1.22.09.22.08.21.07.24.08.21.07.27.06.23.07.24v.23l.05.25v3.48l-.05.29-.07.28-.07.27-.08.28-.08.27-.1.26-.12.27-.1.27-.13.25-.14.25-.15.25-.15.23-.15.23-.16.24-.17.23-.18.22-.2.21-.2.2-.2.2-.2.19-.22.2-.23.16-.22.17-.23.17-.25.15-.24.15-.25.13-.26.13-.25.12-.27.12-.27.1-.26.08-.27.08-.28.09-.27.06-.28.05h-.29l-.2.27-.78 1.08-.8 1.17-.82 1.23-.83 1.3-.83 1.32-.82 1.35-.78 1.32-.74 1.3-.7 1.25-.63 1.18-.37.7v2.43l-.07.29-.06.26-.07.29-.08.26-.1.27-.1.27-.12.26-.12.25-.13.27-.13.23-.15.25-.15.24-.17.23-.17.23-.18.22-.18.22-.2.21-.2.2-.2.2-.47.42-.45.35-.18.17-.22.15-.2.13-.22.15-.2.12-.2.13-.21.12-.22.11-.22.1-.16.09-.25.11-.25.1-.25.1-.27.1-.27.07-.26.08-.18.24-.27.05h-.13l-.28.05h-2.55l-.27-.05-.25-.05-.25-.07-.27-.06-.25-.07-.23-.08-.25-.1-.25-.1-.23-.1-.24-.12-.25-.14-.25-.13-.23-.15-.23-.17-.24-.15-.23-.18-.22-.18-.21-.19-.2-.2-.18-.18-.18-.2-.19-.2-.16-.22-.15-.2-.17-.22-.13-.23-.15-.22-.14-.23v-.05l-.14-.25-.13-.25-.1-.25-.12-.25-.1-.27-.08-.26-.08-.25-.07-.29-.07-.26v-.14l-.05-.26v-2.66l.05-.27.08-.58.2-.84.24-.75.43-1.16.5-1.2.58-1.24.64-1.28.7-1.33.75-1.4.8-1.45.85-1.49.9-1.5.91-1.51.94-1.5 1-1.5 1-1.45 1-1.4 1-1.37 1-1.28 1-1.24.95-1.11.55-.59.53-.55.57-.55.63-.55.73-.56.54-.35.23-.15.23-.14.25-.13.25-.13.2-.12.22-.1.22-.08.21-.1.22-.09.23-.08.25-.08.27-.09.25-.06.27-.07-.2-.05.27-.05h1.87zm16.38 18.75h1.25l.25.05.23.05.25.07.24.06.25.07.23.08.23.1.24.1.23.1.22.1.23.14.22.11.21.14.2.13.22.15.2.15.2.15.18.17.2.16.19.17.16.18.17.19.17.18.16.2.15.2.15.2.15.22.14.2.13.21.12.24.11.21.12.24.1.21.08.24.1.25.09.23.06.23.07.25.05.25.07.24v3.35l-.07.25v.25l-.06.23-.09.25-.08.23-.08.24-.1.23-.1.23-.12.22-.12.23-.13.22-.12.22-.15.2-.13.21-.15.2-.17.2-.15.19-.18.18-.17.18-1.05 1.07-1 1.08-1.12 1.19-1 1.16-2.2 2.52-2.25 2.57-2.26 2.58-1.17 1.3-1.17 1.28-1.2 1.24-1.2 1.21-1.26 1.14-1.15 1-.19.17-.2.15-.18.16-.22.15-.2.14-.21.13-.22.13-.22.12-.21.12-.24.11-.23.1-.23.1-.24.09-.23.08-.25.07-.23.06-.25.07-.25.05-.24.05h-2.51l-.25-.05-.25-.05h-.24l-.25-.05-.25-.08-.23-.07-.23-.08-.24-.1-.23-.08-.23-.12-.24-.1-.21-.12-.22-.13-.22-.13-.21-.14-.2-.15-.2-.15-.2-.15-.2-.16-.19-.17-.18-.17-.17-.18-.18-.18-.17-.19-.15-.2-.16-.2-.15-.2-.14-.2-.13-.21-.13-.22-.12-.22-.12-.23-.11-.22-.1-.23-.1-.23-.09-.24-.08-.23-.07-.25-.06-.23-.07-.25-.05-.25v-3l.05-.25v-.25l.06-.24.07-.25.07-.23.15-.22.1-.23.08-.24.12-.21.1-.24.12-.21.13-.22.13-.22.14-.21.15-.2.15-.2.15-.2.16-.2.17-.19.17-.18.18-.18.18-.17.95-.87.9-.86.95-1 1-1 1-1.1 1-1.16 2.18-2.47 2.23-2.57 2.29-2.6 1.18-1.31 1.18-1.29 1.19-1.28 1.15-1.17.18-.18.18-.17.2-.16.19-.17.2-.15.2-.15.21-.13.22-.14.22-.13.21-.13.22-.12.23-.1.24-.1.23-.1.23-.08.24-.09.23-.08.25-.07h.25l.23-.05.25-.05h1.52zm58.37-103.15h.4l.4.05.38.05.4.08.38.1.39.12.36.13.37.15.37.17.35.18.33.2.33.22.32.23.32.25.3.27.28.27.27.3.25.3.25.31.23.32.2.33.2.35.18.35.15.37.15.37.1.33.32.12 2.73 1 1.5.57.8.33.82.33.82.37.83.42.85.45.88.51.89.6.76.59 1.07.86.92.75 2 1.54 2 1.53 2.09 1.53 2.11 1.55 2.17 1.57 4.4 3.18 2.22 1.62 2.21 1.67 2.22 1.68 2.17 1.72 1.1.88 1.08.9 1.07.9 1.05.92 1.05.93 1 .95 1 1 .95.91.28.29.25.3.25.31.24.32.21.33.2.34.19.35.16.36.17.37.12.37.11.38.1.38.09.4.06.39v1.98l-.07.38-.06.4-.09.39-.11.38-.12.37-.15.38-.17.35-.16.37-.2.33-.22.33-.22.34-.25.31-.25.3-.28.29-.28.28-.3.27-.3.23-.32.23-.33.22-.35.22-.35.18-.35.17-.37.15-.38.13-.41.07-.38.08-.38.08-.4.07h-2.37l-.38-.09-.39-.08-.38-.12-.38-.11-.37-.15-.37-.15-.35-.19-.35-.2-.33-.21-.32-.22-.31-.25-.3-.25-.3-.27-.84-.83-.81-.78-.85-.77-.87-.78-.9-.77-.9-.78-.95-.77-.93-.77-2-1.56-2-1.55-2.07-1.58-2.14-1.55-4.35-3.15-2.2-1.6-2.2-1.6-2.2-1.64-2.18-1.66-2.15-1.69-1.08-.88-.92-.75-.1-.07h-.05l-.15-.1-.27-.13-.35-.17-.4-.18-.48-.22-.52-.2-1.23-.47-1.32-.48-1.43-.52-1.43-.53-.79-.32-.78-.33-.78-.37-.82-.4-.85-.46-.88-.57-.64-.45-.28-.23-.3-.25-.58-.52-.59-.6-.5-.6-.5-.68-.26-.45-.2-.35-.19-.35-.06-.17-.12-.25-.1-.23-.1-.27-.07-.15-.1-.3-.08-.3-.08-.3v-.17l-.06-.3-.07-.3v-3.04l.05-.3.06-.3v-.18l.06-.28.09-.3.08-.29.07-.18.13-.37.15-.35.08-.2.15-.33.19-.33.25-.47.46-.72.34-.43.25-.3.26-.3.29-.28.28-.29.3-.25.32-.25.33-.21.33-.22.34-.2.36-.17.35-.16.39-.15.36-.12.39-.12.38-.08.4-.07.38-.05h.8z"/><path d="m315.58 245.38h.82l.4.07.4.08.4.1.38.12.39.13.38.17.37.18.35.18.35.22.35.23.31.25.32.25.3.29.28.28.29.32.25.31.25.32.21.35.22.35.18.37.19.36.15.39.05.15.1.28.1.28.08.29v.16l.07.27.05.28v.45l.05.37v2.27l-.05.38-.07.38-.08.42v.28l-.09.29-.08.28-.23.77-.42 1-.45.93-.48.89-.5.83-.54.82-.55.8-.58.78-.6.8-.65.82-1.25 1.68-1.43 1.65-1.57 1.7-1.6 1.74-1.65 1.78-3.46 3.63-3.57 3.77-1.72 1.88-1.75 1.9-1.74 1.9-1.68 1.88-1.6 1.85-1.55 1.84-.7.88-.7.88-.68.87-.64.83-.6.84-.56.8-.54.78-.48.75-.45.72-.4.68-.35.65-.32.6-.26.55-.21.5-.15.43-.12.37-.07.27-.05.26v.97l-.07.42-.07.4-.1.4-.11.38-.15.38-.15.39-.17.36-.2.37-.2.35-.23.35-.24.32-.26.31-.27.32-.3.28-.3.29-.32.25-.31.25-.35.23-.35.2-.35.2-.37.17-.38.16-.39.14-.4.13-.38.1-.4.07-.42.06-.4.05h-1.63l-.4-.07-.4-.08-.4-.08-.4-.12-.38-.15-.39-.15-.36-.17-.35-.2-.37-.2-.33-.23-.34-.25-.31-.25-.3-.27-.3-.3-.27-.3-.27-.31-.23-.32-.23-.35-.22-.35-.18-.35-.19-.37-.16-.38-.14-.38-.11-.4-.1-.39-.09-.4-.06-.41v-2.42l.06-.67.1-.71.24-1.2.3-1.22.38-1.18.42-1.15.48-1.12.52-1.1.55-1.08.58-1.09.62-1.05.65-1.05.68-1.05.72-1.05.73-1 .75-1 .78-1.05.8-1 .82-1 .85-1 1.72-2.05 1.76-2 1.82-2 1.83-2 1.85-2 1.85-2 3.6-3.8 3.4-3.6 1.59-1.69 1.48-1.61 1.37-1.5 1.21-1.42 1.07-1.3.45-.55.42-.53.35-.49.3-.43.13-.2v-.72l.07-.4.08-.4.1-.4.12-.38.15-.38.15-.39.18-.36.2-.37.2-.35.23-.33.25-.34.27-.3.27-.3.3-.3.3-.26.31-.27.34-.23.33-.24.35-.2.37-.18.36-.18.39-.15.38-.14.4-.11.4-.1.4-.09h1.22zm-8.16 11 .1.29-.12-.37zm-20.55-118.71h1l.31.05.34.07.31.08.32.08.32.1.31.12.3.13.3.14.3.16.29.15.28.19.27.18.26.2.27.2.25.22.23.23.24.23.23.25.2.25.2.27.2.27.18.28.17.28.15.29.15.3.13.3.14.31.1.32.1.32.08.31.07.32.06.33.05.34v2.43l-.1.52-.22 1.11-.27 1.42-.26 1.52-.22 1.28v3.25l-.05.15-.05.17-.05.15-.05.16-.07.15-.05.15-.06.15-.07.15-.07.15-.39.15-.07.15-.08.15-.08.14-.09.15-.1.13-.08.15-.1.13-.08.14-.1.13-.1.13-.12.14-.1.11-.12.14-.1.11-.11.12-.12.12-.07.06-.11.12-.12.12-.12.1-.13.11-.12.1-.13.1-.13.1-.12.1-.13.09-.14.1-.15.08-.13.08-.13.09-.15.08-.14.08-.15.07-.15.08-.15.07-.15.07-.15.06-.15.07-.15.05-.15.07-.15.05h-.32l-.15.05h-4.33l-.17-.05h-.17l-.15-.06-.15-.05h-.16l-.15-.07-.15-.07-.15-.06-.15-.07-.15-.07-.15-.08-.15-.08-.14-.09-.15-.08-.13-.08-.15-.09-.13-.1-.14-.1-.13-.08-.13-.12-.12-.1-.13-.1-.14-.11-.11-.1-.12-.12-.12-.12-.11-.11-.12-.12-.12-.13-.1-.12-.11-.13-.1-.13-.1-.13-.1-.12-.08-.13-.1-.14-.08-.13-.09-.15-.08-.13-.08-.14-.09-.15-.06-.13-.09-.15-.06-.15-.07-.15-.07-.15-.05-.15-.06-.15-.05-.15-.05-.15v-.15l-.05-.15-.05-.17v-2.88l.06-.92.1-.88.14-.88.26-1.7.32-1.72.28-1.48.2-1-.06.31v.22-1.85l.05-.17v-.15l.07-.17v-.15l.05-.15.07-.16.06-.15.07-.15.08-.15.07-.15.08-.14.09-.15.08-.15.08-.13.09-.15.1-.13.08-.14.1-.13.1-.13.1-.14.12-.11.1-.14.11-.11.1-.14.12-.11.12-.12.11-.12.14-.11.11-.1.14-.12.11-.1.14-.1.13-.1.13-.1.14-.1.15-.08.13-.09.15-.1.13-.08.15-.07.15-.08.14-.08.15-.07.15-.07.16-.06.15-.07.15-.05.15-.07h.17l.15-.05.17-.05h2.45zm17.26-13h1.22l.3.06h.3l.28.09.3.08.29.1.28.1.28.12.29.13.26.13.27.15.27.17.25.17.25.16.23.19.25.2.22.2.23.2.2.23.22.22.18.23.2.23.17.25.16.25.17.27.15.27.15.26.12.27.13.28v.12l.19.2.2.23.18.25.17.25.16.25.17.27.13.27.15.26.12.27.12.28.11.29.09.3.08.28.08.3.07.3.05.3v4.2l-.05.08v.29l-.21.5-.25.46-.05.09v.08l-.05.08-.05.07-.05.08-.05.09v.08l-.05.07-.05.08-.05.08-.05.07-.08.12-.05.08-.07.07-.66.23-.06.08-.07.09v.06l-.07.09-.06.06-.07.09-.07.06-.06.09-.07.06-.07.07-.06.08-.09.07-.06.07-.07.06-.07.07-.06.07-.09.06-.06.07-.09.07-.06.06-.09.07-.06.05-.09.07-.08.06h-.07l-.08.07h-.08l-.09.07-.05.18-.07.05h-.08l-.08.05-.09.06h-.08l-.08.05h-.09l-.08.05h-.1l-.08.05-.09.05h-.18l-.1.05h-6.95l-.09-.05h-.1l-.08-.05h-.25l-.08-.05-.1-.05h-.17l-.08-.05-.1-.05h-.09l-.08-.05-.08-.06h-.09l-.08-.05-.08-.07-.09-.05-.06-.07-.09-.05-.08-.06h-.08l-.07-.07-.08-.07h-.07l-.08-.06-.07-.07-.08-.07-.07-.06-.07-.07-.08-.07-.07-.06-.06-.07-.07-.07-.07-.06-.06-.09-.07-.06-.07-.07-.06-.08-.07-.09-.07-.06-.06-.07-.05-.08-.07-.07-.05-.08-.07-.07-.05-.08-.06-.07-.05-.08-.05-.09v-.06l-.07-.09v-.08l-.05-.08-.12-.2-.05-.09-.05-.08-.05-.08v-.09l-.05-.08-.05-.08v-.09l-.05-.08v-.27l-.26-.56-.3-.82-.2-.68-.19-.65-.23-1-.15-.87-.07-.43v-4.24l.05-.1v-.18l.05-.1v-.18l.05-.09v-.08l.05-.1.05-.08v-.1l.05-.09.05-.08.05-.08.06-.09v-.1l.05-.08.05-.08.07-.09.05-.08.07-.08.06-.09.05-.06.07-.09.07-.08.06-.08.07-.07.07-.08.06-.07.07-.08.07-.07.06-.08.07-.07.08-.08.07-.07.07-.07.08-.06.07-.07.08-.07.08-.06.07-.07.08-.07.09-.06.08-.07.07-.05.08-.07h.08l.09-.06h.08l.08-.07h.17l.1-.07h.35l.08-.05h4zm8.2 7.63v.3-.32zm-14.33-.18-.07.15.05-.1v-.07zm36.07-22.42h1.23l.3.05.3.06.3.07.3.08.3.1.28.12h.12l.37.07.3.06.3.09.3.1.28.1.3.11.28.12.27.15.28.13.27.17.25.17.27.16.25.19.23.2.23.2.24.21.21.22.2.23.22.24.18.23.19.25.18.27.15.26.17.27.13.27.13.28.14.28.1.29.11.3.09.3.08.3.07.3v.3l.05.3v5.03l-.05.08v.27l-.05.07v.06l-.05.07v.13l-.05.07-.05.07-.05.06v.07l-.05.07-.05.06v.07l-.05.07-.05.06-.05.07-.05.05-.05.07-.05.06h-.05l-.05.07h-.05v.07l-.07.05-.05.06h-.16l-.07.05h-.05l-.07.07h-.05l-.06.05h-.3l-.05.05h-.92l-.08.05h-11.31l-.07-.05h-.25l-.06-.05h-.32l-.05-.05h-.18l-.07-.05h-.13l-.05-.05-.05-.07h-.12l-.1-.1-.05-.06h-.1l-.05-.07-.05-.07h-.05l-.05-.06-.05-.05v-.07h-.05l-.05-.07-.05-.06-.05-.07v-.07l-.05-.06v-.07l-.31-.47-.05-.06v-.2l-.05-.07v-.07l-.05-.06v-.14l-.05-.06v-7.98l.05-.07v-.13l.05-.07v-.13l.05-.07v-.06l.05-.07v-.07l.05-.06h.05v-.14l.05-.06h.05l.05-.07v-.07h.05l.05-.06.05-.07.05-.07h.05l.05-.06h.05l.07-.07h.05l.05-.07.06-.05h.1l.07-.06h.05l.07-.05h.18l.07-.05h.55l.06-.05h.4l.07-.05h4.13zm6.73 3.53.1.12-.1-.13zm54.28-11.66h.94l.46.06.45.1.47.12.43.15.44.17.43.2.42.21.4.25.38.25.37.29.36.31.34.32.31.35.3.35.29.38.25.4.23.4.22.42.18.43.17.44.13.45.12.45.08.46.07.47v2.75h-12.44v-1.11.36-3.03h.3-1.18 3.64l.5-.05h.85zm-5.66 15.1.2.15h-.1zm10.4-13 .2.18-.22-.23-.3-.22zm36.78 11.73h1.32l.31.06.32.07.33.08.3.1.32.12.3.13.3.14.3.15.28.16.29.17.28.18.27.19.26.21.25.22.24.22.23.23.23.23.22.27.2.25.18.27.19.28.18.28.2.34.15.3.15.28.12.3.1.23.11.32.1.32.1.31.07.32.07.33.06.32v5.4l-.05.07v.13l-.05.08v.07l-.05.07v.06l-.05.07-.05.07v.06l-.06.1v.14l-.05.06-.05.07-.05.05v.07l-.05.06-.05.07-.05.07-.05.06v.05l-.05.07-.05.07-.06.05-.05.06v.07l-.05.05-.07.07-.05.05h-.07l-.05.06-.06.05v.06l-.05.07v.07l-.05.06-.05.07-.05.07-.05.06v.07l-.05.05-.05.07-.07.06-.05.07-.05.05-.05.07-.07.06h-.05v.07l-.06.07h-.05l-.07.06-.05.05-.07.05-.06.07h-.05l-1.61.41h-.07l-.05.05h-.06l-.07.05-.07.06-.06.05h-.07l-.07.05h-.06l-.07.05h-.07l-.06.05h-.07l-.07.05-.06.05h-.14l-.08.05h-.42l-.08.05h-.37l-.08.05h-7l-.07-.05h-.37l-.06-.05h-.09l-.06-.05h-.14l-.08-.05h-.07l-.06-.05h-.07l-.07-.05h-.13l-.07-.05-.06-.05h-.07l-.07-.05h-.06l-.07-.07-.07-.05h-.06l-.07-.05v-.07l-.07-.05-.06-.06h-.05l-.07-.05-.05-.07-.07-.07-.05-.05-.06-.06-.05-.05-.05-.07-.07-.07-.05-.05v-.06l-.05-.07-.23-.14-.05-.07-.07-.05-.05-.07v-.06l-.05-.07-.05-.07v-.08l-.05-.07-.05-.06v-.07l-.05-.07-.05-.06v-.09l-.05-.06v-.07l-.05-.07v-.15l-.05-.06v-6.33l.07-.22v-1.55l.09-.18.05-.07v-.22l.05-.06v-.07l.05-.08v-.2l.05-.07v-.07l.05-.06.05-.07.05-.07v-.06l.05-.07.05-.07.05-.06.05-.06v-.24l.05-.06v-.22l.05-.07v-.06l.05-.09v-.13l.05-.07.05-.06.05-.07v-.13l.05-.07.05-.07.05-.06.05-.07v-.07l.06-.06.05-.07h.05l.05-.07v-.06h.07v-.07l.07-.07.05-.06.06-.05.05-.07h.07l.07-.07h.11l.07-.06h.12l.06-.05h.07l.07-.07h.06l.05-.05h.35l.07-.05h.2l.07-.05h.36l.07-.05h4.61zm-7.53 12.12.23.41v-.51zm14.7-1v.63l.05-.13v-.52zm18.36 20.83h1.42l.28.07.29.07.26.06.29.09.26.1.27.1.27.11.25.12.25.13.25.14.25.15.25.16.23.15.22.19.23.18.22.18.2.2.2.2.2.2.18.22.18.22.19.23.16.23.15.24.15.25.14.25.13.25.13.26.12.25.1.27.1.28.08.27.07.27.08.28.05.28v3.82l-.05.15v.13l-.05.14-.05.13-.05.13-.05.14v.13l-.05.13-.06.14v.21l.05.72.07.73v3.09l-.05.13v.28l-.05.14-.05.13-.05.13v.14l-.05.13-.05.13-.05.14-.06.13-.07.12-.05.13-.07.13-.06.12-.09.13-.06.12-.07.13-.08.12-.09.12-.06.11-.09.12-.1.12-.08.11-.08.12-.09.1-.1.12-.1.1-.08.11-.1.1-.1.1-.1.1-.1.1-.12.1-.1.1-.11.09-.1.1-.12.08-.12.1-.1.08-.11.09-.12.08-.12.08-.13.07-.12.08-.11.07-.14.08-.11.07-.14.07-.11.06-.14.07h-.13l-.13.07h-.14l-.11.05-.14.06h-.41l-.14.05h-4.93l-.13-.05h-.14l-.13-.05h-.13l-.14-.07-.13-.05-.13-.05-.14-.06-.11-.07-.14-.07-.13-.06-.12-.07-.13-.07-.12-.06-.11-.09-.14-.08-.11-.07-.12-.08-.12-.08-.11-.09-.1-.1-.12-.08-.12-.08-.1-.1-.11-.1-.1-.1-.1-.09-.1-.1-.1-.11-.1-.1-.1-.1-.1-.12-.09-.1-.1-.12-.08-.1-.08-.11-.09-.12-.08-.12-.08-.11-.09-.12-.08-.13-.07-.12-.08-.12-.07-.13-.06-.12-.07-.13-.07-.12-.06-.13-.05-.13-.07-.14-.05-.13-.05-.13-.05-.14v-.13l-.05-.13-.05-.14v-.28l-.05-.13v-1.89l-.05-.68-.09-1.05v-3.05l.09-1 .18-1.08.18-.75v-.72l.15-.45.33-.78.27-.49.07-.11.06-.12.07-.13.08-.12.07-.12.08-.11.1-.15.07-.1.08-.1.07-.1.08-.1.07-.1.08-.1.09-.1.08-.1.1-.12.1-.1.08-.1.09-.1.1-.08.08-.1.1-.09.1-.1.1-.08.1-.08.12-.1.1-.1.11-.09.1-.08.12-.1.12-.08.11-.09.12-.06.13-.09.12-.08.12-.07.11-.08.14-.07.13-.06.12-.07.13-.07.13-.05.12-.06h.13l.14-.07h.13l.13-.05h.27l.15-.05h.13l.14-.05h.98-.57 1.15zm5.77 14.27-.1.1-.1.08-.12.1-.1.1.34-.28.1-.12zm6.32 23.13h.96l.32.05.32.06.31.07.3.08.32.1.3.12.3.12.3.13.28.13.29.17.26.15.29.18.25.19.26.2.25.2.24.21.23.22.22.23.21.25.2.25.2.25.12.19.17.21.15.19.2.2.78.73.87.83.21.24.24.23.2.23.2.27.2.25.16.27.19.28.15.27.15.3.13.28.13.3.12.3.1.3.08.32.09.3.06.31.05.32.05.33v3.9l-.05.1v.29l-.05.1v.1l-.05.1-.05.1v.08l-.05.1-.05.1-.05.08-.06.1v.09l-.05.1-.07.08-.05.1-.07.08-.05.09-.06.1-.07.08-.07.08-.06.09-.07.08-.07.08-.06.09-.07.08-.07.08-.08.09-.07.06-.06.09-.09.08-.06.07-.09.08-.08.07-.07.08-.08.07-.08.06-.09.07-.08.07-.08.08-.09.07h-.08l-.08.06-.09.07-.08.07-.1.06h-.08l-.09.07h-.1l-.08.07-.1.05-.08.05h-.1l-.1.05h-.09l-.1.05-.1.05h-.1l-.08.05h-.2l-.1.05h-.2l-.1.05h-5.98l-.1-.05h-.1l-.1-.05h-.19l-.1-.05-.1-.05h-.1l-.08-.05h-.1l-.1-.05-.08-.05-.1-.06h-.09l-.1-.05-.08-.07-.08-.05-.1-.07-.09-.06-.08-.07-.08-.05-.09-.07-.08-.06-.08-.07-.09-.08-.08-.07-.08-.07-.09-.06-.08-.09-.07-.06-.85-.82-1-.92-.64-.65-.68-.75-.72-.88-.5-.73-.06-.09-.05-.1-.07-.08-.05-.1-.05-.08-.07-.1-.05-.09-.05-.1v-.1l-.05-.08-.05-.1-.05-.1v-.1l-.05-.1-.05-.08v-.1l-.05-.1v-.2l-.05-.1v-1.79.05-3.82l.05-.1v-.2l.05-.1v-.2l.05-.08v-.1l.05-.1.05-.1.05-.08.05-.1v-.09l.07-.1v-.1l.05-.08.06-.08.05-.1.07-.09.07-.08.06-.1.05-.08.07-.09.07-.08.06-.08.07-.09.08-.08.07-.08.07-.07.06-.08.09-.09.06-.06.09-.09.06-.08.09-.07.08-.06.08-.09.07-.06.08-.07.09-.07.08-.06.08-.07.09-.07.08-.06.1-.07.08-.07.09-.06.08-.05.1-.07h.08l.1-.07h.09l.1-.05h.08l.1-.06.1-.05.08-.05h.2l.1-.05.1-.05h.29l.1-.05h3.15zm14.66 34.8h1.22l.25.05.23.05h.24l.23.06.23.07.24.08.23.09.23.1.22.1.22.1.21.11.22.12.22.12.2.13.2.13.2.15.2.15.18.15.2.17.17.17.18.16.17.17.16.18.17.19.15.2.15.18.13.2.55.23.77.37.22.12.21.11.2.12.22.13.2.14.2.13.2.15.2.15.18.15.19.17.16.16.19.19.16.16.17.19.15.2.15.18.15.2.13.2.14.2.13.22.12.2.11.21.12.24.1.21.1.22.08.23.09.24.08.23.07.23.05.24.06.23.05.25v3.87l-.05.11v.24l-.05.11v.24l-.05.11v.22l-.05.12-.05.1-.07.11-.05.12-.05.1-.06.12-.07.1-.05.1-.07.11-.06.1-.07.1-.07.1-.06.1-.07.1-.08.1-.07.1-.08.1-.07.09-.08.1-.09.1-.08.08-.07.1-.08.08-.1.09-.08.08-.09.1-.08.08-.1.09-.08.08-.1.07-.09.08-.1.08-.1.07-.08.08-.1.07-.1.08-.1.07-.1.07-.1.06-.1.07-.12.07-.1.06-.1.05-.11.07-.1.07-.12.05h-.1l-.12.06-.1.05-.11.05h-.24l-.1.05-.11.05h-6.32l-.12-.05-.11-.05h-.22l-.12-.06-.11-.05-.52-.25-.32-.14-.25-.1-.21-.08-.62-.22-.55-.2-.43-.18-.12-.05-.1-.05h-.12l-.11-.07-.1-.05-.12-.06-.1-.05-.18-.1-.1-.07-.1-.05-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.09-.06-.16-.14-.1-.06-.09-.09-.1-.06-.08-.09-.08-.06-.1-.09-.09-.08-.08-.08-.08-.09-.09-.08-.08-.08-.15-.17-.08-.08-.07-.09-.08-.08-.07-.08-.08-.09-.07-.08-.07-.1-.06-.08-.09-.09-.06-.1-.14-.2-.06-.1-.07-.1-.07-.1-.06-.1-.07-.1-.07-.1-.06-.1-.29-.5-.36-.75-.45-1.06-.05-.1v-.12l-.05-.12v-.11l-.05-.12v-4.98l.05-.11v-.24l.05-.11v-.12l.05-.12.05-.11.05-.1v-.12l.05-.12.05-.1.07-.11.05-.1.05-.12.06-.1.07-.1.07-.12.05-.1.06-.1.07-.1.08-.1.07-.1.07-.1.08-.1.07-.1.08-.1.07-.08.08-.1.08-.08.09-.1.08-.09.08-.1.09-.08.08-.08.08-.09.1-.08.09-.08.1-.09.08-.08.1-.07.1-.08.08-.07.1-.08.1-.07.1-.06.1-.09.1-.06.12-.07.1-.07.1-.05.1-.06.12-.07h.1l.11-.07h.1l.12-.05h.1l.12-.05.11-.05h.12l.1-.05h.23l.12-.35h2.88zm22 25.07h1.35l.49.08h.23l.23.05h.22l.23.07.22.06.22.09.23.08.22.08.2.1.21.1.2.1.22.12.25.15.5.15h.38l.24.05h.23l.22.05.23.07.22.08.21.07.22.08.22.1.21.1.22.1.2.1.2.12.22.12.18.13.2.13.18.14.2.13.17.15.18.15.19.15.16.17.17.16.15.17.17.18.15.19.13.18.15.18.13.19.12.2.13.2.12.2.12.2.1.21.1.2.1.22.08.22.08.21.09.24.06.21.07.22v.47l.05.23v4.38l-.05.12v.22l-.05.1v.21l-.05.12v.1l-.05.12v.2l-.05.1v.11l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.09-.06.1-.07.1-.07.08-.06.1-.09.1-.06.08-.07.09-.08.1-.09.08-.75.08-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.1.07-.09.08-.08.09-.1.06-.08.07-.1.08-.09.07-.1.07-.1.06-.08.07-.1.07-.1.06-.1.07-.1.05-.1.07-.1.05-.1.06-.1.05-.1.05-.12.07-.1.05h-.21l-.1.05h-.12l-.1.05h-.22l-.11.05h-4.55l-.5-.1-1.1-.29-1.1-.35-1.05-.35-1.05-.38-.69-.3-.1-.05h-.11l-.1-.05-.1-.05-.1-.05-.1-.05-.12-.07-.1-.05-.1-.06-.1-.05-.1-.07-.1-.07-.1-.06-.08-.05-.1-.07-.1-.07-.09-.06-.1-.07-.08-.08-.1-.07-.08-.07-.09-.08-.1-.07-.08-.08-.08-.07-.09-.08-.06.35-.08-.09-.09-.06-.06-.09-.09-.08-.08-.08-.07-.1-.08-.09-.07-.08-.06-.08-.09-.1-.06-.09-.07-.1-.07-.08-.06-.1-.07-.1-.07-.08-.06-.1v-.1l-.07-.1-.05-.1-.06-.12v-.1l-.05-.1-.07-.1-.05-.1-.05-.11-.05-.1-.05-.1v-.12l-.05-.1-.22-.15v-.21l-.05-.12v-5.25l.05-.1v-.34l.05-.11v-.1l.05-.12.05-.1v-.1l.05-.12.05-.1.05-.1.06-.1v-.1l.05-.11.07-.1.07-.1v-.09l.06-.1.07-.1.07-.1.06-.1.07-.08.08-.1.07-.08.07-.1.08-.09.07-.1.08-.08.08-.08.07-.09.08-.08.09-.08.35-.17.09-.08.08-.09.1-.08.1-.08.08-.07.09-.08.1-.07.08-.07.1-.06.08-.07.1-.07.1-.06.09-.07.1-.07.1-.06.1-.05.1-.07.1-.05h.1l.1-.07.1-.05.1-.05h.1l.1-.05h.21l.1-.05.12-.05h3.19zm-.68 16.66h-.35zm5.57-15.28h.23-.2zm27 17.12h.95l.25.05h.23l.23.05.22.05.23.06.24.07.21.08.24.07.21.1.22.08.22.1.21.12.22.1.2.13.2.12.2.13.2.14.22.15.31.05h.24l.23.05.23.05.24.07.21.06.24.09.21.06.24.1.21.09.22.1.22.1.2.11.21.12.2.13.2.12.2.13.19.15.18.14.18.15.19.16.18.17.17.15.16.18.17.17.15.18.15.19.15.18.13.2.14.2.13.2.12.2.11.2.12.22.1.21.1.22.1.22.08.21.09.24.06.21.07.24.07.23.05.23v4.35l-.05.1v.24l-.05.11v.22l-.05.1v.22l-.05.11v.1l-.07.1v.12l-.06.1v.1l-.07.1-.07.1-.05.1-.06.1-.07.1-.07.1-.08.1-.07.1-.06.08-.07.1-.08.1-.09.09-.06.08-.09.1-.08.08-.08.09-.09.08-.08.1-.08.08-.09.09-.08.06-.08.09-.1.08-.09.08-.1.07-.08.08-.1.07-.08.07-.1.06-.1.09-.1.06-.1.07-.1.07-.1.05-.1.06-.1.07-.1.05-.12.07-.1.05h-.1l-.12.06-.1.05-.1.05-.11.05h-.12l-.1.05-.12.05h-.1l-.11.05h-.24l-.1.05h-3.2l-.75-.07-1.8.52-.72-.12-.66-.15-.7-.16-.74-.2-.81-.29-.57-.23h-.2l-.1-.05-.1-.05-.1-.05-.1-.05h-.12l-.25-.14-.1-.05-.1-.06-.1-.05-.1-.05-.08-.07-.1-.07-.1-.05-.1-.06-.08-.07-.1-.07-.09-.06-.2-.15-.08-.07-.08-.07-.1-.06-.09-.07-.08-.07-.08-.08-.09-.07-.08-.08-.08-.07-.09-.08-.08-.08-.08-.09-.07-.06-.07-.09-.08-.08-.08-.08-.09-.1-.06-.09-.09-.08-.06-.1-.09-.08-.06-.1-.07-.1-.07-.09-.06-.1-.07-.1v-.08l-.07-.08-.06-.1v-.1l-.07-.1-.07-.1v-.2l-.06-.1v-.12l-.05-.1v-.42l-.05-.11v-6.59l.05-.1v-.2l.05-.11v-.1l.05-.1v-.19l.05-.1v-.1l.05-.1.07-.1.05-.1.06-.08v-.1l.07-.1.07-.1.06-.08.07-.1.07-.09.06-.1.07-.08.07-.08.08-.1.07-.07.06-.1.09-.08.06-.09.09-.08.08-.08.08-.09.09-.08.08-.08.08-.09.09-.08.08-.07.08-.08.1-.08.1-.07.09-.08.1-.07.08-.08.1-.07.1-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07h.1l.1-.06.1-.05.12-.07.1-.05.1-.05.11-.05h.1l.12-.05.1-.05h.12l.11-.05.1-.05h.24l.11-.05h2.62zm5.78 14.16-.08.09-.09.08-.08.08-.1.09-.08.08-.09.08.44-.38.15-.18zm.83-1 .06-.07v-.05zm36.42-31.73h1.23l.3.07.3.06.3.09.3.08.3.1.29.12.28.11.28.14.27.15.27.15.26.16.27.17.25.18.23.19.24.2.23.21.22.22.21.22.2.23.2.25.19.25.18.25.17.27.15.26.15.27.13.28.13.29.12.28.1.28.1.3.08.3.07.3.07.3v4.22l-.05.15v.15l-.05.13-.07.15-.07.13v.15l-.06.14-.09.15-.06.13-.07.13-.08.14-.09.13-.08.13-.08.14-.09.11-.08.14-.1.13-.08.12-.1.11-.1.12-.1.13-.1.12-.1.1-.12.12-.1.11-.12.1-.11.12-.1.1-.12.1-.13.1-.12.1-.12.1-.13.08-.12.1-.13.09-.12.08-.13.08-.5.09-.14.08h-.08l-.11.1-.15.13-.47.45-.53.54-.55.6-.57.63-.53.62-1 1.21-.81 1-.32.35-.1.1-.1.1-.1.12-.12.1-.1.1-.11.1-.12.1-.12.1-.11.1-.12.08-.12.1-.13.09-.12.08-.13.08-.12.09-.13.08-.13.08-.14.07-.13.07-.13.06-.14.07-.13.07-.15.06-.13.07h-.14l-.15.05-.13.05-.15.05-.15.05h-.15l-.15.05h-4.28l-.15-.05h-.3l-.15-.05-.15-.05-.14-.05-.15-.07-.13-.05-.15-.06-.13-.07-.15-.07-.14-.06-.13-.07-.13-.08-.15-.07-.12-.08-.13-.09-.14-.08-.13-.08-.12-.1-.13-.09-.12-.1-.13-.1-.12-.1-.11-.1-.12-.1-.12-.1-.1-.11-.11-.1-.1-.12-.12-.12-.1-.1-.1-.11-.1-.14-.1-.11-.08-.12-.1-.13-.09-.12-.1-.13-.08-.14-.08-.11-.09-.14-.06-.13-.09-.13-.06-.15-.07-.14-.07-.13-.06-.15-.05-.15-.07-.13-.05-.15-.06-.15v-.15l-.05-.14v-4.67l.05-.15v-.3l.05-.15v-.14l.07-.15v-.15l.07-.13.06-.15.07-.13.07-.17.06-.12.07-.13.07-.12.06-.11.07-.14.07-.11.25-.39.08-.13.08-.13.09-.12.08-.13.1-.12.1-.13.08-.12.1-.12.1-.11.1-.12.12-.12.1-.11.12-.1.1-.12.11-.1.12-.1.12-.1.11-.1.64-.75.68-.8.75-.84.82-.86.85-.89.88-.83.53-.48.52-.44.57-.45.63-.45.72-.46.51-.29.14-.06.15-.09.13-.06.13-.07.15-.07h.14l.15-.06.15-.05h.13l.15-.05.15-.05h.3l.15-.05h2.03zm24.52-21.67h1.63l.23.05h.22l.23.06.22.07.22.08.23.09.22.08.2.1.21.1.22.12.2.11.2.12.2.12.2.13.18.13.2.15.19.14.16.16.19.15.16.17.17.17.17.16.15.17.15.18.15.19.13.18.13.2.14.2.13.2.12.2.11.2.1.22.1.2.1.21.09.22.08.23.08.22.07.22.07.23.05.22v5.25l-.05.12v.22l-.05.1v.21l-.05.1v.1l-.05.07v2.75l-.05.11v.54l-.05.11v.1l-.05.1v.22l-.06.1v.1l-.07.1v.1l-.07.1-.06.1-.07.1-.07.1-.06.1-.07.1-.07.08-.06.1-.09.09-.06.1-.07.08-.08.1-.09.08-.06.09-.09.08-.08.08-.08.09-.09.08-.08.08-.08.09-.1.08-.09.07-.08.08-.1.07-.08.08-.1.07-.09.08-.1.07-.1.06-.08.07-.1.07-.1.06-.1.05-.12.09-.1.06h-.1l-.1.07h-.11l-.1.07-.1.05-.1.05h-.1l-.12.05h-.1l-.1.05h-.12l-.1.05h-.2l-.11.05h-7.51l-.1-.05h-.22l-.1-.05-.12-.05h-.1l-.1-.05h-.1l-.1-.05-.11-.05-.1-.07h-.1l-.09-.05-.1-.07-.1-.06h-.05l-.1-.06-.1-.05-.08-.07-.1-.07-.1-.06-.08-.09-.09-.06-.1-.07-.08-.07-.08-.08-.09-.07-.1-.08-.08-.07-.08-.08-.09-.08-.06-.09-.09-.08-.08-.08-.08-.09-.07-.08-.08-.08-.07-.09-.07-.08-.08-.1-.07-.08-.06-.1-.07-.09-.07-.1-.06-.08-.07-.1-.07-.1-.07-.1v-.1l-.06-.1-.05-.1-.07-.1-.05-.1v-.1l-.05-.1v-.22l-.05-.1v-.1l-.05-.11v-5.17l.12-.62.23-.85.24-.73.23-.67.28-.7.47-1.08.32-.63.35-.64.25-.4.05-.1.06-.08v-.08l.07-.1v-.09l.07-.08.06-.08.07-.09.07-.08.1-.15.08-.08.07-.09.08-.1.07-.08.08-.08.08-.1.09-.09.06-.08.09-.08.08-.09.1-.06.08-.09.09-.08.08-.08.1-.07.08-.08.1-.07.09-.07.1-.06.1-.09.08-.06.1-.07.1-.07h.1l.1-.06.1-.07.1-.05.1-.07.1-.05h.12l.1-.06.1-.05.11-.05h.1l.1-.05h.12l.1-.05h.22l.11-.05h1.49-.6 1.29zm6.58 13.3-.07.09-.06.1.18-.24zm-11.73-8.25-.37.24.1-.07h.1l.1-.07h.1l.1-.06zm1.26-.56h-.06.09zm26.22-33.62h.88l.44.05.43.08.42.12.38.1.82.26.41.17.4.17.4.2.39.21.36.24.37.26.33.27.34.3.31.3.3.33.29.34.25.36.25.37.21.38.2.39.19.4.16.41.14.42.11.43.09.44.06.43v4.77h-9.72l-1.86 4.05h-.7v-13.1h.85-.15 2.38z"/><path d="m677.68 113.33 1.27.17 1.25.25 1.22.35 1.21.42 1.19.51 1.15.57 1.13.67 1.08.71 1.07.79 1 .85.51.45.49.48.45.5.43.5.4.52.43.6.62 1 .58 1.1.5 1.12.4 1.12.34 1.11.26 1.14.2 1.11.17 1.12.1 1.12.05 1.1v2.21l-.07 1.12-.1 1.1-.11 1.12-.17 1.1-.18 1.11-.22 1.1-.23 1.1-.27 1.1-.28 1.1-.32 1.1-.35 1.1-.35 1.09-.38 1.08-.42 1.08-.42 1.07-.45 1.07-.46 1.06-.49 1-.5 1.05-.53 1-.55 1-.57 1-.56 1-.6 1-.64 1-.63.93-.65.92-.68.88-.7.89-.72.85-.75.83-.77.8-.8.78-.81.75-.85.72-.9.7-.92.65-1 .62-1 .56-1.06.54-1.1.46-1.15.4-1.22.34-1.17.23-.73.08-.65.07h-2.02l-.68-.05-.68-.1-.69-.12-.66-.15-.69-.18-.65-.22-.63-.25-.63-.26-.6-.32-.6-.33-.57-.37-.53-.38-.6-.49-.6-.55-.19-.18-.18-.18-.18-.2-.34-.37-.25-.28-.21-.3-.52-.69-.63-1-.54-1-.45-1-.36-1-.32-1-.23-1-.2-1-.14-1-.11-1-.05-1v-3l.07-1 .1-1 .08-.61v-.24l-.22-1-.16-1-.14-1-.1-1v-4l.07-1 .08-1 .12-1 .15-1 .18-1 .18-1 .24-1 .23-1 .27-1 .3-1 .31-1 .34-1 .36-1 .39-.95.4-1 .43-.94.47-.91.46-.92.5-.9.54-.88.55-.89.58-.85.62-.85.63-.81.67-.8.68-.79.73-.76.77-.74.8-.7.85-.68.88-.65.92-.6 1-.57 1-.51 1.06-.47 1.09-.42 1.15-.33 1.16-.27 1.22-.2 1.23-.1h1.25zm-3.53 35.54v-.65zm-.13-5-.2.19-.24.23-.25.25-.26.3-.27.33-.27.35-.28.4-.27.42-.28.43-.15.29.35-.44.48-.58 1-1.37.65-.83z" fill="#fff"/><path d="m684.42 115.93h2.15l.38-.05h2.5l.35.07.35.08h.1l.37.1.33.12.5-.18.69-.24.7-.2.71-.18.74-.13.75-.1.75-.07h2.3l.76.08.77.12.75.15.75.2.73.21.74.27.7.28.7.34.68.35.67.36.65.4.63.44.62.45.56.43.54.43.51.47.52.48.48.5.47.52.43.53.44.54.4.55.38.56.37.59.33.6.32.58.28.62.27.61.25.62.21.62.22.68.32 1.2.23 1.25.15 1.27.08 1.23v1.23l-.05 1.22-.06.6.15.37.28.93.18.87.14.81.1.79v3.41l-.11 1.22-.15 1.12-.17 1-.18 1-.32 1.48-.22 1-.36 1.52-.25.9-.25.92-.29.95-.31 1-.35 1-.37 1-.4 1-.43 1-.47 1.06-.5 1.07-.55 1.07-.58 1.06-.64 1.07-.68 1-.73 1.05-.8 1-.84 1-.5.55-.48.48-.5.49-.53.46-.55.47-.59.45-.64.7-.64.41-.66.4-.69.37-.73.33-.75.32-.77.27-.81.25-.82.18-.85.17-.87.1-.86.06h-1.77l-.88-.08-.87-.14-.88-.18-.85-.23-.85-.27-.84-.3-.7-.3-.7-.33-.66-.37-.65-.38-.64-.4-.61-.44-.59-.45-.55-.46-.51-.53-.52-.52-.5-.52-.46-.53-.44-.55-.41-.57-.4-.56-.14-.19-.65-.11-.71-.17-.64-.17-.65-.18-.65-.22-.63-.21-.63-.27-.64-.27-.65-.31-.83-.45-.85-.5-.8-.54-.77-.56-.75-.62-.7-.65-.66-.67-.62-.7-.58-.73-.54-.75-.5-.75-.45-.78-.41-.79-.37-.8-.33-.8-.3-.8-.25-.8-.24-.81-.2-.8-.15-.8-.15-.8-.1-.79-.08-.8-.07-.78v-3.91l.07-.78.15-1.45.2-1.47.26-1.45.32-1.42.35-1.4.38-1.36.42-1.34.45-1.31.47-1.27.5-1.25.51-1.2.54-1.15.53-1.13.57-1.07.56-1 .6-1 .6-1 .55-.8.64-.82.68-.8.78-.78.6-.5.2-.17.2-.15.22-.15.33-.23.24-.15.21-.15.24-.13.35-.2.25-.14.23-.11.25-.12.37-.15.23-.1.25-.1.25-.08.72-.24 1-.25 1-.15.9-.08.82-.05h2.01zm-570.8 299.49h.53l.42.07.41.06.42.1.42.12.4.13.4.15.38.19h.07l.4.22.38.21.37.25.36.29.34.28.33.3.32.33.05.05.28.34.27.35.25.35.23.36.2.39.18.38v.08l.19.44.15.45.13.45.12.45v.11l.07.4.07.4v2.15l-.08 1.1-.15 1.09-.2 1.06-.23 1-.3 1-.34 1-.35.95-.4.93-.43.9-.45.89-.48.85-.5.83-.52.82-.12.16.07.22.1.37.1.38v.07l.06.41.07.4v2.12l-.05.37v.25l-.1.45-.12.46-.16.6-.34.87-.33.77-.35.73-.38.73-.42.74-.47.8-1 1.63-1.24 1.9-1.06 1.57.08.13.1.13.23.4.24.4.18.4.08.15.15.4.15.4.12.4.07.22.38-.25.77-.42.86-.4.6-.21.4-.14.4-.11.29-.07.45-.12.48-.06h3.04l.42.08.42.09.4.1.26.08.4.13.4.15.39.17.25.13.36.19.37.2.35.21.25.17.3.22.3.23.28.23.24.22.28.25.27.27.25.28.23.28.1.12.23.33.24.34.2.33.2.37.16.35.07.15.17.4.15.4.13.41.1.44v.15l.09.38v2.71l.08.5-.08.45v.22l-.1.36-.1.35-.17.5v.09l.25.28.29.4.28.4.25.42.22.45.2.45.16.45.15.46.12.49.08.48.05.48v1.47l-.07.48-.08.49-.12.48-.13.47-.17.46-.2.45-.21.44-.25.43v.08l-.24.34-.23.33-.25.3-.27.32-.35.36-.56.54-.57.48-1.13 1-1.39 1.08-1.6 1.24-1.78 1.33-1.92 1.4-2 1.45-2.07 1.45-2.18 1.4-2 1.35-2 1.25-.95.6-.92.55-.9.52-.86.5-.89.45-.91.42-1 .43-.75.22-.42.11-.43.1h-.17l-.43.08h-2.17l-.4.22-2.63 1.43-2.48 1.29-2.28 1.13-1.1.52-1 .46-1 .42-1 .38-1 .37-1 .3-.51.12-.37.06-.38.05h-1.93l-.47-.05-.43-.08-.45-.1-.43-.14h-.09l-.45-.15-.43-.18-.42-.2-.4-.24-.4-.25-.38-.26-.37-.3-.33-.3-.33-.34v-.05l-.32-.36-.3-.37-.27-.4-.25-.4-.23-.43-.2-.44-.17-.43-.16-.45-.12-.47-.07-.33h-2.05l-.4-.07-.4-.06h-.16l-.44-.1-.43-.11-.43-.15-.42-.19-.12-.05-.38-.18-.38-.2-.39-.23-.35-.25-.35-.27-.33-.28-.07-.07-.33-.32-.32-.33-.3-.35-.28-.37-.25-.38-.23-.4-.22-.4v-.08l-.18-.4-.15-.42-.14-.42-.11-.41-.1-.44-.07-.43v-2.3l.06-.43v-.12l.06-.38.1-.39.12-.36.13-.37.05-.13.12-.32.15-.3.15-.3.25-.47.48-.76.69-.89.66-.73.64-.67 1.08-1 1-.93.39-.37.26-.27.1-.11.07-.09 1.35-1.75 1.39-1.94 1.49-1.82 1.51-1.78 1.54-1.84.85-1-.12-.15-.25-.4v-.1l-.47-.09-.48-.11-.47-.14-.45-.15-.44-.19-.43-.21-.42-.24-.4-.26-.46-.29-.37-.3-.35-.33-.31-.34-.32-.36-.3-.37-.27-.4-.23-.4-.23-.42-.19-.43-.18-.45-.13-.45-.14-.47-.08-.45-.07-.48v-1.93l.08-.49.08-.46.12-.45.13-.41.15-.4.18-.4.2-.4.22-.39.23-.36.25-.35.29-.35v-.05l.26-.3.3-.3.32-.29.38-.33.64-.5 1.15-.8 1.46-1 1.75-1.17 2-1.3 1.3-.83.85-.79.93-.81.92-.79 1.73-1.48.72-.63.6-.57.2-.18.15-.17.08-.08v-.07l1.49-1.92 1.13-1.51.87-1.2.76-1.12.82-1.2 1-1.43 1.27-1.8 1.65-2.27 1.25-1.68 1.28-1.72 1.35-1.7.72-.9.68-.8 1.18-1.42.8-.93.49-.55.51-.53.59-.59.7-.63.83-.63.43-.29.34-.2.31-.18.14-.05.31-.17.32-.13.33-.13h.1l.37-.11.35-.12.37-.08.38-.07h.08l.45-.06h1.34z" fill="#fff"/><path d="m161.32 358.78.75.05.75.09.75.1.71.13.74.15.7.17.7.18.7.22.66.23.72.25 1.27.52 1.3.6 1.25.63 1.25.7 1.21.73 1.2.79 1.17.8 1.17.86 1.15.87 1.13.92 1.13 1 1.1 1 1.1 1 1.09 1 1.06 1 1.07 1 1 1.09 1 1.08 1 1.1 1 1.12 1 1.11 1 1.12 1 1.13.91 1.14.92 1.11.88 1.14.87 1.11.83 1.12.82 1.12.82 1.11 1.5 2.14 1.4 2.08 1.26 2 .62 1 .57.95.53.94.52.9.46.88.45.85.42.83.38.84.35.81.32.85.3.87.27 1 .13.69.08.46.05.47v1.92l-.06.58-.12.55-.07.33-.11.44-.12.43-.23.68-.42 1-.45.85-.45.78-.48.74-.5.7-.52.68-.53.67-.55.66-.6.69-1.19 1.3-1.3 1.33-1.38 1.35-1.45 1.38-1.52 1.4-1.56 1.4-1.64 1.44-1.65 1.43-1.71 1.34-1.72 1.43-3.4 2.8-3.33 2.77-3.18 2.55-2.94 2.33-2.56 2.07-2.14 1.71-.83.69-.67.56-.43.39-.27.23-2.73 2.69-2.8 2.78-2.83 2.78-2.85 2.75-2.85 2.75-2.85 2.72-5.72 5.44-5.75 5.41-5.75 5.39-11.5 10.76-11.48 10.69-5.72 5.31-5.68 5.37-5.65 5.38-2.82 2.7-2.8 2.7-2.8 2.72-2.78 2.71-2.77 2.74-2.73 2.73-.54.55-.5.52-1 1.13-1 1.17-1 1.2-1 1.23-1 1.25-2 2.62-2 2.61-1 1.34-1 1.31-1.08 1.32-1.12 1.3-1.15 1.25-.62.65-.63.62-.63.61-.65.6-.69.59-.7.58-.71.57-.75.55-.77.53-.8.5-.83.5-.85.45-.89.43-.91.4-.94.35-1 .34-1 .28-1 .23-1 .19-1 .13-1.06.1h-2.35l-1.08-.05-1.09-.12-1.1-.17-1.1-.21-1.1-.27-1.08-.3-1.1-.37-1.05-.36-1.1-.45-1.1-.48-1.1-.54-.72-.36-.7-.4-.68-.4-.69-.44-.65-.41-.66-.49-1.22-.88-1.18-1-1.15-1-1.12-1-1.07-1-1-1-1-1-.95-1-.94-1-1.7-1.89-1.55-1.78-1.31-1.52-1.25-1.5-1.2-1.46-1.16-1.38-1.07-1.42-1-1.38-1-1.37-.83-1.35-.82-1.3-.76-1.34-.7-1.31-.62-1.35-.59-1.3-.53-1.3-.47-1.3-.4-1.3-.36-1.3-.27-1.3-.2-1.32-.13-1.31v-1.32l-.05-1.25.11-1.28.19-1.32.25-1.25.32-1.22.38-1.18.45-1.13.5-1.1.53-1.07.59-1 .61-1 .65-.95.67-.92.7-.86.72-.85.75-.84.75-.81.76-.79.79-.76.8-.77.83-.77 1.65-1.46 1.7-1.47 1.71-1.48 1.75-1.49 1.77-1.51 1.78-1.57 1.82-1.63.88-.8.9-.85.9-.87.9-.88.9-.9.9-.92.89-.95.91-1 7.19-8 3.63-4 3.65-4 3.67-4 3.71-3.95 3.74-3.93 3.76-3.9 1.94-1.85 1.92-1.94 1.93-1.93 2-1.92 2-1.9 2-1.9 2-1.88 2-1.88 2-1.85 2-1.85 2-1.85 1.95-1.82 2.08-1.82 2.1-1.8 2.12-1.76 2.1-1.74 2.13-1.78 2.09-1.78 2-1.8 2-1.82 2-1.85 2-1.85 2-1.88 2-1.9 4-3.84 4.09-3.86 2.08-1.95 2.1-1.95 2.13-1.94 2.2-2 1.55-1.33 2.32-1.94 2.8-2.3 3-2.45 5.27-4.28 1.71-1.37.7-.53.34-.23.68-.42.72-.35.75-.28.51-.14-.06-.79v-.8l.08-.78.15-.78.22-.77.3-.73.35-.7.43-.67.49-.63.55-.57.48-.47.63-.55.67-.53.67-.5.71-.45.74-.43.73-.39.77-.35.76-.31.79-.27.78-.23.8-.2.8-.15.78-.12.8-.08h2.34zm-.95 16.65h-.22l-.06.05-.07.06-.2.2-.6.52-.65.47-.68.4-.72.31-.75.27-.35.08.08.7v.8l-.06.8-.14.79-.21.76-.29.74-.36.71-.42.69-.48.63-.55.58-.59.52-.53.38.07-.07-.19.15-1.56 1.25-5.2 4.22-2.94 2.4-2.73 2.27-2.22 1.83-1.31 1.13-2 1.8-2 1.85-2 1.89-2 1.88-4.05 3.83-4.39 4.01-2 1.94-2.08 1.93-2.1 1.95-2.13 1.93-2.17 1.92-2.2 1.91-2.25 1.92-2.25 1.87-2 1.7-2 1.68-2 1.7-2 1.73-2 1.74-2 1.75-1.95 1.76-1.87 1.81-1.92 1.8-1.9 1.8-1.88 1.83-1.88 1.83-1.89 1.85-1.85 1.87-1.86 1.87-1.82 1.88-3.68 3.8-3.65 3.83-3.67 3.89-3.62 3.9-3.6 3.91-3.58 3.95-7.2 8-1 1.11-1 1.12-1 1.1-1.17 1.09-1 1-1 1-1 1-1 .95-2 1.76-1.91 1.69-1.92 1.5-1.75 1.5-1.67 1.42-1.58 1.33-1.44 1.28-.56.57-.62.59-.58.56-.53.55-.5.54-.45.51-.42.49-.37.46-.33.45-.28.42-.25.4-.22.37-.17.35-.15.31-.11.3-.1.3-.07.29-.07.26v1.65l.06.42.1.48.14.52.18.58.23.64.27.68.33.73.4.8.45.85.52.9.58 1 .65 1 .74 1 .78 1.1.87 1.15.95 1.2 1 1.25 1.09 1.32 1.18 1.37 1.43 1.63 1.55 1.72.72.86.78.82.8.81.8.79.8.73.79.72.76.65.75.6.77.56.32.22.33.22.33.21.32.19.3.16.28.15.64.3.6.27.58.23.53.2.5.15.47.14.42.1.4.08.36.05h1.75l.24-.05h.25l.23-.07.25-.08.25-.1.25-.1.27-.13.28-.15.28-.17.32-.2.3-.22.33-.25.35-.25.34-.3.36-.31.37-.34.38-.36.39-.39.38-.4.83-.91.85-1 .89-1 .9-1.13.91-1.2 2-2.57 2.08-2.7 1.1-1.41 1.14-1.56 1.2-1.43 1.25-1.45 1.3-1.42.7-.73.7-.7 2.82-2.82 2.81-2.78 2.84-2.77 2.83-2.75 2.85-2.75 2.85-2.73 5.72-5.43 5.73-5.4 5.73-5.39 11.5-10.7 11.5-10.7 5.7-5.35 5.7-5.36 5.67-5.34 2.82-2.7 2.8-2.71 2.8-2.72 2.8-2.73 2.76-2.74 2.87-2.85.63-.6.79-.68.85-.73 1-.8 2.22-1.8 2.61-2.09 2.92-2.33 3.13-2.52 3.27-2.63 3.28-2.72 1.62-1.35 1.6-1.35 1.55-1.33 1.5-1.32 1.42-1.28 1.35-1.25 1.25-1.18 1.13-1.12 1-1 .88-1 .23-.27-.08-.15-.33-.61-.39-.69-.41-.71-.47-.77-.47-.78-1.1-1.72-1.21-1.8-1.34-1.9-.68-.95-.72-1-.75-1-.76-1-.77-1-.8-1-.82-1-.83-1-.83-1-.85-1-.87-1-.87-.95-.88-.92-.87-.9-.88-.88-.88-.87-.89-.82-.88-.8-.87-.76-.86-.72-.85-.68-.84-.65-.81-.6-.82-.55-.77-.5-.75-.47-.71-.4-.69-.33-.63-.3-.63-.25-.24-.09-.25-.1-.25-.06-.21-.07-.22-.05h-.98z"/><path d="m336.5 188.15 1.07.1 1 .13 1 .19 1 .2.95.21.94.24.9.25.9.26 1.65.54 1.58.55 1.52.53 1.38.48 1 .19 2.13.43 1 .17 1.27.21 2.93.47 1.34.23.66.14.82.18.53.17.69.25.63.3.62.36.6.42.56.48.52.52.47.56.41.6.1.19h.12l.2.05.68.19.67.23.2.08.53.25.52.27.2.12.42.26.4.29.2.13.3.25.3.27.43.38.58.62.5.6.42.56.4.59.27.43.25.17 4.2 2.81 1.63 1.12.77.57.45.36.58.52.52.57.1.13.43.57.38.6.34.63.28.67.22.66.15.71.07.4.52.29 1.25.71.68.42.68.42.7.46.7.5.74.55.75.64.75.73.51.58.49.6.46.62.42.67.37.68.18.42.18.43.15.43.05.12.15.52.1.53.09.53v.09l.05.76v.75l-.09.77-.15.73v.07l-.2.65-.24.63-.3.62-.35.58-.4.55-.43.54-.47.48h-.05l-.35.3.2.64.24.9.2.9.18.88.15.88.12.87.1.85.1.88.11 1.6v1.19l.27 1 .35 1.43.18 1.12.29 1.78.35 2.37.36 2.65.17 1.38.15 1.35.13 1.32.1 1.25.05 1.18v1.45l-.05.53-.07.47-.08.45-.05.18-.17.67-.23.65-.27.62-.07.11.05.07.3.5.24.41.4.84.3.73.26.75.24.75.2.75.18.73.13.74.12.73.08.73.07.72v2.87l-.08 1.33-.14 1.37-.2 1.35-.23 1.35-.27 1.31-.31 1.3-.35 1.3-.39 1.27-.4 1.27-.41 1.25-.45 1.21-.47 1.2-.23.55v2.94l-.05.76-.1.77-.19.75-.25.72-.31.7-.37.68-.43.63-.5.59-.55.53-.59.5-.65.43-.66.37-.57.25-.1.17-.83 1.36-.39.65-.65 1.14-.85 1.48-.5.85-.55.87-.58.9-.63.9-.7.93-.17.2-.85 1.6-1 1.68-.83 1.42-.8 1.25-.77 1.13-.82 1.19-1 1.41-.32.45-.28 1.1-.37 1.1-.4 1-.45 1-.47 1-.51 1-.54 1-.36.68-.17.53v.12l-.22.6-.27.57-.08.15-.23.41-.25.4-.42.64-.65.83-.63.73v.05l-.35.55-.66 1-.67 1-.67.95-.65.91-.66.89-.67.83-.68.8-.72.78-.82.8-.9.77-.73.52-.45.26-.42.24-.41.2-.14.06-.61.25h-.05l-1.59 1.59-3.25 3.13-.13.13-.27.54-.41.63-.47.6-.52.55-.83.83-.95.9-1.18 1.12-1.32 1.23-1.4 1.27-1.4 1.2-.73.62-.65.51-2.55 2-1.5 1.15-1.5 1.39-1.73 1.28-1.84 1.35-1.9 1.3-1 .66-1 .65-1 .65-1 .64-1 .61-1.05.6-1.05.59-1.08.55-1.07.53-1.1.5-1.11.48-1.14.44-1.15.4-1.18.35-1.22.3-1.2.21-.71.1-.69.07h-1.95l-.76-.08-.74-.15-.73-.23-.37-.15-.26.11-1.97.87-2 .81-2 .79-1.07.38-1.05.37-1 .33-1.05.33-1.05.29-1.06.26-1.07.24-1.1.2-1.13.15-1.19.1h-1.33l-.78-.05-.74-.09-.76-.15-.84-.2-.51-.18-.72-.27-.2-.1-.35-.21-.23.07-.45.07-1 .11-1 .05-1.15.05h-1.94l-.78-.08-.93-.13-1-.24-1.31-.43-1.12-.4-1.08-.43-1-.44-.23-.11h-4.35l-.76-.1-.74-.18-.73-.23-.7-.32-.67-.37-.63-.43-.6-.48-.53-.54-.5-.6-.44-.61-.25-.45-.53-.17-2.53-.85-1.55-.5-.92-.28-.12.06-1 .54-1 .43-1 .33-1 .27-1 .17-1 .1h-1.88l-.88-.09-.87-.13-.83-.17-.8-.2-.77-.23-.75-.25-.73-.27-.7-.3-.69-.31-.68-.34-.65-.33-.65-.37-.67-.38-1.18-.75-1.18-.82-1.17-.83-1.12-.87-1.08-.9-1.07-.9-1-.91-1-.92-.8-.78-.14-.07-.43-.28-.27-.19-.36-.25-.35-.28-.52-.45-.68-.67-.6-.65-.55-.63-.54-.65-.53-.7-1-1.35-1-1.45-.89-1.28-1.88-2.59-1.25-1.73-1.23-1.72-1.07-1.55-.5-.75-.29-.59-.37-.66-.13-.27-.3-.68-.24-.72-.16-.73v-.07l-.1-.7v-1.4l.07-.68.13-.7.2-.67.25-.65.1-.21-.36-.7-1-1.9-.93-1.9-.45-1-.45-1-.42-1-.42-1-.4-1-.38-1-.37-1.05-.35-1.06-.36-1.22-.34-1.22-.3-1.2-.28-1.2-.27-1.16-.23-1.19-.43-2.26-.75-4.32-.39-2.05-.18-1-.2-.91-.3-1.37-.42-1.83-.18-1-.1-.63-.05-.44v-1.21l.05-.74.11-.73.19-.7.13-.38-.27-.4-.4-.75-.33-.74-.27-.73-.21-.7-.15-.68-.14-.67-.1-.72-.08-1.1v-1.15l.05-1.08.1-1.05.15-1 .18-1 .2-1 .24-.95.25-.92.26-.91.29-.9.3-.89.3-.88.61-1.63.62-1.57.62-1.43.56-1.32.54-1.15.8-1.65.36-.7.3-.55v-.07l.07-.51v-.15l.17-.77v-.17l.12-.4.15-.38.27-.7.45-1 .41-.75.39-.65.36-.58.54-.82.13-.48.22-.74.23-.73.27-.73.51-1.32.57-1.3.57-1.23.58-1.19.58-1.13.57-1.08.43-.82.57-1.27.78-1.66.25-.55.15-.47.44-1.27.48-1.25.53-1.21.55-1.19.59-1.16.6-1.15.63-1.14.63-1.11.65-1.09.67-1.06.67-1.05.68-1 .27-.4v-.08l.2-.38.12-.72.13-.7.17-.68.18-.67.2-.65.23-.63.25-.67.5-1.13.57-1.15.6-1.1.65-1 .67-1 .68-1 .73-1 .74-1 .75-.92.76-.9.77-.88.78-.85.79-.87 1.53-1.56 1.52-1.52 1.46-1.4 2.57-2.45 1.07-1 1.1-1.08 1.63-1.42 3-2.58 3.11-2.64 1.24-1 .91-.73.72-.48.63-.4 1.22-.72 1.3-.7.75-.38.73-.34.79-.33.58-.23.35-.25.72-.54.71-.48.72-.48.75-.47.75-.45.77-.43.78-.42.8-.38.83-.39.87-.33.88-.32.94-.28 1-.22 1-.18 1.08-.12h1.12l1.16.07.82.1.38.06.39.09.45.1.4.11.38.12.43.15.4.15.39.17.41.18.34.17 1-.17 1.07-.52v-.15l.1-.7.15-.68.2-.67.24-.58.28-.58.33-.54.37-.53.43-.5.45-.49.5-.43.52-.38.56-.35h.07l.58-.32.62-.25.62-.22.63-.16h.13l.69-.12.7-.06h1.6l.75.1 1 .18 1 .22.92.25 1.68.48 1.62.47.68.2.55.13.34.09h.16l.77.1.95.09 1.07.06 1.15.09 2.51.13 1.35.08 1.4.12 1.45.13 1.49.17 1.48.22.8.15.77.15.8.16.78.2.8.22.8.25.82.27.81.31.82.35.67.3.68.37.17.1.5.32.46.35.45.38v.05l.53.53.48.59.1.15h.6l.3-.27.62-.46.65-.4.7-.35.72-.29.75-.2.75-.15.78-.06h1.7zm-35.93 17-2.14.33-2.13.3-2 .29-1.89.25-1.68.2-1.43.15-1.19.11-.81.05-1.54.78-3.11 1.6-1.65.79h-.08l-.07.05-.73.41-.75.44-1.4.73-1.42.7-1.35.63-1.26.55-1.15.49-1 .4-1 .35-.62.18-.38.1-.38.08-.54.1-.73.12-1.32.17h-.25l-.6.12-.91.15h-.27l-1.38 1-1.49 1-1.4 1-1 .65-.65.58-1 .87-1 .83-.64.48-.4.69-.76 1.16-.77 1.15-.78 1.12-.79 1.08-.8 1.07-.8 1-.8 1-1.55 1.92-1.43 1.73-.28.35-.34.43-.76 1.07-.17.4-.32.77-.35.76-.66 1.44-.7 1.38-.7 1.35-.7 1.28-1.29 2.34-.55 1-.48.93-.38.79-.3.65-.2.51-.29.79-.73 2.11-.82 2.42-.45 1.27-.46 1.26-.49 1.25-.51 1.19-.35.7-.37.68-.45.75-.37.5-.28.37-.3.36-.17.19-.53.53-.58.5-.17.12-.48.35-.5.3-.54.26h-.06l-.4.16v.17l.12.57.16 1.33.1 1.18v3.4l.12.33.2.73.13.77.05.77v1.26l-.07.55-.1.55-.13.55v.09l-.2.63-.26.62-.3.58-.37.57-.2.26-.2 1-.45 1.88-.9 3.54-.42 1.68-.38 1.6-.33 1.57-.1.53.53.47.53.56.47.6.42.65.36.67.3.72.22.73.15.75.1.77v1.45l-.08.9-.14 1-.15.63-.08.38-.12.39-.1.26-.16.45-.19.45-.1.22-.28.55-.32.52-.11.18-.45.6-.49.57-.13.13-.43.42-.45.38-.49.35-.13.1-.58.35h-.07l.43 1.45.3.92.3.88.3.84.35.91.27.74.33.9.62 1.9.62 2 .28 1 .28 1 .24 1 .21 1 .2 1 .09.71v1.55l-.05.54v.13l-.1.62-.14.6-.05.16.77 1.44.9 1.63.93 1.63 1 1.67 2 3.38 1 1.7 1 1.74 1 1.76.87 1.59.05.08.13.2.25.32.7.86.44.59.5.7.16.23.57-.08h2.35l1.1.09 1.06.13 1 .15 1 .2 1 .23 1 .27 1 .28 1 .3 1 .32.95.33.95.35.94.39.93.38 1.78.77 1.75.8 1.69.81 1.63.8 1.55.79 2.83 1.43 1.25.63 2.07 1 .93.47 1.59.82.78.2.92.21.93.22.72.15h.18l1.82-.35 1.91-.37 1.94-.35 1.71-.28 1.19-.19 1.23-.15.8-.06h2l.5.07.27.05.68.13.67.2h.08l.72.29.66.33h.07l.52.3.23.17 2.5-.34 1.5-.2 1.53-.16 1.57-.17 1.62-.12 1.65-.06h1.46l2.6-1.2 1.9-.86.12-.05.39-.22.5-.31.65-.4 1.53-1 .87-.55.93-.57.95-.55.62-.3.6-.3.68-.28.78-.27.55-.15.39-.1.38-.08.25-.05.48.17.51-.05h.92l.7.05h.2l.6.08.6.15.57.17.18.06.52.2.65-.46 1.55-1.2 1.5-1.13 1.42-1.09 2.45-1.88.43-.35.45-.37 1.12-1 1.18-1.07.87-.82.25-.45.38-.6.45-.55.27-.31 1.88-1.87 1.64-1.6 3.21-3.12 1.55-1.51 1.14-1.15.35-.69.35-.65.38-.6.4-.61.73-1.05.8-1 .84-1 .85-1 .85-.94.86-.88.85-.83.35-.34v-.26l.1-.69.13-.75.17-.83.23-.9.27-1 .38-1.09.45-1.06.37-.7.38-.67.48-.72.37-.45.5-.56.17-.19.31-.31.35-.3.17-.15.42-.34.45-.3.18-.11.53-.3.1-.05.69-.81.76-1.12.34-.46-.07-.32-.07-.48v-1.57l.05-.5v-.32l.06-.48.1-.47.17-.71.32-1 .35-.85.35-.78.36-.72.39-.68.4-.7.75-1.22.8-1.18.8-1.12.73-1 .7-.9 1.05-1.32.42-.52.5-.56.55-.52.61-.47.64-.4.68-.35.7-.28.22-.07.41-.86.17-.35v-8.3l.05-.9.09-.92.05-.5.05-4.3v-13.1l-.05-.17-.24-.7-.35-1.28-.33-1.35-.28-1.38-.25-1.4-.24-1.42-.2-1.45-.18-1.47-.17-1.46-.15-1.47-.11-1.45-.12-1.45-.2-2.75-.13-2.57v-.11l-.37-.79-1-1.93-1-1.92-1.07-2-1.1-2-2.25-4-1.13-2-.37-.67-.51-.32-1.64-.91-1.65-.89-1.68-.86-1.73-.89-1.77-.86-3.63-1.8-1.87-.94-1.88-1-1.9-1-1.93-.94-1-.57-1-.56-1-.6-1-.62-.94-.63-.88-.64-.8-.61-.68-.59-.44-.38h-4.6l-2.48.05h-11.6l-1.57-.07-1.58-.08-1.6-.12-1.62-.15-1.61-.17-1.62-.21-1.63-.25-1.64-.3-1.61-.34-1.59-.38z" fill="#fff"/><path d="m318.07 198.68h2.53l1.27.05 1.26.07 1.27.08 1.25.1 1.27.12 1.25.15 1.25.15 1.23.17 1.25.18 1.23.22 1.24.21 1.21.25 1.22.25 1.2.32 1.2.3 1.2.33 1.2.33 1.18.37 1.18.37 1.17.4 1.17.43 1.15.43 1.13.47 1.13.48 1.12.52 1.17.57 1.1.55 1.08.59 1.08.6 1.07.61 1.05.65 1 .67 1 .7 1 .72 1 .75 1 .76 1 .8.94.82.91.83.9.87.89.9.86.92.84.95.81 1 .8 1 .77 1 .75 1 .72 1.07.7 1.08.68 1.12.63 1.15.64 1.16.58 1.19.57 1.21.53 1.24.52 1.25.46 1.28.45 1.3.44 1.32.38 1.35.37 1.36.31 1.39.3 1.41.32 1.65.27 1.69.25 1.68.2 1.7.16 1.7.12 1.7.1 1.72.07 1.71v5.2l-.07 1.74-.1 1.73-.13 1.75-.17 1.73-.25 1.73-.22 1.75-.25 1.74-.28 1.75-.3 1.73-.32 1.75-.36 1.73-.37 1.74-.42 1.73-.41 1.73-.47 1.74-.47 1.71-.51 1.72-.52 1.7-.55 1.7-.57 1.7-.6 1.68-.6 1.69-.63 1.66-.67 1.65-.66 1.65-.7 1.64-.7 1.63-.74 1.62-.75 1.6-.78 1.6-.78 1.56-.8 1.57-.84 1.55-.83 1.53-.8 1.55-.88 1.5-.89 1.47-.9 1.46-.91 1.45-.94 1.44-.95 1.4-1 1.4-1 1.36-1 1.34-1 1.33-1 1.3-1 1.28-1 1.25-1.07 1.24-1.06 1.2-1.09 1.18-1.1 1.15-1.21 1.15-1.08 1-1.17 1-1.2 1-1.25 1-1.3 1-1.32.9-1.35.87-1.38.83-1.4.8-1.44.77-1.46.75-1.49.71-1.5.7-1.5.65-1.53.65-1.53.6-1.55.57-1.57.55-1.55.52-1.57.48-1.56.45-1.55.42-1.55.38-1.55.35-1.55.32-1.52.28-1.52.23-1.51.2-1.49.17-1.48.12-1.45.06h-3.78l-2.4-.06-2.45-.12-2.49-.18-2.53-.22-2.57-.28-2.56-.34-1.35-.23-1.3-.2-1.31-.23-1.32-.24-1.33-.25-1.32-.25-1.33-.28-1.34-.3-1.31-.32-1.34-.33-1.33-.33-1.33-.37-1.32-.38-1.32-.4-1.33-.42-1.32-.43-1.3-.47-1.31-.47-1.3-.5-1.29-.51-1.28-.54-1.28-.55-1.27-.58-1.27-.6-1.25-.62-1.23-.65-1.23-.66-1.22-.69-1.2-.71-1.18-.74-1.17-.76-1.17-.79-1.13-.81-1.12-.84-1.1-.86-1.08-.9-1.07-.92-1-.95-1-1-1-1-1-1-.95-1.06-.9-1.1-.9-1.12-.85-1.15-.82-1.2-.78-1.2-.75-1.25-.72-1.27-.7-1.35-.57-1.18-.5-1.25-.46-1.28-.4-1.29-.35-1.3-.3-1.31-.27-1.34-.23-1.33-.19-1.37-.15-1.36-.11-1.39-.09-1.4-.06-1.41v-5.77l.08-1.47.09-1.48.11-1.48.14-1.49.15-1.5.18-1.5.18-1.51.22-1.52.22-1.52.25-1.5.25-1.51.26-1.52.29-1.53.6-3 .65-3 .68-2.95.73-2.91.75-2.87.77-2.8.78-2.72.82-2.65.8-2.55.82-2.43.8-2.33.8-2.22.8-2.08.76-1.95.77-1.82.75-1.65.65-1.38.28-.6.25-.57.25-.68.29-.77.28-.83.3-.9.62-2 .63-2.15.68-2.22.35-1.15.39-1.15.38-1.15.42-1.15.45-1.17.46-1.15.52-1.15.58-1.15.62-1.08.38-.63.4-.57.42-.58.45-.59.5-.58.55-.57.62-.56.66-.55.74-.54.83-.5.88-.45.62-.25.4-.14.35-.12.3-.08.38-.12.39-.08h.28l.4-.08.4-.05h2.88l.37.07.68.11.27.07.27-.17 1-.63 1-.62 1-.6 1-.58 1-.58 1-.57 1-.57 1-.53 1.07-.55 1.07-.52 1.08-.51 1.1-.5 1.1-.5 1.12-.49 1.13-.46 1.13-.45 1.14-.45 1.15-.44 1.16-.43 1.17-.42 1.18-.4 1.19-.38 1.24-.37 1.22-.37 2.4-.68 2.41-.65 1.25-.3 1.24-.3 1.23-.29 1.25-.26 1.23-.25 1.25-.24 1.27-.23 1.25-.22 1.27-.2 1.26-.18 1.25-.17 1.29-.16 1.26-.15 1.27-.12 1.27-.12 1.28-.1 1.27-.1 1.28-.06 1.27-.07h5.1zm-2.3 16.67h-2.15l-1.07.05-1.08.05-1.09.08-1.08.08-1.08.1-1.09.12-1.08.12-1.1.13-1.08.15-1.09.17-1.08.16-1.07.19-1.08.2-1.08.2-1.07.21-1.07.24-1.06.23-1.07.27-1 .25-2.12.56-2.08.6-1 .3-1 .34-1 .33-1 .33-1 .35-1 .37-1 .37-1 .38-1 .38-.95.4-.93.4-.93.42-.9.42-.92.43-.88.43-.89.45-.85.45-.85.45-.85.47-.81.47-.8.46-.8.49-.79.5-.75.48-.75.5-.71.5-.64.62-.7.5-.67.51-.66.52-.64.52-.61.53-.6.52-.59.53-.56.53-.6.59-.5.46-.55.42-.59.37-.61.31-.64.29-.65.21-.48.12-.58 1.93-.65 2.19-.69 2.18-.36 1.13-.37 1.1-.4 1.1-.43 1.1-.47 1.1-.45 1-.58 1.22-.57 1.28-.63 1.5-.67 1.67-.7 1.83-.72 2-.73 2.12-.75 2.23-.73 2.35-.75 2.44-.74 2.53-.71 2.58-.69 2.65-.66 2.69-.64 2.71-.6 2.74-.55 2.76-.25 1.35-.28 1.29-.21 1.37-.22 1.35-.2 1.35-.18 1.33-.17 1.33-.17 1.3-.13 1.3-.1 1.29-.1 1.25-.08 1.23v1.22l-.05 1.18v4.47l.06 1 .09 1 .11.95.12.9.15.87.15.82.18.75.19.7.21.65.2.6.22.51.25.52.4.8.47.8.48.8.5.78.53.77.55.75.59.73.6.74.63.7.65.7.68.7.7.66.72.67.75.65.78.63.79.62.81.62.84.6.86.58.89.57.88.56.92.54 1 .53 1 .52 1 .5 1 .5 1 .46 1 .47 1 .45 1 .43 1.05.42 1.06.4 1.09.4 1.08.38 1.1.37 1.1.35 1.12.33 1.11.32 1.14.32 1.13.28 1.13.28 1.14.27 1.13.27 1.15.23 1.15.23 1.13.22 1.15.2 1.14.18 1.13.19 1.12.15 2.28.3 2.23.25 2.2.18 2.17.15 2.12.12 2.06.05h3.85l1-.08 1.05-.12 1.09-.15 1.13-.16 1.17-.22 1.18-.25 1.22-.27 1.23-.3 1.25-.35 1.25-.35 1.27-.4 1.26-.41 1.27-.44 1.27-.46 1.25-.5 1.23-.52 1.22-.52 1.18-.56 1.17-.57 1.15-.58 1.1-.6 1.06-.6 1-.62 1-.63.93-.64.87-.61.82-.64.76-.63.69-.6.66-.63.87-.89.9-.95.9-1 .88-1 .89-1 .88-1.05.87-1.09.86-1.11.87-1.12.85-1.17.83-1.16.84-1.2.83-1.22.8-1.25.8-1.25.8-1.28.77-1.3.76-1.32.75-1.32.74-1.35.73-1.36.7-1.37.7-1.4.68-1.4.65-1.42.65-1.41.64-1.44.61-1.45.59-1.45.58-1.46.57-1.47.53-1.48.52-1.49.5-1.48.48-1.5.47-1.5.43-1.5.42-1.5.4-1.5.36-1.5.35-1.5.34-1.5.3-1.5.28-1.5.27-1.5.23-1.48.2-1.49.18-1.48.17-1.48.13-1.45.12-1.47.08-1.45.05-1.43v-5.66l-.08-1.37-.1-1.37-.14-1.35-.15-1.33-.18-1.32-.22-1.3-.23-1.28-.22-1-.25-1-.25-1-.26-1-.3-.92-.32-.9-.32-.88-.35-.87-.36-.83-.39-.82-.38-.78-.42-.79-.43-.75-.45-.73-.45-.73-.48-.7-.49-.69-.51-.66-.52-.65-.53-.64-.55-.63-.57-.6-.58-.6-.6-.57-.62-.56-.63-.55-.64-.54-.66-.51-.67-.52-.68-.48-.72-.49-.72-.46-.73-.45-.75-.44-.75-.43-.78-.4-.79-.4-.81-.38-.82-.39-.83-.35-.84-.35-.86-.33-.87-.32-.88-.3-.9-.28-.9-.28-.94-.25-.91-.25-.95-.24-.95-.23-.95-.2-1-.2-1-.17-1-.16-1-.15-1-.15-1-.12-1-.12-1-.08-1-.08-1-.09h-1.05l-1.05-.05h-4.4z"/><path d="m296.1 170.57 2 .05 2 .08 2 .13 2 .15 2 .19 1.95.2 1.95.23 1.92.25 1.91.27 1.92.26 3.75.59 7.4 1.21 3.67.59 1.78.26 1.9.29 1.53.25 1.22.21 1.38.27 1.55.32 1.69.36 1.78.42 1.82.45 1.81.48.94.29.9.28.9.28.9.32.88.35.88.37.9.4.9.46 1 .59.92.65.61.51h.17l1.25.12 1.25.13 1.23.15 1.22.19 1.22.21 1.18.24 1.18.25 1.17.26 1.15.3 1.13.34 1.14.33 1.1.38 1.1.39 1.08.41 1.07.44 1.05.45 1 .46 1 .5 1 .52 1 .53 1 .55 1 .59.93.58.94.62.9.63.9.63.86.67.87.68.85.7.82.7.81.74.8.73.79.77.75.76.75.79.73.8.72.8.7.83.68.83.67.85.65.85.63.87.62.88.6.89.6.9.56.91.57.92.55.93.52.94.51.93.5 1 .5.95.47 1 .47 1 .43 1 .43 1 .42 1 .42 1 .38 1 .38 1 .37 1 .35 1.05.67 2 .61 2.09.57 2.11.52 2.12.48 2.13.42 2.15.38 2.15.33 2.17.3 2.18.24 2.17.21 2.18.17 2.19.12 2.2.06 2.18.05 2.18v2.17l-.05 2.18-.08 2.17-.12 2.15-.15 2.15-.2 2.13-.23 2.12-.27 2.1-.3 2.08-.35 2.07-.36 2.05-.42 2-.45 2-.48 2-.52 2-.55 1.9-.53 1.68-.54 1.68-.55 1.67-.58 1.65-.6 1.67-.62 1.65-.65 1.63-.65 1.65-.68 1.63-.7 1.62-.73 1.62-.74 1.61-.88 1.62-.79 1.58-.8 1.6-.81 1.59-.84 1.56-.85 1.57-.86 1.57-.9 1.55-.92 1.53-.92 1.53-.95 1.52-1 1.5-1 1.5-1 1.5-1 1.48-1 1.47-1 1.45-1.05 1.45-1.08 1.43-1.1 1.42-1.13 1.4-1.12 1.4-1.15 1.38-1.15 1.37-1.16 1.35-1.2 1.33-1.2 1.33-1.22 1.34-1.23 1.3-1.24 1.28-1.26 1.27-1.27 1.27-1.3 1.23-1.3 1.23-1.3 1.2-1.33 1.2-1.35 1.17-1.35 1.15-1.37 1.15-1.37 1.12-1.4 1.11-1.4 1.09-1.41 1.06-1.44 1.05-1.43 1-1.45 1-1.47 1-1.48 1-1.48.95-1.5.94-1.5.91-1.52.89-1.53.86-1.54.85-1.55.82-1.56.8-1.57.78-1.58.75-1.59.74-1.6.71-1.61.69-1.62.66-1.63.64-1.64.6-1.63.58-1.65.57-1.67.53-1.66.5-1.69.48-1.68.45-1.65.42-1.7.38-1.7.38-1.72.34-1.72.31-1.71.29-1.74.25-1.73.21-1.75.2-1.75.15-1.75.14-1.75.1-1.77.06h-5.3l-1.78-.07-1.77-.1-1.78-.13-1.78-.17-1.79-.2-1.81-.14-1.8-.27-1.78-.3-1.79-.33-1.8-.38-1.78-.4-1.8-.45-1.78-.49-1.79-.51-1.78-.55-1.8-.6-1.78-.64-1.77-.66-1.78-.7-1.79-.75-1.76-.79-1.77-.81-1.77-.87-1.76-.88-1.75-.95-1.77-1-1.75-1-1.73-1.05-1.74-1.1-1.75-1.13-1.7-1.17-1.66-1.2-1.62-1.23-1.58-1.25-1.54-1.3-1.5-1.32-1.45-1.35-1.41-1.38-1.39-1.4-1.31-1.43-1.3-1.45-1.25-1.49-1.2-1.51-1.17-1.52-1.13-1.57-1.09-1.56-1-1.6-1-1.62-.95-1.63-.93-1.65-.88-1.69-.85-1.68-.8-1.72-.77-1.71-.73-1.74-.69-1.75-.65-1.78-.61-1.77-.59-1.8-.53-1.8-.5-1.81-.47-1.84-.43-1.83-.4-1.85-.37-1.85-.33-1.87-.28-1.88-.27-1.88-.23-1.89-.19-1.88-.16-1.9-.14-1.92-.08-1.9-.07-1.91v-5.77l.06-1.93.09-1.92.11-1.93.14-1.94.18-1.93.2-1.93.23-1.94.27-1.93.28-1.93.32-1.92.33-1.93.39-1.94.38-1.91.43-1.92.45-1.92.47-1.9.5-1.9.52-1.9.55-1.9.58-1.88.6-1.88.62-1.89.65-1.86.66-1.85.7-1.85.72-1.85.73-1.82.77-1.83.78-1.8.82-1.82.82-1.78.86-1.79.87-1.76.9-1.75.92-1.74.93-1.73 1-1.72 1-1.7 1-1.68 1-1.67 1-1.65 1.07-1.63 1.07-1.62 1.1-1.6 1.11-1.58 1.14-1.58 1.16-1.54 1.09-1.57 1.18-1.52 1.22-1.48 1.22-1.47 1.25-1.45 1.26-1.41 1.29-1.4 1.3-1.39 1.31-1.36 1.34-1.34 1.35-1.3 1.35-1.28 1.38-1.27 1.4-1.23 1.42-1.2 1.43-1.18 1.45-1.15 1.47-1.12 1.48-1.1 1.48-1.07 1.52-1 1.53-1 1.54-1 1.56-.94 1.57-.91 1.58-.89 1.6-.83 1.62-.82 1.63-.76 1.64-.74 1.65-.7 1.68-.66 1.68-.64 1.67-.58 1.08-.35 1.07-.32 1.07-.31 1.05-.29 1.06-.26 1.07-.25 1.05-.24 1.05-.21 1.07-.2 1.05-.19 1.05-.16 1-.14 1-.15 1.05-.11 1-.1 1.07-.09 2-.15 2-.08h2.05zm-3.55 16.7-1.65.06-1.67.12-.8.07-.81.08-.82.08-.8.1-.82.12-.8.13-.81.14-.8.16-.8.15-.82.19-.8.18-.8.22-.8.21-.8.22-.8.25-.8.27-1.35.46-1.32.49-1.33.53-1.32.55-1.31.6-1.32.62-1.3.65-1.3.68-1.3.72-1.28.75-1.29.78-1.26.8-1.27.83-1.27.87-1.25.88-1.23.92-1.23.95-1.24 1-1.2 1-1.21 1-1.19 1.05-1.18 1.08-1.18 1.1-1.17 1.14-1.15 1.15-1.13 1.16-1.14 1.2-1.1 1.22-1.11 1.25-1.09 1.27-1.06 1.28-1.07 1.3-1 1.33-1 1.35-1 1.37-1 1.38-1 1.4-1 1.42-.95 1.43-.93 1.47-.93 1.47-.9 1.48-.9 1.5-.87 1.52-.85 1.51-.83 1.55-.82 1.55-.8 1.57-.78 1.58-.77 1.59-.73 1.6-.74 1.61-.7 1.62-.68 1.63-.67 1.64-.63 1.65-.62 1.65-.6 1.66-.58 1.67-.55 1.67-.53 1.68-.52 1.68-.48 1.69-.47 1.68-.45 1.7-.42 1.7-.5 1.7-.38 1.7-.35 1.7-.32 1.7-.3 1.7-.28 1.7-.25 1.7-.23 1.68-.2 1.7-.19 1.69-.15 1.7-.13 1.68-.1 1.67-.07 1.68-.05 1.67v4.96l.07 1.64.08 1.63.1 1.62.15 1.61.15 1.62.2 1.58.22 1.59.25 1.56.27 1.57.3 1.55.33 1.53.37 1.52.38 1.52.42 1.48.43 1.48.48 1.47.5 1.45.54 1.43.55 1.44.58 1.4.62 1.38.65 1.37.68 1.35.7 1.35.73 1.31.77 1.3.8 1.29.82 1.26.86 1.24.89 1.23.93 1.2 1 1.2 1 1.17 1 1.15 1 1.13 1.08 1.1 1.14 1.1 1.15 1.07 1.18 1.05 1.22 1 1.26 1 1.3 1 1.34 1 1.38.93 1.48 1 1.49.95 1.48.88 1.5.87 1.48.83 1.49.8 1.48.75 1.5.74 1.48.68 1.49.65 1.48.63 1.5.59 1.48.56 1.49.52 1.48.5 1.48.45 1.49.43 1.48.4 1.47.37 1.48.35 1.48.3 1.47.28 1.48.25 1.47.22 1.48.2 1.47.15 1.47.15 1.46.1 1.47.08 1.47.05h4.38l1.47-.05 1.45-.09 1.45-.1 1.45-.13 1.45-.17 1.45-.18 1.45-.22 1.43-.23 1.43-.25 1.45-.3 1.44-.3 1.41-.33 1.44-.37 1.41-.38 1.42-.4 1.42-.44 1.41-.45 1.4-.46 1.4-.5 1.4-.54 1.39-.53 1.38-.57 1.38-.58 1.39-.62 1.36-.63 1.37-.65 1.43-.76 1.35-.7 1.35-.71 1.33-.74 1.34-.75 1.33-.78 1.32-.8 1.3-.8 1.3-.83 1.3-.87 1.28-.87 1.28-.88 1.27-.92 1.25-.91 1.25-1 1.25-.95 1.23-1 1.22-1 1.22-1 1.2-1 1.18-1.05 1.18-1.05 1.17-1.08 1.17-1.09 1.15-1.1 1.13-1.13 1.12-1.13 1.11-1.15 1.1-1.15 1.09-1.19 1.08-1.18 1.07-1.2 1.05-1.22 1-1.23 1-1.23 1-1.25 1-1.27 1-1.27 1-1.28 1-1.3.94-1.32.91-1.3.92-1.33.88-1.33.89-1.35.86-1.35.85-1.37.82-1.37.82-1.36.8-1.4.78-1.39.77-1.4.75-1.4.73-1.41.7-1.42.7-1.43.68-1.44.65-1.43.65-1.43.62-1.45.62-1.45.58-1.45.57-1.47.55-1.47.53-1.45.5-1.46.5-1.49.47-1.46.45-1.45.46-1.62.44-1.62.4-1.66.38-1.69.35-1.71.32-1.74.3-1.76.25-1.79.23-1.8.2-1.81.17-1.84.13-1.85.1-1.85.08-1.86v-5.62l-.06-1.88-.1-1.87-.15-1.87-.17-1.86-.22-1.85-.25-1.84-.32-1.72-.32-1.82-.35-1.8-.4-1.77-.41-1.75-.52-1.76-.5-1.7-.55-1.7-.28-.8-.29-.82-.31-.8-.3-.81-.32-.79-.33-.78-.35-.78-.34-.77-.36-.75-.37-.75-.37-.75-.38-.72-.4-.71-.4-.72-.4-.7-.42-.68-.43-.69-.43-.66-.45-.65-.45-.64-.47-.63-.47-.63-.48-.6-.48-.6-.5-.59-.52-.56-.52-.57-.51-.55-.54-.53-.53-.54-.55-.51-.57-.5-.56-.49-.59-.48-.58-.45-.6-.45-.6-.45-.62-.42-.61-.41-.65-.4-.64-.39-.66-.38-.67-.35-.68-.35-.69-.33-.7-.34-.71-.3-.72-.3-.75-.28-.75-.27-.75-.25-.78-.23-.79-.23-.81-.2-.82-.2-.83-.19-.85-.15-.85-.15-.89-.13-.9-.12-.9-.1-.93-.08-.93-.07h-3.83l-.8-.12-.8-.21-.77-.29-.73-.35-.7-.43-.65-.48-.6-.55-.55-.62-.48-.67-.35-.61-.58-.2-.65-.19-.65-.2-1.49-.4-1.51-.38-1.48-.48-1.48-.32-1.37-.28-1.22-.23-1-.17-1.25-.22-1.8-.26-1.9-.29-3.73-.6-7.37-1.2-3.61-.56-1.79-.25-1.76-.25-1.77-.24-1.75-.2-1.75-.18-1.72-.17-1.71-.13-1.72-.1-1.68-.07-1.69-.05h-1.66zm393.75-86.22 1.53.08 1.54.14 1.55.16 1.55.24.75.15.75.15.73.18.75.2.72.22.71.23.72.25.7.27.68.28.69.3.68.32.7.35 1.28.68 1.27.77 1.23.81 1.22.85 1.18.92 1.14 1 1.11 1 1.09 1 1 1.05 1 1.1 1 1.13 1 1.17.94 1.18.9 1.23.86 1.24.85 1.28.82 1.28.78 1.32.75 1.35.72 1.35.68 1.38.67 1.39.62 1.41.6 1.44.56 1.43.52 1.45.5 1.47.45 1.46.42 1.49.38 1.5.35 1.5.3 1.5.27 1.5.23 1.51.18 1.52.14 1.52.1 1.51.05 1.52v1.52l-.05 1.5-.1 1.51-.15 1.5-.22 1.5-.27 1.49-.31 1.43-.2.78-.22.74-.22.73-.23.72-.25.71-.28.72-.29.72-.31.7-.32.7-.35.7-.37.68-.38.68-.4.67-.42.67-.45.65-.45.63-.48.63-.5.62-.52.6-.53.6-.57.58-.56.57-.6.55-.62.53-.63.52-.65.52-.92.65-.92.63-.93.58-.95.57-1 .53-1 .5-1 .45-1 .45-1 .4-1 .37-1 .35-1 .33-1 .29-1 .28-1 .23-1 .24-1 .2-1 .16-1 .17-1 .13-1 .12-1 .1-1 .08-1 .09-1.93.08-2 .05h-1.66l-1.92-.05-1.91-.08-1.89-.1-1.88-.14-1.85-.15-3.62-.33-3.51-.35-3.4-.32-1.64-.15-1.6-.13-1.55-.1-1.5-.08h-3.45l-.48-.05-.5-.08-.48-.1-.47-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.4-.3-.36-.31-.37-.34-.33-.36-.22-.24-.17.07-.46.15-.49.13-.48.1-.48.07h-1.97l-.48-.08-.49-.1-.48-.13-.47-.17-.45-.18-.45-.22-.43-.25-.42-.27-.43-.28-.62-.5-.56-.52-.54-.53-.46-.53-.49-.6-.66-1-.59-1.05-.5-1-.4-1-.35-1-.28-1-.23-1-.22-1-.17-1-.15-1-.13-.95-.1-.93-.08-1-.14-1.8-.08-1.8v-10.7l.06-1.3.12-1.3.15-1.3.17-1.28.2-1.28.23-1.29.27-1.28.28-1.28.32-1.27.35-1.27.38-1.25.4-1.25.43-1.25.47-1.23.48-1.22.52-1.21.53-1.22.59-1.18.6-1.19.61-1.16.65-1.15.69-1.15.7-1.12.73-1.12.75-1.1.78-1.06.82-1.07.83-1 .87-1 .88-1 .92-1 1-1 1-.94 1-.9 1-.88 1-.87 1.07-.81 1.1-.8 1.12-.77 1.15-.73 1.18-.7 1.2-.69 1.22-.63 1.25-.6 1.26-.57 1.3-.51 1.32-.49 1.33-.45 1.37-.4 1.38-.35 1.4-.31 1.42-.27 1.43-.22 1.45-.18 1.49-.12 1.48-.08h1.5zm-2.43 16.67h-.94l-.9.06-.9.12-.86.13-.87.17-.87.18-.83.22-.83.25-.82.27-.82.3-.8.31-.78.35-.78.39-.77.4-.75.41-.75.45-.73.47-.72.5-.72.52-.7.53-.68.57-.68.58-.67.6-.65.63-.63.64-.62.66-.62.69-.6.71-.58.72-.57.73-.53.75-.53.79-.52.78-.5.8-.48.8-.47.83-.45.84-.43.85-.4.85-.4.86-.37.89-.35.88-.33.88-.32.9-.28.9-.29.9-.25.92-.21.9-.22.92-.18.91-.17.9-.13.92-.14.9-.1.9-.06.9-.07.9v9.35l.06 1.4.09 1.4.06.62.07.63.08.59.09.55.08.51.1.45.1.4.1.32v.07l.23.21.33.35.24.29.2-.09.46-.15.49-.13.48-.1.5-.07h2.65l1.78.05 1.79.1 1.78.11 1.77.14 1.78.16 3.5.34 3.48.35 3.46.3 1.69.14 1.66.11 1.65.1 1.64.07h4.68l1.53-.07h.7l.72-.06.72-.09.7-.08.7-.08.66-.12.67-.12.65-.13.65-.15.63-.15.62-.17.6-.18.6-.18.58-.22.59-.22.55-.23.55-.23.55-.27.51-.27.54-.28.5-.32.51-.31.49-.34.5-.36.26-.2.25-.2.25-.22.24-.22.21-.23.24-.22.2-.23.21-.25.2-.25.2-.25.19-.27.21-.25.18-.27.17-.28.17-.3.16-.3.15-.32.15-.31.15-.34.14-.33.13-.35.12-.35.11-.37.12-.38.12-.37.08-.35.18-.85.15-.85.14-.86.08-.9.07-.92v-3l-.07-1-.08-1-.14-1.05-.16-1.07-.19-1.07-.21-1.08-.25-1.08-.29-1.1-.31-1.09-.34-1.1-.36-1.08-.39-1.08-.43-1.09-.43-1.06-.52-1.05-.5-1.05-.52-1-.53-1-.55-1-.58-1-.6-.94-.6-.93-.64-.88-.63-.87-.65-.83-.67-.82-.68-.77-.67-.73-.7-.68-.68-.67-.68-.62-.7-.56-.69-.54-.7-.48-.68-.45-.67-.4-.7-.38-.28-.14-.33-.16-.32-.14-.32-.13-.31-.12-.3-.11-.32-.1-.3-.09-.3-.08-.3-.07-.28-.06h-.29l-1-.15-1-.12-1-.08h-2zm-30.65 50.76h-.05z"/></g></svg>
assets/img/no-products.svg ADDED
@@ -0,0 +1 @@
 
1
+ <svg viewBox="0 0 923.65 1082.82" xmlns="http://www.w3.org/2000/svg"><g fill-rule="evenodd"><path d="m296.42 899.72h6.81l3.44.07 3.45.1h.2l.18-.1 1.48-.68 1.49-.63 1.53-.48 1.5-.5 1.5-.5 1.5-.43 1.52-.37 1.51-.35 1.52-.31 1.53-.27 1.54-.25 1.55-.23 1.53-.19 1.57-.18 1.55-.15 1.56-.12 1.57-.11 1.55-.04 1.59-.08h7.93l3.18.05 3.19.09 3.11-.06 3.15.17 3.12.18 3.07.2 3.05.22 5.83.47 5.57.46 5.15.42 2.38.18 2.23.15 2.09.14 1.88.1h11.98l8.87-.07 8.87-.12 8.86-.15 8.9-.18 8.89-.2 17.85-.45 16.88-.42 1-.08 2-.13 2.58-.15 3.05-.15 3.39-.14h11.56l2 .08h3.55l.15-.15 1.22-1 1.06-.73.95-.57 1-.53 1.24-.55 1.23-.45 1.12-.35 1.05-.27 1-.22 1-.18.93-.15 1-.15 1.75-.2 1.86-.15 1.9-.12 2-.08h12.53l4.3.13 4.27.17 4.11.2 3.85.2 3.52.21 5.53.34 1.77.1h1l3 .08 3.15.13 3.13.14 3.12.16 6.15.35 6.08.39 6 .38 6 .37 3 .15h.18l1.45-.05 6.08-.2 6.09-.2 6.1-.16 6.11-.15 6.14-.14 6.13-.1 6.15-.05h6.62l3-.2 2-.12 2.25-.08 2.41-.07h5.4l1.4.05 1.44.08 1.45.1 1.46.13 1.49.19 1.5.21 1.53.27 1.57.33 1.5.39.9.26.83.29.87.3.86.33.89.4.91.43.94.5 1 .57 1 .65 1.2.9.57.52.93-.2 1.92-.39 1.91-.35 2-.35 2-.31 2.05-.27 2-.23 1.1-.1 1.08-.07 1.08-.07h4.47l1.15.05 1.17.08 1.16.12 1.19.13 1.2.19 1.2.21 1.21.27 1.22.3 1.23.35 1.24.4 1.23.45 1.23.52 1.24.55 1.21.61 1.2.67 1.19.73 1.16.79 1.14.83 1.11.9 1.07.95 1.1 1.05.8.83.85 1.05.87 1.24.85 1.5.76 1.75.6 2 .35 2.28v2.43l-.37 2.45-.7 2.29-1 2-1.1 1.72-1.15 1.4-1.13 1.13-1.08.9-1.19.85-1.6.94-1.58.73-1.38.53-1.27.4-1.17.34-1.1.25-1.06.21-1 .19-1 .16-1 .15-1.85.24-1.82.18-1.72.17-3 .25-1.14.11-.91.1-3.54.45-3.53.42-3.42.38-3.33.35-3.27.32-3.2.3-3.18.25-3.17.23-3.16.2-3.19.19-3.23.16-3.3.14-3.37.13-3.48.1-3.6.1-3.68.08h-2.15l-2.44.14-2.6.15-2.81.2-3 .25-3.15.26-6.75.6-7.19.64-3.75.31-3.81.32-3.89.28-3.91.29-4 .25-4 .2-4 .16-2 .09-2 .05h-12l-2-.07-2-.08-1.95-.1-1.93-.14-1.93-.15-1.92-.18-1.92-.22-1.88-.23-1.88-.27-1.87-.3-1.85-.33-1.4-.28h-4.05l-2.72.12-2.71.1-5.29.17-10.11.3-4.79.16-2.28.1-2.27.12-8.5.43-8.56.42-8.59.4-3.13.13.4.05 1.27.24 1.41.33 1.5.48 1.17.49 1.2.58 1.4.87 1.62 1.26 1.8 1.9.81 1.29.82 1.5.63 1.6v.1l.48 1.83.23 1.88v1.95l-.25 1.84-.35 1.66-1.21 2.74-1.34 2-1.26 1.4-1.12 1-1 .77-.88.61-.77.45-.88.5-.87.45-1.56.79-1.64.71-1.63.67-1.64.83-1.64.52-1.6.47-1.61.41-1.59.37-1.58.32-1.55.26-1.55.24-1.52.21-1.5.17-1.48.15-1.47.13-1.43.1-1.45.09-2.75.15-2.68.1-2.59.1-2.48.1-2.42.11-1.1.07-1.11.08-1.07.09-1.13.11-4.15.44-4.24.41-4.23.4-4.22.37-4.23.37-4.22.31-4.23.32-4.22.28-4.21.29-4.22.23-4.22.23-4.21.2-4.24.19-4.21.16-4.22.15-4.22.12-4.21.18-4.22.08-4.22.07h-21.11l-4.22-.05-4.23-.1-4.24-.1-4-.1-.76.16-4.19 1-4.2.9-4.18.85-4.2.84-4.2.78-4.2.75-4.22.72-4.2.68-4.21.65-4.22.6-4.22.58-4.21.55-4.22.54-4.22.48-4.21.47-4.22.45-4.22.4-4.23.38-4.22.37-4.21.33-4.22.32-4.22.3-4.21.26-4.22.25-4.22.24-4.2.2-4.21.2-4.2.18-2.3.08-2.54.44-2.56.41-2.57.4-2.58.4-2.59.37-2.58.37-2.58.33-2.59.33-2.54.32-2.67.32-3 .4-3.25.43-3.45.45-3.61.44-1.9.21-1.9.19-2 .18-2 .17h-.47l-.63.19-1.07.26-1.08.24-1.08.2-1.09.16-1.08.14-1.08.1-1.1.06h-3.3l-1.12-.06-1.13-.1-1.14-.15-1.13-.2-1.17-.24-1.16-.3-1.17-.35-.52-.16-1-.13-1-.15h-.07l-2.38.18-2.4.15-2.42.1h-6.1l-1.21-.05h-1.24l-1.23-.08-1.23-.1-1.24-.12-1.23-.13-1.23-.17-1.24-.18-1.23-.22-1.23-.23-1.24-.27-1.23-.28-1.23-.34-1.24-.35-1.23-.4-1.22-.43-1.23-.47-1.22-.5-1.2-.56-1.21-.59-1.19-.65-1.18-.7-1.37-.86-1.48-1.12-2-2-.94-1.47-.78-1.43-.6-1.5-.45-1.3-.45-2.91.17-2.9.7-2.71 1.1-2.3 1.48-2.14 2-2 2-1.33 1.55-.77 1.25-.5 1-.33 1-.27 1.45-.32 1.43-.23 1.33-.18 1.27-.14 1.22-.11 1.16-.09 2-.13 1.5-.1 3.81-.25 3.84-.28 2.86-.22.92-.92 1.95-1.36 2.15-1 2.3-.63 2.37-.24h2.68l.63-.47.94-.67 1-.63 1-.6 1-.58 1-.55 1-.54 1-.5 1-.5 1-.46 1.05-.45 1.07-.44 1.07-.41 1.08-.4 1.1-.37 1.12-.37 1.11-.33 1.12-.32 1.13-.3 1.15-.28 1.15-.25 1.17-.23 1.18-.2 1.17-.2 1.2-.15 1.2-.14.55-.05-.37-.08-1.16-.28-1.15-.32-1.17-.32-1.15-.35-1.15-.36-1.15-.4-1.15-.42-1.23-.47-.95-.41-1.54-.79-.91-.66-1.87-1.55-1.57-1.85-1.11-1.9-.87-2-.55-2.1-.21-2.17-9.42 3.27-3.75 1.3-2.12.7-4.6 1.38-4.61 1.37-4.79 1.37-2.5.7-2.5.68-2.55.68-2.58.67-2.63.65-2.64.63-2.68.62-2.7.6-2.72.57-2.73.55-2.77.51-2.76.49-2.79.43-2.8.4-2.81.37-2.8.31-2.79.25h-.16l-1.29.08-1.41.07-1.42.07-1.42.05h-7.06l-1.4-.07-1.42-.06-1.4-.1-1.4-.17-1.4-.13-1.4-.15-1.4-.19-1.4-.2-2.08-.33-1.83-.5-1.49-.6-1-.46-1-.47-1.69-.88-1.73-1-1.73-1-1.34-.84-1.41-.16-1.2-.12h-4.95l-1.77-.08-1.77-.09-1.76-.13-1.75-.13-1.75-.17-1.74-.2-1.76-.27-1.73-.25-1.72-.29-1.72-.31-1.7-.37-1.68-.38-1.68-.44-1.67-.46-1.67-.5-1.63-.57-1.63-.6-1.64-.65-1.6-.7-1.58-.8-1.57-.81-1.75-1-1.45-1-2.06-1.87-1-1.4-1.17-2.08-.85-2.27v-.08l-.42-2-.13-2 .17-2v-.17l.4-1.86.65-1.79.89-1.68.05-.08 1.18-1.65 1.38-1.47 1.07-1 2-1.25 1.48-.68 1.32-.48 1.51-.42 1.34-.27 1.15-.16 1-.12 1-.1h.94l1-.05h3.35l3.08.22 2.69.2 2.38.22 2.15.23 1.95.23 1.78.24 1.65.23 1.52.23 2.88.45 1.45.22 1.57.23 1.72.22 2 .23 2.25.25h.6l.13-.56.58-1.32.85-1.65 1.05-1.52.1-.11 1.14-1.38 1.47-1.23 1.2-.89 2.18-1.06 1.7-.59 1.35-.33 1.12-.18 1.06-.15 1.49-.1h3.96l2.12.1 1.75.1h30.46l1.85.05 1.89.09 1.93.11 2 .15 2 .19 2.1.23 2.15.28 2 .3.86.14 1 .11 3 .29 4.48-.09 6-.15 6-.16 6-.22 6-.23h.95l-.28-.63-.6-2-.3-2.08v-2.58l.48-2.53.9-2.42 1.32-2.22 1.66-2 2-1.65 1.85-1.08 2-.82 2.07-.52 2.13-.21 1.47-.05 2 .3 1.05.23 1.21.32 1.24.36 2.56.79 2.87.86 1.42.42 1.35.4 1.21.33 1 .25.77.17h.16l1.69.22 1.76.18 1.8.17 1.82.15 1.85.12 1.87.1 1.9.08 1.68.07h51.2l.83-.08 1.09-.05h4.66l1.54.05 1.23.07 1.07.06 2.51.4 2.42.8 2.23 1.2 2 1.59 1.7 1.88 1.37 2.15.13.33h10.04zm-87.32 57.86h.17-.34z" fill="#808080"/><path d="m419.77 413.53 1.43.19 1.37.26 1.3.35 1.4.44 1.45.58 1.53.77 1.45.93 1.35 1 1.22 1.14 1.08 1.21.93 1.24.79 1.25.65 1.23.53 1.22.43 1.18.34 1.13.25 1.1.2 1.07.13 1 .08 1v1.98l-.09 1.6-.2 1.67-.26 1.58-.37 1.52-.42 1.48-.48 1.44-.55 1.41-.5 1.17-.1.22-.68 1.36-.75 1.34-.82 1.31-.9 1.32-1 1.28-1 1.19-.67.71-.63.64-.69.61-.71.62-.79.6-.81.6-.89.57-.95.55-1 .51-1.09.47-1.15.43-1.23.37-1.3.28-1.35.2-1.42.1h-1.43l-1.45-.13-1.38-.23-1.22-.3-1.15-.37-1.13-.45-1.12-.47-1.07-.6-1-.69-.93-.71-.9-.8-.82-.83-.75-.87-.67-.88-.6-.9-.51-.92-.55-1.07-.64-1.61-.51-1.74-.32-1.7-.17-1.61v-1.57l.09-1.52.16-1.46.09-.39.21-1 .4-1.38.5-1.35.25-.59v-1.81l.05-1 .12-1 .15-1 .2-1 .26-1 .32-1.07.27-.77.11-.31.49-1.1.56-1.1.67-1.12.75-1.1.87-1.12 1-1.06 1.08-1 1.22-1 1.32-.9 1.41-.8 1.49-.68 1.53-.55 1.57-.42 1.58-.28 1.57-.14h1.51zm3.38 29.8-.28.15 1.18-.61v-.22.22l.05-.64v-.48l.05.52-.09-1.07.09.5-.19-1.15.12.47-.27-1-6.35 4.41h1.14-.35l1.18-.08-.35.05 1.23-.17-.31.07 1.25-.29-.32.1 1.27-.4-.3.12zm.65-.3.25-.15zm.05-3.08.1.3zm-6.33-15.72h-.75l.48.15.9.3.58.26 1.52 2.19 5.55.13-.37-.33.19.16-1.05-.8.2.17-1.2-.75.21.13-1.31-.65.21.1-1.45-.55.24.1-1.54-.41.25.06-1.58-.26.25.05-1.6-.1z" fill="#fff"/><path d="m463.47 357.9 1.9.33 1.83.57 1.73.83h.09l1.45.93 1.33 1.1 1.2 1.34 1 1.23 1.22 2.27.55 1.45.37 1.2.28 1 .25 1 .25 1.06.45 2.12.43 2.35.44 2.55.43 2.75.42 2.93.25 1.94.43.71.73 1.45.64 1.5.48 1.4.4 1.34.33 1.31.3 1.3.25 1.3.22 1.3.2 1.34.17 1.36.15 1.39.15 1.41.11 1.44.1 1.46.1 1.5.07 1.54.07 1.55.05 1.58v6.53l-.05 3.39-.1 3.41-.15 3.44-.2 3.41-.13 1.75-.13 1.72-.14 1.72-.16 1.7-.17 1.68-.2 1.67-.2 1.66-.22 1.64-.21 1.61-.07.35-.08 1.12-.17 1.6-.18 1.58-.22 1.55-.12.79.42.8.45 1.05.42 1.1.35 1.16.26 1.2.2 1.24.14 1.25v2.51l-.12 1.24-.18 1.21-.07.3-.23.85-.39 1.12-.51 1.23-.87 1.72-.98 1.67-1.13 1.49-1.15 1.26-1.15 1.12-1.16 1-1.14.87-1.13.78-1.12.69-1.11.63-1.1.57-1.1.53-1.09.48-1.1.45-1.08.42-1.1.38-1.1.37-1.1.33-1.12.32-1.11.3-1.12.28-1.12.27-1.13.23-1.12.24-1.15.2-1.13.18-1.13.18-1.15.17-1.14.13-1.15.14-1.13.11-1.15.09-1.15.08-1.13.07-1.14.05h-5.65l-1.13-.07-1.12-.08-1.13-.12-1.12-.14-1.13-.17-1.13-.18-1.15-.24-1.15-.26-1.19-.32-1.2-.37-1.25-.46-1.27-.52-1.53-.71-1.58-.94-1.7-1.31-1.52-1.52-4.93 1.55-2.69.83-2.71.85-2.77.82-2.8.82-2.82.8-2.83.75-2.83.7-1.45.35-1.44.33-1.43.3-1.43.3-1.44.27-1.45.26-1.43.24-1.43.21-1.45.2-1.44.17-1.45.15-1.45.12-1.45.08h-4.38l-1.48-.06-1.49-.12-1.5-.17h-.28l-1.23-.17-1.52-.28-1.55-.35-1.53-.43-1.57-.5-1.45-.59-.88-.38-1.3-.62-2.1-1.31-1.19-1.12-1.11-1.25-1-1.35-.93-1.45-1.07-3-.4-2.71v-2.27l.28-1.82.43-1.7.72-1.85.8-1.55.15-.21-.32-.32-1.41-2.07-1.05-2.2-.64-2.18-.28-2-.05-1.8.13-1.58.24-1.37.3-1.18.33-1.05.35-.93.37-.84.4-.86.48-.89v-.06l-.72-1-.66-1.08-.59-1.17-.5-1.2-.4-1.23-.3-1.25-.21-1.24-.12-1.21v-1.19l.06-1.35.24-1.86.46-1.89.59-1.65.65-1.46.7-1.3.71-1.19.74-1.06.73-1 .77-.91.75-.87.76-.83.79-.79.8-.76.78-.75.82-.72.81-.7.84-.7.88-.7 1.67-1.3 1.73-1.28 1.78-1.27 1.79-1.23 1.8-1.2 1.8-1.15 1.78-1.14 1.77-1.08 1.71-1.05 1.7-1 3.12-1.81 2.8-1.6 2.32-1.3 1.68-.94.92-.53 1.65-1 .23-.14 2.55-1.48 1.45-.82 1.5-.81 1.55-.8 1.58-.79 1.59-.73.95-.38.56-.22 2.44-2 2.66-2.07 2.42-1.85 2.1-1.36 2.32-1 1.8-.42 1.36-.83 1.39-.82 1.4-.78 1.4-.77 1.4-.73 1.41-.7 1.42-.7 1.42-.67 1.41-.63 1.42-.63 1.42-.6 1.4-.59 1.41-.58 2.72-1.05 2.7-1 2.62-.92 2.51-.85 2.4-.76 2.29-.7 2.11-.64.43-1.07.65-1.33 1.18-1.85.94-1 1.6-1.48 1.8-1.24h.08l2.12-1 2.26-.65 2.35-.25h.07z" fill="#808080"/><path d="m69 892.63 12.82.17 6.5.07h19.62l3.25-.06 3.25-.09 3.23-.11 3.22-.14 3.2-.16 3.16-.19 3.15-.23 3.14-.27 3.1-.28 3.05-.33 3-.39 3-.41 1.47-.22 1.46-.23 1.47-.24 1.45-.26 1.46-.26 1.42-.28 1.4-.29 1.4-.3 1.95-.45 2-.45 2-.48 1.95-.5 4-1 4-1.06 4-1.07 4.08-1 2.07-.52 2.07-.5 2.1-.5 2.1-.48 2.11-.45 2.12-.43 2.15-.42 2.15-.38 2.17-.35 2.18-.32 2.2-.28 2.22-.24 2.23-.2 2.25-.15 2.23-.1h5.77l1.15.05 1.17.06 1.15.07 1.18.1 1.13.1 4 .4 4 .37 4 .35 4 .35 4 .31 4 .3 4 .3 4 .27 4 .27 4 .23 3.95.23 4 .2 4 .2 3.95.19 4 .16 3.95.15 3.95.14 3.95.13 3.95.12 4 .08 3.95.08 3.93.09h3.95l3.95.05h23.7l7.9-.1 7.92-.14 7.92-.18 7.93-.22 7.93-.26 7.95-.3 7.95-.34 8-.38 8-.4 8-.43 8-.47 8.05-.5 8.05-.53 8.08-.55 8.1-.57 8.13-.6 8.19-.62 1.63-.11 1.68-.09h8.35l1.67.08 1.65.08 1.67.12 1.65.13 1.63.15 1.65.17 1.63.18 1.64.2 1.65.2 3.23.47 3.23.5 3.22.53 3.2.55 3.17.57 3.16.58 5.81 1.13 3.1.55 3.08.53 3 .52 3 .47 3 .43 1.47.18 1.5.19 1.46.16 1.49.15 1.46.14 1.45.11 1.45.1 1.45.09 1.44.06h7.05l1.38-.06 1.37-.09 1.36-.11 1.37-.15 1.35-.17 1.35-.2 1.33-.22 1.4-.26 2.14-.42 2.23-.4 2.23-.4 2.25-.37 2.27-.35 2.27-.35 2.3-.31 2.28-.3 2.32-.27 2.3-.27 2.33-.25 2.33-.23 2.34-.22 2.35-.2 2.36-.18 2.37-.17 2.37-.16 2.36-.14 2.39-.13 2.4-.12 2.38-.1 2.42-.08 4.78-.13 4.83-.09 4.82-.05h9.67l4.83.08 4.83.1 4.82.15 4.82.17 4.78.2 4.77.21 4.75.25 4.71.27 4.7.28 4.65.3 4.62.32 4.57.32 9 .66 8.76.67 2.92.2 2.88.2 2.89.17 2.88.13 2.88.13 2.89.1 2.9.09 2.88.08 2.9.05h14.47l2.9-.05 2.9-.07 2.9-.06 2.9-.09 5.81-.2 5.82-.25 5.83-.3 5.82-.31 5.83-.35 5.85-.37 5.84-.4 11.71-.83 11.74-.85 11.75-.82 5.9-.4 5.9-.38 5.9-.34 5.9-.33 5.91-.28 5.94-.24 5.91-.2 3-.08 3-.07 3-.05h8.95l1.62.17 1.56.46 1.45.77 1.27 1 1 1.27.79 1.43.46 1.57.17 1.62-.15 1.63-.48 1.54-.76 1.43-1 1.27-1.26 1-1.44.78-1.54.52-1.62.15h-5.8l-2.9.05h-2.88l-2.9.07-2.89.06-5.8.2-5.8.24-5.81.28-5.82.32-5.82.35-5.83.36-5.83.39-11.72.83-11.72.85-11.76.82-5.89.4-5.91.38-5.9.35-5.92.33-5.93.3-5.94.25-5.93.22-3 .08-3 .07-3 .07h-18l-3-.07-3-.07-3-.08-3-.12-3-.13-3-.15-3-.17-3-.2-3-.21-8.77-.67-8.95-.67-4.53-.31-4.57-.3-4.58-.3-4.63-.29-4.65-.25-4.67-.25-4.68-.21-4.7-.2-4.7-.17-4.72-.13-4.72-.12-4.7-.07h-14.08l-4.65.1-4.65.14-2.3.08-2.3.08-2.28.12-2.29.12-2.28.13-2.27.15-2.25.17-2.25.18-2.23.18-2.23.2-2.22.24-2.2.23-2.18.25-2.17.27-2.17.26-2.15.3-2.13.32-2.12.33-2.1.35-2.08.37-2.07.38-2.11.4-1.62.32-1.68.28-1.7.24-1.67.21-1.68.17-1.69.15-1.68.12-1.67.06-1.68.07h-5l-1.65-.05-1.67-.06-1.65-.1-1.65-.1-1.65-.14-1.63-.16-1.65-.17-1.63-.18-1.64-.2-1.46-.09-3.23-.47-3.22-.5-3.22-.53-3.2-.55-3.16-.59-6.3-1.15-3.14-.58-3.1-.55-3.08-.55-3-.5-3-.47-3-.43-1.48-.18-1.48-.19-1.49-.16-1.48-.15-1.47-.14-1.45-.11-1.45-.1-1.45-.09-1.43-.05h-7.08l-1.39.07-1.41.1-8.15.62-8.17.6-8.15.58-8.12.55-8.11.53-8.1.5-8.07.47-8.07.45-8.06.4-8 .38-8 .34-8 .3-8 .26-8 .24-8 .18-8 .13-8 .1h-24l-4-.05-4-.06-4-.07-4-.08-4-.1-4-.1-4-.14-4-.13-4-.17-4-.16-4-.19-4-.2-4-.21-4-.24-4-.23-4-.27-4-.28-4-.3-4-.3-4-.33-4.05-.35-4-.35-4-.39-4-.4-1-.08-.94-.07-.93-.06h-7.22l-1.9.09-1.89.13-1.88.17-1.9.2-1.9.25-1.9.26-1.92.32-1.91.33-1.92.39-1.93.38-1.95.43-1.94.44-2 .46-2 .49-2 .48-4 1-4 1.05-4.05 1.07-4.07 1.05-2.06.53-2.07.5-2.08.49-2.1.48-1.55.33-1.59.34-1.58.3-1.58.3-1.59.28-1.6.27-1.61.25-1.64.25-3.21.45-3.27.4-3.3.36-3.3.32-3.32.27-3.33.23-3.35.22-3.35.16-3.37.15-3.36.12-3.37.08-3.37.07h-13.31l-6.61-.05-6.57-.06-12.82-.17-6.2-.07h-40.4l-.28.06-.28.07-.89.25-1 .32-1.1.35-1.2.4-1.25.36-.72.2-.73.19-.77.16-.82.15-.86.14-1 .06h-1.07l-.75-.07-.9-.11-.35-.07-1.06-.27-.32-.11-.88-.32-.48-.21-.45-.27-.63-.4-.14-.08-.6-.47-.13-.1-.57-.47-.1-.1-.54-.58-.1-.14-.46-.63-.09-.13-.4-.64-.25-.46-.36-.82-.27-.78-.2-.77-.1-.5-.13-1.68.17-1.64.48-1.55.78-1.43 1.05-1.27 1.27-1 1.45-.77 1.57-.47 1.61-.15 1.64.17 1.55.48 1.11.6.82-.26 1.17-.37 1.25-.4 1.33-.38.77-.2.76-.17.82-.17.87-.11 1-.1h41.28zm-52.51 7.62v-.08l-.1-.39-.13-.4z"/><path d="m365.47 647.05.85.15.85.23.8.32.76.42.74.48.66.55.62.63.53.69.47.73.38.78.3.82.22.85.12.87v1.73l-.05 1-.07 1-.08 1-.1 1-.13 1-.15.94-.19 1-.18.93-.2.93-.23.92-.24.93-.26.92-.27.93-.57 1.79-.63 1.81-.68 1.79-.72 1.76-.75 1.75-.78 1.75-.82 1.72-.83 1.72-.84 1.41-.87 1.68-.88 1.65-.88 1.64-.9 1.61-1.77 3.12-1.7 3.1-1.73 2.9-1.59 2.82-.73 1.33-.7 1.3-.67 1.27-.58 1.28-1.45 2.95-1.44 3-1.4 3-1.39 3.05-1.32 3.05-1.34 3.12-1.3 3.13-1.3 3.15-1.26 3.18-1.27 3.19-1.28 3.18-1.25 3.27-2.47 6.51-2.43 6.55-2.45 6.59-2.45 6.6-2.5 6.6-1.27 3.31-1.27 3.3-1.3 3.29-1.31 3.3-1.34 3.26-1.36 3.29-1.39 3.25-1.41 3.25-1.45 3.23-1.45 3.15-.79 1.73-.73 1.67-.72 1.7-.7 1.72-.66 1.71-.65 1.72-.63 1.75-.62 1.76-.6 1.77-.6 1.78-.57 1.8-.56 1.79-1.1 3.65-1.09 3.7-1.05 3.7-1 3.75-2.15 7.55-1.08 3.82-1.13 3.82-.59 1.91-.6 1.92-.61 1.93-.6 1.84-.07.18v.08l-.1.44-.08.45-.07.56-.06.65-.05.72v10.78l-.07 1.12-.12 1.17-.15 1.18-.21 1.22-.34 1.21-.2.72-.22.63-.25.68-.28.67-.32.68-.38.69-.43.7-.49.7-.53.68-.62.65-.68.63-.73.6-.79.54-.83.48-.87.43-.9.35-.91.27-.92.22-.9.15-.67.05h-1.73l-.87-.15-.83-.23-.82-.32-.76-.42-.74-.48-.66-.55-.6-.63-.55-.69-.47-.73-.38-.78-.3-.82-.22-.85-.15-.87v-.88l.07-.87.13-.85.24-.85.33-.8.4-.78.48-.72.57-.68.62-.6.68-.55.73-.47.79-.38.05-.57.05-.7v-9.7l.05-1.13.07-1.17.12-1.18.16-1.22.22-1.23.27-1.22.2-.7.18-.56.62-1.89.56-1.8.57-1.8.55-1.81 1.08-3.67 1.07-3.7 2.14-7.52 1.07-3.79 1.07-3.8 1.11-3.81 1.15-3.8.62-1.94.62-1.91.63-1.92.65-1.93.68-1.92.7-1.92.72-1.91.75-1.92.78-1.92.8-1.91.84-1.9.85-1.87 1.43-3.1 1.37-3.07 1.36-3.11 1.32-3.12 1.32-3.15 1.3-3.18 1.26-3.19 1.27-3.21 1.25-3.24 1.25-3.23 2.45-6.53 2.45-6.55 2.43-6.6 2.47-6.6 2.48-6.59 1.27-3.3 1.28-3.28 1.3-3.28 1.3-3.29 1.35-3.25 1.35-3.26 1.39-3.24 1.41-3.21 1.44-3.22 1.48-3.18 1.52-3.17 1.55-3.15.71-1.42.75-1.43.79-1.45.8-1.47 1.65-2.91 1.71-3 1.72-3 1.72-3.05.83-1.52.83-1.52.8-1.51.8-1.52.75-1.52.74-1.5.71-1.48.65-1.48.64-1.45.58-1.44.53-1.41.49-1.39.45-1.4.18-.63.18-.65.17-.65.17-.63.13-.64.12-.61.11-.6.1-.6.1-.65v-.56l.05-.55.05-.55v-1.14l.07-.87.15-.85.23-.85.32-.8.42-.78.48-.72.57-.66.61-.62.69-.53.73-.47.78-.38.84-.3.83-.22.87-.13h.86zm27.53 6.95.83.1.82.18.8.27.77.35.73.42.68.5.64.55.56.63.52.67.43.73.35.77.29.8.2.81.1.84v1.93l-.06 1.23-.1 1.22-.15 1.22-.19 1.2-.21 1.2-.25 1.18-.29 1.17-.31 1.16-.34 1.15-.36 1.15-.4 1.14-.42 1.13-.43 1.12-.45 1.1-.49 1.1-.48 1.1-.52 1.08-.51 1.08-.55 1.09-.55 1.06-.59 1.07-1.15 2.08-1.2 2.09-1.23 2.06-1.27 2-1.26 2-1.29 2-1.28 2-2.53 3.88-1.24 1.9-1.2 1.89-1.16 1.85-1.14 1.81-1.06 1.79-1 1.75-.95 1.71-.43.82-.42.83-.42.82-.38.8-.35.78-.35.77-.32.75-.28.75-.27.72-.26.76-1.22 3.64-1.25 3.68-2.53 7.32-2.55 7.3-2.57 7.25-5.15 14.48-2.56 7.22-2.52 7.21-2.48 7.22-1.23 3.6-1.2 3.62-1.2 3.61-1.17 3.64-1.16 3.62-1.14 3.63-1.13 3.65-1.1 3.63-1.07 3.65-1.05 3.67-1 3.67-1 3.68-1 3.68-1 3.84-.32 1.13-.41 1.3-.49 1.37-.53 1.43-.58 1.52-.65 1.61-1.37 3.42-1.55 3.68-1.67 3.92-1.66 3.95-1.65 4-1.59 3.88-.73 1.88-.72 1.82-.65 1.75-.6 1.67-.53 1.56-.48 1.45-.39 1.3-.31 1.17-.12.47-.08.43-.09.37v.11l.13.49.12.83v.85l-.05.85-.13.83-.23.8-.3.8-.39.75-.45.7-.53.67-.58.6-.65.55-.7.47-.75.4-.79.31-.8.25-.83.15-.83.09h-.85l-.84-.1-.83-.18-.8-.27-.77-.33-.73-.44-.68-.48-.64-.57-.58-.61-.5-.67-.43-.73-.14-.24-.28-.6-.25-.63-.1-.35-.15-.5-.13-.54-.07-.31-.12-.8-.06-.69v-1.91l.06-.85.12-.84.13-.81.15-.82.19-.82.2-.83.43-1.63.52-1.7.56-1.77.64-1.83.68-1.87.72-1.93.75-1.95.8-2 1.63-4 1.7-4.07 1.68-4 1.64-3.83 1.51-3.62 1.34-3.27.58-1.45.52-1.35.45-1.18.35-1 .25-.78.18-.65.95-3.72 1-3.82 1-3.8 1.07-3.78 1.08-3.78 1.1-3.75 1.14-3.74 1.15-3.73 1.16-3.72 1.19-3.7 1.21-3.7 1.22-3.68 1.23-3.67 1.24-3.68 2.51-7.28 2.55-7.29 2.57-7.25 5.15-14.48 2.55-7.22 2.53-7.23 2.5-7.25 1.22-3.62 1.23-3.68.35-1 .4-1.05.42-1 .43-1 .47-1.05.47-1 .5-1 .5-1 .53-1 .55-1 1.1-2 1.15-2 1.2-2 1.23-2 1.24-2 1.26-2 1.27-2 2.53-3.88 1.25-1.92 1.22-1.92 1.2-1.88 1.15-1.88 1.12-1.85 1.06-1.85 1-1.84.47-.86.46-.9.44-.87.43-.88.4-.87.38-.85.37-.85.35-.83.32-.82.3-.82.26-.8.27-.78.22-.78.2-.75.18-.75.17-.74.11-.71.12-.7.08-.69v-2.11l.07-.85.13-.84.24-.81.3-.79.38-.75.47-.7.53-.66.58-.6.65-.54.7-.46.75-.4.79-.32.81-.25.82-.15.85-.07zm-78.3 232.38-.05-.18-.2-.35z"/><path d="m395.53 658.87h.22l.63.09.64.13.23.07.53.15.52.2.25.08.4.18.4.2.25.14.65.38.55.35.73.58.5.42.6.6.55.63.49.7.4.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.25.8-.34.79-.41.73-.49.68-.55.64-.61.58-.69.52-.13.08v.67l.05 1.11.06 1.17.17 2.52.22 2.58.23 2.63.22 2.59.18 2.48.08 1.23.07 1.17v5.5l-.05 1.62-.07 1.61-.08 1.6-.1 1.6-.22 3.15-.28 3.14-.3 3.11-.32 3.09-.33 3.05-.32 3-.31 3-.29 3-.25 3-.21 3-.1 1.45-.07 1.47-.07 1.45v13.27l-.08 4.45-.09 4.45-.11 4.43-.15 4.45-.17 4.43-.17 4.44-.2 4.43-.2 4.43-.45 8.85-.46 8.84-.5 8.85-.49 8.81-.46 8.84-.45 8.81-.2 4.4-.19 4.42-.18 4.4-.15 4.4-.15 4.42-.12 4.4-.08 4.4-.08 4.4v9.68l-.14.83-.2.82-.3.78-.38.77-.45.72-.52.66-.58.6-.63.55-.7.49-.74.4-.78.33-.8.25-.83.17-.84.08h-1.06l-.83-.08-.83-.19-.8-.25-.79-.33-.73-.42-.68-.48-.65-.55-.59-.62-.5-.66-.45-.72-.36-.77-.3-.78-.2-.82-.14-.83v-5.33l.05-4.52.06-4.5.1-4.48.12-4.49.13-4.48.17-4.48.17-4.47.2-4.45.2-4.47.45-8.88.48-8.87.48-8.85.49-8.81.48-8.8.43-8.79.2-4.38.2-4.38.17-4.37.17-4.37.13-4.36.12-4.37.1-4.35.06-4.35v-12l.05-1.65.07-1.63.08-1.62.1-1.63.24-3.17.26-3.17.3-3.13.32-3.1.33-3 .32-3 .32-3 .28-3 .27-2.93.21-2.93.09-1.44.06-1.43.07-1.43.05-1.44v-4.45l-.05-1-.07-1-.18-2.3-.22-2.52-.21-2.65-.24-2.73-.18-2.72-.08-1.37-.05-1.35v-5.2l.1-1.28.16-1.23.12-.72.15-.68.18-.74.24-.75.31-.81.42-.87.32-.53.25-.4.26-.39.14-.18.35-.43.38-.42.15-.17.47-.43.5-.4.16-.12.64-.43.65-.35.18-.1.72-.3.73-.25.2-.05.77-.18.8-.1h.93zm28.79-8.37.83.08.83.17.8.27.77.33.75.42.68.48.64.55.58.62.52.66.45.72.36.77.29.78.21.82.12.83v6.07l-.05 5.26-.1 5.25-.14 5.25-.15 5.25-.2 5.25-.2 5.25-.25 5.25-.25 5.24-.26 5.25-.3 5.25-.3 5.25-.64 10.46-.65 10.49-.66 10.48-.63 10.47-.3 5.23-.28 5.23-.27 5.25-.27 5.22-.23 5.23-.2 5.24-.18 5.23-.17 5.23-.12 5.24-.1 5.21-.06 5.24v6.78l-.07 2.35-.28 6.88-.35 9-.37 9.94-.15 5-.13 4.77-.1 4.42-.07 3.93v6.14l.17.83.1.83v.86l-.08.84-.15.83-.25.8-.34.78-.4.74-.48.7-.53.65-.62.58-.67.52-.7.45-.76.38-.79.3-.81.22-.84.13-.85.05h-.83l-.83-.12-.82-.22-.8-.28-.77-.37-.71-.43-.53-.4-.52-.45-.46-.49-.44-.51-.4-.55-.34-.6-.3-.62-.05-.13-.23-.6-.18-.64-.12-.5-.15-.86-.13-1.2-.07-1.27-.05-1.38v-5.09l.07-4.08.1-4.53.13-4.85.17-5 .37-10 .35-9 .26-6.85.09-2.2v-6.45l.05-5.33.1-5.33.13-5.34.15-5.33.18-5.32.22-5.3.23-5.3.27-5.3.27-5.28.3-5.28.3-5.27.63-10.52.65-10.5.65-10.46.63-10.44.3-5.21.29-5.2.26-5.19.27-5.18.23-5.18.2-5.17.19-5.17.16-5.16.12-5.15.1-5.14.05-5.13v-5.17l.05-.83.13-.85.22-.82.3-.78.36-.75.53-.92.52-.66.58-.62.65-.55.7-.47.74-.41.81-.29.8-.25.83-.16.84-.07zm-1.55 227.65.35.62-.19-.4-.45-.62z"/><path d="m436 653.85.83.12.82.21.78.3.77.37.71.45.67.52.6.58.55.63.48.7.42.74.33.78.25.8.17.83.08.84v.85l-.08.83-.18.83-.17.55.12.47.15.57.18.58.42 1.33.46 1.39.5 1.38.5 1.35.5 1.27.87 2.16.55 1.35.8 2 .82 1.9.83 1.9.88 1.92.9 1.9.92 1.9.95 1.92 1 1.91 2 3.87 2 3.9 2.05 3.93 2 4 1 2 1 2 1 2.05 1 2.09.95 2.1.93 2.11.92 2.14.86 2.18.85 2.18.82 2.24.77 2.25.71 2.26.35 1.19.34 1.15.33 1.16.3 1.19.3 1.18.28 1.2.27 1.2.23 1.18.59 2.82.6 2.92.63 3 .67 3.13.71 3.22.75 3.32.79 3.38.81 3.47.85 3.51.89 3.55.91 3.6.95 3.64 1 3.66 1 3.65 1.05 3.67 1.16 3.73 1.1 3.63 1.13 3.62 1.15 3.56 1.2 3.54 1.2 3.48 1.25 3.42.62 1.65.65 1.66.63 1.64.65 1.6.65 1.58.65 1.57.67 1.53.67 1.5.66 1.48.67 1.45.68 1.4.69 1.39.68 1.35.68 1.3.7 1.28.69 1.22.7 1.2.68 1.15.7 1.1.75 1.15.3.46.35.6.57 1 .53 1.1.48 1.1.47 1.12.43 1.13.42 1.14.4 1.16.8 2.32.78 2.32.79 2.3.38 1.08.4 1.07.4 1 .4 1 .38.9.4.85.39.75.38.7.15.26.17.27.15.23.15.2.11.17.55.1.8.25.79.32.73.4.7.48.65.53.58.62.54.65.45.72.38.75.3.8.22.81.13.84.07.83v.85l-.13.83-.2.82-.28.8-.37.75-.43.73-.52.67-.57.62-.63.56-.68.49-.74.41-.78.34-.8.26-.82.19-.85.1h-1.56l-1-.11-1-.22-1-.28-1-.34-.89-.41-.83-.45-.78-.49-.72-.51-.68-.55-.64-.55-.58-.57-.53-.6-.52-.58-.48-.6-.45-.6-.42-.6-.42-.62-.38-.62-.38-.65-.67-1.2-.62-1.26-.6-1.27-.55-1.27-.51-1.28-.5-1.27-.56-1.3-.45-1.29-.85-2.43-.78-2.35-.75-2.2-.35-1-.35-.94-.32-.85-.32-.75-.26-.63-.25-.5-.22-.4v-.07l-.12-.16-.78-1.22-.85-1.35-.84-1.38-.83-1.42-.82-1.45-.8-1.47-.78-1.5-.78-1.53-.77-1.57-.75-1.56-.75-1.62-.75-1.63-.73-1.65-.72-1.67-.72-1.7-.7-1.72-.7-1.73-.68-1.75-.67-1.77-.68-1.8-1.32-3.6-1.26-3.65-1.28-3.69-1.22-3.74-1.18-3.76-1.12-3.77-1.1-3.8-1.09-3.78-1-3.78-1-3.77-1-3.75-.95-3.7-.9-3.67-.88-3.6-.84-3.53-.8-3.48-.76-3.39-.74-3.3-.74-3.18-.65-3.1-.62-3-.56-2.83-.22-1-.22-1-.23-1-.25-1-.25-1-.27-1-.28-1-.28-.95-.64-2-.65-1.93-.7-1.94-.75-1.91-.76-1.92-.82-1.92-.85-1.9-.87-1.91-.9-1.92-.91-1.92-.95-1.91-1-1.92-2-3.87-2-3.9-2.05-3.93-2-4-1-2-1-2-1-2.05-1-2.07-1-2.08-.94-2.1-.91-2.13-.85-2.09-.59-1.41-.91-2.3-.55-1.44-.59-1.55-.58-1.61-.57-1.69-.53-1.66-.25-.89-.25-.85-.22-.86-.2-.89-.16-.86-.15-.92-.12-1-.07-1v-1.63l.05-.38.07-.45.1-.45v-.17l.2-.73.05-.15.15-.42.18-.42.07-.13.23-.48.29-.49.06-.11.37-.54.42-.5.08-.1.5-.53.55-.48.1-.09.63-.45.67-.4.12-.06.7-.34.73-.26h.12l.81-.21.85-.14h.84zm2.41 15.95-.8.28.64-.2.35-.18zm17.67-36.8.49.07.86.13.35.09.52.13.52.15.35.13.45.17.41.2.37.18.7.39.68.41.89.65.8.69.7.7.66.7.6.71.55.72.54.75.51.75.49.77.46.78.45.8.45.8.45.87.82 1.66.82 1.77.78 1.82.77 1.86.75 1.92.73 1.93.7 1.95.68 2 .67 2 .65 2 .62 1.95 1.16 3.73 1.07 3.52 1.75 5.93.65 2.2.48 1.53.7 2.07.74 2.13.75 2.14.76 2.13.79 2.13.81 2.15.82 2.15.82 2.14 1.71 4.33 1.75 4.33 1.8 4.35 1.84 4.37 1.88 4.37 1.9 4.4 1.93 4.41 2 4.42 3.93 8.92 4 9 2 4.5 2 4.51 1.95 4.54 1.92 4.53 1.77 4.47 1.87 4.58 1.81 4.58 1.79 4.6.86 2.34.87 2.3.85 2.31.83 2.34.82 2.31.8 2.34.78 2.33.77 2.35.75 2.33.73 2.35.7 2.35.7 2.37.67 2.35.65 2.37.63 2.38.59 2.32.3 1.1.28 1.05.33 1.08.35 1.1.37 1.12.4 1.11.42 1.15.43 1.14.47 1.16.48 1.15.5 1.19.53 1.16.54 1.17.55 1.17.58 1.18.58 1.17.6 1.16.62 1.17.63 1.15.64 1.15.65 1.13.66 1.14.67 1.11.67 1.1.68 1.09.68 1.08.7 1.05.7 1 .7 1 .7 1 .7 1 .79 1 .35.5.38.61.35.62.35.65.5 1.1.43 1.13.37 1.12.3 1.08.25 1.07.22 1 .2 1 .16 1 .29 1.86.23 1.77.25 1.76.6.3.73.48.67.55.62.62.55.66.48.74.38.78.32.82.22.83.15.87v1.75l-.13.85-.22.85-.32.81-.4.77-.46.73-.55.69-.64.61-.66.55-.74.47-.78.4-.55.25-.87.3-.56.17-.74.16h-.25l-.81.11h-2.5l-.54-.12-.48-.12-.2-.05-.47-.15-.46-.17-.19-.06-.45-.2-.41-.22-.19-.08-.76-.47-.19-.13-.66-.5-.17-.15-.58-.54-.39-.4-.56-.66-.47-.67-.4-.63-.35-.64-.32-.66-.43-1.05-.35-1.07-.28-1-.24-1-.2-1-.16-1-.15-.94-.27-1.78-.22-1.66-.25-1.63-.12-.73-.13-.69-.14-.61-.13-.55-.12-.49-.13-.36-.08-.25-.07-.15-.72-.95-.81-1.14-.82-1.15-.8-1.16-.8-1.19-.78-1.2-.79-1.23-.78-1.23-.77-1.25-.75-1.27-.75-1.27-.73-1.3-.73-1.3-.7-1.31-.7-1.32-.69-1.32-.68-1.35-.65-1.33-.63-1.35-.62-1.35-.62-1.37-.58-1.35-.57-1.35-.53-1.36-.53-1.37-.5-1.37-.49-1.35-.45-1.36-.43-1.35-.4-1.37-.38-1.35-.34-1.28-.58-2.29-.58-2.21-.62-2.22-.63-2.22-.65-2.23-.67-2.22-.7-2.23-.72-2.22-.71-2.21-.75-2.24-.77-2.21-.78-2.24-.8-2.23-.82-2.22-.82-2.23-.83-2.22-1.73-4.46-1.77-4.45-1.82-4.45-1.85-4.47-1.88-4.45-1.92-4.47-1.91-4.47-1.95-4.48-3.95-8.93-4-8.9-2-4.47-1.95-4.45-1.93-4.46-1.92-4.45-1.88-4.47-1.83-4.45-1.74-4.42-1.75-4.45-.87-2.25-.85-2.21-.83-2.24-.83-2.23-.8-2.25-.79-2.23-.76-2.24-.79-2.28-.56-1.83-.7-2.34-1.75-5.9-1-3.4-1.12-3.6-.58-1.81-.6-1.82-.62-1.83-.63-1.8-.65-1.79-.65-1.71-.65-1.69-.65-1.58-.65-1.5-.63-1.4-.65-1.28-.29-.57-.3-.53-.28-.5-.27-.45-.25-.4-.23-.34-.22-.3-.2-.06-.8-.34-.76-.43-.72-.5-.65-.57-.6-.65-.52-.68-.45-.75-.36-.8-.29-.82-.2-.85-.1-.86v-.94l.08-.86.17-.85.25-.84.35-.8.41-.76.52-.72.57-.65.63-.6.7-.52.75-.45.8-.36.82-.29.85-.2.86-.1h1.35zm-1.21 16.64h.13-.43zm-77.97-37.57h1l.33.05.34.07.31.08.32.1.33.1.3.12.32.13.3.15.3.15.28.17.29.18.28.2.27.2.25.22.25.21.25.24.23.25.22.25.21.26.2.27.19.27.18.28.17.3.15.3.15.3.11.3.14.32.1.31.08.34.08.31.07.34.05.33.05.33v2.25l-.07.7-.1.74-.23 1.23-.32 1.27-.37 1.26-.4 1.24-.51 1.31-.48 1.25-.52 1.25-.55 1.25-.58 1.27-.6 1.26-.62 1.27-.66 1.3-1.32 2.52-1.37 2.53-1.4 2.5-1.36 2.42-1.34 2.31-2.43 4.25-1 1.84-.92 1.66-.17.3-.16.29-.2.26-.2.29-.2.25-.24.25-.21.25-.25.23-.25.22-.27.21-.27.2-.26.2-.29.19-.28.16-.3.15-.3.15-.32.14-.31.11-.32.1-.32.1-.33.09-.32.06h-3l-.32-.07-.33-.08-.32-.08-.32-.12-.31-.12-.32-.13-.3-.13-.3-.15-.28-.17-.29-.18-.28-.19-.27-.21-.26-.2-.25-.24-.25-.21-.24-.25-.21-.25-.22-.25-.2-.27-.18-.28-.19-.29-.16-.28-.17-.3-.15-.3-.13-.32-.12-.31-.1-.32-.1-.32-.08-.33-.07-.32-.05-.33-.05-.33v-2.01l.05-.33.07-.32.08-.33.1-.32.1-.32.12-.31.13-.32.14-.3.16-.3 1-1.77 1.12-2 2.46-4.3 1.3-2.28 1.34-2.34 1.3-2.35 1.27-2.35 1.22-2.31.57-1.1.53-1.1.5-1 .47-1 .43-1 .4-.93.33-.87.29-.8.23-.72.18-.63.14-.5.08-.45v-1.37l.05-.33.08-.32.07-.33.1-.32.12-.31.11-.32.14-.3.13-.32.17-.28.16-.3.19-.28.18-.27.22-.27.2-.26.23-.25.23-.24.24-.23.25-.23.26-.2.27-.2.28-.2.29-.17.28-.17.3-.16.3-.14.32-.13.31-.12.32-.1.32-.1.33-.08.33-.07h1.34z"/><path d="m444.32 609.3 1.1.07 1.11.11 1.12.15 1.12.22 1.15.27 1.13.35 1.13.41 1.14.5 1.11.57 1 .63.6.4.52.39.51.41.5.42.49.45.46.47.45.46.44.5.41.52.4.53.39.54.36.55.35.56.37.64.58 1.13.54 1.22.48 1.26.42 1.3.36 1.32.32 1.38.27 1.4.23 1.45.17 1.5.13 1.54.1 1.6.07 1.63v2.6l-.06.48-.1.49-.14.48-.15.47-.18.46-.2.45-.23.44-.27.41-.28.4-.3.4-.34.37-.35.35-.36.32-.39.3-.41.28-.42.27-.43.21-.45.22-.47.17-.47.15-.48.11-.48.1-.49.07h-2l-.48-.09-.49-.11-.46-.14-.47-.16-.45-.2-.45-.22-.42-.25-.41-.27-.4-.3-.39-.31-.35-.34-.33-.36-.32-.39-.3-.4-.26-.41-.25-.42-.22-.45-.18-.45-.17-.47-.13-.48-.1-.48-.09-.49v-2.38l-.05-1.23-.07-1.15-.1-1-.1-1-.15-.88-.15-.8-.15-.7-.18-.63-.17-.54-.18-.45-.17-.38-.18-.37-.05-.08-.07-.12-.06-.1-.07-.08-.05-.07-.05-.06-.07-.07h-.1l-.17-.1-.11-.06-.15-.07-.19-.07-.23-.06-.28-.07-.34-.07-.38-.05h-3.56l-.72.05-.75.08-.78.1-.8.1-1.78.28-1.87.32-2 .37-4.25.81-2.25.44-2.35.4-2.4.4-1.25.18-1.25.17-1.28.16-1.28.14-1.32.13-1.32.12-1.33.08-1.37.07h-3.65l-.68.09-.82.13-.9.15-1 .22-1.05.21-1.1.27-2.35.58-2.41.62-2.45.65-2.4.62-2.32.56-1.15.25-1.12.24-1.11.18-1.14.17-1.11.1h-1.4l-.77-.05-.88-.11-.55-.12-.47-.12-.45-.13-.18-.07-.39-.15-.38-.15-.38-.18-.15-.08-.35-.2-.34-.2-.33-.24-.33-.23-.12-.1-.37-.32-.36-.33-.34-.37-.31-.38-.09-.1-.26-.37-.24-.35-.21-.38-.22-.38-.17-.4-.06-.14-.15-.4-.14-.4-.11-.4-.09-.41-.08-.42v-.13l-.05-.47v-1.57l.05-.48.07-.48.12-.47.05-.18.1-.37.11-.37.13-.56.08-.2.17-.38.18-.38.28-.54.49-.75.48-.65.37-.45.31-.38.35-.35.37-.33.38-.32.4-.28.42-.27.43-.23.44-.22.46-.18.47-.17.47-.13.48-.1.5-.07h1.97l.48.07.48.1.49.13.46.15.45.18.45.22.44.23.41.27.1.08.74-.18 2.25-.58 2.43-.64 2.53-.65 2.55-.65 1.32-.3 1.3-.28 1.28-.27 1.27-.23 1.28-.18 1.29-.17 1.23-.1h4.48l1.07-.09 1.07-.08 1.05-.1 1.06-.12 1.09-.13 1.06-.15 1.05-.15 2.17-.35 2.13-.38 2.15-.4 4.25-.82 2.12-.4 2.12-.37 2.08-.31 1.07-.15 1.06-.14 1.07-.1 1.05-.1 1.07-.06h2.16z"/><path d="m417.2 620.8h1.13l.39.08.36.08.35.12.37.12.35.15.35.15.33.18.34.18.31.2.32.22.3.23.28.25.29.25.26.27.25.28.25.3.22.3.22.32.2.32.18.33.17.33.15.35.15.35.11.37.1.37.09.36.08.37v1.92l.15 1.71.22 2.4.3 2.94.37 3.35.41 3.65.47 3.81.47 3.87.5 3.82.5 3.63.5 3.33.46 2.94.2 1.21.2 1.09.19.86.05.24.11.2.15.35.15.35.14.35.11.36.1.37.07.37.07.38.05.37v1.51l-.05.39-.05.36-.06.39-.1.36-.1.37-.14.35-.13.35-.17.35-.16.33-.19.34-.2.31-.21.32-.24.3-.25.3-.25.27-.26.26-.29.27-.28.23-.32.24-.3.21-.33.2-.33.19-.34.16-.35.15-.35.15-.36.12-.35.1-.39.1-.35.07-.37.05h-2.18l-.37-.07-.36-.07-.33-.09-.33-.1-.34-.11-.31-.12-.32-.15-.32-.15-.3-.17-.3-.18-.3-.18-.28-.2-.27-.22-.06-.07-.29-.23-.26-.25-.25-.25-.25-.27-.22-.28-.23-.3-.2-.3-.07-.1-.17-.25-.13-.25-.13-.25-.14-.25-.23-.48-.27-.72-.21-.67-.29-1.05-.25-1.11-.25-1.22-.25-1.32-.25-1.43-.5-3.15-.51-3.5-.52-3.77-.5-3.91-.5-4-.47-3.9-.43-3.73-.37-3.44-.31-3.06-.25-2.59-.15-2-.05-.88v-1.73l.05-.37.07-.38.08-.37.1-.37.12-.36.13-.35.15-.35.17-.34.18-.33.2-.33.2-.32.24-.3.23-.3.25-.28.27-.27.26-.27.3-.25.3-.23.3-.22.32-.2.33-.2.34-.16.35-.17.35-.15.35-.13.36-.1.37-.1.37-.09.38-.06h1.13z"/><path d="m401.65 620.8h.4l.42.07.4.07.4.1.38.11.4.12.37.17.38.16.37.19.35.2.33.23.33.23.32.25.32.29.28.28.28.3.27.3.25.33.23.34.22.35.2.35.17.36.16.39.15.38.12.38.1.4.1.4v.4l.05.42v2.97l-.07 2.33-.12 2.4-.16 2.47-.2 2.53-.25 2.55-.29 2.58-.33 2.6-.37 2.59-.41 2.58-.47 2.53-.48 2.49-.29 1.26-.28 1.22-.28 1.2-.3 1.18-.32 1.17-.33 1.15-.34 1.13-.31.95v.25l-.05.25-.05.29-.13.93-.12 1.07-.1 1.2-.08 1.26-.15 2.59-.15 2.33-.09 1.13-.13 1.12-.1.52-.07.28-.06.27-.07.26-.05.17-.12.33-.11.32-.14.33-.15.32-.16.3-.17.3-.05.1-.22.32-.21.31-.24.3-.25.3-.26.29-.27.26-.3.25-.3.25-.3.24-.33.2-.32.2-.35.18-.36.16-.37.17-.37.13-.36.12-.39.1-.38.08-.38.07-.4.05h-1.57l-.4-.05-.38-.07-.36-.08-.39-.1-.36-.12-.37-.13-.35-.15-.35-.17-.33-.18-.34-.2-.33-.2-.3-.23-.3-.25-.29-.25-.26-.25-.25-.27-.25-.28-.24-.28-.21-.3-.21-.35-.22-.35-.18-.37-.17-.37-.08-.16-.12-.29-.1-.28-.1-.3-.15-.5-.15-.6-.08-.4-.07-.4-.05-.42v-2.03l.08-.4.08-.4.12-.4.13-.38.15-.39.12-.26v-.37l.16-2.68.1-1.49.14-1.51.15-1.54.21-1.48.15-.82.15-.78.22-.82.2-.71.32-1 .26-.87.27-.9.25-.93.25-1 .23-1 .24-1 .23-1 .43-2.19.4-2.23.37-2.3.33-2.32.3-2.31.27-2.34.22-2.3.18-2.26.13-2.2.1-2.12.07-2v-2.81l.05-.4.08-.4.08-.4.12-.4.13-.39.15-.38.17-.37.2-.36.2-.35.22-.35.25-.34.25-.31.26-.3.29-.3.3-.29.31-.25.34-.25.33-.23.35-.22.35-.2.37-.18.38-.17.38-.13.39-.13.4-.1.4-.09.4-.06h1.23z"/><path d="m489.6 554.8h2l1 .07 1 .08 1 .1 1 .14 1 .15 1 .18 1 .22 1 .25 1 .26 1 .32 1 .37.95.4.95.45.95.5.94.56.9.64.9.68.86.77.82.81.77.9.71 1 .67 1 .53 1 .5 1 .42.95.4.93.37.95.35 1 .31 1 .3 1 .27 1 .23 1 .22.95.18 1 .17 1 .13 1 .1 1 .09 1 .06.95v4.81l-.1.94-.1.91-.13.92-.17.92-.17.9-.2.9-.21.9-.24.88-.26.87-.27.86-.3.87-.32.85-.33.85-.35.83-.37.84-.38.81-.4.8-.42.8-.43.8-.43.79-.47.76-.48.77-.49.75-.5.75-.51.73-.54.74-.55.71-.55.7-.56.7-.59.69-.58.68-.62.67-.6.65-.63.65-.65.66-1.75.76-1.35 1.2-1.37 1.15-1.42 1.12-1.45 1.08-1.48 1-1.52 1-1.53.93-1.58.89-1.59.85-1.63.78-1.63.73-1.67.7-1.68.64-1.67.56-.9.29-.85.25-.88.23-.87.23-.87.2-.88.2-.88.19-.89.16-.88.15-.88.14-.9.11-.89.1-.9.09-.9.06h-5.4l-.9-.05-.91-.08-.9-.1-.9-.14-.9-.13-.9-.17-.89-.16-.9-.22-.88-.22-.9-.25-.88-.26-.87-.29-.88-.31-.87-.34-.87-.36-.85-.39-.85-.4-.85-.43-.83-.45-.82-.47-.81-.5-.72-.46-.65-.47-.6-.52-.53-.58-.5-.62-.42-.66-.37-.72-.28-.73-.23-.77-.14-.77-.08-.8v-.78l.08-.8.15-.77.24-.76.3-.74.36-.7.44-.66.48-.62.55-.58.6-.52.65-.45.68-.4.74-.33.75-.25.76-.19.79-.11h1.58l.78.12.77.18.75.27.73.33.69.4.51.34.45.28.45.25.45.25.47.23.45.22.47.22.48.18.48.2.49.17.48.16.5.15.5.14.52.13.51.12.52.1.52.1.53.08.53.07.55.06h.54l.55.05h3.4l.58-.05h.58l.59-.07.58-.08.6-.08.58-.1.6-.12.59-.12.6-.13.6-.13.6-.17.6-.17.58-.16.57-.19 1.23-.41 1.18-.45 1.19-.49 1.16-.53 1.17-.55 1.13-.62 1.14-.63 1.11-.67 1.09-.7 1.06-.75 1-.76 1-.79 1-.83.95-.85.95-.9.42-.42.43-.45.42-.45.41-.46.4-.45.4-.49.39-.46.38-.47.37-.48.35-.5.33-.49.33-.48.34-.5.3-.48.3-.5.28-.5.27-.5.26-.5.25-.52.24-.5.23-.52.2-.5.22-.51.18-.5.17-.52.16-.52.15-.5.21-.48.13-.52.12-.52.1-.5.08-.51.07-.5.06-.52.05-.52v-3.1l-.05-.51-.07-.52-.06-.53-.09-.52-.1-.52-.11-.53-.14-.53-.15-.54-.16-.55-.19-.53-.2-.55-.21-.55-.24-.55-.25-.55-.23-.47-.05-.11v-.05h-.05l-.09-.06-.11-.09-.17-.08-.18-.12-.24-.1-.28-.11-.32-.14-.36-.11-.4-.12-.44-.1-.48-.1-.5-.1-.55-.08-.57-.09-.6-.06h-.63l-.65-.05h-5.13l-1.59.08-1.61.13-1.65.15-1.67.17-1.67.2-1.66.22-1.64.21-3.25.45-3.06.44-1.49.21-1.45.17-1.38.17-1.35.11-1.33.09h-24.45l-4.59.06-4.75.12-4.86.15-5 .18-2.52.12-2.53.13-2.57.15-2.58.15-2.59.19-2.58.2-2.6.2-2.6.23-2.6.25-2.6.27-2.58.28-2.59.32-2.56.33-2.55.35-2.54.38-2.51.4-2.49.42-2.46.45-2.44.48-2.4.5-2.35.52-2.33.57-2.27.56-2.27.55-2.18.63-2.14.67-2.1.7-1 .35-1 .35-1 .38-1 .37-.95.38-.93.4-.93.39-.9.41-.89.4-.86.42-.84.42-.83.43-.82.43-.78.45-.77.44-.75.45-.73.46-.7.47-.68.47-.67.46-.63.49-.64.46-.6.5-.56.49-.55.48-.54.5-.51.5-.49.5-.46.52-.45.5-.42.51-.4.52-.22.28.05.09.15.26.19.32.21.33.27.37.3.38.33.4.37.44.4.45.43.45.47.46.48.47.54.48.53.49.57.48.58.48.62.5.61.49.62.46 1.35 1 1.35 1 1.4.91 1.4.9 1.42.85 1.38.82 1.38.75 1.32.72 1.28.65 1.2.56 1.14.52 1 .43.88.35.7.25.57.17h5.58l2.6-.07 2.84-.1 5.91-.2 3-.08h7.95l1.16.07 1.17.11 1.1.17.7.13.7.17.82.27.5.2.46.21.45.24.15.08.6.37.59.43.11.08.54.49.5.51.45.57.06.1.42.63.35.65.3.69.23.71v.1l.15.64.1.65.05.63v.65l-.05.65v.12l-.1.66-.16.67-.22.63-.27.64v.11l-.38.7-.43.65-.5.62-.55.57-.62.51-.65.45-.7.39-.72.31-.75.25-.78.19-.78.1h-.8l-.79-.05-.78-.11-.77-.2-.75-.29-.71-.33-.27-.17h-6.68l-2.78.07-5.85.2-2.88.1-2.74.08h-6.9l-1.07-.08-1.05-.17-.78-.17-.73-.2-1.24-.36-1.31-.49-1.37-.53-1.42-.6-1.46-.67-1.52-.73-1.57-.8-1.61-.85-1.65-.92-1.67-1-1.68-1-1.69-1.08-1.7-1.12-1.66-1.17-1.64-1.2-.83-.63-.82-.63-.8-.64-.78-.66-.78-.67-.75-.68-.75-.69-.74-.7-.71-.71-.7-.74-.69-.75-.66-.76-.64-.79-.61-.8-.6-.83-.57-.87-.53-.88-.52-.92-.47-1-.43-1-.38-1-.32-1.1-.27-1.13-.28-1.16-.08-1.23v-1.27l.11-1.18.12-.74.13-.65.17-.63.18-.63.24-.64.25-.61.28-.6.3-.6.33-.57.34-.53.66-1 .67-.92.7-.9.72-.87.73-.85.77-.83.78-.8.82-.8.81-.77.85-.75.87-.73.88-.72.9-.7.92-.68.95-.67.95-.65 1-.63 1-.62 1-.6 1-.58 1-.58 1-.55 1.06-.55 1.07-.54 1.07-.51 1.1-.52 1.1-.48 1.11-.49 1.14-.46 1.13-.47 1.15-.45 1.17-.43 1.18-.42 1.2-.43 2.37-.79 2.43-.76 2.48-.72 2.5-.68 2.54-.64 2.55-.58 2.59-.59 2.61-.55 2.64-.5 2.66-.5 2.67-.45 2.68-.43 2.7-.4 2.72-.37 2.72-.35 2.73-.33 2.72-.3 2.73-.28 2.72-.27 2.71-.23 2.72-.22 2.7-.2 2.68-.18 2.67-.17 2.67-.15 2.63-.15 2.62-.12 5.11-.2 5-.15 4.87-.11 4.68-.07h24.7l.95-.09 1.12-.13 1.25-.15 1.36-.18 3-.44 3.32-.46 1.75-.24 1.8-.23 1.83-.22 1.88-.18 1.9-.18 1.92-.15 1.93-.1 1.95-.07h1.92z"/><path d="m389.85 479.05h.5l.52.07.5.1.48.13.48.15.47.2.47.22.45.25.43.27.4.3.4.31.37.35.36.37.32.38.32.44.26.4.24.41.21.42.2.45.15.43.15.47.1.47.1.46v2.09l-.06.51-.1.52-.14.5-.15.5-.2.48-.21.49-.25.45-.15.4-.35 1-.4 1.18-.43 1.35-.47 1.45-.45 1.52-.37 1.56-.4 1.52-.35 1.45-.3 1.35-.1.55-.08.51-.07.47v3.45l-.07 2.77-.13 2.85-.18 2.86-.24 2.9-.26 2.92-.3 2.93-.35 2.94-.39 2.93-.41 2.92-.45 2.88-.47 2.87-.5 2.81-.53 2.77-.55 2.72-.54 2.48-.06.32v.3l-.27.43v5.28l.07 1.85.11 3.72.05 1.8v2.65l-.05.9-.11 1-.12.7-.1.42-.1.4-.1.35-.15.47-.18.46v.15l-.2.42-.22.42-.07.11-.21.37-.24.35-.25.35-.08.1-.27.32-.28.31-.3.3-.32.27-.06.08-.35.27-.35.27-.39.23-.38.22-.38.2h-.09l-.45.2-.46.17-.47.13-.47.12-.48.08h-.1l-.47.06h-2l-.48-.09-.48-.11-.47-.14-.55-.16-.11-.05-.45-.19-.44-.23-.43-.23-.12-.09-.31-.2-.3-.21-.29-.22-.13-.12-.3-.25-.3-.28-.35-.37-.58-.66-.5-.7-.3-.44-.27-.45-.23-.46-.22-.47-.17-.5-.15-.5-.11-.52-.09-.51-.05-.52v-1l.05-.52.09-.51.11-.52.14-.5.18-.5.2-.47.25-.46.27-.45.28-.44.17-.23-.12-3.45-.07-2v-6l.07-1 .1-1 .15-1 .18-.92.55-2.6.52-2.52.48-2.56.47-2.64.45-2.66.41-2.7.39-2.72.36-2.73.32-2.74.28-2.71.25-2.69.2-2.66.17-2.62.12-2.55.08-2.52v-3.35l.09-.93.1-.92.11-.9.15-.88.19-.93.38-1.77.43-1.83.49-1.82.51-1.8.52-1.75.53-1.65.5-1.55.49-1.4.43-1.23.42-1.09.4-1 .35-.71.25-.44.23-.36.25-.34.25-.33.28-.33.31-.35.35-.32.37-.3.38-.26.39-.27.41-.23.42-.2.43-.19.44-.16.5-.15.49-.12.51-.08.5-.05h.5zm24.42-1.7h.48l.47.07.48.08.45.13.47.14.45.18.43.2.42.22.41.25.4.26.39.3.35.32.35.33.35.39.28.35.27.38.26.38.22.4.22.42.18.42.15.43v.07l.13.45.12.45.08.45.08.56.07.92v2.32l-.06.48-.09.48-.13.49-.15.46-.17.47-.2.42-.06.71-.32 3.37-.27 3.43-.11 1.54-.07 1.35-.05 1v3.58l-.05 1.47-.06 1.43-.09 1.43-.1 1.44-.23 2.76-.28 2.72-.3 2.68-.32 2.65-.33 2.59-.32 2.55-.32 2.53-.28 2.48-.25 2.49-.22 2.46-.08 1.2-.07 1.22-.06 1.22-.05 1.21v4.04l-.06.78-.09.83-.18 1.57-.22 1.65-.26 1.65-.27 1.63-.5 3-.13.82.05.25.06.48.05.5v.98l-.05.49-.07.5-.1.48-.13.47-.15.46-.18.47-.25.58-.24.47-.2.37-.2.35-.11.18-.25.38-.29.37-.3.37-.05.05-.28.3-.3.3-.32.26-.33.27-.35.25-.42.26-.43.24-.44.21-.46.19-.47.15-.47.13-.48.1-.48.07h-1.99l-.49-.08-.48-.1-.47-.12-.46-.16-.47-.19-.43-.2-.44-.25-.41-.25-.4-.3-.39-.3-.35-.34-.33-.33-.32-.37-.3-.38-.28-.38-.24-.42-.23-.42-.2-.45-.18-.45-.14-.45v-.1l-.13-.48-.1-.48-.07-.49v-1.98l.13-1.15.17-1.23.43-2.65.52-3 .25-1.5.21-1.47.19-1.36.15-1.22.05-.48v-3.75l.05-1.43.06-1.42.09-1.42.1-1.4.23-2.73.28-2.7.3-2.67.32-2.61.33-2.59.32-2.56.32-2.54.28-2.5.25-2.5.22-2.5.08-1.23.08-1.23v-1.25l.05-1.24v-3.63l.07-1.37.1-1.53.12-1.7.28-3.62.33-3.58.17-1.67.17-1.48.18-1.32.2-1.18.1-.5.12-.43.15-.45.05-.15.16-.42.19-.42.2-.41.23-.39.23-.38.27-.39.3-.35.32-.35.33-.31.35-.3.37-.29.4-.26.38-.24.42-.21.41-.2.44-.17.45-.15.45-.12.47-.09.48-.08h.95zm26.58 3.52.5.05.48.08.49.12.46.15.47.16.45.2.43.22.44.25.41.28.39.3.38.32.35.35.33.35.32.38.28.4.27.42.25.43.2.45.2.45.15.47.13.48.1.49.09.48.05.5v6l.05 2.78.08 2.82.1 2.83.12 2.87.15 2.87.18 2.9.22 2.9.25 2.91.26 2.92.32 2.92.35 2.9.38 2.91.42 2.9.45 2.89.65 3.71.38 2.25.42 2.45.4 2.57.37 2.6.18 1.33.15 1.32.15 1.3.12 1.3.1 1.28.06 1.25v2.49l-.05 1.25-.1 1.18-.1.72-.12.68-.17.7-.2.77-.28.8-.23.53-.15.33-.19.35-.11.2-.22.4-.27.39-.11.18-.22.3-.23.28-.25.29-.14.15-.3.31-.31.29-.34.28-.15.12-.38.3-.42.26-.41.25-.17.09-.35.18-.37.17-.36.15-.39.13h-.16l-.39.12-.38.08-.38.07-.39.06h-2.31l-.42-.07-.43-.08h-.22l-.35-.1-.35-.1-.35-.12-.23-.08-.44-.17-.41-.18-.25-.14-.23-.14-.33-.19-.52-.33-.75-.53-.5-.4-.36-.32-.37-.35-.33-.37-.3-.38-.3-.4-.25-.42-.25-.43-.2-.45-.19-.45-.16-.48-.14-.47-.1-.48-.06-.5v-1.99l.08-.48.1-.49.13-.48.15-.47.19-.45.21-.45.25-.43.27-.42.28-.4.32-.38.33-.37.35-.33.37-.33.18-.14v-.28l-.08-1-.12-1.09-.13-1.11-.15-1.15-.35-2.39-.37-2.38-.4-2.32-.37-2.21-.66-3.82-.5-3.12-.45-3.11-.42-3.12-.37-3.12-.33-3.11-.28-3.1-.27-3.1-.22-3.07-.2-3.07-.16-3-.14-3-.1-3-.08-2.95v-9.12l.05-.48.06-.5.1-.49.14-.46.15-.47.18-.47.22-.45.15-.38.27-.42.28-.4.32-.38.33-.37.35-.35.37-.31.4-.3.4-.29.43-.25.43-.23.45-.2.47-.17.47-.15.48-.11.48-.09.49-.06h1zm20.5-5.27h.65l.48.07.48.08.47.12h.13l.4.12.42.15.4.15.12.07.35.16.33.17.32.18.13.09.4.26.38.29.14.1.3.26.3.27.38.37.53.6.52.65.63 1 .54 1 .45 1 .4 1 .35 1 .31 1 .32 1 .28 1 .29 1.1.28 1.14.27 1.18.26 1.25.5 2.53.5 2.7.49 2.85.46 3 .45 3 .45 3.14.44 3.18.41 3.23.42 3.24.38 3.25.75 6.35.69 6.06.61 5.6.55 4.94.49 4.11.2 1.64.18 1.35.15 1 .13.72.07.48.05.49v1.45l-.07.48-.1.48-.12.47-.15.45-.18.45-.2.45-.23.43-.25.4-.27.4-.3.39-.32.36-.35.35-.35.32-.38.3-.4.28-.42.27-.41.23-.44.2-.45.19-.46.15-.47.13-.47.1-.48.07h-1.96l-.5-.09-.48-.1-.47-.12-.45-.15-.45-.18-.45-.2-.43-.24-.4-.25-.4-.26-.38-.3-.37-.32-.35-.35-.32-.35-.3-.38-.28-.4-.27-.42-.23-.42-.2-.43-.18-.45-.15-.47-.14-.46-.1-.47-.18-1-.2-1.35-.2-1.55-.23-1.8-.49-4.2-.56-5-.62-5.6-.68-6-.74-6.29-.38-3.16-.4-3.17-.4-3.15-.42-3.1-.43-3-.43-2.91-.45-2.79-.45-2.65-.45-2.46-.45-2.29-.24-1-.21-1-.22-.91-.22-.84-.2-.73-.2-.67-.18-.53-.35-.33-.33-.35-.32-.39-.28-.38-.27-.4-.23-.43-.22-.44-.2-.43-.17-.47-.13-.46-.12-.47-.08-.48-.05-.47v-1.47l.07-.46.08-.49.1-.46.15-.47.17-.47.18-.43.22-.43.25-.42.26-.42.29-.38.31-.37.34-.35.35-.33.38-.32.38-.28.4-.27.44-.25.43-.21.43-.19.47-.16.45-.14.48-.11.47-.09.48-.05h.49zm-1.58 16.58.6.05-.49-.06-.38-.07z"/><path d="m459.68 356.52 1.74.05 1.71.08 1.72.13 1.68.15 1.67.2 1.65.25 1.63.29 1.6.33 1.6.38 1.54.44.81.25.77.26.77.27.75.28.76.3.75.32.74.35.63.3.35.18.35.2.15.09.52.35.5.38.13.12.38.33.35.37.14.13.28.32.25.31.33.44.45.7.39.66.3.64.28.65.38 1.05.34 1.1.26 1.06.25 1.1.2 1.1.19 1.12.16 1.13.17 1.17.13 1.17.14 1.21.2 2.37.23 2.4.13 2.31.12 2.19.08 2 .05 1.8v5.73l.06.87.17 2 .23 2.22.3 2.42.34 2.6.38 2.78.42 2.9.88 6.22.95 6.55.47 3.4.45 3.41.43 3.47.4 3.48.37 3.47.33 3.45.13 1.75.14 1.7.11 1.72.1 1.7.07 1.68.07 1.67.05 1.65v4.85l-.05 1.58-.07 1.57-.1 1.53-.13 1.52-.17 1.5-.2 1.48-.25 1.45-.26 1.43-.34 1.42-.36 1.38-.44 1.39-.46 1.28-.3.72-.29.66-.31.65-.32.65-.35.65-.38.64-.4.63-.44.62-.45.61-.48.6-.5.59-.53.55-.55.51-.55.5-.57.47-.57.45-.58.42-.58.4-.62.38-.6.37-.62.33-.66.37-1.22.58-1.28.55-1.32.52-1.33.46-1.37.42-1.38.38-1.42.35-1.43.32-1.47.3-1.48.27-1.5.23-1.54.22-1.55.18-1.56.17-1.59.15-1.6.13-1.61.12-1.65.1-1.65.08-1.65.07-1.69.05h-10.18l-3.42-.06-3.38-.12-3.37-.13-3.31-.15-3.27-.19-3.2-.18-6.08-.38-5.62-.37-5-.3-2.22-.13-2-.09-1.76-.05h-13.6l-1.62.07-1.62.08-1.6.1-1.56.13-1.59.15-1.55.2-1.56.22-1.55.25-1.62.3-9.68 1.9-.7.12-.7.05h-.72l-.7-.08-.68-.12-.6-.16-.66-.25-.64-.3-.61-.35-.59-.42-.53-.45-.27-.25-.21.35-.42.57-.47.53-.51.49-.55.45-.59.4-.61.33-.65.3-.67.23-.68.19-.69.11-.71.05h-1.34l-.6-.09-.37-.05-.36-.08-.59-.13-.91-.29-.87-.35-.8-.41-.75-.47-.68-.48-.62-.52-.55-.53-.5-.58-.45-.53-.42-.53-.43-.62-.58-1-.55-1.05-.47-1-.38-1-.34-1-.3-1-.25-1-.23-1-.18-1-.17-1-.15-1-.12-1-.1-1-.06-1-.07-.95v-5.3l.06-.81.09-.8.1-.8.11-.65.22-1.2.17-1.07.15-1.12.13-1.13.1-1.18.07-1.2.06-1.24v-6.52l-.07-1.37-.08-1.4-.1-1.43-.1-1.42-.27-2.95-.31-3-.35-3-.39-3.09-.81-6.3-.82-6.36-.4-3.22-.38-3.22-.34-3.21-.28-3.2-.12-1.64-.11-1.6-.09-1.6-.08-1.6v-6.33l.05-1.58.06-1.57.09-1.57.13-1.55.17-1.55.18-1.53.23-1.53.29-1.52.3-1.52.36-1.5.4-1.5.45-1.48.5-1.45.57-1.45.6-1.43.73-1.55.3-.52.22-.37.25-.35.17-.25.23-.3.25-.3.43-.5.7-.68.7-.6.7-.52.69-.45.7-.4.68-.36.67-.32.66-.28.67-.27.67-.25.71-.23 1.3-.39 1.37-.33 1.37-.3 1.4-.27 1.41-.23 1.44-.2 1.43-.17 1.45-.16 1.45-.14 1.45-.11 1.45-.1 1.42-.09 1.43-.06 2.72-.1 2.56-.07h8.59l1.11-.05 1.17-.05 1.22-.08 1.26-.1 1.3-.12 1.37-.15 1.4-.17 1.43-.18 1.45-.18 3.07-.45 3.18-.52 3.29-.55 3.38-.6 3.47-.62 7.16-1.31 3.65-.67 3.7-.67 3.74-.65 3.73-.63 3.77-.58 3.73-.55 1.88-.27 1.87-.25 1.87-.22 1.86-.21 1.85-.2 1.85-.17 1.84-.17 1.81-.13 1.82-.12 1.8-.08 1.8-.07h3.53zm-3.3 16.65h-1.51l-1.55.05-1.59.08-1.61.1-1.64.12-1.65.15-1.68.15-1.7.18-1.72.2-1.73.22-1.75.22-1.75.25-3.57.51-3.6.57-3.61.62-3.64.63-3.63.65-3.62.65-7.16 1.32-3.54.65-3.48.6-3.42.58-3.35.53-3.26.49-1.62.21-1.6.2-1.57.19-1.53.16-1.52.14-1.5.13-1.48.08-1.45.09h-10.05l-2.37.05-2.5.1-1.25.06-1.28.07-1.27.08-1.25.12-1.23.1-1.2.13-1.15.15-1.12.15-1 .17-1 .18-.89.2-.76.19-.72.21h-.17l-.08.22-.35.88-.3.92-.3.95-.27 1-.23 1-.22 1.05-.2 1.08-.16 1.12-.15 1.15-.12 1.17-.1 1.21-.08 1.24-.05 1.26v6.69l.07 1.41.08 1.42.1 1.43.12 1.45.26 3 .32 3 .35 3.06.38 3.09.82 6.31.82 6.35.4 3.2.36 3.2.34 3.2.28 3.19.13 1.6.1 1.58.1 1.58.07 1.59.05 1.58v4.68l-.05 1.55-.06 1.55-.1 1.54-.14 1.53-.16 1.52-.2 1.51-.24 1.5-.25 1.35v5.17l.05.65.07.65.08.65.09.62.1.6.11.58.12.53.12.49.1.33h.06l.62.35.58.4.55.45.37.33.3-.47.42-.55.48-.53.52-.48.56-.44.59-.38.63-.33.65-.29.67-.21.68-.17 9.7-1.71 1.88-.35 1.94-.31 1.91-.27 1.89-.23 1.88-.19 1.87-.15 1.85-.11 1.83-.1 1.83-.07 1.82-.05h12.68l2 .06 2.2.1 2.35.12 5.1.32 5.61.36 6 .39 3.1.18 3.18.17 3.2.15 3.25.13 3.23.1 3.24.07h9.56l1.53-.05 1.5-.05 1.48-.08 1.45-.09 1.44-.1 1.4-.11 1.36-.12 1.34-.15 1.28-.17 1.25-.16 1.22-.2 1.15-.2 1.1-.22 1.06-.23 1-.25.93-.27.88-.27.8-.28.73-.32.67-.28.61-.32.22-.1.23-.13.27-.17.18-.14.18-.11.15-.12.14-.1.11-.1.1-.08.07-.07.05-.05.05-.07.07-.06.06-.1.09-.12.08-.13.1-.15.1-.19.1-.2.1-.23.12-.25.08-.22.23-.66.22-.69.22-.76.18-.85.18-.9.17-1 .13-1.05.12-1.1.12-1.16.06-1.22.07-1.25v-6.92l-.07-1.48-.07-1.52-.08-1.53-.12-1.57-.11-1.58-.14-1.58-.3-3.27-.35-3.28-.38-3.32-.42-3.33-.43-3.34-.47-3.3-.91-6.5-.9-6.21-.44-3-.38-2.87-.37-2.75-.31-2.61-.25-2.49-.2-2.31-.09-1.14-.05-1.1v-5.07l-.05-1.67-.07-1.86-.1-2-.13-2.12-.15-2.11-.2-2.12-.1-1-.12-.95-.12-.92-.13-.85-.12-.78-.06-.3-.44-.12-.45-.15-1-.28-1.05-.25-1.1-.24-1.15-.2-1.18-.16-1.25-.15-1.3-.14-1.33-.08-1.39-.08h-4.35zm-108.21 111.18h-.24z"/><path d="m422.05 401.57 1.3.05 1.22.11.71.09.67.11.68.14.74.18.76.25.84.32.51.26.39.2.38.22.18.12.3.18.29.2.26.22.17.13.25.22.25.21.25.25.22.25.13.14.25.3.25.31.23.34.2.33.1.15.19.32.16.33.07.17.88.26 1.14.39 1.08.43 1.08.45 1 .48 1 .52 1 .55.95.6.91.62.89.65.85.7.81.71.79.75.73.79.68.8.67.85.6.85.57.88.53.9.47.92.43 1 .4.93.33 1 .3 1 .25 1 .22 1 .18 1 .14 1 .08 1 .07 1v1.93l-.05 1-.09 1-.11.95-.15 1-.17.95-.2.93-.23.93-.25.94-.29.9-.3.91-.33.9-.35.9-.38.89-.4.88-.42.87-.43.85-.47.85-.48.85-.5.83-.54.82-.53.81-.57.8-.58.8-.6.79-.62.76-.63.77-.65.73-.67.74-.7.73-.7.7-.71.7-.75.68-.75.67-.77.65-.78.65-.8.62-.82.6-.83.58-.85.58-.87.55-.88.54-.89.51-.91.49-.92.48-.95.45-.95.42-.95.41-1 .39-1 .35-1 .33-1 .3-1 .28-1 .25-1.05.22-1.06.18-1.07.17-1.08.13-1.1.09-1.09.06h-3.35l-1.11-.08-1.14-.12-1.13-.15-1.13-.2-1.14-.23-1.13-.27-1.13-.32-1.14-.36-1.11-.39-1.12-.45-1.12-.46-1.11-.54-1.1-.55-1.1-.6-1.09-.65-1.06-.68-1.07-.72-1.07-.76-1-.8-1-.85-1-.89-1-.93-1-1-.7-.73-.68-.83-.62-.85-.57-.89-.51-.9-.44-.91-.4-.92-.33-.93-.28-.94-.25-.91-.2-.94-.15-.93-.12-.92-.08-.91-.05-.9v-2.69l.05-.88.08-.87.12-.88.12-.87.15-.85.15-.86.18-.85.18-.84.22-.83.23-.88.47-1.62.53-1.62.57-1.6.62-1.56.65-1.55.66-1.5.7-1.47.7-1.42.74-1.38.75-1.33.75-1.27.75-1.22.76-1.16.77-1.12.78-1.05.79-1 .81-.93.85-.9.64-.62.66-.55.65-.5.67-.47.67-.41.66-.4.69-.37.68-.35.68-.32.72-.33 1.35-.53 1.42-.52 1.43-.45 1.45-.43 1.45-.37 1.47-.35 1.48-.3 1.47-.27 1.45-.21 1.45-.2 1.41-.15 1.4-.14 1.37-.08h1.33zm-10.18 17.91-1 .27-1 .28-.9.3-.85.3-.78.32-.29.13-.28.14-.27.13-.21.12-.19.11-.13.09-.1.06-.21.24-.34.38-.4.52-.46.63-.52.73-.52.8-.55.89-.56.95-.55 1-.57 1.05-.55 1.1-.53 1.11-.5 1.15-.49 1.17-.46 1.17-.42 1.16-.38 1.15-.34 1.19-.15.51-.13.55-.12.55-.11.54-.1.51-.09.5-.06.49-.05.48-.05.45v2.23l.05.29v.26l.05.22.05.18.05.17v.13l.05.12.07.15.08.12.08.08.62.6.67.6.65.58.65.54.66.5.64.46.65.44.63.41.63.37.62.35.63.32.6.28.62.27.62.23.6.2.58.2.6.17.6.13.58.13.59.1.58.09.58.05.59.05h2.31l.59-.05.58-.07.58-.1.57-.1.58-.11.59-.14.56-.16.59-.17.56-.18.59-.22.56-.22.57-.25.57-.25.56-.26.55-.29.55-.3.55-.31.55-.34.54-.35.53-.35.53-.36.52-.4.52-.39.5-.41.48-.42.5-.43.47-.44.46-.45.45-.45.45-.46.44-.47.41-.48.4-.5.4-.49.39-.5.36-.5.35-.5.34-.51.33-.5.3-.52.3-.52.28-.5.25-.51.25-.5.24-.52.21-.5.19-.5.18-.48.17-.49.15-.48.13-.47.1-.46.1-.45.08-.45.07-.42.05-.42v-2.25l-.05-.31-.05-.32-.07-.3-.06-.28-.1-.29-.09-.26-.11-.25-.1-.25-.14-.24-.13-.23-.15-.23-.17-.24-.09-.2-.18-.23-.22-.22-.25-.23-.25-.24-.28-.23-.32-.23-.35-.24-.37-.23-.41-.23-.45-.22-.47-.23-.53-.22-.55-.22-.6-.2-.64-.2-.68-.18-.73-.18-.77-.15-.8-.15-.85-.14-.9-.11-1-.09-1-.08-1-.05h-3.15l-.41-.07-.42-.08-.42-.1-.41-.12-.4-.15-.4-.16-.39-.19-.38-.21-.37-.22-.35-.25-.33-.25-.33-.28-.32-.3-.28-.3-.29-.34zm233.56-183.11 1 .18 1 .3.95.43.88.55.82.65.73.77.62.83.51.92.4 1 .29 1 .13 1v1.05l-.12 1-.25 1-.37 1-.48.94-.62.85-.7.76-.8.69-.86.56-1 .47-1 .33-1 .22-1 .07h-.56l-.7.07-.74.08-.78.14-.87.16-.91.22-1 .27-1 .3-1.06.35-1.12.38-1.15.43-1.18.49-1.24.51-1.25.55-1.28.59-1.32.61-1.33.67-1.35.7-1.38.72-1.4.75-1.42.78-1.43.82-1.45.83-1.47.85-1.47.88-1.46.9-3 1.87-3 1.92-3 2-3 2-3 2.07-3 2.08-2.95 2.09-2.91 2.1-2.85 2.08-2.8 2.05-2.72 2-5.2 3.9-4.81 3.7-4.3 3.27-3.78 2.88-2.62 1.95-2.62 2-2.63 1.92-2.65 1.91-2.65 1.92-2.67 1.9-2.68 1.88-2.68 1.89-2.7 1.86-2.7 1.85-2.72 1.85-2.73 1.85-2.74 1.84-2.75 1.81-5.51 3.57-5.55 3.58-5.57 3.55-5.62 3.5-5.63 3.49-5.67 3.43-5.7 3.42-5.7 3.38-5.73 3.33-5.7 3.32-5.77 3.28-5.78 3.27-5.8 3.22-5.8 3.2-5.85 3.11-5.81 3.14-5.84 3.11-5.83 3.09-5.83 3.05-5.84 3-5.83 3-5.82 3-5.83 3-5.8 2.93-5.77 2.89-.56.28-.59.32-1.45.8-1.68 1-1.92 1.15-2.11 1.28-2.29 1.4-5.05 3.17-11.4 7.18-6.06 3.8-3.1 1.92-3.09 1.92-3.08 1.88-3 1.83-3 1.8-2.95 1.72-2.9 1.65-2.8 1.57-2.7 1.46-1.33.7-1.3.65-1.27.64-1.23.6-1.22.56-1.18.54-1.15.5-1.13.46-1.12.44-1.1.38-1.08.35-1.12.3-1.13.25-1.19.2-1.18.1h-1.52l-.82-.09-.87-.15-.53-.13-.75-.23-.18-.07-1-.42-.9-.53-.83-.63-.74-.74-.65-.83-.53-.9-.42-1-.3-1-.16-1v-1l.1-1.05.22-1 .37-1 .46-.94.59-.86.7-.8.78-.69.85-.6.93-.46 1-.37 1-.23 1-.1h1.05l.5.08.43-.11.54-.19.65-.21.71-.29.82-.33.88-.38.94-.42 1-.47 1.05-.51 1.11-.55 1.15-.59 1.17-.61 2.52-1.37 2.63-1.47 2.73-1.56 2.85-1.65 2.9-1.74 3-1.78 3-1.85 3-1.87 3-1.88 6-3.78 11.41-7.19 5.12-3.2 2.37-1.46 2.21-1.35 2.07-1.24 1.9-1.1 1.72-.95.83-.45.75-.38 5.8-2.92 5.78-2.9 5.77-2.95 5.78-2.95 5.79-3 5.78-3 5.78-3 5.79-3.07 5.76-3.07 5.77-3.11 5.75-3.14 5.73-3.15 5.74-3.18 5.7-3.22 5.7-3.23 5.66-3.28 5.65-3.29 5.64-3.33 5.6-3.37 5.56-3.38 5.55-3.42 5.52-3.45 5.48-3.48 5.45-3.52 5.42-3.56 2.7-1.77 2.67-1.8 2.68-1.8 2.67-1.82 2.65-1.81 2.63-1.84 2.63-1.83 2.62-1.85 2.6-1.87 2.6-1.86 2.58-1.87 2.57-1.88 2.57-1.89 2.55-1.9 3.68-2.78 4.28-3.27 4.84-3.66 5.38-3.95 2.78-2.07 2.87-2.1 2.93-2.13 3-2.15 3-2.17 3.1-2.17 3.14-2.13 3.15-2.12 3.16-2.08 3.19-2 3.15-2 1.6-1 1.58-1 1.58-.94 1.59-.9 1.56-.88 1.57-.87 1.55-.83 1.55-.82 1.53-.78 1.54-.75 1.51-.73 1.52-.69 1.5-.66 1.48-.64 1.49-.58 1.48-.55 1.45-.52 1.45-.48 1.45-.43 1.45-.39 1.43-.33 1.44-.28 1.41-.24 1.44-.18 1.38-.1h1.38zm-339.21 199.33-.19-.07-.36-.08z"/><path d="m580.5 154 .88.14.82.18.77.23.7.25.66.29.62.3.58.31.6.35 1 .62.95.7.9.73.85.74.82.75.78.78.77.78.73.8.72.8.71.82.7.82 1.3 1.56 1.22 1.54 1.13 1.43 1 1.27.85 1.05.69.8.16.2.2.21 1 1 1.2 1.27 1.35 1.46 1.47 1.62 1.61 1.8 1.74 2 1.83 2.08 1.92 2.24 2 2.33 2.07 2.43 2.13 2.54 2.17 2.61 2.2 2.67 2.22 2.72 2.21 2.75 2.2 2.76 2.19 2.79 2.15 2.78 2.03 2.7 2 2.72 1.95 2.68 1.89 2.63 1.75 2.55.85 1.25.81 1.24.79 1.21.76 1.19.72 1.16.68 1.15.65 1.14.62 1.1.58 1.08.54 1.07.51 1.06.45 1.05.44 1.05.38 1.07.33 1.12.29 1.18.18 1.18.07.77v1.57l-.18 1.08-.32 1-.45 1-.56.92-.7.85-.8.73-.89.64-1 .51-1 .39-1.07.25-1.08.1h-1.08l-1.09-.18-1-.32-1-.45-.92-.58-.85-.68-.73-.8-.63-.89-.52-1-.38-1-.25-1.07-.09-.83v-.07l-.08-.23-.13-.37-.19-.48-.25-.57-.31-.66-.37-.72-.43-.8-.47-.85-.53-.9-.57-.95-.6-1-.67-1-.68-1.07-.73-1.1-.77-1.13-1.63-2.37-1.75-2.45-1.85-2.53-1.94-2.64-2-2.64-2.06-2.68-2.14-2.68-2.13-2.69-2.15-2.68-2.15-2.63-2.15-2.6-2.12-2.55-2.1-2.45-2-2.4-2-2.27-1.87-2.17-1.76-2-1.67-1.87-1.48-1.69-1.4-1.53-1.24-1.32-1.05-1.15-.93-1-.45-.49-.53-.6-1-1.13-1-1.25-1-1.32-1.1-1.38-1.12-1.38-1.15-1.39-.55-.65-.55-.63-.55-.62-.53-.56-.5-.54-.49-.46-.18-.17-3.85 1.93-6.8 3.49-6.78 3.51-6.77 3.64-6.7 3.6-6.75 3.65-6.73 3.68-6.72 3.72-6.8 3.77-6.7 3.78-6.65 3.8-6.7 3.85-6.68 3.89-6.67 3.91-6.67 3.95-6.66 4-6.67 4-6.65 4-6.67 4.05-6.65 4-6.63 4.12-6.65 4.1-13.35 8.21-13.31 8.29-13.32 8.31-26.72 16.7-1.45.9-1.5.9-1.5.9-1.53.89-1.55.88-1.57.88-3.15 1.72-3.21 1.72-3.19 1.68-3.3 1.67-3.34 1.66-3.36 1.67-3.39 1.65-6.8 3.28-6.8 3.3-3.38 1.67-3.37 1.67-3.35 1.66-3.3 1.7-3.28 1.72-3.22 1.72-3.21 1.78-1.55.88-1.55.88-1.52.9-1.51.9-1.49.9-1.48.9-1.45.92-1.43.93-1.4.94-1.39.93-1.36.93-1.34.95-1.31 1-1.29 1-1.25 1-1.23 1-1.2 1-1.17 1-1.13 1-1.1 1-1.08 1-.14.13v1.37l.06.7.12.78.13.87.19.93.2 1 .25 1 .28 1.1.3 1.15.35 1.18.37 1.24.4 1.26.41 1.3.45 1.34.49 1.35.48 1.38.52 1.4 1.08 2.87 1.15 2.93 1.22 3 1.23 3 1.27 3 1.3 3 1.32 2.76 2.57 5.74 2.45 5.4 2.23 4.95 1 2.28.93 2.12.85 2 .75 1.8.63 1.64.3.8.2.58.19.5.21.48.29.64.38.71.43.82.5.87.54.93.58.95 1.28 2 1.34 2.07 2.7 4.07 1.25 1.91 1.13 1.79.53.86.49.85.46.87.47 1 .28.71.25.72.05.18.19.75v.15l.1.64v1.7l-.13.95v.1l-.25.95-.35.91-.45.87v.07l-.53.78-.62.72-.7.63-.75.55-.06.05-1 .55-1.05.4-1.1.27h-.09l-1.13.12-1.13-.05h-.12l-.7-.1-.7-.16h-.15l-.88-.3-.47-.2-.72-.35-.65-.38-.78-.5-.87-.65-.78-.77-.67-.86-.56-.94-.42-1-.3-1-.15-1.08v-1.13l-.83-1.29-2.72-4.11-1.45-2.22-1.4-2.23-.71-1.17-.67-1.13-.63-1.14-.62-1.13-.58-1.13-.55-1.15-.5-1.17-.39-1-.2-.57-.16-.5-.52-1.3-.65-1.55-.78-1.81-.89-2-1-2.2-2.22-5.13-2.45-5.43-2.6-5.82-1.34-3-1.31-3.07-1.32-3.1-1.3-3.1-1.27-3.12-1.21-3.1-1.12-3.09-.57-1.54-.53-1.51-.53-1.5-.5-1.49-.49-1.46-.45-1.45-.43-1.44-.4-1.41-.38-1.4-.35-1.39-.32-1.36-.28-1.34-.25-1.33-.22-1.3-.17-1.3-.13-1.3-.08-1.28v-2.52l.05-.72.09-.66.08-.69.12-.66.16-.69.19-.7.21-.71.27-.72.32-.72.36-.73.44-.72.5-.71.55-.7.53-.59 1.37-1.33 1.3-1.22 1.31-1.21 1.35-1.19 1.39-1.16 1.4-1.15 1.41-1.14 1.45-1.11 1.47-1.12 1.48-1.08 1.5-1.07 1.54-1.05 1.53-1.05 1.57-1 1.56-1 1.59-1 1.6-1 1.61-1 1.64-1 1.65-.95 1.65-.95 1.66-.95 3.35-1.84 3.39-1.81 3.4-1.79 3.43-1.75 3.43-1.73 3.45-1.72 3.45-1.68 6.84-3.32 6.78-3.28 3.33-1.62 3.3-1.63 3.24-1.62 3.18-1.61 3.13-1.62 3-1.62 3-1.63 1.43-.82 1.43-.81 1.42-.82 1.38-.82 1.37-.81 1.35-.84 26.67-16.68 13.35-8.33 13.33-8.3 13.33-8.24 6.69-4.11 6.68-4.09 6.68-4.08 6.69-4.05 6.7-4 6.7-4 6.7-4 6.71-4 6.74-4 6.73-3.91 6.75-3.89 6.75-3.86 6.77-3.84 6.78-3.78 6.78-3.77 6.82-3.71 6.82-3.7 6.83-3.65 6.85-3.6 6.87-3.57 6.88-3.53 7.08-3.57.42-.18.83-.32.24-.07.81-.21.25-.05.82-.12h1.65z"/><path d="m596.1 112.83h1.17l1.15.06 1.16.1 1.15.12 1.14.15 1.13.18 1.13.2 1.12.22 1.12.25 1.11.28 1.1.29 1.1.31 1.09.35 1.06.37 1.09.38 1.05.4 1.03.51 1 .45 1 .46 1 .49 1 .5 1 .51 1 .55 1 .55 1 .59 1 .58 1 .6 1 .63 1 .64 1 .65.93.66.94.69.91.7.92.71.92.72.9.73.88.75.88.77.89.78.86.79.89.81 1.66 1.6 1.67 1.69 1.63 1.7 1.6 1.75 1.59 1.8 1.53 1.81 1.52 1.85 1.46 1.89 1.45 1.9 1.42 1.93 1.38 2 1.35 2 1.32 2 1.28 2 1.25 2 1.22 2.05 1.18 2.05 1.15 2 1.12 2.06 1.08 2.09 1.05 2.06 1 2.09 1 2.06.93 2.07.9 2.07.87 2.05.83 2 .8 2 .75 2 .72 2 .66 2 .64 2 .6 2 .55 1.93.51 1.92.47 1.88.43 1.87.35 1.68v.15l.17.57.27.78.36 1 .45 1.17.54 1.33 1.23 3.07 1.38 3.43 1.47 3.74.77 2 .75 2 .75 2 .71 2.05.7 2.06.67 2.07.62 2.07.56 2 .27 1 .25 1 .23 1 .22 1 .18 1 .19 1 .15 1 .11 1 .1 1 .07 1v2l-.05 1-.06 1.35-.17 1.08-.25 1.1-.33 1.14-.32.8-.13.35-.17.35-.36.73-.4.67-.39.56-.43.59-.47.55-.51.51-.54.52-.6.48-.61.44-.65.4-.62.33-.82.38-.78.34-.78.3-.8.26-.79.22-.78.18-.8.17-.78.12-.77.1-.77.06-.76.05h-2.22l-.73-.05-.75-.06-1.35-.17-1.35-.22-1.32-.28-1.28-.3-1.25-.33-1.22-.37-1.18-.38-1.17-.39-2.18-.78-2.09-.77-2-.73-.9-.32-.87-.3-.83-.26-.77-.22-.71-.2-.64-.15-.58-.12-.55-.06h-1.45l-.65-.1-.65-.13-.62-.18-.61-.25-.59-.29-.56-.31-.54-.39-.51-.41-.47-.45-.43-.49-.4-.51-.35-.55-.32-.59-.27-.6-.21-.61-.17-.64-.12-.63-.06-.65v-.67l.05-.65.08-.65.14-.63.18-.63.25-.6.28-.6.32-.57.38-.53.42-.5.45-.49.48-.43.52-.4.55-.35.58-.3.6-.27.62-.21.63-.17.64-.12.66-.06h1.9l.69.05.71.08 1.24.19 1.25.23 1.21.28 1.19.32 1.16.35 1.12.37 1.12.36 1.08.39 2.1.67 2 .75 2 .7.9.3.88.29.87.26.83.22.78.18.74.15.68.12.68.08h1.02v-.48l-.07-.57-.1-.61-.12-.67-.13-.68-.15-.74-.17-.76-.2-.77-.2-.8-.46-1.7-.54-1.75-.58-1.8-.62-1.83-.65-1.87-.68-1.87-.7-1.86-.72-1.84-1.43-3.61-1.37-3.4-1.25-3.12-.56-1.45-.54-1.35-.46-1.27-.42-1.21-.35-1.12-.17-.68-.13-.54-.35-1.65-.35-1.55-.4-1.6-.51-1.6-.49-1.67-.51-1.7-.55-1.73-.6-1.75-.64-1.78-.66-1.79-.72-1.81-.73-1.84-.79-1.85-.8-1.85-.85-1.85-.88-1.86-.9-1.87-.95-1.88-1-1.85-1-1.87-1-1.85-1.06-1.85-1.09-1.83-1.11-1.82-1.15-1.8-1.19-1.78-1.2-1.75-1.21-1.74-1.25-1.71-1.29-1.67-1.28-1.65-1.32-1.62-1.33-1.58-1.37-1.55-1.36-1.5-1.4-1.45-1.4-1.42-1.45-1.38-.7-.65-.72-.65-.72-.65-.73-.62-.73-.61-.74-.6-.73-.59-.73-.58-.75-.55-.74-.55-.75-.53-.75-.5-.75-.5-.75-.49-.75-.48-.75-.45-.75-.43-.75-.42-.76-.42-.75-.38-.77-.37-.75-.36-.75-.34-.77-.33-.75-.3-.76-.28-.75-.29-.77-.25-.75-.23-.77-.23-.75-.2-.76-.19-.75-.16-.77-.15-.77-.14-.75-.11-.76-.1-.77-.09-.75-.06h-4.62l-.76.06-.79.1-.78.1-.78.12-.8.15-.79.17-.78.2-.32.06-.26.09-.25.08-.25.1-.2.08-.2.09-.19.08-.16.08-.15.1-.14.09-.13.08-.12.08-.1.09-.1.08-.1.08-.08.09-.08.08-.09.1-.06.1-.09.08-.06.12-.09.12-.06.11-.09.14-.06.13-.07.15-.07.15-.05.12-.15.43-.13.42-.1.46-.1.5-.08.57-.07.6v3.55l.07.8.08.83.1.85.13.87.14.87.16.9.19.9.18.91.2.89.47 1.86.48 1.85.5 1.82.53 1.8.52 1.75 1 3.35.46 1.58.44 1.54.36 1.45.17.78.15.75.13.78.1.85v2.84l-.08.58-.13.6-.07.25-.18.58-.24.57v.12l-.22.43-.23.43v.1l-.32.5-.35.49-.06.06-.44.5-.45.47-.08.07-.5.41-.52.39-.56.35-.59.28-.6.25-.61.22-.65.15-.64.1-.66.05h-.65l-.65-.05-.65-.12-.64-.15-.69-.2-.6-.25-.59-.3-.56-.33-.54-.4-.48-.42-.47-.47-.43-.5-.38-.51-.34-.57-.3-.58-.31-.67-.2-.64-.15-.63-.1-.65-.05-.65v-.65l.05-.65.1-.65v-.1l-.27-1-.33-1.22-.42-1.41-1-3.3-.55-1.84-.57-1.95-.56-2-.57-2.12-.52-2.16-.26-1.14-.24-1.13-.21-1.13-.22-1.15-.18-1.17-.19-1.18-.15-1.19-.11-1.2-.1-1.2-.07-1.2v-3.68l.08-1.25.14-1.23.18-1.27.25-1.25.3-1.27.38-1.26.42-1.2.28-.67.29-.63.28-.62.32-.62.35-.6.36-.6.39-.6.41-.58.44-.58.46-.55.49-.55.5-.54.53-.51.55-.5.57-.49.58-.46.62-.45.63-.42.63-.4.67-.37.68-.36.69-.34.71-.31.72-.29.73-.26.74-.25.75-.22.76-.2 1.2-.28 1.19-.27 1.2-.22 1.18-.18 1.18-.17 1.19-.13 1.18-.1 1.18-.07h3.52zm-21.3 51.55-.22.29.17-.2.45-.45z"/><path d="m674.83 51.18.54.07.53.08.52.14.51.16.5.19.49.21.46.27.45.28.44.3.41.35.39.37.36.38.35.42.3.43.3.45.25.47.22.48.2.5.17.5.11.52.1.53.07.54v1.63l-.05.37-.06.53-.2.87-.25.8-.3.75-.2.43-.2.35-.2.37-.22.33-.23.38-.27.37-.27.35-.23.28-.25.29-.52.56-.78.72-.75.62-.75.56-.75.5-.73.45-.72.44-.73.4-.75.38-1.37.68-1.38.62-1.32.57-2.32 1-.93.4-.7.3-.38.2-1.69 1.05-1.83 1.18-3.63 2.33-3.69 2.3-3.7 2.25-3.68 2.25-3.7 2.22-7.37 4.42-3.63 2.21-3.62 2.22-3.55 2.25-1.77 1.12-1.76 1.13-1.74 1.14-1.73 1.15-1.72 1.15-1.7 1.16-1.68 1.15-1.65 1.18-1.65 1.19-1.6 1.2-1.37 1.05-2.33 1.83-1.38 1.1-1.52 1.22-1.5 1.25-1.5 1.28-1.41 1.25-1.32 1.22-.55.53-.52.5-.43.47-.14.5-.18.5-.22.5-.25.47-.28.47-.3.43-.33.42-.35.4-.39.36-.41.35-.42.32-.45.3-.47.25-.48.23-.5.2-.5.19-.52.13-.51.1-.54.07h-1.6l-.53-.07-.53-.1-.52-.13-.5-.17-.5-.2-.48-.23-.47-.25-.4-.31-.44-.32-.41-.35-.39-.37-.35-.4-.08-.08-.33-.42-.3-.43-.29-.45-.25-.47v-.11l-.2-.45-.18-.49-.15-.48-.12-.48v-.12l-.07-.42-.05-.4v-1.86l.05-.44v-.15l.1-.51.12-.5.05-.15.12-.39.13-.38.18-.47.39-.8.58-1 .67-.94.63-.81.67-.79.68-.73.72-.73.73-.74.78-.75 1.57-1.45 1.65-1.45 1.67-1.43 1.66-1.4 1.6-1.3 1.5-1.22 2.36-1.94 1.55-1.18 1.78-1.32 1.78-1.28 1.79-1.28 1.8-1.25 1.81-1.25 1.82-1.22 1.83-1.22 1.84-1.18 1.83-1.18 1.87-1.19 3.68-2.3 3.72-2.28 3.71-2.25 7.39-4.43 3.66-2.2 3.64-2.2 3.6-2.22 3.55-2.22 3.5-2.23 1.71-1.12 1.85-1.21.55-.35.67-.37 1.07-.5 1.1-.5 1.1-.46 2.25-.94 1.09-.46 1-.47 1-.48.38-.2.37-.2.26-.15v-.1l.23-.49.28-.45.29-.45.33-.41.35-.4.38-.39.4-.35.42-.33.45-.3.45-.27.48-.25.49-.2.51-.18.5-.13.54-.12.51-.08h1.6zm-81.3 67.14v-.17zm-1.15-2.14.3.44.2.33-.21-.47-.62-.71zm199.62 76.5.57.07.57.12.55.15.53.2.52.21.5.27.5.28.46.34.44.36.41.39.4.41.35.44.34.46.3.49.26.5.22.51.2.55.15.54.12.56.08.57v1.7l-.07.57-.11.55-.15.55-.14.53-.23.53-.25.5-.3.49-.33.46-.35.45-.39.42-.41.38-.45.37-.45.33-.5.3-.5.25-.52.24-.53.2-.55.15-.55.11-.57.09h-1.27l-.33.06-.43.12-.5.15-.59.2-.63.23-.7.29-.75.31-.78.35-.84.39-.86.43-.9.47-.94.48-1 .53-1 .55-1 .57-2.12 1.25-2.18 1.33-2.25 1.42-2.3 1.48-2.35 1.55-2.37 1.6-2.38 1.64-2.4 1.66-2.4 1.69-2.37 1.7-2.35 1.68-4.6 3.35-4.38 3.2-4.09 3-3.71 2.72-1.7 1.33-1.6 1.15-1.48 1-1.35.93-2.85 1.92-2.89 1.83-2.91 1.82-2.92 1.78-2.92 1.77-2.9 1.73-5.73 3.44-.57.31-.68.37-1.48.78-1.67.89-1.68.9-1.52.83-.52.3-.1.1-.41.4-.45.35-.47.33-.48.29-.52.26-.52.22-.53.2-.5.1-.55.12-.57.06h-1.71l-.55-.08-.62-.1-.55-.15-.53-.2-.52-.23-.5-.25-.48-.3-.47-.33-.45-.37-.4-.38-.4-.42-.35-.45-.3-.43-.26-.43-.25-.45-.22-.47-.18-.48-.15-.5-.14-.5-.1-.55-.06-.53v-1.1l.05-.54.08-.55.12-.53.15-.52v-.08l.2-.53.21-.5.27-.5.28-.47.32-.47.07-.08.26-.33.3-.38.3-.3.11-.11.35-.32.37-.28.58-.47.9-.6.85-.52.87-.5 1.78-1 1.84-1 1.68-.88 1.37-.72.41-.25.29-.15 5.61-3.35 2.87-1.71 2.85-1.72 2.82-1.73 2.78-1.74 2.72-1.73 2.65-1.73 1.15-.79 1.33-.93 1.5-1.07 1.63-1.16 3.65-2.67 4.09-3 4.41-3.22 4.65-3.4 2.42-1.71 2.45-1.75 2.45-1.74 2.48-1.73 2.5-1.7 2.49-1.68 2.48-1.64 2.45-1.58 2.43-1.53 2.4-1.47 2.34-1.37 1.16-.68 1.15-.63 1.15-.62 1.12-.58 1.12-.54 1.1-.55 1.08-.52 1.08-.48 1.07-.45 1.07-.42 1.06-.4 1.05-.35 1.07-.33 1.08-.27 1.09-.25 1.13-.18 1.17-.12h1.45z"/><path d="m714 0 1.83.07 1.82.12 1.8.16 1.8.2 1.78.25 1.77.29 1.76.31 1.74.37 1.73.4 1.72.45 1.71.47 1.69.51 1.68.55 1.67.59 1.65.63 1.63.65 1.63.68 1.6.72 1.6.75 1.59.78 1.56.82 1.55.85 1.54.87 1.53.9 1.5.93 1.5 1 1.48 1 1.47 1 1.45 1 1.45 1.06 1.43 1.07 1.4 1.12 1.42 1.11 1.38 1.15 1.39 1.17 1.37 1.2 1.38 1.2 1.33 1.23 1.33 1.25 1.3 1.29 1.3 1.28 1.3 1.3 1.27 1.33 1.27 1.34 1.25 1.35 1.23 1.38 1.22 1.38 1.21 1.4 1.2 1.42 1.2 1.43 1.17 1.44 1.17 1.46 1.16 1.47 1.09 1.47 1.13 1.5 1.13 1.5 1.1 1.51 1.1 1.52 1.09 1.53 1.08 1.54 1.07 1.55 1 1.55 1.05 1.58 2 3.13 2 3.17 2 3.2 1.92 3.2 1.88 3.22 1.83 3.23 1.8 3.22 1.87 3.23 1.7 3.23 1.68 3.22 1.64 3.22 1.58 3.2 1.55 3.13 1.5 3.15 1.47 3.14 1.43 3.1 1.38 3 1.35 3 1.3 3 1.27 2.93 1.22 2.88 1.2 2.84 1.13 2.76 1.1 2.72 1.07 2.63 2.6 6.45 1.41 3.6.74 1.9.73 1.94.73 2 .74 2 .73 2.06.7 2.09.7 2.13.68 2.15.65 2.18.62 2.2.58 2.22.54 2.25.5 2.25.45 2.23.2 1.15.2 1.14.16 1.15.17 1.13.15 1.13.12 1.15.11 1.14.09 1.15.06 1.13v5.72l.02 1.21-.1 1.13-.12 1.14-.15 1.13-.18 1.13-.2 1.12-.25 1.13-.28 1.1-.3 1.12-.37 1.15-.4 1.08-.47 1.09-.53 1.06-.6 1-.67 1-.73.93-.8.89-.85.8-.92.75-.95.67-1 .6-1 .52-1 .43-1 .37-1 .3-1 .21-1 .17-1 .12-1 .05h-2.95l-.92-.1-.91-.13-.9-.17-.89-.18-.88-.2-.87-.24-.85-.23-.85-.27-.81-.28-.84-.3-.8-.32-.83-.33-1.53-.67-1.54-.71-1.48-.77-1.43-.77-1.4-.8-1.32-.8-1.28-.8-1.2-.8-1.07-.73-.47.4-.66.47-.72.4-.75.31-.78.25-.8.19-.82.08h-.82l-.81-.07-.8-.15-.79-.23-.76-.3-.72-.37-.68-.45-.65-.5-.59-.58-.53-.62-.47-.67-.38-.71-.33-.75-.25-.79-.17-.8-.1-.81v-.82l.07-.82.15-.8.21-.78.3-.77.39-.71v-.19l-.07-.4-.08-.47-.1-.52-.13-.56-.17-.62-.18-.67-.22-.7-.23-.71-.25-.77-.29-.78-.3-.79-.66-1.71-.75-1.75-.8-1.82-.85-1.85-.9-1.87-1-1.86-1-1.89-1-1.85-1-1.81-1-1.79-1-1.73-1-1.65-.95-1.57-.93-1.46-.87-1.35-.83-1.24-.75-1.08-.67-.92-.55-.71-.43-.52-.08-.1-.14-.13-.66-.69-.75-.8-.72-.8-.7-.81-.68-.82-.67-.83-.65-.85-.63-.85-.64-.85-.6-.87-.58-.87-.58-.88-1.1-1.73-1.01-1.7-1-1.78-1-1.79-1-1.8-.92-1.78-.9-1.78-.86-1.79-1.7-3.5-1.67-3.45-.82-1.68-.83-1.65-.82-1.62-.83-1.56-.83-1.54-.85-1.5-.87-1.43-.88-1.42-.44-.65-.43-.66-.45-.65-.47-.64-.45-.61-.46-.6-.47-.59-.47-.56-.48-.55-.48-.54-.49-.51-.5-.52-1.71-1.68-1.75-1.69-1.8-1.65-1.85-1.65-1.87-1.61-1.92-1.62-2-1.6-2-1.58-2-1.57-2-1.55-2.06-1.53-2.1-1.52-2.12-1.48-2.13-1.49-2.17-1.46-2.18-1.44-2.2-1.43-2.22-1.4-2.22-1.38-2.25-1.39-2.25-1.33-2.25-1.33-2.26-1.32-2.27-1.28-2.27-1.29-2.28-1.25-2.2-1.28-2.26-1.2-2.27-1.2-2.27-1.17-2.25-1.15-2.35-1.18-1-.52-1-.65-1-.68-1-.72-.92-.78-.85-.8-.82-.85-.76-.87-.74-.9-.66-.91-.65-.95-.6-1-.55-1-.54-1-.48-1-.45-1-.42-1-.38-1-.35-1.07-.33-1.06-.29-1.09-.26-1.08-.24-1.1-.2-1.1-.16-1.1-.15-1.12-.12-1.1-.08-1.11-.07-1.14v-3.35l.05-1.11.08-1.12.1-1.12.13-1.11.15-1.1.19-1.12.21-1.1.25-1.08.27-1.09.3-1.06.33-1.09.37-1.05.4-1.05.43-1 .47-1 .52-1 .53-1 .58-1 .62-1 .65-.93.7-.9.75-.9.78-.85.84-.84.88-.78.89-.8 1-.72 1-.66 1.07-.6 1.1-.55 1.15-.5 1.1-.42 2-.65 1.95-.57 1.94-.53 1.93-.48 1.92-.44 1.91-.38 1.92-.33 1.9-.3 1.9-.24 1.88-.2 1.93-.15 1.88-.1 1.85-.08h1.85zm-3.35 16.65-1.45.05-1.49.09-1.46.11-1.5.15-1.5.2-1.52.24-1.52.26-1.55.3-1.55.35-1.56.4-1.57.42-1.6.48-1.53.49-.35.13-.27.12-.27.13-.26.15-.27.17-.25.2-.28.21-.27.24-.27.26-.26.3-.27.32-.27.35-.26.38-.27.4-.27.45-.25.45-.23.5-.25.5-.22.55-.21.55-.2.59-.19.6-.18.61-.15.64-.15.66-.13.67-.12.67-.1.68-.07.7-.06.7v4.35l.07.71.07.7.1.69.1.68.13.67.13.66.15.65.17.62.18.62.2.58.22.58.22.55.23.52.23.5.25.48.25.44.27.43.27.38.26.37.27.33.28.32.27.28.27.25.26.22.27.22.27.18.26.15.39.2 2.2 1.12 2.33 1.2 2.35 1.21 2.37 1.24 2.36 1.26 2.37 1.29 2.37 1.3 2.36 1.28 2.39 1.35 2.34 1.35 2.37 1.4 2.37 1.41 2.36 1.44 2.35 1.46 2.34 1.49 2.33 1.51 2.32 1.54 2.3 1.55 2.28 1.58 2.25 1.62 2.23 1.62 2.23 1.65 2.2 1.66 2.19 1.69 2.15 1.71 2.11 1.75 2.09 1.75 2.06 1.8 2 1.8 2 1.84 2 1.86 1.91 1.9.74.75.73.79.72.78.68.8.68.82.65.81.64.84.63.83.6.85.6.85.57.85.58.88 1.07 1.72 1 1.75 1 1.77 1 1.76.94 1.79.91 1.76.89 1.79.86 1.76 1.69 3.49 1.66 3.45.84 1.68.83 1.65.83 1.62.84 1.6.85 1.55.86 1.5.94 1.48.92 1.45.43.65.45.68.47.65.46.65.47.63.48.62.49.6.48.58.5.57.5.55.5.55.62.62.38.41.48.54.84 1 .88 1.15.9 1.23.93 1.35 1 1.45 1 1.57 1 1.65 1.07 1.73 1.06 1.82 1.1 1.9 1.1 1.93 1.09 2 1.08 2 1.08 2.07 1 2.08 1 2.09 1 2.1.93 2.08.87 2.08.8 2 .38 1 .37 1 .33 1 .34 1 .3 1v.1h.07l.77.25.75.33.71.4.67.49.62.53.36.33.37.34.5.41.62.49.71.53.79.58.86.59.94.61 1 .62 1 .62 1.05.6 1.08.58 1.05.57 1.06.52 1.12.48.5.2.52.2.5.19.5.16.48.15.48.15.45.12.44.1.41.08.39.07.36.05h1.62l.05-.08.07-.14.08-.2.12-.3.16-.53.17-.62.17-.63.13-.65.13-.65.1-.7.1-.7.07-.73.07-.74v-4.81l-.05-.85-.06-.87-.09-.87-.1-.9-.1-.88-.13-.92-.13-.91-.17-.92-.17-.92-.36-1.91-.44-1.9-.46-1.92-.5-1.93-.55-1.95-.59-2-.6-1.94-.63-1.93-.65-1.92-.68-1.91-.69-1.89-.6-1.75-.7-1.83-.68-1.8-1.39-3.5-2.58-6.4-1-2.6-1.15-2.65-1.11-2.7-1.15-2.75-1.19-2.8-1.23-2.85-1.27-2.9-1.3-2.92-1.35-3-1.36-3-1.42-3-1.45-3-1.5-3.06-1.53-3.07-1.57-3.08-1.57-3.09-1.63-3.08-1.69-3.1-1.68-3.1-1.75-3.07-1.79-3.05-1.83-3-1.85-3-1.9-3-1.93-3-1-1.46-1-1.45-1-1.45-1-1.44-1-1.43-1-1.42-1-1.4-1-1.4-1.05-1.36-1.07-1.37-1.05-1.35-1.18-1.37-1.08-1.32-1.09-1.31-1.1-1.29-1.1-1.28-1.11-1.25-1.12-1.25-1.13-1.22-1.14-1.21-1.15-1.19-1.15-1.16-1.15-1.15-1.16-1.14-1.19-1.1-1.18-1.1-1.18-1.06-1.2-1-1.2-1-1.2-1-1.22-1-1.23-1-1.22-.92-1.23-.92-1.25-.83-1.25-.87-1.25-.82-1.25-.81-1.27-.77-1.28-.73-1.27-.73-1.28-.7-1.3-.67-1.29-.63-1.3-.62-1.31-.65-1.32-.55-1.32-.54-1.31-.5-1.34-.41-1.33-.44-1.35-.41-1.35-.37-1.35-.35-1.37-.32-1.36-.28-1.37-.3-1.38-.21-1.38-.19-1.44-.13-1.4-.12-1.42-.1-1.43-.05h-1.43zm91.55 180.67-.13.16.21-.23zm-542.03 178.3.71.06.65.12.7.13 1.07.29 1.05.35 1 .4.9.4.85.43.82.43.8.45 1.4.84 1.28.81h.6l.55.05.53.07.53.12.54.13.51.18.5.2.49.25.48.27.45.32.43.33.4.35.39.4.36.4.32.43.3.47.28.47.24.48.21.52.17.51.13.52.1.4.09.43.06.44v2.35l-.06.46-.09.47-.11.45v.1l-.13.43-.17.42-.18.42-.2.4-.05.08-.22.38-.25.37-.25.35-.28.35-.3.32-.05.06-.32.32-.33.3-.35.27-.37.26-.38.24-.07.05-.45.25-.45.21-.46.19-.49.16h-.08l-.4.1-.42.1-.4.06-.41.05h-1.9l-.45-.06-.44-.09-.25-.05-.36-.1-.37-.1-.35-.11-.63-.24-.87-.4-.73-.38-.65-.37-.62-.38-1.12-.7-1.11-.72-1.07-.68-1-.62-.44-.25-.26-.13-.29.15-.75.43-1.58.92-1.58 1-1.6 1-1.64 1.08-1.63 1.15-1.63 1.18-1.67 1.22-1.67 1.27-1.68 1.31-1.7 1.34-1.7 1.36-1.7 1.39-3.47 2.86-3.48 2.9-3.5 3-3.55 2.95-3.55 2.92-1.8 1.45-1.8 1.43-1.82 1.42-1.93 1.39-1.84 1.37-1.83 1.33-1.85 1.3-1.88 1.29-.64.4-.68.41-1.37.8-1.5.84-1.6.88-1.65.92-1.68.95-1.67 1-1.65 1-.75.48-.75.47-.7.48-.65.45-.6.43-.53.42-.47.38-.38.35-.22.2-.13.49-.18.51-.22.5-.25.49-.28.46-.3.45-.35.44-.37.4-.38.38-.42.35-.43.32-.47.3-.47.26-.5.24-.5.2-.51.16-.54.14-.53.1-.55.06h-1.63l-.54-.09-.53-.11-.53-.15-.52-.19-.5-.21-.48-.25-.47-.29-.45-.3-.42-.33-.41-.37-.37-.4-.37-.41-.31-.44-.3-.45-.27-.48-.23-.5-.2-.5-.17-.52-.13-.53-.1-.53-.07-.55v-2.09l.08-.61.2-.9.27-.85.3-.79.33-.71.37-.67.36-.63.4-.57.44-.6.76-.93.84-.9.86-.82.87-.78.9-.74.9-.7.93-.68.94-.67 1-.63.95-.62 1-.61 1.9-1.14 1.9-1.1 1.82-1 1.71-.95 1.55-.87 1.34-.75 1.08-.63.37-.22.3-.18 1.6-1.1 1.65-1.15 1.65-1.2 1.66-1.24 1.67-1.28 1.68-1.32 1.7-1.35 1.7-1.36 3.45-2.84 3.47-2.88 3.5-2.93 3.53-3 3.55-2.92 1.79-1.46 1.8-1.44 1.8-1.43 1.81-1.4 1.82-1.38 1.83-1.35 1.85-1.34 1.85-1.28 1.87-1.25 1.87-1.22 1.9-1.16 1.88-1.1 1-.55.95-.52 1-.52 1.11-.56.42-.19.35-.15.37-.13.21-.07.31-.17.35-.1.55-.12.87-.15.85-.07h.78zm25.7 44.06h.86l.42.07.43.08.42.1.4.13h.1l.43.16.44.19.43.21.4.24.4.26.38.29.35.3.35.31.07.07.32.35.31.35.29.38.26.39.24.41.21.42.2.43.17.44v.1l.15.48.12.48.1.5.05.5v1.5l-.07.5-.08.5-.12.49-.15.48-.18.48-.2.45-.24.45-.26.44-.29.41-.3.4-.33.37-.35.37-.38.33-.4.3-.42.3-.42.25-.45.25-.46.2-.47.18-.48.15-.49.12h-.06l-.52.36-.72.54-.8.6-1.83 1.41-2 1.62-2.1 1.73-2.15 1.79-2.1 1.78-3.92 3.33-3.1 2.62-1.17 1-.56.45-.55.38-1.55 1.15-1.57 1-1.61 1-1.67 1-1.7 1-1.73 1-1.77 1-1.8 1-3.65 1.73-3.7 1.94-3.7 1.95-3.68 1.93-3.64 1.95-1.75 1-1.73 1-1.68 1-1.65 1-1.6.95-1.54 1-1.46.94-1.4.95-1.34.91-1.23.92-1.18.9-.52.43-.52.42-.48.43-.47.42-.43.4-.47.47-.36.33-.4.33-.4.29-.44.26-.43.25-.47.22-.46.18-.47.17-.5.12-.48.1-.5.08h-1.5l-.52-.05-.48-.09-.5-.1-.49-.15-.46-.16-.47-.2-.45-.22-.43-.25-.42-.28-.4-.3-.38-.34-.37-.35-.35-.36-.32-.4-.28-.4-.28-.44-.24-.43-.21-.45-.19-.47-.16-.48-.14-.48-.1-.5-.06-.5v-1.5l.05-.5.07-.5.11-.5.15-.49.17-.46.2-.47.22-.45.25-.43.28-.42.3-.4.33-.38.35-.37.59-.58.68-.64.7-.63.72-.62.73-.61.75-.62 1.5-1.17 1.58-1.15 1.62-1.13 1.67-1.12 1.71-1.1 1.75-1.08 1.8-1.25 1.8-1.06 1.83-1.05 1.85-1 1.88-1 3.75-2 3.77-2 3.73-2 3.65-1.92 3.55-1.86 1.7-.94 1.67-.9 1.62-.9 1.53-.88 1.48-.87 1.42-.85 1.33-.83 1.14-.75.16-.12.9-.75 3-2.51 3.91-3.34 2.17-1.83 2.16-1.84 2.21-1.82 2.17-1.75 2-1.58 1-.75.95-.7.91-.65.92-.6.92-.58.95-.52.68-.32.75-.3.5-.15.33-.1.34-.08.35-.07h.15l.4-.07h1.18z"/><path d="m148.25 408.62.6.08.6.12.6.16.17.07h1.71l.62.06.62.1.6.17.6.2.56.25.55.28.54.34.5.36.48.4.43.44.42.48.37.5.33.52.3.55.25.56.22.59v.1l1.75 1.25 3.44 2.5 3.16 2.3 2.54 1.83 1.63 1.18 1.67 1.25 1.7 1.32 1.69 1.42 1.7 1.42 1.68 1.45 1.67 1.5 1.63 1.53.82.82.82.8.8.81.78.84.78.83.77.85.75.87.73.88.74.88.71.9.7.92.67.93.67.94.65.95.61 1 .6 1 .67 1.11.65 1.15.65 1.19.65 1.21.65 1.27.65 1.3.65 1.33.63 1.37.64 1.4.63 1.42.62 1.46.61 1.49.6 1.5.59 1.53.58 1.57.57 1.58.55 1.6.51 1.62.52 1.65.5 1.65.47 1.66.45 1.7.43 1.7.4 1.7.37 1.74.35 1.71.33 1.74.28 1.75.25 1.75.24 1.75.18 1.76.15 1.75.1 1.77.08 1.75v3.52l-.06 1.75-.12 1.73-.2 1.65-.21 1.68-.15.9-.15.87-.15.85-.19.87-.2.83-.2.85-.23.85-.25.85-.27.82-.28.83-.3.83-.32.82-.33.82-.35.8-.38.8-.39.8-.41.8-.45.76-.45.77-.49.77-.5.75-.51.73-.55.73-.57.72-.58.7-.62.68-.62.67-.66.67-.67.63-.7.63-.72.62-.73.58-.75.59-.78.55-.8.53-.82.52-.83.5-.87.48-.87.45-.9.43-.9.42-.93.4-.95.38-1 .35-1 .34-1 .3-1 .3-1.09.28-.85.2-.91.15-.92.13-.92.1-.91.07-.94.05h-2.95l-1-.06-1-.1-1-.14-1-.16-1-.2-1-.22-1-.27-1-.3-1-.35-1-.38-1-.43-1-.49-1-.53-1-.6-.95-.67-.93-.73-.92-.8-.86-.9-.77-.92-.45-.58-.37-.55-.35-.57-.35-.6-.3-.6-.3-.63-.26-.63-.22-.64-.23-.73-.24-.75-.35-1.37-.3-1.38-.23-1.37-.2-1.35-.13-1.31-.12-1.3-.08-1.29v-13.23l-.07-.91-.1-.89-.1-.85-.13-.83-.15-.8-.18-.75-.22-.8-.1-.32-.12-.35-.13-.35-.13-.35-.15-.33-.15-.35-.17-.33-.17-.34-.18-.33-.2-.33-.67-1.1-.73-1.15-.8-1.2-.87-1.25-.9-1.29-.95-1.33-1-1.35-1-1.38-2.16-2.89-2.27-2.95-4.7-6.15-2.4-3.16-2.37-3.19-1.16-1.63-1.17-1.62-1.13-1.63-.89-1.72-1-1.64-1.07-1.63-1-1.63-1-1.65-1-1.65-.93-1.67-.87-1.65-.83-1.67-.75-1.63-.38-.87-.35-.83-.34-.85-.31-.84-.29-.85-.28-.85-.27-.85-.25-.86-.21-.89-.2-.86-.17-.87-.15-.9-.13-.9-.09-.9-.06-.9v-2.77l.08-.93.12-.93.16-.95.2-.94.25-.93.3-.93.35-.92.4-.92.45-.9.5-.86.55-.85.59-.82.63-.8.67-.77.71-.71.75-.7.79-.67.81-.63.85-.59.87-.56.9-.54.93-.5 1-.46 1-.44 1-.41 1-.39 1-.36 1.09-.34 1.1-.3 1.13-.3 1.17-.26 1.18-.24 1.22-.23 1.18-.18 1.28-.18 1.32-.17 1.33-.13 1.38-.14 1.42-.1h.5l.4-.15.57-.18.58-.15.58-.1.6-.07h.61zm-3.4 17.3-1.15.08-1.12.1-1.06.12-1 .11-1 .15-.91.15-.89.15-.83.17-.78.18-.74.2-.68.19-.65.2-.6.2-.55.21-.5.2-.47.22-.41.2-.39.22-.33.18-.3.2-.27.18-.23.19-.2.16-.17.15-.13.15-.13.14-.1.13-.09.13-.08.12-.07.12-.06.11-.05.14v.13l-.05.13v.17l-.05.17v2.18l.05.37.06.4.09.43.1.43.13.47.13.48.15.5.17.52.18.53.22.55.22.57.23.57.25.56.58 1.25.64 1.27.68 1.32.75 1.33.8 1.37.85 1.41.9 1.42.95 1.45 1 1.47 1 1.48 1.05 1.5 1.01 1.5 1.1 1.52 2.27 3.06 2.32 3.05 4.68 6.12 2.3 3 2.23 3 1.1 1.47 1.07 1.46 1 1.45 1 1.44 1 1.43.93 1.4.9 1.4.85 1.4.42.7.38.72.38.71.34.72.33.73.3.72.28.72.27.71.25.74.23.76.39 1.37.33 1.42.27 1.4.21 1.36.17 1.35.13 1.34.1 1.3.07 1.28v12.18l.05.92.08.88.1.85.1.8.15.78.15.75.2.75.1.3v.2l.13.12.12.1.18.12.22.13.25.15.3.13.35.15.37.15.4.14.41.13.45.12.47.1.47.1.5.08.48.07.48.05h3l.3-.05h.25l.25-.07.62-.15.63-.18.62-.2.58-.2.59-.22.55-.22.53-.21.5-.24.5-.25.48-.25.45-.25.45-.26.42-.27.42-.28.4-.29.38-.28.37-.3.35-.3.35-.32.33-.31.32-.34.31-.33.3-.33.3-.35.29-.37.26-.35.27-.38.25-.39.25-.4.25-.4.23-.41.22-.42.22-.43.2-.44.2-.45.2-.46.18-.49.17-.48.16-.48.17-.52.15-.52.13-.51.15-.54.12-.55.12-.55.1-.56.1-.59.1-.55.15-1.21.11-1.24.09-1.25.05-1.28v-2.73l-.05-1.35-.09-1.38-.13-1.4-.15-1.42-.17-1.42-.21-1.43-.25-1.45-.27-1.45-.28-1.47-.32-1.45-.35-1.46-.37-1.45-.38-1.45-.42-1.45-.41-1.44-.45-1.43-.47-1.42-.48-1.4-.3-1.38-.51-1.37-.5-1.35-.54-1.31-.53-1.3-.55-1.29-.53-1.23-.57-1.22-.55-1.18-.55-1.13-.55-1.12-.55-1.07-.55-1-.55-1-.53-.94-.52-.88-.42-.67-.43-.66-.45-.69-.47-.66-.5-.69-.51-.66-.54-.69-.56-.68-.57-.67-.58-.68-.6-.67-.64-.66-.63-.67-.63-.67-.67-.66-.65-.64-1.4-1.3-1.4-1.26-1.43-1.25-1.45-1.2-1.47-1.19-1.48-1.13-1.47-1.1-1.5-1.1-2.53-1.82-3.19-2.31-3.43-2.5-3.32-2.38-2.12-1.5z"/><path d="m381.28 343.38.6.1.6.15.59.19.56.23.55.28.52.32.52.35.46.38.45.44.42.45.37.48.35.52.3.53.26.55.22.58.18.59.14.6.08.6.05.61v.67l-.05.62-.08.6-.14.6-.18.6-.22.56-.26.55-.3.54-.35.51-.37.49-.42.45-.45.43-.75.65.1.33.05.3 1.42-.8 4.83-2.81 4.5-2.62 5.09-2.95 5-2.88 2.27-1.27.3-.22.88-.53.65-.33.47-.22h.1l1.61-.87 1.5-.78.77-.37.52-.22.4-.16.41-.14.22-.06.58-.17.59-.1.58-.08h1.27l.61.07.6.1.6.15.59.18.58.25.55.27.52.31 2.01-1.98 1-1 1-.91 1-.89 1-.86 1-.84 1-.78 1-.77 1-.68.65-.38.62-.34.67-.33.73-.32.83-.28.57-.17.37-.08.36-.07.25-.05.45-.06.45-.05h1.97l.43.07.42.06.2.05.47.12.45.15.45.17.2.06.46.22.45.23.44.27.16.1.44.3.4.3.38.35.15.15.33.33.34.35.28.39.13.18.25.33.24.35.2.37.11.22.24.48.21.5.09.25.15.43.13.44.07.3.1.36.06.37.1.62.09.93v1.82l-.1.85-.15.78-.2.74-.23.66-.29.7-.5 1-.58 1-.63.91-.64.85-.68.8-.7.79-.73.76-.75.74-.8.75-.82.73-.85.73-.88.75-.9.74-.95.73-1 .77-2 1.48-2.12 1.52-2.14 1.59-2.28 1.52-2.32 1.52-2.4 1.51-2.4 1.5-2.42 1.49-2.43 1.46-2.42 1.44-2.41 1.43-2.35 1.35-2.3 1.28-2.22 1.24-2.13 1.13-2.05 1.08-1.92 1-1.8.93-1.67.83-1.51.75-1.37.67-1.23.55-1 .42-1.36.56-1.4.64-1.54.7-1.61.78-1.69.82-1.66.85-3.32 1.68-3 1.57-2.41 1.3-2.24 1.21-.55.29-.56.23-.6.18-.6.15-.62.1h-.4l-.72.45-1 .6-1 .55-1 .53-1.09.58-1 .48-1 .47-1 .43-.43.17-1.18.78-1.37.9-1.38.87-1.4.83-1.4.82-1.42.8-.32.16h-.06l-1.4 1.05-1.42 1-1.47 1-1.48 1-1.79 1.24-.86.46-.9.44-1.84.83-1 .43-.34.37-2.21 2.42-1.1 1.18-.59.62-.6.58-.61.6-.69.6-.78.63-.62.4-.38.25-.4.24-.32.16-.46.22-.47.2h-.15l-.42.15-.43.13h-.13l-.55.11-.59.1h-.04l-.49.05h-1.06l-.55-.05-.57-.08-.55-.13h-.1l-.47-.13-.45-.17-.43-.18-.42-.22-.1-.05-.53-.3-.52-.35-.48-.38-.08-.07-.44-.4-.4-.42-.36-.45-.09-.1-.26-.38-.25-.4-.24-.4-.06-.12-.25-.51-.22-.54-.05-.15-.15-.45-.13-.46-.12-.52-.18-.76-.06-.76v-1.84l.06-.48v-.15l.08-.42.12-.41v-.15l.12-.39.15-.36.18-.49.37-.73.25-.43.2-.32.2-.3.23-.32.25-.33.27-.33.5-.55.73-.74.73-.63.49-.37-.24-.16-.33-.25-.1-.09-.38-.33-.35-.35-.09-.1-.38-.42-.35-.45-.07-.1-.33-.5-.3-.51-.05-.1-.2-.4-.17-.4-.15-.4v-.1l-.13-.42-.1-.43-.09-.42v-.12l-.07-.41v-1.54l.05-.56v-.12l.08-.53.12-.54v-.11l.13-.44.14-.41.05-.12.21-.52.24-.48.13-.25.28-.5.34-.47.18-.26.25-.32.27-.33.54-.54.68-.65.58-.5-.08-.81v-2.04l.12-.59.13-.58.2-.55v-.15l.15-.4.19-.4.2-.37.1-.16.23-.4.25-.39.32-.43.51-.62.55-.58.85-.8.92-.75.92-.7 1-.7 1-.68 1.06-.7 1.1-.72 1.17-.72 1.22-.73 2.46-1.45 2.57-1.48.2-.1.12-.3.18-.4.22-.4.13-.24.27-.41.26-.4.32-.39.17-.2.38-.43.43-.4.1-.08.3-.27.34-.25.23-.18 4.75-3.19 5.23-3.55 5.5-3.76 5.35-3.69 8.79-6.05 3.61-2.5.52-.33.55-.28.55-.25.58-.22.59-.17.61-.11.6-.09h1.24zm20.54 83.62.66-1.07.8-1 .89-.95 1.81-1.3 1.07-.48 3.35 1.08 1.28-1.72 1.64-1.55 1.88-1.23 2.07-.9 2.18-.52 2.25-.13 2.23.27 2.15.63 2 1 1.8 1.33 1.53 1.63 1.25 1.89.89 2.06.51 2.19.15.91.09 1.47.16 1.3-.56.55-.25 1.15-.42 1.7-.27 1.05-.05.19-.18.93-.27 1.18-.3 1.25-.36 1.3-.44 1.37-.5 1.42-.56 1.38-.39.82-.36.75-.42.78-.45.78-.48.79-.55.8-.6.81-.67.82-.75.82-.82.8h-.05l-.85.75-1 .75-1.1.72-1.17.66-1.26.59-1.35.48-1.4.38-1.45.27-1.47.13h-1.47l-1.43-.1-1.42-.2-1.36-.32-1.49-.45-1.38-.55-1.38-.78-1.19-.85-1.2-1.07-1.31-1.55-1-1.63-.7-1.48-.48-1.32-.33-1.23-.25-1.14-.15-1.08-.12-1.05-.05-1v-2l.05-.85v-.15l.15-1 .18-1 .24-1 .28-1.05.37-1.08.45-1.13.55-1.17.7-1.23.71-1.07.42-1.25.55-1.18zm7.33 19.7-.22-.07.34.12-.69-.3-.16-.05zm-3.42-2.49.47.42-.57-.57-.08-.08zm11.09-2.86-.22.16.8-.5-.37-.36zm13.11-4.95 2.37.5 1.6-4.4zm4-4 .14-.38v-.35z" fill="#fff"/><path d="m579.92 998.37h1.11l1.59.05 1.58.1 1.62.15 1.63.2 1.58.27.92.18.88.18.89.24.91.26.94.3 1 .37 1 .43 1 .52 1.1.62 1.13.73 1.18.88 1.19 1.07 1.16 1.28 1 1.34.75 1.21.62 1.19.57 1.3.46 1.43.37 1.52.22 1.61v1.67l-.12 1.67-.28 1.65-.44 1.55-.55 1.45-.66 1.31-.7 1.19-.77 1-.77.93-.76.8-.75.72-.87.73-1.28 1-1.37.85-1.28.68-1.24.59-1.18.5-1.15.43-1.12.38-1.1.34-1.06.31-1.07.29-1.07.26-2 .44-1.73.46-1.8.33-1.62.3-2.68.47-2.88.53-3.25.57-3.5.57-3.67.55-1.82.26v.14h.35l2.5.72 2.34 1.11 2.1 1.54 1.81 1.85 1.45 2.15 1.07 2.36.65 2.5.2 2.6-.23 2.59-.7 2.5-1.1 2.33-1.5 2.13-1.85 1.82-2.14 1.48-2.35 1.1-2.5.67h-.31l-.05.13-.62 1.54-1.5 2.16-1.13 1.25-.9.85-.82.7-.85.64-.83.58-.85.53-.95.52-1.37.65-1.32.5-1 .33-.9.27-.27.08.5-.18.5-.22.37-.2.43-.25.47-.31.48-.35.45-.4.44-.42.36-.42.34-.4.26-.36.2-.34.09-.15-6 1.84h1.09-.5l-1.14.16h-.21l-12.35 3.8-1-3.14-14.78.12-11.19.08h-8.71l-2.52-.23-2.47-.65-2.3-1.07-2.08-1.45-1.8-1.8-.85-1.22-.67-.21-.88-.34-.92-.4-.95-.48-1-.55-1.05-.68-1.06-.82-1.09-1-1.08-1.15-1-1.32-.95-1.51-.15-.3h-30.47l-2.21.15-1.34.09-1.46.08h-4.25l-1-.07-1-.1-1.13-.15-1.23-.25-1.39-.35-1.55-.51-1.73-.79-1.68-1-1.22-.91-1-.92-1-1.07-1-1.25-.88-1.38-.74-1.52-.58-1.6-.4-1.63-.22-1.6-.05-1.55.09-1.45.18-1.35.28-1.23.37-1.24.58-1.51.77-1.55.88-1.45 1-1.34 1.07-1.2 1.12-1.06 1.13-.92 1.12-.78 1.1-.69 1.06-.56 1-.49 1-.4.93-.33.89-.3.85-.23.88-.24 1.4-.31 1.35-.25 1.2-.19 1-.15.56-.1.35-1.73.42-1.62 1.35-2.6 1.42-1.86 1.51-1.54 1.84-1.36 1.53-.85 1-.5.82-.35.82-.34.88-.33 1.5-.5 1.57-.47 1.55-.38 1.55-.35 1.55-.3 1.55-.27 1.55-.23 1.56-.22 1.57-.2 1.57-.16 1.56-.15 1.59-.15 2.11-.17 1-.07 3.05-.2 2.95-.16 5.48-.3 2.42-.15 2.15-.17.88-.07.82-.08.68-.08.6-.09 3.94-.61 4-.65 4-.69 4.05-.71 4.06-.74 4.09-.75 8.21-1.51 4.15-.77 4.17-.75 4.18-.73 4.2-.72 4.24-.68 4.25-.67 4.26-.62 4.2-.56 1.84-.25 1.66-.22 2-.23 2.37-.27 2.62-.23 2.76-.22 1.49-.1 1.5-.07 1.51-.06h3.54z" fill="#808080"/></g></svg>
{images → assets/img}/payment-methods/alipay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/amex.svg RENAMED
File without changes
{images → assets/img}/payment-methods/bancontact.svg RENAMED
File without changes
{images → assets/img}/payment-methods/diners.svg RENAMED
File without changes
{images → assets/img}/payment-methods/discover.svg RENAMED
File without changes
{images → assets/img}/payment-methods/eps.svg RENAMED
File without changes
{images → assets/img}/payment-methods/giropay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/ideal.svg RENAMED
File without changes
{images → assets/img}/payment-methods/jcb.svg RENAMED
File without changes
{images → assets/img}/payment-methods/laser.svg RENAMED
File without changes
{images → assets/img}/payment-methods/maestro.svg RENAMED
File without changes
{images → assets/img}/payment-methods/mastercard.svg RENAMED
File without changes
{images → assets/img}/payment-methods/multibanco.svg RENAMED
File without changes
{images → assets/img}/payment-methods/p24.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sepa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/sofort.svg RENAMED
File without changes
{images → assets/img}/payment-methods/unionpay.svg RENAMED
File without changes
{images → assets/img}/payment-methods/visa.svg RENAMED
File without changes
{images → assets/img}/payment-methods/wechat.svg RENAMED
File without changes
{images/previews → assets/img}/pennant.jpg RENAMED
File without changes
assets/img/single-product-preview.svg ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 100">
2
+ <g fill="#E1E3E6" fill-rule="nonzero">
3
+ <path d="M76 0h11v6H76zM76 11h88v11H76zM76 27h28v6H76zM76 44h154v28H76zM76 83h22v17H76zM104 83h44v17h-44zM0 0h66v66H0z"/>
4
+ </g>
5
+ </svg>
assets/js/atomic/blocks/product-elements/add-to-cart/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/attribute-select-control.js CHANGED
@@ -4,12 +4,10 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
 
7
  import { useEffect } from 'react';
8
  import classnames from 'classnames';
9
- import {
10
- ValidationInputError,
11
- useValidationContext,
12
- } from '@woocommerce/base-context';
13
 
14
  // Default option for select boxes.
15
  const selectAnOption = {
4
  import { __ } from '@wordpress/i18n';
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { SelectControl } from '@wordpress/components';
7
+ import { useValidationContext } from '@woocommerce/base-context';
8
  import { useEffect } from 'react';
9
  import classnames from 'classnames';
10
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
 
 
 
11
 
12
  // Default option for select boxes.
13
  const selectAnOption = {
assets/js/atomic/blocks/product-elements/add-to-cart/product-types/variable/variation-attributes/style.scss CHANGED
@@ -23,9 +23,9 @@
23
  margin-bottom: $gap-large;
24
 
25
  select {
26
- border-color: $alert-red;
27
  &:focus {
28
- outline-color: $alert-red;
29
  }
30
  }
31
  }
23
  margin-bottom: $gap-large;
24
 
25
  select {
26
+ border-color: $error-red;
27
  &:focus {
28
+ outline-color: $error-red;
29
  }
30
  }
31
  }
assets/js/atomic/blocks/product-elements/add-to-cart/shared/add-to-cart-button.js CHANGED
@@ -6,11 +6,7 @@ import Button from '@woocommerce/base-components/button';
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
  import { useState, useEffect } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
9
- import {
10
- useStoreEvents,
11
- useStoreAddToCart,
12
- } from '@woocommerce/base-context/hooks';
13
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
14
 
15
  /**
16
  * Add to Cart Form Button Component.
@@ -28,8 +24,6 @@ const AddToCartButton = () => {
28
  hasError,
29
  dispatchActions,
30
  } = useAddToCartFormContext();
31
- const { parentName } = useInnerBlockLayoutContext();
32
- const { dispatchStoreEvent } = useStoreEvents();
33
  const { cartQuantity } = useStoreAddToCart( product.id || 0 );
34
  const [ addedToCart, setAddedToCart ] = useState( false );
35
  const addToCartButtonData = product.add_to_cart || {
@@ -75,13 +69,7 @@ const AddToCartButton = () => {
75
  isDisabled={ isDisabled }
76
  isProcessing={ isProcessing }
77
  isDone={ addedToCart }
78
- onClick={ () => {
79
- dispatchActions.submitForm();
80
- dispatchStoreEvent( 'cart-add-item', {
81
- product,
82
- listName: parentName,
83
- } );
84
- } }
85
  />
86
  ) : (
87
  <LinkComponent
@@ -91,12 +79,6 @@ const AddToCartButton = () => {
91
  addToCartButtonData.text ||
92
  __( 'View Product', 'woo-gutenberg-products-block' )
93
  }
94
- onClick={ () => {
95
- dispatchStoreEvent( 'product-view-link', {
96
- product,
97
- listName: parentName,
98
- } );
99
- } }
100
  />
101
  );
102
  };
@@ -108,16 +90,10 @@ const AddToCartButton = () => {
108
  * @param {string} props.className Css classnames.
109
  * @param {string} props.href Link for button.
110
  * @param {string} props.text Text content for button.
111
- * @param {function():any} props.onClick Callback to execute when button is clicked.
112
  */
113
- const LinkComponent = ( { className, href, text, onClick } ) => {
114
  return (
115
- <Button
116
- className={ className }
117
- href={ href }
118
- onClick={ onClick }
119
- rel="nofollow"
120
- >
121
  { text }
122
  </Button>
123
  );
@@ -151,7 +127,7 @@ const ButtonComponent = ( {
151
  >
152
  { isDone && quantityInCart > 0
153
  ? sprintf(
154
- /* translators: %s number of products in cart. */
155
  _n(
156
  '%d in cart',
157
  '%d in cart',
6
  import { Icon, done as doneIcon } from '@woocommerce/icons';
7
  import { useState, useEffect } from '@wordpress/element';
8
  import { useAddToCartFormContext } from '@woocommerce/base-context';
9
+ import { useStoreAddToCart } from '@woocommerce/base-hooks';
 
 
 
 
10
 
11
  /**
12
  * Add to Cart Form Button Component.
24
  hasError,
25
  dispatchActions,
26
  } = useAddToCartFormContext();
 
 
27
  const { cartQuantity } = useStoreAddToCart( product.id || 0 );
28
  const [ addedToCart, setAddedToCart ] = useState( false );
29
  const addToCartButtonData = product.add_to_cart || {
69
  isDisabled={ isDisabled }
70
  isProcessing={ isProcessing }
71
  isDone={ addedToCart }
72
+ onClick={ () => dispatchActions.submitForm() }
 
 
 
 
 
 
73
  />
74
  ) : (
75
  <LinkComponent
79
  addToCartButtonData.text ||
80
  __( 'View Product', 'woo-gutenberg-products-block' )
81
  }
 
 
 
 
 
 
82
  />
83
  );
84
  };
90
  * @param {string} props.className Css classnames.
91
  * @param {string} props.href Link for button.
92
  * @param {string} props.text Text content for button.
 
93
  */
94
+ const LinkComponent = ( { className, href, text } ) => {
95
  return (
96
+ <Button className={ className } href={ href } rel="nofollow">
 
 
 
 
 
97
  { text }
98
  </Button>
99
  );
127
  >
128
  { isDone && quantityInCart > 0
129
  ? sprintf(
130
+ // translators: %s number of products in cart.
131
  _n(
132
  '%d in cart',
133
  '%d in cart',
assets/js/atomic/blocks/product-elements/button/block.js CHANGED
@@ -4,11 +4,10 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
- import {
8
- useStoreEvents,
9
- useStoreAddToCart,
10
- } from '@woocommerce/base-context/hooks';
11
  import { decodeEntities } from '@wordpress/html-entities';
 
12
  import {
13
  useInnerBlockLayoutContext,
14
  useProductDataContext,
@@ -52,6 +51,8 @@ const Block = ( { className } ) => {
52
  };
53
 
54
  const AddToCartButton = ( { product } ) => {
 
 
55
  const {
56
  id,
57
  permalink,
@@ -60,9 +61,18 @@ const AddToCartButton = ( { product } ) => {
60
  is_purchasable: isPurchasable,
61
  is_in_stock: isInStock,
62
  } = product;
63
- const { dispatchStoreEvent } = useStoreEvents();
64
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
65
 
 
 
 
 
 
 
 
 
 
66
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
67
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
68
  const buttonAriaLabel = decodeEntities(
@@ -70,7 +80,7 @@ const AddToCartButton = ( { product } ) => {
70
  );
71
  const buttonText = addedToCart
72
  ? sprintf(
73
- /* translators: %s number of products in cart. */
74
  _n(
75
  '%d in cart',
76
  '%d in cart',
@@ -90,17 +100,9 @@ const AddToCartButton = ( { product } ) => {
90
  if ( ! allowAddToCart ) {
91
  buttonProps.href = permalink;
92
  buttonProps.rel = 'nofollow';
93
- buttonProps.onClick = () => {
94
- dispatchStoreEvent( 'product-view-link', {
95
- product,
96
- } );
97
- };
98
  } else {
99
  buttonProps.onClick = () => {
100
  addToCart();
101
- dispatchStoreEvent( 'cart-add-item', {
102
- product,
103
- } );
104
  };
105
  }
106
 
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { __, _n, sprintf } from '@wordpress/i18n';
7
+ import { useEffect, useRef } from '@wordpress/element';
8
+ import { useStoreAddToCart } from '@woocommerce/base-hooks';
 
 
9
  import { decodeEntities } from '@wordpress/html-entities';
10
+ import { triggerFragmentRefresh } from '@woocommerce/base-utils';
11
  import {
12
  useInnerBlockLayoutContext,
13
  useProductDataContext,
51
  };
52
 
53
  const AddToCartButton = ( { product } ) => {
54
+ const firstMount = useRef( true );
55
+
56
  const {
57
  id,
58
  permalink,
61
  is_purchasable: isPurchasable,
62
  is_in_stock: isInStock,
63
  } = product;
64
+
65
  const { cartQuantity, addingToCart, addToCart } = useStoreAddToCart( id );
66
 
67
+ useEffect( () => {
68
+ // Avoid running on first mount when cart quantity is first set.
69
+ if ( firstMount.current ) {
70
+ firstMount.current = false;
71
+ return;
72
+ }
73
+ triggerFragmentRefresh();
74
+ }, [ cartQuantity ] );
75
+
76
  const addedToCart = Number.isFinite( cartQuantity ) && cartQuantity > 0;
77
  const allowAddToCart = ! hasOptions && isPurchasable && isInStock;
78
  const buttonAriaLabel = decodeEntities(
80
  );
81
  const buttonText = addedToCart
82
  ? sprintf(
83
+ // translators: %s number of products in cart.
84
  _n(
85
  '%d in cart',
86
  '%d in cart',
100
  if ( ! allowAddToCart ) {
101
  buttonProps.href = permalink;
102
  buttonProps.rel = 'nofollow';
 
 
 
 
 
103
  } else {
104
  buttonProps.onClick = () => {
105
  addToCart();
 
 
 
106
  };
107
  }
108
 
assets/js/atomic/blocks/product-elements/button/style.scss CHANGED
@@ -24,13 +24,3 @@
24
  min-width: 8em;
25
  min-height: 3em;
26
  }
27
-
28
-
29
- .theme-twentytwentyone {
30
- // Prevent buttons appearing disabled in the editor.
31
- .editor-styles-wrapper .wc-block-components-product-button .wp-block-button__link {
32
- background-color: var(--button--color-background);
33
- color: var(--button--color-text);
34
- border-color: var(--button--color-background);
35
- }
36
- }
24
  min-width: 8em;
25
  min-height: 3em;
26
  }
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/image/block.js CHANGED
@@ -2,16 +2,15 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { useState, Fragment } from '@wordpress/element';
6
- import { __, sprintf } from '@wordpress/i18n';
7
  import classnames from 'classnames';
8
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
9
  import {
10
  useInnerBlockLayoutContext,
11
  useProductDataContext,
12
  } from '@woocommerce/shared-context';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
15
 
16
  /**
17
  * Internal dependencies
@@ -30,17 +29,16 @@ import './style.scss';
30
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
31
  * @return {*} The component.
32
  */
33
- export const Block = ( {
34
  className,
35
  imageSizing = 'full-size',
36
- productLink: showProductLink = true,
37
  showSaleBadge,
38
  saleBadgeAlign = 'right',
39
  } ) => {
40
  const { parentClassName } = useInnerBlockLayoutContext();
41
  const { product } = useProductDataContext();
42
  const [ imageLoaded, setImageLoaded ] = useState( false );
43
- const { dispatchStoreEvent } = useStoreEvents();
44
 
45
  if ( ! product.id ) {
46
  return (
@@ -58,24 +56,8 @@ export const Block = ( {
58
  </div>
59
  );
60
  }
61
- const hasProductImages = !! product.images.length;
62
- const image = hasProductImages ? product.images[ 0 ] : null;
63
- const ParentComponent = showProductLink ? 'a' : Fragment;
64
- const anchorLabel = sprintf(
65
- /* translators: %s is referring to the product name */
66
- __( 'Link to %s', 'woo-gutenberg-products-block' ),
67
- product.name
68
- );
69
- const anchorProps = {
70
- href: product.permalink,
71
- rel: 'nofollow',
72
- ...( ! hasProductImages && { 'aria-label': anchorLabel } ),
73
- onClick: () => {
74
- dispatchStoreEvent( 'product-view-link', {
75
- product,
76
- } );
77
- },
78
- };
79
 
80
  return (
81
  <div
@@ -87,21 +69,37 @@ export const Block = ( {
87
  }
88
  ) }
89
  >
90
- <ParentComponent { ...( showProductLink && anchorProps ) }>
91
- { !! showSaleBadge && (
92
- <ProductSaleBadge
93
- align={ saleBadgeAlign }
94
- product={ product }
 
 
 
 
 
 
 
 
95
  />
96
- ) }
97
- <Image
98
- fallbackAlt={ product.name }
99
- image={ image }
100
- onLoad={ () => setImageLoaded( true ) }
101
- loaded={ imageLoaded }
102
- showFullSize={ imageSizing !== 'cropped' }
103
- />
104
- </ParentComponent>
 
 
 
 
 
 
 
 
105
  </div>
106
  );
107
  };
@@ -112,22 +110,28 @@ const ImagePlaceholder = () => {
112
  );
113
  };
114
 
115
- const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
116
  const { thumbnail, src, srcset, sizes, alt } = image || {};
117
- const imageProps = {
118
- alt: alt || fallbackAlt,
 
119
  onLoad,
120
  hidden: ! loaded,
121
  src: thumbnail,
122
- ...( showFullSize && { src, srcSet: srcset, sizes } ),
123
  };
 
 
 
 
 
 
 
 
124
 
125
  return (
126
  <>
127
- { imageProps.src && (
128
- /* eslint-disable-next-line jsx-a11y/alt-text */
129
- <img data-testid="product-image" { ...imageProps } />
130
- ) }
131
  { ! loaded && <ImagePlaceholder /> }
132
  </>
133
  );
@@ -135,7 +139,6 @@ const Image = ( { image, onLoad, loaded, showFullSize, fallbackAlt } ) => {
135
 
136
  Block.propTypes = {
137
  className: PropTypes.string,
138
- fallbackAlt: PropTypes.string,
139
  productLink: PropTypes.bool,
140
  showSaleBadge: PropTypes.bool,
141
  saleBadgeAlign: PropTypes.string,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { useState } from '@wordpress/element';
 
6
  import classnames from 'classnames';
7
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
11
  } from '@woocommerce/shared-context';
12
  import { withProductDataContext } from '@woocommerce/shared-hocs';
13
+ import { isEmpty } from 'lodash';
14
 
15
  /**
16
  * Internal dependencies
29
  * @param {string} [props.saleBadgeAlign] How should the sale badge be aligned if displayed.
30
  * @return {*} The component.
31
  */
32
+ const Block = ( {
33
  className,
34
  imageSizing = 'full-size',
35
+ productLink = true,
36
  showSaleBadge,
37
  saleBadgeAlign = 'right',
38
  } ) => {
39
  const { parentClassName } = useInnerBlockLayoutContext();
40
  const { product } = useProductDataContext();
41
  const [ imageLoaded, setImageLoaded ] = useState( false );
 
42
 
43
  if ( ! product.id ) {
44
  return (
56
  </div>
57
  );
58
  }
59
+
60
+ const image = ! isEmpty( product.images ) ? product.images[ 0 ] : null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  return (
63
  <div
69
  }
70
  ) }
71
  >
72
+ { productLink ? (
73
+ <a href={ product.permalink } rel="nofollow">
74
+ { !! showSaleBadge && (
75
+ <ProductSaleBadge
76
+ align={ saleBadgeAlign }
77
+ product={ product }
78
+ />
79
+ ) }
80
+ <Image
81
+ image={ image }
82
+ onLoad={ () => setImageLoaded( true ) }
83
+ loaded={ imageLoaded }
84
+ showFullSize={ imageSizing !== 'cropped' }
85
  />
86
+ </a>
87
+ ) : (
88
+ <>
89
+ { !! showSaleBadge && (
90
+ <ProductSaleBadge
91
+ align={ saleBadgeAlign }
92
+ product={ product }
93
+ />
94
+ ) }
95
+ <Image
96
+ image={ image }
97
+ onLoad={ () => setImageLoaded( true ) }
98
+ loaded={ imageLoaded }
99
+ showFullSize={ imageSizing !== 'cropped' }
100
+ />
101
+ </>
102
+ ) }
103
  </div>
104
  );
105
  };
110
  );
111
  };
112
 
113
+ const Image = ( { image, onLoad, loaded, showFullSize } ) => {
114
  const { thumbnail, src, srcset, sizes, alt } = image || {};
115
+
116
+ let imageProps = {
117
+ alt,
118
  onLoad,
119
  hidden: ! loaded,
120
  src: thumbnail,
 
121
  };
122
+ if ( showFullSize ) {
123
+ imageProps = {
124
+ ...imageProps,
125
+ src,
126
+ srcSet: srcset,
127
+ sizes,
128
+ };
129
+ }
130
 
131
  return (
132
  <>
133
+ { /* eslint-disable-next-line jsx-a11y/alt-text */ }
134
+ <img { ...imageProps } />
 
 
135
  { ! loaded && <ImagePlaceholder /> }
136
  </>
137
  );
139
 
140
  Block.propTypes = {
141
  className: PropTypes.string,
 
142
  productLink: PropTypes.bool,
143
  showSaleBadge: PropTypes.bool,
144
  saleBadgeAlign: PropTypes.string,
assets/js/atomic/blocks/product-elements/image/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/blocks/product-elements/image/test/block.test.js DELETED
@@ -1,139 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, fireEvent } from '@testing-library/react';
5
- import { ProductDataContextProvider } from '@woocommerce/shared-context';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { Block } from '../block';
11
-
12
- jest.mock( '@woocommerce/block-settings', () => ( {
13
- __esModule: true,
14
- PLACEHOLDER_IMG_SRC: 'placeholder.jpg',
15
- } ) );
16
-
17
- const productWithoutImages = {
18
- name: 'Test product',
19
- id: 1,
20
- fallbackAlt: 'Test product',
21
- permalink: 'http://test.com/product/test-product/',
22
- images: [],
23
- };
24
-
25
- const productWithImages = {
26
- name: 'Test product',
27
- id: 1,
28
- fallbackAlt: 'Test product',
29
- permalink: 'http://test.com/product/test-product/',
30
- images: [
31
- {
32
- id: 56,
33
- src: 'logo-1.jpg',
34
- thumbnail: 'logo-1-324x324.jpg',
35
- srcset:
36
- 'logo-1.jpg 800w, logo-1-300x300.jpg 300w, logo-1-150x150.jpg 150w, logo-1-768x767.jpg 768w, logo-1-324x324.jpg 324w, logo-1-416x415.jpg 416w, logo-1-100x100.jpg 100w',
37
- sizes: '(max-width: 800px) 100vw, 800px',
38
- name: 'logo-1.jpg',
39
- alt: '',
40
- },
41
- {
42
- id: 55,
43
- src: 'beanie-with-logo-1.jpg',
44
- thumbnail: 'beanie-with-logo-1-324x324.jpg',
45
- srcset:
46
- 'beanie-with-logo-1.jpg 800w, beanie-with-logo-1-300x300.jpg 300w, beanie-with-logo-1-150x150.jpg 150w, beanie-with-logo-1-768x768.jpg 768w, beanie-with-logo-1-324x324.jpg 324w, beanie-with-logo-1-416x416.jpg 416w, beanie-with-logo-1-100x100.jpg 100w',
47
- sizes: '(max-width: 800px) 100vw, 800px',
48
- name: 'beanie-with-logo-1.jpg',
49
- alt: '',
50
- },
51
- ],
52
- };
53
-
54
- describe( 'Product Image Block', () => {
55
- describe( 'with product link', () => {
56
- test( 'should render an anchor with the product image', () => {
57
- const component = render(
58
- <ProductDataContextProvider product={ productWithImages }>
59
- <Block productLink />
60
- </ProductDataContextProvider>
61
- );
62
-
63
- // use testId as alt is added after image is loaded
64
- const image = component.getByTestId( 'product-image' );
65
- fireEvent.load( image );
66
-
67
- const productImage = component.getByAltText(
68
- productWithImages.name
69
- );
70
- expect( productImage.getAttribute( 'src' ) ).toBe(
71
- productWithImages.images[ 0 ].src
72
- );
73
-
74
- const anchor = productImage.closest( 'a' );
75
- expect( anchor.getAttribute( 'href' ) ).toBe(
76
- productWithImages.permalink
77
- );
78
- } );
79
-
80
- test( 'should render an anchor with the placeholder image', () => {
81
- const component = render(
82
- <ProductDataContextProvider product={ productWithoutImages }>
83
- <Block productLink />
84
- </ProductDataContextProvider>
85
- );
86
-
87
- const placeholderImage = component.getByAltText( '' );
88
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
89
- 'placeholder.jpg'
90
- );
91
-
92
- const anchor = placeholderImage.closest( 'a' );
93
- expect( anchor.getAttribute( 'href' ) ).toBe(
94
- productWithoutImages.permalink
95
- );
96
- expect( anchor.getAttribute( 'aria-label' ) ).toBe(
97
- `Link to ${ productWithoutImages.name }`
98
- );
99
- } );
100
- } );
101
-
102
- describe( 'without product link', () => {
103
- test( 'should render the product image without an anchor wrapper', () => {
104
- const component = render(
105
- <ProductDataContextProvider product={ productWithImages }>
106
- <Block productLink={ false } />
107
- </ProductDataContextProvider>
108
- );
109
- const image = component.getByTestId( 'product-image' );
110
- fireEvent.load( image );
111
-
112
- const productImage = component.getByAltText(
113
- productWithImages.name
114
- );
115
- expect( productImage.getAttribute( 'src' ) ).toBe(
116
- productWithImages.images[ 0 ].src
117
- );
118
-
119
- const anchor = productImage.closest( 'a' );
120
- expect( anchor ).toBe( null );
121
- } );
122
-
123
- test( 'should render the placeholder image without an anchor wrapper', () => {
124
- const component = render(
125
- <ProductDataContextProvider product={ productWithoutImages }>
126
- <Block productLink={ false } />
127
- </ProductDataContextProvider>
128
- );
129
-
130
- const placeholderImage = component.getByAltText( '' );
131
- expect( placeholderImage.getAttribute( 'src' ) ).toBe(
132
- 'placeholder.jpg'
133
- );
134
-
135
- const anchor = placeholderImage.closest( 'a' );
136
- expect( anchor ).toBe( null );
137
- } );
138
- } );
139
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/atomic/blocks/product-elements/price/block.js CHANGED
@@ -4,7 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
assets/js/atomic/blocks/product-elements/rating/block.js CHANGED
@@ -36,7 +36,7 @@ const Block = ( { className } ) => {
36
  };
37
 
38
  const ratingText = sprintf(
39
- /* translators: %f is referring to the average rating value */
40
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
41
  rating
42
  );
@@ -45,6 +45,7 @@ const Block = ( { className } ) => {
45
  <div
46
  className={ classnames(
47
  className,
 
48
  'wc-block-components-product-rating',
49
  {
50
  [ `${ parentClassName }__product-rating` ]: parentClassName,
36
  };
37
 
38
  const ratingText = sprintf(
39
+ /* Translators: %f is referring to the average rating value */
40
  __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
41
  rating
42
  );
45
  <div
46
  className={ classnames(
47
  className,
48
+ 'star-rating',
49
  'wc-block-components-product-rating',
50
  {
51
  [ `${ parentClassName }__product-rating` ]: parentClassName,
assets/js/atomic/blocks/product-elements/shared/editor.scss CHANGED
@@ -3,7 +3,7 @@
3
  }
4
  .wc-atomic-blocks-product__edit-card {
5
  padding: 16px;
6
- border-top: 1px solid $gray-200;
7
 
8
  .wc-atomic-blocks-product__edit-card-title {
9
  margin: 0 0 $gap;
3
  }
4
  .wc-atomic-blocks-product__edit-card {
5
  padding: 16px;
6
+ border-top: 1px solid #e2e4e7;
7
 
8
  .wc-atomic-blocks-product__edit-card-title {
9
  margin: 0 0 $gap;
assets/js/atomic/blocks/product-elements/shared/with-product-selector.js CHANGED
@@ -4,7 +4,7 @@
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
  import ProductControl from '@woocommerce/editor-components/product-control';
7
- import { Placeholder, Button, ToolbarGroup } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
  import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
@@ -55,7 +55,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
55
  } }
56
  />
57
  <Button
58
- isSecondary
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
@@ -68,7 +68,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
68
  ) : (
69
  <>
70
  <BlockControls>
71
- <ToolbarGroup>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
@@ -77,7 +77,7 @@ const withProductSelector = ( selectorArgs ) => ( OriginalComponent ) => {
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
- </ToolbarGroup>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
4
  import { __ } from '@wordpress/i18n';
5
  import { useState } from '@wordpress/element';
6
  import ProductControl from '@woocommerce/editor-components/product-control';
7
+ import { Placeholder, Button, Toolbar } from '@wordpress/components';
8
  import { BlockControls } from '@wordpress/block-editor';
9
  import TextToolbarButton from '@woocommerce/editor-components/text-toolbar-button';
10
  import { useProductDataContext } from '@woocommerce/shared-context';
55
  } }
56
  />
57
  <Button
58
+ isDefault
59
  disabled={ ! productId }
60
  onClick={ () => {
61
  setIsEditing( false );
68
  ) : (
69
  <>
70
  <BlockControls>
71
+ <Toolbar>
72
  <TextToolbarButton
73
  onClick={ () => setIsEditing( true ) }
74
  >
77
  'woo-gutenberg-products-block'
78
  ) }
79
  </TextToolbarButton>
80
+ </Toolbar>
81
  </BlockControls>
82
  <OriginalComponent { ...props } />
83
  </>
assets/js/atomic/blocks/product-elements/stock-indicator/style.scss CHANGED
@@ -5,13 +5,13 @@
5
  @include font-size(small);
6
 
7
  &--in-stock {
8
- color: $in-stock-color;
9
  }
10
  &--out-of-stock {
11
- color: $no-stock-color;
12
  }
13
  &--low-stock,
14
  &--available-on-backorder {
15
- color: $low-stock-color;
16
  }
17
  }
5
  @include font-size(small);
6
 
7
  &--in-stock {
8
+ color: $valid-green;
9
  }
10
  &--out-of-stock {
11
+ color: $error-red;
12
  }
13
  &--low-stock,
14
  &--available-on-backorder {
15
+ color: $notice-yellow;
16
  }
17
  }
assets/js/atomic/blocks/product-elements/summary/block.js CHANGED
@@ -4,7 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
- import { blocksConfig } from '@woocommerce/block-settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
@@ -49,6 +49,8 @@ const Block = ( { className } ) => {
49
  return null;
50
  }
51
 
 
 
52
  return (
53
  <Summary
54
  className={ classnames(
@@ -60,7 +62,7 @@ const Block = ( { className } ) => {
60
  ) }
61
  source={ source }
62
  maxLength={ 150 }
63
- countType={ blocksConfig.wordCountType || 'words' }
64
  />
65
  );
66
  };
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import Summary from '@woocommerce/base-components/summary';
7
+ import { getSetting } from '@woocommerce/settings';
8
  import {
9
  useInnerBlockLayoutContext,
10
  useProductDataContext,
49
  return null;
50
  }
51
 
52
+ const countType = getSetting( 'wordCountType', 'words' );
53
+
54
  return (
55
  <Summary
56
  className={ classnames(
62
  ) }
63
  source={ source }
64
  maxLength={ 150 }
65
+ countType={ countType }
66
  />
67
  );
68
  };
assets/js/atomic/blocks/product-elements/title/block.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
 
6
  import {
7
  useInnerBlockLayoutContext,
8
  useProductDataContext,
@@ -11,8 +12,6 @@ import { getColorClassName, getFontSizeClass } from '@wordpress/block-editor';
11
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
12
  import { gatedStyledText } from '@woocommerce/atomic-utils';
13
  import { withProductDataContext } from '@woocommerce/shared-hocs';
14
- import ProductName from '@woocommerce/base-components/product-name';
15
- import { useStoreEvents } from '@woocommerce/base-context/hooks';
16
 
17
  /**
18
  * Internal dependencies
@@ -46,7 +45,6 @@ export const Block = ( {
46
  } ) => {
47
  const { parentClassName } = useInnerBlockLayoutContext();
48
  const { product } = useProductDataContext();
49
- const { dispatchStoreEvent } = useStoreEvents();
50
  const TagName = `h${ headingLevel }`;
51
 
52
  const colorClass = getColorClassName( 'color', color );
@@ -81,6 +79,8 @@ export const Block = ( {
81
  );
82
  }
83
 
 
 
84
  return (
85
  // @ts-ignore
86
  <TagName
@@ -94,24 +94,33 @@ export const Block = ( {
94
  }
95
  ) }
96
  >
97
- <ProductName
98
- className={ classnames( {
99
- [ titleClasses ]: isFeaturePluginBuild(),
100
- } ) }
101
- disabled={ ! productLink }
102
- name={ product.name }
103
- permalink={ product.permalink }
104
- rel={ productLink ? 'nofollow' : null }
105
- style={ gatedStyledText( {
106
- color: customColor,
107
- fontSize: customFontSize,
108
- } ) }
109
- onClick={ () => {
110
- dispatchStoreEvent( 'product-view-link', {
111
- product,
112
- } );
113
- } }
114
- />
 
 
 
 
 
 
 
 
 
115
  </TagName>
116
  );
117
  };
3
  */
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
  import {
8
  useInnerBlockLayoutContext,
9
  useProductDataContext,
12
  import { isFeaturePluginBuild } from '@woocommerce/block-settings';
13
  import { gatedStyledText } from '@woocommerce/atomic-utils';
14
  import { withProductDataContext } from '@woocommerce/shared-hocs';
 
 
15
 
16
  /**
17
  * Internal dependencies
45
  } ) => {
46
  const { parentClassName } = useInnerBlockLayoutContext();
47
  const { product } = useProductDataContext();
 
48
  const TagName = `h${ headingLevel }`;
49
 
50
  const colorClass = getColorClassName( 'color', color );
79
  );
80
  }
81
 
82
+ const productName = decodeEntities( product.name );
83
+
84
  return (
85
  // @ts-ignore
86
  <TagName
94
  }
95
  ) }
96
  >
97
+ { productLink ? (
98
+ <a
99
+ href={ product.permalink }
100
+ rel="nofollow"
101
+ className={ classnames( {
102
+ [ titleClasses ]: isFeaturePluginBuild(),
103
+ } ) }
104
+ style={ gatedStyledText( {
105
+ color: customColor,
106
+ fontSize: customFontSize,
107
+ } ) }
108
+ >
109
+ { productName }
110
+ </a>
111
+ ) : (
112
+ <span
113
+ className={ classnames( {
114
+ [ titleClasses ]: isFeaturePluginBuild(),
115
+ } ) }
116
+ style={ gatedStyledText( {
117
+ color: customColor,
118
+ fontSize: customFontSize,
119
+ } ) }
120
+ >
121
+ { productName }
122
+ </span>
123
+ ) }
124
  </TagName>
125
  );
126
  };
assets/js/atomic/blocks/product-elements/title/frontend.js CHANGED
@@ -1,6 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
5
 
6
  /**
@@ -9,4 +10,4 @@ import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attribu
9
  import Block from './block';
10
  import attributes from './attributes';
11
 
12
- export default withFilteredAttributes( attributes )( Block );
1
  /**
2
  * External dependencies
3
  */
4
+ import { compose } from '@wordpress/compose';
5
  import withFilteredAttributes from '@woocommerce/base-hocs/with-filtered-attributes';
6
 
7
  /**
10
  import Block from './block';
11
  import attributes from './attributes';
12
 
13
+ export default compose( withFilteredAttributes( attributes ) )( Block );
assets/js/atomic/utils/index.js CHANGED
@@ -1,5 +1,6 @@
1
- export * from './get-block-map';
2
- export * from './create-blocks-from-template';
3
- export * from './render-parent-block';
 
4
  export * from './block-styling.js';
5
- export * from './render-standalone-blocks';
1
+ export * from './get-block-map.js';
2
+ export * from './create-blocks-from-template.js';
3
+ export * from './render-parent-block.js';
4
+ export * from './render-inner-blocks.js';
5
  export * from './block-styling.js';
6
+ export * from './render-standalone-blocks.js';
assets/js/atomic/utils/render-inner-blocks.js ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { Suspense, cloneElement, isValidElement } from '@wordpress/element';
5
+ import parse from 'html-react-parser';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { getBlockMap } from './get-block-map';
11
+
12
+ /**
13
+ * Replaces saved block HTML markup with Inner Block Components.
14
+ *
15
+ * @param {Object} props Render props.
16
+ * @param {Array} props.children Children/inner blocks to render.
17
+ * @param {string} props.blockName Parent Block Name used to get the block map and for keys.
18
+ * @param {number} [props.depth] Depth of inner blocks being rendered.
19
+ */
20
+ export const renderInnerBlocks = ( {
21
+ children,
22
+ blockName: parentBlockName,
23
+ depth = 1,
24
+ } ) => {
25
+ const blockMap = getBlockMap( parentBlockName );
26
+
27
+ return Array.from( children ).map( ( el, index ) => {
28
+ const componentProps = {
29
+ ...el.dataset,
30
+ key: `${ parentBlockName }_${ depth }_${ index }`,
31
+ };
32
+
33
+ const componentChildren =
34
+ el.children && el.children.length
35
+ ? renderInnerBlocks( {
36
+ children: el.children,
37
+ blockName: parentBlockName,
38
+ depth: depth + 1,
39
+ } )
40
+ : null;
41
+
42
+ const LayoutComponent =
43
+ componentProps.blockName && blockMap[ componentProps.blockName ]
44
+ ? blockMap[ componentProps.blockName ]
45
+ : null;
46
+
47
+ if ( ! LayoutComponent ) {
48
+ const element = parse( el.outerHTML );
49
+
50
+ if ( isValidElement( element ) ) {
51
+ return componentChildren
52
+ ? cloneElement( element, componentProps, componentChildren )
53
+ : cloneElement( element, componentProps );
54
+ }
55
+ return null;
56
+ }
57
+
58
+ return (
59
+ <Suspense
60
+ key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
61
+ fallback={ <div className="wc-block-placeholder" /> }
62
+ >
63
+ <LayoutComponent { ...componentProps }>
64
+ { componentChildren }
65
+ </LayoutComponent>
66
+ </Suspense>
67
+ );
68
+ } );
69
+ };
assets/js/atomic/utils/render-parent-block.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { renderFrontend } from '@woocommerce/base-utils';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { renderInnerBlocks } from './render-inner-blocks';
10
+
11
+ /**
12
+ * Renders a block component in the place of a specified set of selectors.
13
+ *
14
+ * @param {Object} props Render props.
15
+ * @param {Function} props.Block React component to use as a replacement.
16
+ * @param {string} props.selector CSS selector to match the elements to replace.
17
+ * @param {string} [props.blockName] Optional Block Name. Used for inner block component mapping.
18
+ * @param {Function} [props.getProps] Function to generate the props object for the block.
19
+ */
20
+ export const renderParentBlock = ( {
21
+ Block,
22
+ selector,
23
+ blockName = '',
24
+ getProps = () => {},
25
+ } ) => {
26
+ const getPropsWithChildren = ( el, i ) => {
27
+ const children =
28
+ el.children && el.children.length
29
+ ? renderInnerBlocks( {
30
+ blockName,
31
+ children: el.children,
32
+ } )
33
+ : null;
34
+ return { ...getProps( el, i ), children };
35
+ };
36
+ renderFrontend( {
37
+ Block,
38
+ selector,
39
+ getProps: getPropsWithChildren,
40
+ } );
41
+ };
assets/js/atomic/utils/render-parent-block.tsx DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { renderFrontend } from '@woocommerce/base-utils';
5
- import {
6
- Fragment,
7
- Suspense,
8
- cloneElement,
9
- isValidElement,
10
- } from '@wordpress/element';
11
- import parse from 'html-react-parser';
12
-
13
- interface renderBlockProps {
14
- // Parent Block Name. Used for inner block component mapping.
15
- blockName: string;
16
- // Map of block names to block components for children.
17
- blockMap: Record< string, React.ReactNode >;
18
- // Wrapper for inner components.
19
- blockWrapper?: React.ReactNode;
20
- }
21
-
22
- interface renderParentBlockProps extends renderBlockProps {
23
- // React component to use as a replacement.
24
- Block: React.FunctionComponent;
25
- // CSS selector to match the elements to replace.
26
- selector: string;
27
- // Function to generate the props object for the block.
28
- getProps: ( el: Element, i: number ) => Record< string, unknown >;
29
- }
30
-
31
- interface renderInnerBlockProps extends renderBlockProps {
32
- children: HTMLCollection;
33
- depth?: number;
34
- }
35
-
36
- /**
37
- * Replaces saved block HTML markup with Inner Block Components.
38
- */
39
- const renderInnerBlocks = ( {
40
- blockName: parentBlockName,
41
- blockMap,
42
- blockWrapper,
43
- depth = 1,
44
- children,
45
- }: renderInnerBlockProps ): ( JSX.Element | null )[] | null => {
46
- return Array.from( children ).map( ( el: Element, index: number ) => {
47
- const { blockName = '', ...componentProps } = {
48
- key: `${ parentBlockName }_${ depth }_${ index }`,
49
- ...( el instanceof HTMLElement ? el.dataset : {} ),
50
- };
51
-
52
- const componentChildren =
53
- el.children && el.children.length
54
- ? renderInnerBlocks( {
55
- children: el.children,
56
- blockName: parentBlockName,
57
- blockMap,
58
- depth: depth + 1,
59
- blockWrapper,
60
- } )
61
- : null;
62
-
63
- const LayoutComponent =
64
- blockName && blockMap[ blockName ]
65
- ? ( blockMap[ blockName ] as React.ElementType )
66
- : null;
67
-
68
- if ( ! LayoutComponent ) {
69
- const element = parse( el.outerHTML );
70
-
71
- if ( isValidElement( element ) ) {
72
- return componentChildren
73
- ? cloneElement( element, componentProps, componentChildren )
74
- : cloneElement( element, componentProps );
75
- }
76
- return null;
77
- }
78
-
79
- const LayoutComponentWrapper = ( blockWrapper
80
- ? blockWrapper
81
- : Fragment ) as React.ElementType;
82
-
83
- return (
84
- <Suspense
85
- key={ `${ parentBlockName }_${ depth }_${ index }_suspense` }
86
- fallback={ <div className="wc-block-placeholder" /> }
87
- >
88
- <LayoutComponentWrapper>
89
- <LayoutComponent { ...componentProps }>
90
- { componentChildren }
91
- </LayoutComponent>
92
- </LayoutComponentWrapper>
93
- </Suspense>
94
- );
95
- } );
96
- };
97
-
98
- /**
99
- * Renders a block component in the place of a specified set of selectors.
100
- */
101
- export const renderParentBlock = ( {
102
- Block,
103
- selector,
104
- blockName,
105
- getProps = () => ( {} ),
106
- blockMap,
107
- blockWrapper,
108
- }: renderParentBlockProps ): void => {
109
- const getPropsWithChildren = ( el: Element, i: number ) => {
110
- const children =
111
- el.children && el.children.length
112
- ? renderInnerBlocks( {
113
- blockName,
114
- blockMap,
115
- children: el.children,
116
- blockWrapper,
117
- } )
118
- : null;
119
- return { ...getProps( el, i ), children };
120
- };
121
- renderFrontend( {
122
- Block,
123
- selector,
124
- getProps: getPropsWithChildren,
125
- } );
126
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/block-error-boundary/block-error.js CHANGED
@@ -2,11 +2,11 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import PropTypes from 'prop-types';
6
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
7
 
8
  const BlockError = ( {
9
- imageUrl = `${ WC_BLOCKS_IMAGE_URL }/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
@@ -14,7 +14,6 @@ const BlockError = ( {
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
17
- button,
18
  } ) => {
19
  return (
20
  <div className="wc-block-error wc-block-components-error">
@@ -42,11 +41,6 @@ const BlockError = ( {
42
  { errorMessage }
43
  </p>
44
  ) }
45
- { button && (
46
- <p className="wc-block-error__button wc-block-components-error__button">
47
- { button }
48
- </p>
49
- ) }
50
  </div>
51
  </div>
52
  );
@@ -79,10 +73,6 @@ BlockError.propTypes = {
79
  * Text preceeding the error message.
80
  */
81
  errorMessagePrefix: PropTypes.string,
82
- /**
83
- * Button cta.
84
- */
85
- button: PropTypes.node,
86
  };
87
 
88
  export default BlockError;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
6
  import PropTypes from 'prop-types';
 
7
 
8
  const BlockError = ( {
9
+ imageUrl = `${ WC_BLOCKS_ASSET_URL }img/block-error.svg`,
10
  header = __( 'Oops!', 'woo-gutenberg-products-block' ),
11
  text = __(
12
  'There was an error loading the content.',
14
  ),
15
  errorMessage,
16
  errorMessagePrefix = __( 'Error:', 'woo-gutenberg-products-block' ),
 
17
  } ) => {
18
  return (
19
  <div className="wc-block-error wc-block-components-error">
41
  { errorMessage }
42
  </p>
43
  ) }
 
 
 
 
 
44
  </div>
45
  </div>
46
  );
73
  * Text preceeding the error message.
74
  */
75
  errorMessagePrefix: PropTypes.string,
 
 
 
 
76
  };
77
 
78
  export default BlockError;
assets/js/base/components/block-error-boundary/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { Component } from 'react';
6
 
7
  /**
8
  * Internal dependencies
@@ -20,10 +20,10 @@ class BlockErrorBoundary extends Component {
20
  ) {
21
  return {
22
  errorMessage: (
23
- <>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
- </>
27
  ),
28
  hasError: true,
29
  };
@@ -39,15 +39,10 @@ class BlockErrorBoundary extends Component {
39
  showErrorMessage,
40
  text,
41
  errorMessagePrefix,
42
- renderError,
43
- button,
44
  } = this.props;
45
  const { errorMessage, hasError } = this.state;
46
 
47
  if ( hasError ) {
48
- if ( typeof renderError === 'function' ) {
49
- return renderError( { errorMessage } );
50
- }
51
  return (
52
  <BlockError
53
  errorMessage={ showErrorMessage ? errorMessage : null }
@@ -55,7 +50,6 @@ class BlockErrorBoundary extends Component {
55
  imageUrl={ imageUrl }
56
  text={ text }
57
  errorMessagePrefix={ errorMessagePrefix }
58
- button={ button }
59
  />
60
  );
61
  }
@@ -91,10 +85,6 @@ BlockErrorBoundary.propTypes = {
91
  * Text preceeding the error message.
92
  */
93
  errorMessagePrefix: PropTypes.string,
94
- /**
95
- * Render function to show a custom error component.
96
- */
97
- renderError: PropTypes.func,
98
  };
99
 
100
  BlockErrorBoundary.defaultProps = {
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { Component, Fragment } from 'react';
6
 
7
  /**
8
  * Internal dependencies
20
  ) {
21
  return {
22
  errorMessage: (
23
+ <Fragment>
24
  <strong>{ error.status }</strong>:&nbsp;
25
  { error.statusText }
26
+ </Fragment>
27
  ),
28
  hasError: true,
29
  };
39
  showErrorMessage,
40
  text,
41
  errorMessagePrefix,
 
 
42
  } = this.props;
43
  const { errorMessage, hasError } = this.state;
44
 
45
  if ( hasError ) {
 
 
 
46
  return (
47
  <BlockError
48
  errorMessage={ showErrorMessage ? errorMessage : null }
50
  imageUrl={ imageUrl }
51
  text={ text }
52
  errorMessagePrefix={ errorMessagePrefix }
 
53
  />
54
  );
55
  }
85
  * Text preceeding the error message.
86
  */
87
  errorMessagePrefix: PropTypes.string,
 
 
 
 
88
  };
89
 
90
  BlockErrorBoundary.defaultProps = {
assets/js/base/components/block-error-boundary/style.scss CHANGED
@@ -1,34 +1,36 @@
1
  .wc-block-components-error {
2
  display: flex;
3
- padding: $gap-largest 0;
4
- margin: $gap-largest 0;
 
5
  align-items: center;
6
  justify-content: center;
7
  flex-direction: column;
8
- color: $gray-700;
9
- text-align: center;
10
  }
 
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
 
13
  margin: 0;
14
- color: $studio-gray-50;
15
  }
 
16
  .wc-block-components-error__image {
17
- width: 25%;
18
- margin: 0 0 $gap-large 0;
19
  }
20
  .wc-block-components-error__text {
21
- margin: 1em 0 0;
22
- color: $studio-gray-30;
23
- @include font-size(large);
24
- max-width: 60ch;
25
  }
26
  .wc-block-components-error__message {
27
- margin: 1em 0 0;
28
  font-style: italic;
29
- color: $studio-gray-30;
30
- max-width: 60ch;
31
  }
32
- .wc-block-error__button {
33
- margin: $gap-largest 0 0 0;
 
 
 
 
 
 
 
34
  }
1
  .wc-block-components-error {
2
  display: flex;
3
+ background-color: #f3f3f4;
4
+ border-left: 4px solid #6d6d6d;
5
+ padding: $gap-larger $gap;
6
  align-items: center;
7
  justify-content: center;
8
  flex-direction: column;
 
 
9
  }
10
+
11
  .wc-block-components-error__header {
12
  @include font-size(larger);
13
+ font-weight: bold;
14
  margin: 0;
 
15
  }
16
+
17
  .wc-block-components-error__image {
18
+ max-width: 25%;
 
19
  }
20
  .wc-block-components-error__text {
21
+ margin: 0;
 
 
 
22
  }
23
  .wc-block-components-error__message {
24
+ margin: 1em 0 0 0;
25
  font-style: italic;
 
 
26
  }
27
+
28
+ @include breakpoint( ">480px" ) {
29
+ .wc-block-components-error {
30
+ flex-direction: row;
31
+ }
32
+
33
+ .wc-block-components-error__image + .wc-block-components-error__content {
34
+ margin-left: $gap-large;
35
+ }
36
  }
assets/js/base/components/button/index.js ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { Button as WPButton } from 'wordpress-components';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.scss';
12
+
13
+ /** @typedef {import('react')} React */
14
+
15
+ /**
16
+ * Component that visually renders a button but semantically might be `<button>` or `<a>` depending
17
+ * on the props.
18
+ *
19
+ * @param {Object} props Incoming props for the component.
20
+ * @param {string} props.className CSS classname used.
21
+ * @param {boolean} props.showSpinner Whether to show spinner or not.
22
+ * @param {React.ReactChildren} props.children Child components passed in.
23
+ * @param {Object} props.props Rest of incoming props.
24
+ */
25
+ const Button = ( { className, showSpinner = false, children, ...props } ) => {
26
+ const buttonClassName = classNames(
27
+ 'wc-block-components-button',
28
+ className,
29
+ {
30
+ 'wc-block-components-button--loading': showSpinner,
31
+ }
32
+ );
33
+
34
+ return (
35
+ <WPButton className={ buttonClassName } { ...props }>
36
+ { showSpinner && (
37
+ <span
38
+ className="wc-block-components-button__spinner"
39
+ aria-hidden="true"
40
+ />
41
+ ) }
42
+ <span className="wc-block-components-button__text">
43
+ { children }
44
+ </span>
45
+ </WPButton>
46
+ );
47
+ };
48
+
49
+ Button.propTypes = {
50
+ className: PropTypes.string,
51
+ showSpinner: PropTypes.bool,
52
+ children: PropTypes.node,
53
+ };
54
+
55
+ export default Button;
assets/js/base/components/button/index.tsx DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { Button as WPButton } from 'wordpress-components';
5
- import type { ReactNode } from 'react';
6
- import classNames from 'classnames';
7
- import Spinner from '@woocommerce/base-components/spinner';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import './style.scss';
13
-
14
- interface ButtonProps extends WPButton.ButtonProps {
15
- className?: string;
16
- showSpinner?: boolean;
17
- children?: ReactNode;
18
- }
19
-
20
- /**
21
- * Component that visually renders a button but semantically might be `<button>` or `<a>` depending
22
- * on the props.
23
- */
24
- const Button = ( {
25
- className,
26
- showSpinner = false,
27
- children,
28
- ...props
29
- }: ButtonProps ): JSX.Element => {
30
- const buttonClassName = classNames(
31
- 'wc-block-components-button',
32
- className,
33
- {
34
- 'wc-block-components-button--loading': showSpinner,
35
- }
36
- );
37
-
38
- return (
39
- <WPButton className={ buttonClassName } { ...props }>
40
- { showSpinner && <Spinner /> }
41
- <span className="wc-block-components-button__text">
42
- { children }
43
- </span>
44
- </WPButton>
45
- );
46
- };
47
-
48
- export default Button;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/button/style.scss CHANGED
@@ -1,7 +1,7 @@
1
  .wc-block-components-button:not(.is-link) {
2
  @include reset-typography();
3
  align-items: center;
4
- background-color: $gray-900;
5
  color: $white;
6
  display: inline-flex;
7
  font-weight: bold;
@@ -18,7 +18,7 @@
18
  &:hover,
19
  &:focus,
20
  &:active {
21
- background-color: $gray-900;
22
  color: $white;
23
  }
24
 
@@ -29,7 +29,45 @@
29
  fill: currentColor;
30
  }
31
  }
32
- .wc-block-components-spinner + .wc-block-components-button__text {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  visibility: hidden;
34
  }
35
  }
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-components-button:not(.is-link) {
2
  @include reset-typography();
3
  align-items: center;
4
+ background-color: $black;
5
  color: $white;
6
  display: inline-flex;
7
  font-weight: bold;
18
  &:hover,
19
  &:focus,
20
  &:active {
21
+ background-color: $black;
22
  color: $white;
23
  }
24
 
29
  fill: currentColor;
30
  }
31
  }
32
+ .wc-block-components-button__spinner {
33
+ width: 1em;
34
+ height: 1em;
35
+ position: absolute;
36
+ top: 50%;
37
+ left: 0;
38
+ width: 100%;
39
+ height: 100%;
40
+ margin-top: -0.5em;
41
+ color: inherit;
42
+ box-sizing: content-box;
43
+
44
+ &::after {
45
+ content: " ";
46
+ display: inline-block;
47
+ margin: 0 auto;
48
+ width: 1em;
49
+ height: 1em;
50
+ box-sizing: border-box;
51
+ transform-origin: 50% 50%;
52
+ transform: translateZ(0) scale(0.5);
53
+ backface-visibility: hidden;
54
+ border-radius: 50%;
55
+ border: 0.2em solid currentColor;
56
+ border-left-color: transparent;
57
+ animation: wc-block-components-button__spinner__animation 1s infinite linear;
58
+ }
59
+ }
60
+ .wc-block-components-button__spinner + .wc-block-components-button__text {
61
  visibility: hidden;
62
  }
63
  }
64
+
65
+ @keyframes wc-block-components-button__spinner__animation {
66
+ 0% {
67
+ animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
68
+ transform: rotate(0deg);
69
+ }
70
+ 100% {
71
+ transform: rotate(360deg);
72
+ }
73
+ }
assets/js/base/components/cart-checkout/address-form/country-address-fields.js ADDED
@@ -0,0 +1,546 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressFieldKey } AddressFieldKey */
3
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
4
+
5
+ /**
6
+ * External dependencies
7
+ */
8
+ import { __ } from '@wordpress/i18n';
9
+
10
+ /**
11
+ * Used to render postcode before the city field.
12
+ *
13
+ * @type {Object <AddressFieldKey, AddressField>}
14
+ */
15
+ const postcodeBeforeCity = {
16
+ city: {
17
+ index: 9,
18
+ },
19
+ postcode: {
20
+ index: 7,
21
+ },
22
+ };
23
+
24
+ /**
25
+ * Used to make the state field optional.
26
+ *
27
+ * @type {Object <AddressFieldKey, AddressField>}
28
+ */
29
+ const optionalState = {
30
+ state: {
31
+ required: false,
32
+ },
33
+ };
34
+
35
+ /**
36
+ * Used to hide the state field.
37
+ *
38
+ * @type {Object <AddressFieldKey, AddressField>}
39
+ */
40
+ const hiddenState = {
41
+ state: {
42
+ required: false,
43
+ hidden: true,
44
+ },
45
+ };
46
+
47
+ /**
48
+ * Used to hide the postcode field.
49
+ *
50
+ * @type {Object <AddressFieldKey, AddressField>}
51
+ */
52
+ const hiddenPostcode = {
53
+ postcode: {
54
+ required: false,
55
+ hidden: true,
56
+ },
57
+ };
58
+
59
+ /**
60
+ * Country specific address field properties.
61
+ *
62
+ * @type {CountryAddressFields}
63
+ */
64
+ const countryAddressFields = {
65
+ AE: {
66
+ ...hiddenPostcode,
67
+ ...optionalState,
68
+ },
69
+ AF: hiddenState,
70
+ AO: {
71
+ ...hiddenPostcode,
72
+ state: {
73
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
74
+ optionalLabel: __(
75
+ 'Province (optional)',
76
+ 'woo-gutenberg-products-block'
77
+ ),
78
+ },
79
+ },
80
+ AT: {
81
+ ...postcodeBeforeCity,
82
+ ...hiddenState,
83
+ },
84
+ AU: {
85
+ city: {
86
+ label: __( 'Suburb', 'woo-gutenberg-products-block' ),
87
+ optionalLabel: __(
88
+ 'Suburb (optional)',
89
+ 'woo-gutenberg-products-block'
90
+ ),
91
+ },
92
+ postcode: {
93
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
94
+ optionalLabel: __(
95
+ 'Postcode (optional)',
96
+ 'woo-gutenberg-products-block'
97
+ ),
98
+ },
99
+ state: {
100
+ label: __( 'State', 'woo-gutenberg-products-block' ),
101
+ optionalLabel: __(
102
+ 'State (optional)',
103
+ 'woo-gutenberg-products-block'
104
+ ),
105
+ },
106
+ },
107
+ AX: {
108
+ ...postcodeBeforeCity,
109
+ ...hiddenState,
110
+ },
111
+ BD: {
112
+ postcode: {
113
+ required: false,
114
+ },
115
+ state: {
116
+ label: __( 'District', 'woo-gutenberg-products-block' ),
117
+ optionalLabel: __(
118
+ 'District (optional)',
119
+ 'woo-gutenberg-products-block'
120
+ ),
121
+ },
122
+ },
123
+ BE: {
124
+ ...postcodeBeforeCity,
125
+ ...hiddenState,
126
+ },
127
+ BH: {
128
+ postcode: {
129
+ required: false,
130
+ },
131
+ ...hiddenState,
132
+ },
133
+ BI: hiddenState,
134
+ BO: hiddenPostcode,
135
+ BS: hiddenPostcode,
136
+ CA: {
137
+ state: {
138
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
139
+ optionalLabel: __(
140
+ 'Province (optional)',
141
+ 'woo-gutenberg-products-block'
142
+ ),
143
+ },
144
+ },
145
+ CH: {
146
+ ...postcodeBeforeCity,
147
+ state: {
148
+ label: __( 'Canton', 'woo-gutenberg-products-block' ),
149
+ optionalLabel: __(
150
+ 'Canton (optional)',
151
+ 'woo-gutenberg-products-block'
152
+ ),
153
+ required: false,
154
+ },
155
+ },
156
+ CL: {
157
+ city: {
158
+ require: true,
159
+ },
160
+ postcode: {
161
+ required: false,
162
+ },
163
+ state: {
164
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
165
+ optionalLabel: __(
166
+ 'Region (optional)',
167
+ 'woo-gutenberg-products-block'
168
+ ),
169
+ },
170
+ },
171
+ CN: {
172
+ state: {
173
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
174
+ optionalLabel: __(
175
+ 'Province (optional)',
176
+ 'woo-gutenberg-products-block'
177
+ ),
178
+ },
179
+ },
180
+ CO: {
181
+ postcode: {
182
+ required: false,
183
+ },
184
+ },
185
+ CZ: hiddenState,
186
+ DE: {
187
+ ...postcodeBeforeCity,
188
+ ...hiddenState,
189
+ },
190
+ DK: {
191
+ ...postcodeBeforeCity,
192
+ ...hiddenState,
193
+ },
194
+ EE: {
195
+ ...postcodeBeforeCity,
196
+ ...hiddenState,
197
+ },
198
+ ES: {
199
+ ...postcodeBeforeCity,
200
+ state: {
201
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
202
+ optionalLabel: __(
203
+ 'Province (optional)',
204
+ 'woo-gutenberg-products-block'
205
+ ),
206
+ },
207
+ },
208
+ FI: {
209
+ ...postcodeBeforeCity,
210
+ ...hiddenState,
211
+ },
212
+ FR: {
213
+ ...postcodeBeforeCity,
214
+ ...hiddenState,
215
+ },
216
+ GB: {
217
+ postcode: {
218
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
219
+ optionalLabel: __(
220
+ 'Postcode (optional)',
221
+ 'woo-gutenberg-products-block'
222
+ ),
223
+ },
224
+ state: {
225
+ label: __( 'County', 'woo-gutenberg-products-block' ),
226
+ optionalLabel: __(
227
+ 'County (optional)',
228
+ 'woo-gutenberg-products-block'
229
+ ),
230
+ },
231
+ },
232
+ GP: hiddenState,
233
+ GF: hiddenState,
234
+ GR: optionalState,
235
+ HK: {
236
+ postcode: {
237
+ required: false,
238
+ },
239
+ city: {
240
+ label: __( 'Town/District', 'woo-gutenberg-products-block' ),
241
+ optionalLabel: __(
242
+ 'Town/District (optional)',
243
+ 'woo-gutenberg-products-block'
244
+ ),
245
+ },
246
+ state: {
247
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
248
+ optionalLabel: __(
249
+ 'Region (optional)',
250
+ 'woo-gutenberg-products-block'
251
+ ),
252
+ },
253
+ },
254
+ HU: {
255
+ state: {
256
+ label: __( 'County', 'woo-gutenberg-products-block' ),
257
+ optionalLabel: __(
258
+ 'County (optional)',
259
+ 'woo-gutenberg-products-block'
260
+ ),
261
+ },
262
+ },
263
+ ID: {
264
+ state: {
265
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
266
+ optionalLabel: __(
267
+ 'Province (optional)',
268
+ 'woo-gutenberg-products-block'
269
+ ),
270
+ },
271
+ },
272
+ IE: {
273
+ postcode: {
274
+ label: __( 'Eircode', 'woo-gutenberg-products-block' ),
275
+ optionalLabel: __(
276
+ 'Eircode (optional)',
277
+ 'woo-gutenberg-products-block'
278
+ ),
279
+ required: false,
280
+ },
281
+ state: {
282
+ label: __( 'County', 'woo-gutenberg-products-block' ),
283
+ optionalLabel: __(
284
+ 'County (optional)',
285
+ 'woo-gutenberg-products-block'
286
+ ),
287
+ },
288
+ },
289
+ IS: {
290
+ ...postcodeBeforeCity,
291
+ ...hiddenState,
292
+ },
293
+ IL: {
294
+ ...postcodeBeforeCity,
295
+ ...hiddenState,
296
+ },
297
+ IM: hiddenState,
298
+ IT: {
299
+ ...postcodeBeforeCity,
300
+ state: {
301
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
302
+ optionalLabel: __(
303
+ 'Province (optional)',
304
+ 'woo-gutenberg-products-block'
305
+ ),
306
+ },
307
+ },
308
+ JP: {
309
+ first_name: {
310
+ index: 2,
311
+ },
312
+ last_name: {
313
+ index: 1,
314
+ },
315
+ address_1: {
316
+ index: 7,
317
+ },
318
+ address_2: {
319
+ index: 8,
320
+ },
321
+ postcode: {
322
+ index: 4,
323
+ },
324
+ city: {
325
+ index: 6,
326
+ },
327
+ state: {
328
+ label: __( 'Prefecture', 'woo-gutenberg-products-block' ),
329
+ optionalLabel: __(
330
+ 'Prefecture (optional)',
331
+ 'woo-gutenberg-products-block'
332
+ ),
333
+ index: 5,
334
+ },
335
+ },
336
+ KR: hiddenState,
337
+ KW: hiddenState,
338
+ LB: hiddenState,
339
+ LI: {
340
+ ...postcodeBeforeCity,
341
+ state: {
342
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
343
+ optionalLabel: __(
344
+ 'Municipality (optional)',
345
+ 'woo-gutenberg-products-block'
346
+ ),
347
+ required: false,
348
+ },
349
+ },
350
+ LK: hiddenState,
351
+ LU: hiddenState,
352
+ LV: {
353
+ state: {
354
+ label: __( 'Municipality', 'woo-gutenberg-products-block' ),
355
+ optionalLabel: __(
356
+ 'Municipality (optional)',
357
+ 'woo-gutenberg-products-block'
358
+ ),
359
+ required: false,
360
+ },
361
+ },
362
+ MQ: hiddenState,
363
+ MT: hiddenState,
364
+ MZ: {
365
+ ...hiddenPostcode,
366
+ state: {
367
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
368
+ optionalLabel: __(
369
+ 'Province (optional)',
370
+ 'woo-gutenberg-products-block'
371
+ ),
372
+ },
373
+ },
374
+ NL: {
375
+ ...postcodeBeforeCity,
376
+ ...hiddenState,
377
+ },
378
+ NG: {
379
+ ...hiddenPostcode,
380
+ state: {
381
+ label: __( 'State', 'woo-gutenberg-products-block' ),
382
+ optionalLabel: __(
383
+ 'State (optional)',
384
+ 'woo-gutenberg-products-block'
385
+ ),
386
+ },
387
+ },
388
+ NO: {
389
+ ...postcodeBeforeCity,
390
+ ...hiddenState,
391
+ },
392
+ NP: {
393
+ postcode: {
394
+ required: false,
395
+ },
396
+ state: {
397
+ label: __( 'State', 'woo-gutenberg-products-block' ),
398
+ optionalLabel: __(
399
+ 'State (optional)',
400
+ 'woo-gutenberg-products-block'
401
+ ),
402
+ },
403
+ },
404
+ NZ: {
405
+ postcode: {
406
+ label: __( 'Postcode', 'woo-gutenberg-products-block' ),
407
+ optionalLabel: __(
408
+ 'Postcode (optional)',
409
+ 'woo-gutenberg-products-block'
410
+ ),
411
+ },
412
+ state: {
413
+ label: __( 'Region', 'woo-gutenberg-products-block' ),
414
+ optionalLabel: __(
415
+ 'Region (optional)',
416
+ 'woo-gutenberg-products-block'
417
+ ),
418
+ },
419
+ },
420
+ PL: {
421
+ ...postcodeBeforeCity,
422
+ ...hiddenState,
423
+ },
424
+ PT: hiddenState,
425
+ RE: hiddenState,
426
+ RO: {
427
+ state: {
428
+ label: __( 'County', 'woo-gutenberg-products-block' ),
429
+ optionalLabel: __(
430
+ 'County (optional)',
431
+ 'woo-gutenberg-products-block'
432
+ ),
433
+ },
434
+ },
435
+ RS: hiddenState,
436
+ SE: {
437
+ ...postcodeBeforeCity,
438
+ ...hiddenState,
439
+ },
440
+ SG: {
441
+ city: {
442
+ required: false,
443
+ },
444
+ ...hiddenState,
445
+ },
446
+ SK: {
447
+ ...postcodeBeforeCity,
448
+ ...hiddenState,
449
+ },
450
+ SI: {
451
+ ...postcodeBeforeCity,
452
+ ...hiddenState,
453
+ },
454
+ SR: {
455
+ ...hiddenPostcode,
456
+ },
457
+ ST: {
458
+ ...hiddenPostcode,
459
+ state: {
460
+ label: __( 'District', 'woo-gutenberg-products-block' ),
461
+ optionalLabel: __(
462
+ 'District (optional)',
463
+ 'woo-gutenberg-products-block'
464
+ ),
465
+ },
466
+ },
467
+ MD: {
468
+ state: {
469
+ label: __(
470
+ 'Municipality/District',
471
+ 'woo-gutenberg-products-block'
472
+ ),
473
+ optionalLabel: __(
474
+ 'Municipality/District (optional)',
475
+ 'woo-gutenberg-products-block'
476
+ ),
477
+ },
478
+ },
479
+ TR: {
480
+ ...postcodeBeforeCity,
481
+ state: {
482
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
483
+ optionalLabel: __(
484
+ 'Province (optional)',
485
+ 'woo-gutenberg-products-block'
486
+ ),
487
+ },
488
+ },
489
+ UG: {
490
+ ...hiddenPostcode,
491
+ city: {
492
+ label: __( 'Town/Village', 'woo-gutenberg-products-block' ),
493
+ optionalLabel: __(
494
+ 'Town/Village (optional)',
495
+ 'woo-gutenberg-products-block'
496
+ ),
497
+ },
498
+ state: {
499
+ label: __( 'District', 'woo-gutenberg-products-block' ),
500
+ optionalLabel: __(
501
+ 'District (optional)',
502
+ 'woo-gutenberg-products-block'
503
+ ),
504
+ },
505
+ },
506
+ US: {
507
+ postcode: {
508
+ label: __( 'ZIP', 'woo-gutenberg-products-block' ),
509
+ optionalLabel: __(
510
+ 'ZIP (optional)',
511
+ 'woo-gutenberg-products-block'
512
+ ),
513
+ },
514
+ state: {
515
+ label: __( 'State', 'woo-gutenberg-products-block' ),
516
+ optionalLabel: __(
517
+ 'State (optional)',
518
+ 'woo-gutenberg-products-block'
519
+ ),
520
+ },
521
+ },
522
+ VN: {
523
+ city: {
524
+ index: 8,
525
+ },
526
+ postcode: {
527
+ index: 7,
528
+ required: false,
529
+ },
530
+ ...hiddenState,
531
+ },
532
+ WS: hiddenPostcode,
533
+ YT: hiddenState,
534
+ ZA: {
535
+ state: {
536
+ label: __( 'Province', 'woo-gutenberg-products-block' ),
537
+ optionalLabel: __(
538
+ 'Province (optional)',
539
+ 'woo-gutenberg-products-block'
540
+ ),
541
+ },
542
+ },
543
+ ZW: hiddenPostcode,
544
+ };
545
+
546
+ export default countryAddressFields;
assets/js/{settings/shared/default-address-fields.ts → base/components/cart-checkout/address-form/default-address-fields.js} RENAMED
@@ -1,74 +1,24 @@
 
 
1
  /**
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
 
6
- export interface AddressField {
7
- // The label for the field.
8
- label: string;
9
- // The label for the field if made optional.
10
- optionalLabel: string;
11
- // The HTML autocomplete attribute value. See https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
12
- autocomplete: string;
13
- // How this field value is capitalized.
14
- autocapitalize?: string;
15
- // Set to true if the field is required.
16
- required: boolean;
17
- // Set to true if the field should not be rendered.
18
- hidden: boolean;
19
- // Fields will be sorted and render in this order, lowest to highest.
20
- index: number;
21
- }
22
-
23
- export interface LocaleSpecificAddressField extends AddressField {
24
- priority: number;
25
- }
26
-
27
- export interface AddressFields {
28
- // eslint-disable-next-line camelcase
29
- first_name: AddressField;
30
- // eslint-disable-next-line camelcase
31
- last_name: AddressField;
32
- company: AddressField;
33
- // eslint-disable-next-line camelcase
34
- address_1: AddressField;
35
- // eslint-disable-next-line camelcase
36
- address_2: AddressField;
37
- country: AddressField;
38
- city: AddressField;
39
- state: AddressField;
40
- postcode: AddressField;
41
- }
42
-
43
- export type AddressType = 'billing' | 'shipping';
44
- export interface EnteredAddress {
45
- // eslint-disable-next-line camelcase
46
- first_name: string;
47
- // eslint-disable-next-line camelcase
48
- last_name: string;
49
- company: string;
50
- // eslint-disable-next-line camelcase
51
- address_1: string;
52
- // eslint-disable-next-line camelcase
53
- address_2: string;
54
- country: string;
55
- city: string;
56
- state: string;
57
- postcode: string;
58
- }
59
-
60
- export type KeyedAddressField = AddressField & {
61
- key: keyof AddressFields;
62
- errorMessage?: string;
63
- };
64
- export type ShippingAddress = EnteredAddress;
65
- export type BillingAddress = EnteredAddress;
66
- export type CountryAddressFields = Record< string, AddressFields >;
67
-
68
  /**
69
  * Default address field properties.
 
 
 
 
 
 
 
 
 
 
70
  */
71
- export const defaultAddressFields: AddressFields = {
72
  first_name: {
73
  label: __( 'First name', 'woo-gutenberg-products-block' ),
74
  optionalLabel: __(
@@ -79,7 +29,7 @@ export const defaultAddressFields: AddressFields = {
79
  autocapitalize: 'sentences',
80
  required: true,
81
  hidden: false,
82
- index: 10,
83
  },
84
  last_name: {
85
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
@@ -91,7 +41,7 @@ export const defaultAddressFields: AddressFields = {
91
  autocapitalize: 'sentences',
92
  required: true,
93
  hidden: false,
94
- index: 20,
95
  },
96
  company: {
97
  label: __( 'Company', 'woo-gutenberg-products-block' ),
@@ -103,7 +53,7 @@ export const defaultAddressFields: AddressFields = {
103
  autocapitalize: 'sentences',
104
  required: false,
105
  hidden: false,
106
- index: 30,
107
  },
108
  address_1: {
109
  label: __( 'Address', 'woo-gutenberg-products-block' ),
@@ -115,7 +65,7 @@ export const defaultAddressFields: AddressFields = {
115
  autocapitalize: 'sentences',
116
  required: true,
117
  hidden: false,
118
- index: 40,
119
  },
120
  address_2: {
121
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
@@ -127,7 +77,7 @@ export const defaultAddressFields: AddressFields = {
127
  autocapitalize: 'sentences',
128
  required: false,
129
  hidden: false,
130
- index: 50,
131
  },
132
  country: {
133
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
@@ -138,7 +88,7 @@ export const defaultAddressFields: AddressFields = {
138
  autocomplete: 'country',
139
  required: true,
140
  hidden: false,
141
- index: 60,
142
  },
143
  city: {
144
  label: __( 'City', 'woo-gutenberg-products-block' ),
@@ -147,7 +97,7 @@ export const defaultAddressFields: AddressFields = {
147
  autocapitalize: 'sentences',
148
  required: true,
149
  hidden: false,
150
- index: 70,
151
  },
152
  state: {
153
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
@@ -159,7 +109,7 @@ export const defaultAddressFields: AddressFields = {
159
  autocapitalize: 'sentences',
160
  required: true,
161
  hidden: false,
162
- index: 80,
163
  },
164
  postcode: {
165
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
@@ -171,8 +121,8 @@ export const defaultAddressFields: AddressFields = {
171
  autocapitalize: 'characters',
172
  required: true,
173
  hidden: false,
174
- index: 90,
175
  },
176
  };
177
 
178
- export default defaultAddressFields;
1
+ /** @typedef { import('@woocommerce/type-defs/address-fields').AddressField } AddressField */
2
+
3
  /**
4
  * External dependencies
5
  */
6
  import { __ } from '@wordpress/i18n';
7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  /**
9
  * Default address field properties.
10
+ *
11
+ * @property {AddressField} first_name Customer first name.
12
+ * @property {AddressField} last_name Customer last name.
13
+ * @property {AddressField} company Company name.
14
+ * @property {AddressField} address_1 Street address.
15
+ * @property {AddressField} address_2 Second line of address.
16
+ * @property {AddressField} country Country code.
17
+ * @property {AddressField} city City name.
18
+ * @property {AddressField} state State name or code.
19
+ * @property {AddressField} postcode Postal code.
20
  */
21
+ const AddressFields = {
22
  first_name: {
23
  label: __( 'First name', 'woo-gutenberg-products-block' ),
24
  optionalLabel: __(
29
  autocapitalize: 'sentences',
30
  required: true,
31
  hidden: false,
32
+ index: 1,
33
  },
34
  last_name: {
35
  label: __( 'Last name', 'woo-gutenberg-products-block' ),
41
  autocapitalize: 'sentences',
42
  required: true,
43
  hidden: false,
44
+ index: 2,
45
  },
46
  company: {
47
  label: __( 'Company', 'woo-gutenberg-products-block' ),
53
  autocapitalize: 'sentences',
54
  required: false,
55
  hidden: false,
56
+ index: 3,
57
  },
58
  address_1: {
59
  label: __( 'Address', 'woo-gutenberg-products-block' ),
65
  autocapitalize: 'sentences',
66
  required: true,
67
  hidden: false,
68
+ index: 4,
69
  },
70
  address_2: {
71
  label: __( 'Apartment, suite, etc.', 'woo-gutenberg-products-block' ),
77
  autocapitalize: 'sentences',
78
  required: false,
79
  hidden: false,
80
+ index: 5,
81
  },
82
  country: {
83
  label: __( 'Country/Region', 'woo-gutenberg-products-block' ),
88
  autocomplete: 'country',
89
  required: true,
90
  hidden: false,
91
+ index: 6,
92
  },
93
  city: {
94
  label: __( 'City', 'woo-gutenberg-products-block' ),
97
  autocapitalize: 'sentences',
98
  required: true,
99
  hidden: false,
100
+ index: 7,
101
  },
102
  state: {
103
  label: __( 'State/County', 'woo-gutenberg-products-block' ),
109
  autocapitalize: 'sentences',
110
  required: true,
111
  hidden: false,
112
+ index: 8,
113
  },
114
  postcode: {
115
  label: __( 'Postal code', 'woo-gutenberg-products-block' ),
121
  autocapitalize: 'characters',
122
  required: true,
123
  hidden: false,
124
+ index: 9,
125
  },
126
  };
127
 
128
+ export default AddressFields;
assets/js/base/components/cart-checkout/address-form/{address-form.tsx → index.js} RENAMED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
6
  import {
7
  BillingCountryInput,
8
  ShippingCountryInput,
@@ -12,31 +12,24 @@ import {
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
- import { useEffect, useMemo } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
18
- import { useShallowEqual } from '@woocommerce/base-hooks';
19
- import {
20
- AddressField,
21
- AddressFields,
22
- AddressType,
23
- defaultAddressFields,
24
- EnteredAddress,
25
- } from '@woocommerce/settings';
26
 
27
  /**
28
  * Internal dependencies
29
  */
30
- import prepareAddressFields from './prepare-address-fields';
 
31
 
32
  // If it's the shipping address form and the user starts entering address
33
  // values without having set the country first, show an error.
34
  const validateShippingCountry = (
35
- values: EnteredAddress,
36
- setValidationErrors: ( errors: Record< string, unknown > ) => void,
37
- clearValidationError: ( error: string ) => void,
38
- hasValidationError: boolean
39
- ): void => {
40
  if (
41
  ! hasValidationError &&
42
  ! values.country &&
@@ -57,15 +50,6 @@ const validateShippingCountry = (
57
  }
58
  };
59
 
60
- interface AddressFormProps {
61
- id: string;
62
- instanceId: string;
63
- fields: ( keyof AddressFields )[];
64
- fieldConfig: Record< keyof AddressFields, Partial< AddressField > >;
65
- onChange: ( newValue: EnteredAddress ) => void;
66
- type: AddressType;
67
- values: EnteredAddress;
68
- }
69
  /**
70
  * Checkout address form.
71
  *
@@ -80,52 +64,43 @@ interface AddressFormProps {
80
  */
81
  const AddressForm = ( {
82
  id,
83
- fields = ( Object.keys(
84
- defaultAddressFields
85
- ) as unknown ) as ( keyof AddressFields )[],
86
- fieldConfig = {} as Record< keyof AddressFields, Partial< AddressField > >,
87
  instanceId,
88
  onChange,
89
  type = 'shipping',
90
  values,
91
- }: AddressFormProps ): JSX.Element => {
92
  const {
93
  getValidationError,
94
  setValidationErrors,
95
  clearValidationError,
96
  } = useValidationContext();
97
-
98
- const currentFields = useShallowEqual( fields );
99
-
100
- const countryValidationError = ( getValidationError(
101
- 'shipping-missing-country'
102
- ) || {} ) as {
103
- message: string;
104
- hidden: boolean;
105
- };
106
-
107
- const addressFormFields = useMemo( () => {
108
- return prepareAddressFields(
109
- currentFields,
110
- fieldConfig,
111
- values.country
112
- );
113
- }, [ currentFields, fieldConfig, values.country ] );
114
-
115
  useEffect( () => {
116
  if ( type === 'shipping' ) {
117
  validateShippingCountry(
118
  values,
119
  setValidationErrors,
120
  clearValidationError,
121
- !! countryValidationError.message &&
122
  ! countryValidationError.hidden
123
  );
124
  }
125
  }, [
126
  values,
127
- countryValidationError.message,
128
- countryValidationError.hidden,
129
  setValidationErrors,
130
  clearValidationError,
131
  type,
@@ -135,7 +110,7 @@ const AddressForm = ( {
135
 
136
  return (
137
  <div id={ id } className="wc-block-components-address-form">
138
- { addressFormFields.map( ( field ) => {
139
  if ( field.hidden ) {
140
  return null;
141
  }
@@ -206,7 +181,7 @@ const AddressForm = ( {
206
  }
207
 
208
  return (
209
- <ValidatedTextInput
210
  key={ field.key }
211
  id={ `${ id }-${ field.key }` }
212
  className={ `wc-block-components-address-form__${ field.key }` }
@@ -216,7 +191,7 @@ const AddressForm = ( {
216
  value={ values[ field.key ] }
217
  autoCapitalize={ field.autocapitalize }
218
  autoComplete={ field.autocomplete }
219
- onChange={ ( newValue: string ) =>
220
  onChange( {
221
  ...values,
222
  [ field.key ]: newValue,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import { DebouncedValidatedTextInput } from '@woocommerce/base-components/text-input';
6
  import {
7
  BillingCountryInput,
8
  ShippingCountryInput,
12
  ShippingStateInput,
13
  } from '@woocommerce/base-components/state-input';
14
  import { useValidationContext } from '@woocommerce/base-context';
15
+ import { useEffect } from '@wordpress/element';
16
  import { __ } from '@wordpress/i18n';
17
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
 
 
 
 
18
 
19
  /**
20
  * Internal dependencies
21
  */
22
+ import defaultAddressFields from './default-address-fields';
23
+ import countryAddressFields from './country-address-fields';
24
 
25
  // If it's the shipping address form and the user starts entering address
26
  // values without having set the country first, show an error.
27
  const validateShippingCountry = (
28
+ values,
29
+ setValidationErrors,
30
+ clearValidationError,
31
+ hasValidationError
32
+ ) => {
33
  if (
34
  ! hasValidationError &&
35
  ! values.country &&
50
  }
51
  };
52
 
 
 
 
 
 
 
 
 
 
53
  /**
54
  * Checkout address form.
55
  *
64
  */
65
  const AddressForm = ( {
66
  id,
67
+ fields = Object.keys( defaultAddressFields ),
68
+ fieldConfig = {},
 
 
69
  instanceId,
70
  onChange,
71
  type = 'shipping',
72
  values,
73
+ } ) => {
74
  const {
75
  getValidationError,
76
  setValidationErrors,
77
  clearValidationError,
78
  } = useValidationContext();
79
+ const countryLocale = countryAddressFields[ values.country ] || {};
80
+ const addressFields = fields.map( ( field ) => ( {
81
+ key: field,
82
+ ...defaultAddressFields[ field ],
83
+ ...countryLocale[ field ],
84
+ ...fieldConfig[ field ],
85
+ } ) );
86
+ const sortedAddressFields = addressFields.sort(
87
+ ( a, b ) => a.index - b.index
88
+ );
89
+ const countryValidationError =
90
+ getValidationError( 'shipping-missing-country' ) || {};
 
 
 
 
 
 
91
  useEffect( () => {
92
  if ( type === 'shipping' ) {
93
  validateShippingCountry(
94
  values,
95
  setValidationErrors,
96
  clearValidationError,
97
+ countryValidationError.message &&
98
  ! countryValidationError.hidden
99
  );
100
  }
101
  }, [
102
  values,
103
+ countryValidationError,
 
104
  setValidationErrors,
105
  clearValidationError,
106
  type,
110
 
111
  return (
112
  <div id={ id } className="wc-block-components-address-form">
113
+ { sortedAddressFields.map( ( field ) => {
114
  if ( field.hidden ) {
115
  return null;
116
  }
181
  }
182
 
183
  return (
184
+ <DebouncedValidatedTextInput
185
  key={ field.key }
186
  id={ `${ id }-${ field.key }` }
187
  className={ `wc-block-components-address-form__${ field.key }` }
191
  value={ values[ field.key ] }
192
  autoCapitalize={ field.autocapitalize }
193
  autoComplete={ field.autocomplete }
194
+ onChange={ ( newValue ) =>
195
  onChange( {
196
  ...values,
197
  [ field.key ]: newValue,
assets/js/base/components/cart-checkout/address-form/index.ts DELETED
@@ -1 +0,0 @@
1
- export { default as AddressForm } from './address-form';
 
assets/js/base/components/cart-checkout/address-form/prepare-address-fields.ts DELETED
@@ -1,131 +0,0 @@
1
- /** @typedef { import('@woocommerce/type-defs/address-fields').CountryAddressFields } CountryAddressFields */
2
-
3
- /**
4
- * External dependencies
5
- */
6
- import {
7
- AddressField,
8
- AddressFields,
9
- CountryAddressFields,
10
- defaultAddressFields,
11
- getSetting,
12
- KeyedAddressField,
13
- LocaleSpecificAddressField,
14
- } from '@woocommerce/settings';
15
- import { __, sprintf } from '@wordpress/i18n';
16
- import { isNumber, isString } from '@woocommerce/types';
17
-
18
- /**
19
- * This is locale data from WooCommerce countries class. This doesn't match the shape of the new field data blocks uses,
20
- * but we can import part of it to set which fields are required.
21
- *
22
- * This supports new properties such as optionalLabel which are not used by core (yet).
23
- */
24
- const coreLocale = getSetting< CountryAddressFields >( 'countryLocale', {} );
25
-
26
- /**
27
- * Gets props from the core locale, then maps them to the shape we require in the client.
28
- *
29
- * Ignores "class", "type", "placeholder", and "autocomplete" props from core.
30
- *
31
- * @param {Object} localeField Locale fields from WooCommerce.
32
- * @return {Object} Supported locale fields.
33
- */
34
- const getSupportedCoreLocaleProps = (
35
- localeField: LocaleSpecificAddressField
36
- ): Partial< AddressField > => {
37
- const fields: Partial< AddressField > = {};
38
-
39
- if ( localeField.label !== undefined ) {
40
- fields.label = localeField.label;
41
- }
42
-
43
- if ( localeField.required !== undefined ) {
44
- fields.required = localeField.required;
45
- }
46
-
47
- if ( localeField.hidden !== undefined ) {
48
- fields.hidden = localeField.hidden;
49
- }
50
-
51
- if ( localeField.label !== undefined && ! localeField.optionalLabel ) {
52
- fields.optionalLabel = sprintf(
53
- /* translators: %s Field label. */
54
- __( '%s (optional)', 'woo-gutenberg-products-block' ),
55
- localeField.label
56
- );
57
- }
58
-
59
- if ( localeField.priority ) {
60
- if ( isNumber( localeField.priority ) ) {
61
- fields.index = localeField.priority;
62
- }
63
- if ( isString( localeField.priority ) ) {
64
- fields.index = parseInt( localeField.priority, 10 );
65
- }
66
- }
67
-
68
- if ( localeField.hidden ) {
69
- fields.required = false;
70
- }
71
-
72
- return fields;
73
- };
74
-
75
- const countryAddressFields: CountryAddressFields = Object.entries( coreLocale )
76
- .map( ( [ country, countryLocale ] ) => [
77
- country,
78
- Object.entries( countryLocale )
79
- .map( ( [ localeFieldKey, localeField ] ) => [
80
- localeFieldKey,
81
- getSupportedCoreLocaleProps( localeField ),
82
- ] )
83
- .reduce( ( obj, [ key, val ] ) => {
84
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
85
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
86
- obj[ key ] = val;
87
- return obj;
88
- }, {} ),
89
- ] )
90
- .reduce( ( obj, [ key, val ] ) => {
91
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
92
- // @ts-ignore - Ignoring because it should be fine as long as the data from the server is correct. TS won't catch it anyway if it's not.
93
- obj[ key ] = val;
94
- return obj;
95
- }, {} );
96
-
97
- /**
98
- * Combines address fields, including fields from the locale, and sorts them by index.
99
- *
100
- * @param {Array} fields List of field keys--only address fields matching these will be returned.
101
- * @param {Object} fieldConfigs Fields config contains field specific overrides at block level which may, for example, hide a field.
102
- * @param {string} addressCountry Address country code. If unknown, locale fields will not be merged.
103
- * @return {CountryAddressFields} Object containing address fields.
104
- */
105
- const prepareAddressFields = (
106
- fields: ( keyof AddressFields )[],
107
- fieldConfigs: Record< string, Partial< AddressField > >,
108
- addressCountry = ''
109
- ): KeyedAddressField[] => {
110
- const localeConfigs: AddressFields =
111
- addressCountry && countryAddressFields[ addressCountry ] !== undefined
112
- ? countryAddressFields[ addressCountry ]
113
- : ( {} as AddressFields );
114
-
115
- return fields
116
- .map( ( field ) => {
117
- const defaultConfig = defaultAddressFields[ field ] || {};
118
- const localeConfig = localeConfigs[ field ] || {};
119
- const fieldConfig = fieldConfigs[ field ] || {};
120
-
121
- return {
122
- key: field,
123
- ...defaultConfig,
124
- ...localeConfig,
125
- ...fieldConfig,
126
- };
127
- } )
128
- .sort( ( a, b ) => a.index - b.index );
129
- };
130
-
131
- export default prepareAddressFields;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/address-form/test/index.js DELETED
@@ -1,178 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import userEvent from '@testing-library/user-event';
6
- import { CheckoutProvider } from '@woocommerce/base-context';
7
- import { useCheckoutAddress } from '@woocommerce/base-context/hooks';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import AddressForm from '../address-form';
13
-
14
- const renderInCheckoutProvider = ( ui, options = {} ) => {
15
- const Wrapper = ( { children } ) => {
16
- return <CheckoutProvider>{ children }</CheckoutProvider>;
17
- };
18
- return render( ui, { wrapper: Wrapper, ...options } );
19
- };
20
-
21
- // Countries used in testing addresses must be in the wcSettings global.
22
- // See: tests/js/setup-globals.js
23
- const primaryAddress = {
24
- country: 'United Kingdom (UK)',
25
- countryKey: 'GB',
26
- city: 'London',
27
- state: 'Greater London',
28
- postcode: 'ABCD',
29
- };
30
- const secondaryAddress = {
31
- country: 'Austria', // We use Austria because it doesn't have states.
32
- countryKey: 'AU',
33
- city: 'Vienna',
34
- postcode: 'DCBA',
35
- };
36
- const tertiaryAddress = {
37
- country: 'Canada', // We use Canada because it has a select for the state.
38
- countryKey: 'CA',
39
- city: 'Toronto',
40
- state: 'Ontario',
41
- postcode: 'EFGH',
42
- };
43
-
44
- const countryRegExp = /country/i;
45
- const cityRegExp = /city/i;
46
- const stateRegExp = /county|province|state/i;
47
- const postalCodeRegExp = /postal code|postcode|zip/i;
48
-
49
- const inputAddress = ( {
50
- country = null,
51
- city = null,
52
- state = null,
53
- postcode = null,
54
- } ) => {
55
- if ( country ) {
56
- const countryButton = screen.getByRole( 'button', {
57
- name: countryRegExp,
58
- } );
59
- userEvent.click( countryButton );
60
- userEvent.click( screen.getByRole( 'option', { name: country } ) );
61
- }
62
- if ( city ) {
63
- const cityInput = screen.getByLabelText( cityRegExp );
64
- userEvent.type( cityInput, city );
65
- }
66
- if ( state ) {
67
- const stateButton = screen.queryByRole( 'button', {
68
- name: stateRegExp,
69
- } );
70
- // State input might be a select or a text input.
71
- if ( stateButton ) {
72
- userEvent.click( stateButton );
73
- userEvent.click( screen.getByRole( 'option', { name: state } ) );
74
- } else {
75
- const stateInput = screen.getByLabelText( stateRegExp );
76
- userEvent.type( stateInput, state );
77
- }
78
- }
79
- if ( postcode ) {
80
- const postcodeInput = screen.getByLabelText( postalCodeRegExp );
81
- userEvent.type( postcodeInput, postcode );
82
- }
83
- };
84
-
85
- describe( 'AddressForm Component', () => {
86
- const WrappedAddressForm = ( { type } ) => {
87
- const {
88
- defaultAddressFields,
89
- setShippingFields,
90
- shippingFields,
91
- } = useCheckoutAddress();
92
-
93
- return (
94
- <AddressForm
95
- type={ type }
96
- onChange={ setShippingFields }
97
- values={ shippingFields }
98
- fields={ Object.keys( defaultAddressFields ) }
99
- />
100
- );
101
- };
102
- const ShippingFields = () => {
103
- const { shippingFields } = useCheckoutAddress();
104
-
105
- return (
106
- <ul>
107
- { Object.keys( shippingFields ).map( ( key ) => (
108
- <li key={ key }>{ key + ': ' + shippingFields[ key ] }</li>
109
- ) ) }
110
- </ul>
111
- );
112
- };
113
-
114
- it( 'updates context value when interacting with form elements', () => {
115
- renderInCheckoutProvider(
116
- <>
117
- <WrappedAddressForm type="shipping" />
118
- <ShippingFields />
119
- </>
120
- );
121
-
122
- inputAddress( primaryAddress );
123
-
124
- expect( screen.getByText( /country/ ) ).toHaveTextContent(
125
- `country: ${ primaryAddress.countryKey }`
126
- );
127
- expect( screen.getByText( /city/ ) ).toHaveTextContent(
128
- `city: ${ primaryAddress.city }`
129
- );
130
- expect( screen.getByText( /state/ ) ).toHaveTextContent(
131
- `state: ${ primaryAddress.state }`
132
- );
133
- expect( screen.getByText( /postcode/ ) ).toHaveTextContent(
134
- `postcode: ${ primaryAddress.postcode }`
135
- );
136
- } );
137
-
138
- it( 'input fields update when changing the country', () => {
139
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
140
-
141
- inputAddress( primaryAddress );
142
-
143
- // Verify correct labels are used.
144
- expect( screen.getByLabelText( /City/ ) ).toBeInTheDocument();
145
- expect( screen.getByLabelText( /County/ ) ).toBeInTheDocument();
146
- expect( screen.getByLabelText( /Postcode/ ) ).toBeInTheDocument();
147
-
148
- inputAddress( secondaryAddress );
149
-
150
- // Verify state input has been removed.
151
- expect( screen.queryByText( stateRegExp ) ).not.toBeInTheDocument();
152
-
153
- inputAddress( tertiaryAddress );
154
-
155
- // Verify postal code input label changed.
156
- expect( screen.getByLabelText( /Postal code/ ) ).toBeInTheDocument();
157
- } );
158
-
159
- it( 'input values are reset after changing the country', () => {
160
- renderInCheckoutProvider( <WrappedAddressForm type="shipping" /> );
161
-
162
- inputAddress( secondaryAddress );
163
- // Only update `country` to verify other values are reset.
164
- inputAddress( { country: primaryAddress.country } );
165
-
166
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
167
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
168
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
169
-
170
- // Repeat the test with an address which has a select for the state.
171
- inputAddress( tertiaryAddress );
172
- inputAddress( { country: primaryAddress.country } );
173
-
174
- expect( screen.getByLabelText( cityRegExp ).value ).toBe( '' );
175
- expect( screen.getByLabelText( stateRegExp ).value ).toBe( '' );
176
- expect( screen.getByLabelText( postalCodeRegExp ).value ).toBe( '' );
177
- } );
178
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/form-step/index.js CHANGED
@@ -49,7 +49,6 @@ const FormStep = ( {
49
  'wc-block-components-checkout-step',
50
  {
51
  'wc-block-components-checkout-step--with-step-number': showStepNumber,
52
- 'wc-block-components-checkout-step--disabled': disabled,
53
  }
54
  ) }
55
  id={ id }
49
  'wc-block-components-checkout-step',
50
  {
51
  'wc-block-components-checkout-step--with-step-number': showStepNumber,
 
52
  }
53
  ) }
54
  id={ id }
assets/js/base/components/cart-checkout/form-step/style.scss CHANGED
@@ -12,20 +12,6 @@
12
  .is-large & {
13
  padding-right: $gap-large;
14
  }
15
-
16
- .wc-block-components-checkout-step__heading::after {
17
- content: "";
18
- border-left: 1px solid;
19
- opacity: 0.3;
20
- position: absolute;
21
- left: -$gap-larger/2;
22
- top: 2.5em;
23
- bottom: em($gap) * -1;
24
- }
25
- }
26
-
27
- .wc-block-components-checkout-step--disabled {
28
- opacity: 0.6;
29
  }
30
 
31
  .wc-block-components-checkout-step__container {
@@ -36,6 +22,10 @@
36
  padding-bottom: em($gap-large);
37
  }
38
 
 
 
 
 
39
  .wc-block-components-checkout-step__heading {
40
  display: flex;
41
  justify-content: space-between;
@@ -43,8 +33,6 @@
43
  flex-wrap: wrap;
44
  margin: em($gap-small) 0 em($gap);
45
  position: relative;
46
- align-items: center;
47
- gap: em($gap);
48
  }
49
 
50
  .wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
@@ -57,6 +45,8 @@
57
 
58
  .wc-block-components-checkout-step__heading-content {
59
  @include font-size(smaller);
 
 
60
 
61
  a {
62
  font-weight: bold;
@@ -94,4 +84,8 @@
94
  left: -$gap-larger/2;
95
  top: 0;
96
  }
 
 
 
 
97
  }
12
  .is-large & {
13
  padding-right: $gap-large;
14
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  }
16
 
17
  .wc-block-components-checkout-step__container {
22
  padding-bottom: em($gap-large);
23
  }
24
 
25
+ .wc-block-components-form .wc-block-components-checkout-step:disabled {
26
+ opacity: 0.6;
27
+ }
28
+
29
  .wc-block-components-checkout-step__heading {
30
  display: flex;
31
  justify-content: space-between;
33
  flex-wrap: wrap;
34
  margin: em($gap-small) 0 em($gap);
35
  position: relative;
 
 
36
  }
37
 
38
  .wc-block-components-checkout-step:first-child .wc-block-components-checkout-step__heading {
45
 
46
  .wc-block-components-checkout-step__heading-content {
47
  @include font-size(smaller);
48
+ position: absolute;
49
+ right: 0;
50
 
51
  a {
52
  font-weight: bold;
84
  left: -$gap-larger/2;
85
  top: 0;
86
  }
87
+
88
+ &:last-of-type .wc-block-components-checkout-step__container::after {
89
+ content: none;
90
+ }
91
  }
assets/js/base/components/cart-checkout/form-step/test/__snapshots__/index.js.snap CHANGED
@@ -231,7 +231,7 @@ exports[`FormStep should render step heading content 1`] = `
231
 
232
  exports[`FormStep should set disabled prop to the fieldset element when disabled is true 1`] = `
233
  <fieldset
234
- className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number wc-block-components-checkout-step--disabled"
235
  disabled={true}
236
  >
237
  <legend
231
 
232
  exports[`FormStep should set disabled prop to the fieldset element when disabled is true 1`] = `
233
  <fieldset
234
+ className="wc-block-components-checkout-step wc-block-components-checkout-step--with-step-number"
235
  disabled={true}
236
  >
237
  <legend
assets/js/base/components/cart-checkout/index.js CHANGED
@@ -1,20 +1,20 @@
1
- export * from './address-form';
2
  export { default as FormStep } from './form-step';
3
  export { default as OrderSummary } from './order-summary';
4
  export { default as PlaceOrderButton } from './place-order-button';
5
  export { default as Policies } from './policies';
6
  export { default as ProductBackorderBadge } from './product-backorder-badge';
7
- export { default as ProductDetails } from './product-details';
8
  export { default as ProductImage } from './product-image';
9
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
10
  export { default as ProductSummary } from './product-summary';
11
  export { default as ProductMetadata } from './product-metadata';
 
12
  export { default as ProductSaleBadge } from './product-sale-badge';
 
13
  export { default as ReturnToCartButton } from './return-to-cart-button';
14
  export { default as ShippingCalculator } from './shipping-calculator';
15
  export { default as ShippingLocation } from './shipping-location';
16
  export { default as ShippingRatesControl } from './shipping-rates-control';
17
- export { default as ShippingRatesControlPackage } from './shipping-rates-control-package';
18
  export { default as PaymentMethodIcons } from './payment-method-icons';
19
  export { default as PaymentMethodLabel } from './payment-method-label';
20
- export * from './totals';
1
+ export { default as AddressForm } from './address-form';
2
  export { default as FormStep } from './form-step';
3
  export { default as OrderSummary } from './order-summary';
4
  export { default as PlaceOrderButton } from './place-order-button';
5
  export { default as Policies } from './policies';
6
  export { default as ProductBackorderBadge } from './product-backorder-badge';
 
7
  export { default as ProductImage } from './product-image';
8
  export { default as ProductLowStockBadge } from './product-low-stock-badge';
9
  export { default as ProductSummary } from './product-summary';
10
  export { default as ProductMetadata } from './product-metadata';
11
+ export { default as ProductName } from './product-name';
12
  export { default as ProductSaleBadge } from './product-sale-badge';
13
+ export { default as ProductVariationData } from './product-variation-data';
14
  export { default as ReturnToCartButton } from './return-to-cart-button';
15
  export { default as ShippingCalculator } from './shipping-calculator';
16
  export { default as ShippingLocation } from './shipping-location';
17
  export { default as ShippingRatesControl } from './shipping-rates-control';
 
18
  export { default as PaymentMethodIcons } from './payment-method-icons';
19
  export { default as PaymentMethodLabel } from './payment-method-label';
20
+ export * from './totals/index.js';
assets/js/base/components/cart-checkout/order-summary/index.js CHANGED
@@ -4,7 +4,7 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
- import { Panel } from '@woocommerce/blocks-checkout';
8
 
9
  /**
10
  * Internal dependencies
@@ -23,7 +23,6 @@ const OrderSummary = ( { cartItems = [] } ) => {
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
26
- hasBorder={ false }
27
  title={
28
  <span className="wc-block-components-order-summary__button-text">
29
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import { useContainerWidthContext } from '@woocommerce/base-context';
7
+ import Panel from '@woocommerce/base-components/panel';
8
 
9
  /**
10
  * Internal dependencies
23
  <Panel
24
  className="wc-block-components-order-summary"
25
  initialOpen={ isLarge }
 
26
  title={
27
  <span className="wc-block-components-order-summary__button-text">
28
  { __( 'Order summary', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/order-summary/order-summary-item.js CHANGED
@@ -2,111 +2,41 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import Label from '@woocommerce/base-components/label';
6
  import ProductPrice from '@woocommerce/base-components/product-price';
7
- import ProductName from '@woocommerce/base-components/product-name';
8
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
9
  import {
10
- __experimentalApplyCheckoutFilter,
11
- mustContain,
12
- } from '@woocommerce/blocks-checkout';
 
 
 
13
  import PropTypes from 'prop-types';
14
  import Dinero from 'dinero.js';
15
- import { getSetting } from '@woocommerce/settings';
16
- import { useCallback, useMemo } from '@wordpress/element';
17
- import { useStoreCart } from '@woocommerce/base-context/hooks';
18
-
19
- /**
20
- * Internal dependencies
21
- */
22
- import ProductBackorderBadge from '../product-backorder-badge';
23
- import ProductImage from '../product-image';
24
- import ProductLowStockBadge from '../product-low-stock-badge';
25
- import ProductMetadata from '../product-metadata';
26
 
27
  const OrderSummaryItem = ( { cartItem } ) => {
28
  const {
29
  images,
30
  low_stock_remaining: lowStockRemaining = null,
31
  show_backorder_badge: showBackorderBadge = false,
32
- name: initialName,
33
  permalink,
34
  prices,
35
  quantity,
36
  short_description: shortDescription,
37
  description: fullDescription,
38
- item_data: itemData = [],
39
  variation,
40
- totals,
41
- extensions = {},
42
  } = cartItem;
43
 
44
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
45
- // We need to pluck out receiveCart.
46
- // eslint-disable-next-line no-unused-vars
47
- const { receiveCart, ...cart } = useStoreCart();
48
-
49
- const productPriceValidation = useCallback(
50
- ( value ) => mustContain( value, '<price/>' ),
51
- []
52
- );
53
-
54
- const arg = useMemo(
55
- () => ( {
56
- context: 'summary',
57
- cartItem,
58
- cart,
59
- } ),
60
- [ cartItem, cart ]
61
- );
62
-
63
- const priceCurrency = getCurrencyFromPriceResponse( prices );
64
-
65
- const name = __experimentalApplyCheckoutFilter( {
66
- filterName: 'itemName',
67
- defaultValue: initialName,
68
- extensions,
69
- arg,
70
- } );
71
-
72
- const regularPriceSingle = Dinero( {
73
- amount: parseInt( prices.raw_prices.regular_price, 10 ),
74
- precision: parseInt( prices.raw_prices.precision, 10 ),
75
- } )
76
- .convertPrecision( priceCurrency.minorUnit )
77
- .getAmount();
78
- const priceSingle = Dinero( {
79
  amount: parseInt( prices.raw_prices.price, 10 ),
80
  precision: parseInt( prices.raw_prices.precision, 10 ),
81
  } )
82
- .convertPrecision( priceCurrency.minorUnit )
 
83
  .getAmount();
84
- const totalsCurrency = getCurrencyFromPriceResponse( totals );
85
-
86
- let lineSubtotal = parseInt( totals.line_subtotal, 10 );
87
- if ( getSetting( 'displayCartPricesIncludingTax', false ) ) {
88
- lineSubtotal += parseInt( totals.line_subtotal_tax, 10 );
89
- }
90
- const subtotalPrice = Dinero( {
91
- amount: lineSubtotal,
92
- precision: totalsCurrency.minorUnit,
93
- } ).getAmount();
94
- const subtotalPriceFormat = __experimentalApplyCheckoutFilter( {
95
- filterName: 'subtotalPriceFormat',
96
- defaultValue: '<price/>',
97
- extensions,
98
- arg,
99
- validation: productPriceValidation,
100
- } );
101
-
102
- // Allow extensions to filter how the price is displayed. Ie: prepending or appending some values.
103
- const productPriceFormat = __experimentalApplyCheckoutFilter( {
104
- filterName: 'cartItemPrice',
105
- defaultValue: '<price/>',
106
- extensions,
107
- arg,
108
- validation: productPriceValidation,
109
- } );
110
 
111
  return (
112
  <div className="wc-block-components-order-summary-item">
@@ -124,20 +54,14 @@ const OrderSummaryItem = ( { cartItem } ) => {
124
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
125
  </div>
126
  <div className="wc-block-components-order-summary-item__description">
127
- <ProductName
128
- disabled={ true }
129
- name={ name }
130
- permalink={ permalink }
131
- />
132
- <ProductPrice
133
- currency={ priceCurrency }
134
- price={ priceSingle }
135
- regularPrice={ regularPriceSingle }
136
- className="wc-block-components-order-summary-item__individual-prices"
137
- priceClassName="wc-block-components-order-summary-item__individual-price"
138
- regularPriceClassName="wc-block-components-order-summary-item__regular-individual-price"
139
- format={ subtotalPriceFormat }
140
- />
141
  { showBackorderBadge ? (
142
  <ProductBackorderBadge />
143
  ) : (
@@ -150,17 +74,9 @@ const OrderSummaryItem = ( { cartItem } ) => {
150
  <ProductMetadata
151
  shortDescription={ shortDescription }
152
  fullDescription={ fullDescription }
153
- itemData={ itemData }
154
  variation={ variation }
155
  />
156
  </div>
157
- <div className="wc-block-components-order-summary-item__total-price">
158
- <ProductPrice
159
- currency={ totalsCurrency }
160
- format={ productPriceFormat }
161
- price={ subtotalPrice }
162
- />
163
- </div>
164
  </div>
165
  );
166
  };
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { getCurrency } from '@woocommerce/base-utils';
6
  import Label from '@woocommerce/base-components/label';
7
  import ProductPrice from '@woocommerce/base-components/product-price';
 
 
8
  import {
9
+ ProductBackorderBadge,
10
+ ProductImage,
11
+ ProductLowStockBadge,
12
+ ProductMetadata,
13
+ ProductName,
14
+ } from '@woocommerce/base-components/cart-checkout';
15
  import PropTypes from 'prop-types';
16
  import Dinero from 'dinero.js';
 
 
 
 
 
 
 
 
 
 
 
17
 
18
  const OrderSummaryItem = ( { cartItem } ) => {
19
  const {
20
  images,
21
  low_stock_remaining: lowStockRemaining = null,
22
  show_backorder_badge: showBackorderBadge = false,
23
+ name,
24
  permalink,
25
  prices,
26
  quantity,
27
  short_description: shortDescription,
28
  description: fullDescription,
 
29
  variation,
 
 
30
  } = cartItem;
31
 
32
+ const currency = getCurrency( prices );
33
+ const linePrice = Dinero( {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  amount: parseInt( prices.raw_prices.price, 10 ),
35
  precision: parseInt( prices.raw_prices.precision, 10 ),
36
  } )
37
+ .multiply( quantity )
38
+ .convertPrecision( currency.minorUnit )
39
  .getAmount();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
  return (
42
  <div className="wc-block-components-order-summary-item">
54
  <ProductImage image={ images.length ? images[ 0 ] : {} } />
55
  </div>
56
  <div className="wc-block-components-order-summary-item__description">
57
+ <div className="wc-block-components-order-summary-item__header">
58
+ <ProductName permalink={ permalink } name={ name } />
59
+ <ProductPrice
60
+ currency={ currency }
61
+ price={ linePrice }
62
+ priceClassName="wc-block-components-order-summary-item__total-price"
63
+ />
64
+ </div>
 
 
 
 
 
 
65
  { showBackorderBadge ? (
66
  <ProductBackorderBadge />
67
  ) : (
74
  <ProductMetadata
75
  shortDescription={ shortDescription }
76
  fullDescription={ fullDescription }
 
77
  variation={ variation }
78
  />
79
  </div>
 
 
 
 
 
 
 
80
  </div>
81
  );
82
  };
assets/js/base/components/cart-checkout/order-summary/style.scss CHANGED
@@ -1,12 +1,7 @@
1
  .wc-block-components-order-summary {
2
-
3
- .wc-block-components-panel__button {
4
- padding-top: 0;
5
  margin-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- margin-bottom: 0;
10
  }
11
  }
12
 
@@ -17,16 +12,10 @@
17
 
18
  .wc-block-components-order-summary-item {
19
  @include with-translucent-border(0 0 1px);
20
- @include font-size(small);
21
- display: flex;
22
  padding-bottom: 1px;
23
- padding-top: $gap;
24
  width: 100%;
25
 
26
- &:first-child {
27
- padding-top: 0;
28
- }
29
-
30
  &:last-child {
31
  > div {
32
  padding-bottom: 0;
@@ -36,10 +25,6 @@
36
  display: none;
37
  }
38
  }
39
-
40
- .wc-block-components-product-metadata {
41
- @include font-size(regular);
42
- }
43
  }
44
 
45
  .wc-block-components-order-summary-item__image,
@@ -50,6 +35,7 @@
50
 
51
  .wc-block-components-order-summary-item__image {
52
  width: #{$gap-large * 2};
 
53
  padding-bottom: $gap;
54
  position: relative;
55
 
@@ -60,6 +46,7 @@
60
  }
61
 
62
  .wc-block-components-order-summary-item__quantity {
 
63
  align-items: center;
64
  background: #fff;
65
  border: 2px solid;
@@ -74,7 +61,7 @@
74
  justify-content: center;
75
  min-width: 20px;
76
  right: 0;
77
- top: 0;
78
  transform: translate(50%, -50%);
79
  white-space: nowrap;
80
  z-index: 1;
@@ -82,8 +69,9 @@
82
 
83
  .wc-block-components-order-summary-item__description {
84
  padding-left: $gap-large;
85
- padding-right: $gap-small;
86
  padding-bottom: $gap;
 
87
 
88
  p,
89
  .wc-block-components-product-metadata {
@@ -92,13 +80,8 @@
92
  }
93
  }
94
 
95
- .wc-block-components-order-summary-item__total-price {
96
- font-weight: bold;
97
- margin-left: auto;
98
- text-align: right;
99
- }
100
-
101
-
102
- .wc-block-components-order-summary-item__individual-prices {
103
- display: block;
104
  }
1
  .wc-block-components-order-summary {
2
+ .wc-blocks-components-panel__button {
 
 
3
  margin-top: 0;
4
+ padding-top: 0;
 
 
 
5
  }
6
  }
7
 
12
 
13
  .wc-block-components-order-summary-item {
14
  @include with-translucent-border(0 0 1px);
15
+ display: table-row;
 
16
  padding-bottom: 1px;
 
17
  width: 100%;
18
 
 
 
 
 
19
  &:last-child {
20
  > div {
21
  padding-bottom: 0;
25
  display: none;
26
  }
27
  }
 
 
 
 
28
  }
29
 
30
  .wc-block-components-order-summary-item__image,
35
 
36
  .wc-block-components-order-summary-item__image {
37
  width: #{$gap-large * 2};
38
+ padding-top: $gap;
39
  padding-bottom: $gap;
40
  position: relative;
41
 
46
  }
47
 
48
  .wc-block-components-order-summary-item__quantity {
49
+ @include font-size(smaller);
50
  align-items: center;
51
  background: #fff;
52
  border: 2px solid;
61
  justify-content: center;
62
  min-width: 20px;
63
  right: 0;
64
+ top: $gap;
65
  transform: translate(50%, -50%);
66
  white-space: nowrap;
67
  z-index: 1;
69
 
70
  .wc-block-components-order-summary-item__description {
71
  padding-left: $gap-large;
72
+ padding-top: $gap;
73
  padding-bottom: $gap;
74
+ line-height: 1.375;
75
 
76
  p,
77
  .wc-block-components-product-metadata {
80
  }
81
  }
82
 
83
+ .wc-block-components-order-summary-item__header {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ justify-content: space-between;
 
 
 
 
 
87
  }
assets/js/base/components/cart-checkout/order-summary/test/index.js DELETED
@@ -1,43 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, screen } from '@testing-library/react';
5
- import { previewCart } from '@woocommerce/resource-previews';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import OrderSummary from '../index';
11
-
12
- jest.mock( '@woocommerce/base-context', () => ( {
13
- ...jest.requireActual( '@woocommerce/base-context' ),
14
- useContainerWidthContext: () => ( {
15
- isLarge: false,
16
- hasContainerWidth: true,
17
- } ),
18
- } ) );
19
-
20
- describe( 'Order Summary', () => {
21
- it( 'renders correct cart line subtotal when currency has 0 decimals', async () => {
22
- render(
23
- <OrderSummary
24
- cartItems={ [
25
- {
26
- ...previewCart.items[ 0 ],
27
- totals: {
28
- ...previewCart.items[ 0 ].totals,
29
- // Change price format so there are no decimals.
30
- currency_minor_unit: 0,
31
- currency_prefix: '',
32
- currency_suffix: '€',
33
- line_subtotal: '16',
34
- line_total: '18',
35
- },
36
- },
37
- ] }
38
- />
39
- );
40
-
41
- expect( screen.getByText( '16€' ) ).toBeTruthy();
42
- } );
43
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/payment-method-icons/common-icons.js CHANGED
@@ -1,7 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { WC_BLOCKS_IMAGE_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
@@ -10,97 +10,97 @@ export const commonIcons = [
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
- src: WC_BLOCKS_IMAGE_URL + 'payment-methods/wechat.svg',
104
  },
105
  ];
106
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { WC_BLOCKS_ASSET_URL } from '@woocommerce/block-settings';
5
 
6
  /**
7
  * Array of common assets.
10
  {
11
  id: 'alipay',
12
  alt: 'Alipay',
13
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/alipay.svg',
14
  },
15
  {
16
  id: 'amex',
17
  alt: 'American Express',
18
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/amex.svg',
19
  },
20
  {
21
  id: 'bancontact',
22
  alt: 'Bancontact',
23
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/bancontact.svg',
24
  },
25
  {
26
  id: 'diners',
27
  alt: 'Diners Club',
28
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/diners.svg',
29
  },
30
  {
31
  id: 'discover',
32
  alt: 'Discover',
33
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/discover.svg',
34
  },
35
  {
36
  id: 'eps',
37
  alt: 'EPS',
38
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/eps.svg',
39
  },
40
  {
41
  id: 'giropay',
42
  alt: 'Giropay',
43
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/giropay.svg',
44
  },
45
  {
46
  id: 'ideal',
47
  alt: 'iDeal',
48
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/ideal.svg',
49
  },
50
  {
51
  id: 'jcb',
52
  alt: 'JCB',
53
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/jcb.svg',
54
  },
55
  {
56
  id: 'laser',
57
  alt: 'Laser',
58
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/laser.svg',
59
  },
60
  {
61
  id: 'maestro',
62
  alt: 'Maestro',
63
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/maestro.svg',
64
  },
65
  {
66
  id: 'mastercard',
67
  alt: 'Mastercard',
68
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/mastercard.svg',
69
  },
70
  {
71
  id: 'multibanco',
72
  alt: 'Multibanco',
73
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/multibanco.svg',
74
  },
75
  {
76
  id: 'p24',
77
  alt: 'Przelewy24',
78
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/p24.svg',
79
  },
80
  {
81
  id: 'sepa',
82
  alt: 'Sepa',
83
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sepa.svg',
84
  },
85
  {
86
  id: 'sofort',
87
  alt: 'Sofort',
88
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/sofort.svg',
89
  },
90
  {
91
  id: 'unionpay',
92
  alt: 'Union Pay',
93
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/unionpay.svg',
94
  },
95
  {
96
  id: 'visa',
97
  alt: 'Visa',
98
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/visa.svg',
99
  },
100
  {
101
  id: 'wechat',
102
  alt: 'WeChat',
103
+ src: WC_BLOCKS_ASSET_URL + 'img/payment-methods/wechat.svg',
104
  },
105
  ];
106
 
assets/js/base/components/cart-checkout/place-order-button/index.js CHANGED
@@ -2,7 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
- import { useCheckoutSubmit } from '@woocommerce/base-context/hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
@@ -11,7 +11,6 @@ const PlaceOrderButton = () => {
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
14
- isDisabled,
15
  waitingForProcessing,
16
  waitingForRedirect,
17
  } = useCheckoutSubmit();
@@ -21,10 +20,7 @@ const PlaceOrderButton = () => {
21
  className="wc-block-components-checkout-place-order-button"
22
  onClick={ onSubmit }
23
  disabled={
24
- isCalculating ||
25
- isDisabled ||
26
- waitingForProcessing ||
27
- waitingForRedirect
28
  }
29
  showSpinner={ waitingForProcessing }
30
  >
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { useCheckoutSubmit } from '@woocommerce/base-hooks';
6
  import { Icon, done } from '@woocommerce/icons';
7
  import Button from '@woocommerce/base-components/button';
8
 
11
  submitButtonText,
12
  onSubmit,
13
  isCalculating,
 
14
  waitingForProcessing,
15
  waitingForRedirect,
16
  } = useCheckoutSubmit();
20
  className="wc-block-components-checkout-place-order-button"
21
  onClick={ onSubmit }
22
  disabled={
23
+ isCalculating || waitingForProcessing || waitingForRedirect
 
 
 
24
  }
25
  showSpinner={ waitingForProcessing }
26
  >
assets/js/base/components/cart-checkout/policies/{index.tsx → index.js} RENAMED
@@ -15,7 +15,7 @@ import { decodeEntities } from '@wordpress/html-entities';
15
  */
16
  import './style.scss';
17
 
18
- const Policies = (): JSX.Element => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
15
  */
16
  import './style.scss';
17
 
18
+ const Policies = () => {
19
  return (
20
  <ul className="wc-block-components-checkout-policies">
21
  { PRIVACY_URL && (
assets/js/base/components/cart-checkout/policies/style.scss CHANGED
@@ -14,7 +14,7 @@
14
  margin: 0;
15
 
16
  &:not(:first-child) {
17
- border-left: 1px solid $gray-400;
18
  }
19
 
20
  > a {
14
  margin: 0;
15
 
16
  &:not(:first-child) {
17
+ border-left: 1px solid $gray-10;
18
  }
19
 
20
  > a {
assets/js/base/components/cart-checkout/product-backorder-badge/{index.tsx → index.js} RENAMED
@@ -11,7 +11,7 @@ import ProductBadge from '../product-badge';
11
  /**
12
  * Returns a backorder badge.
13
  */
14
- const ProductBackorderBadge = (): JSX.Element => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
11
  /**
12
  * Returns a backorder badge.
13
  */
14
+ const ProductBackorderBadge = () => {
15
  return (
16
  <ProductBadge className="wc-block-components-product-backorder-badge">
17
  { __( 'Available on backorder', 'woo-gutenberg-products-block' ) }
assets/js/base/components/cart-checkout/product-badge/{index.tsx → index.js} RENAMED
@@ -2,21 +2,14 @@
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
- import type { ReactNode } from 'react';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
- interface ProductBadgeProps {
13
- children?: ReactNode;
14
- className?: string;
15
- }
16
- const ProductBadge = ( {
17
- children,
18
- className,
19
- }: ProductBadgeProps ): JSX.Element => {
20
  return (
21
  <div
22
  className={ classNames(
@@ -29,4 +22,8 @@ const ProductBadge = ( {
29
  );
30
  };
31
 
 
 
 
 
32
  export default ProductBadge;
2
  * External dependencies
3
  */
4
  import classNames from 'classnames';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
12
+ const ProductBadge = ( { children, className } ) => {
 
 
 
 
 
 
 
13
  return (
14
  <div
15
  className={ classNames(
22
  );
23
  };
24
 
25
+ ProductBadge.propTypes = {
26
+ className: PropTypes.string,
27
+ };
28
+
29
  export default ProductBadge;
assets/js/base/components/cart-checkout/product-details/index.tsx DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { kebabCase } from 'lodash';
5
- import { decodeEntities } from '@wordpress/html-entities';
6
- import type { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- interface ProductDetailsProps {
14
- details: ProductResponseItemData[];
15
- }
16
- // Component to display cart item data and variations.
17
- const ProductDetails = ( {
18
- details = [],
19
- }: ProductDetailsProps ): JSX.Element | null => {
20
- if ( ! Array.isArray( details ) ) {
21
- return null;
22
- }
23
-
24
- details = details.filter( ( detail ) => ! detail.hidden );
25
-
26
- if ( details.length === 0 ) {
27
- return null;
28
- }
29
-
30
- return (
31
- <ul className="wc-block-components-product-details">
32
- { details.map( ( detail ) => {
33
- const className = detail.name
34
- ? `wc-block-components-product-details__${ kebabCase(
35
- detail.name
36
- ) }`
37
- : '';
38
- return (
39
- <li
40
- key={ detail.name + ( detail.display || detail.value ) }
41
- className={ className }
42
- >
43
- { detail.name && (
44
- <>
45
- <span className="wc-block-components-product-details__name">
46
- { decodeEntities( detail.name ) }:
47
- </span>{ ' ' }
48
- </>
49
- ) }
50
- <span className="wc-block-components-product-details__value">
51
- { decodeEntities( detail.display || detail.value ) }
52
- </span>
53
- </li>
54
- );
55
- } ) }
56
- </ul>
57
- );
58
- };
59
-
60
- export default ProductDetails;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/style.scss DELETED
@@ -1,25 +0,0 @@
1
- // Extra class added for specificity so styles are applied in the editor.
2
- .wc-block-components-product-details.wc-block-components-product-details {
3
- list-style: none;
4
- margin: 0.5em 0;
5
- padding: 0;
6
-
7
- &:last-of-type {
8
- margin-bottom: 0;
9
- }
10
-
11
- li {
12
- margin-left: 0;
13
- }
14
- }
15
-
16
- .wc-block-components-product-details__name,
17
- .wc-block-components-product-details__value {
18
- display: inline-block;
19
- }
20
-
21
- .is-large:not(.wc-block-checkout) {
22
- .wc-block-components-product-details__name {
23
- font-weight: bold;
24
- }
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/__snapshots__/index.js.snap DELETED
@@ -1,76 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductDetails should not render hidden details 1`] = `
4
- <ul
5
- className="wc-block-components-product-details"
6
- >
7
- <li
8
- className="wc-block-components-product-details__lorem"
9
- >
10
- <span
11
- className="wc-block-components-product-details__name"
12
- >
13
- LOREM
14
- :
15
- </span>
16
-
17
- <span
18
- className="wc-block-components-product-details__value"
19
- >
20
- IPSUM
21
- </span>
22
- </li>
23
- </ul>
24
- `;
25
-
26
- exports[`ProductDetails should not rendering anything if all details are hidden 1`] = `null`;
27
-
28
- exports[`ProductDetails should not rendering anything if details is an empty array 1`] = `null`;
29
-
30
- exports[`ProductDetails should render details 1`] = `
31
- <ul
32
- className="wc-block-components-product-details"
33
- >
34
- <li
35
- className="wc-block-components-product-details__lorem"
36
- >
37
- <span
38
- className="wc-block-components-product-details__name"
39
- >
40
- Lorem
41
- :
42
- </span>
43
-
44
- <span
45
- className="wc-block-components-product-details__value"
46
- >
47
- Ipsum
48
- </span>
49
- </li>
50
- <li
51
- className="wc-block-components-product-details__lorem"
52
- >
53
- <span
54
- className="wc-block-components-product-details__name"
55
- >
56
- LOREM
57
- :
58
- </span>
59
-
60
- <span
61
- className="wc-block-components-product-details__value"
62
- >
63
- IPSUM
64
- </span>
65
- </li>
66
- <li
67
- className=""
68
- >
69
- <span
70
- className="wc-block-components-product-details__value"
71
- >
72
- Ipsum
73
- </span>
74
- </li>
75
- </ul>
76
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-details/test/index.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductDetails from '..';
10
-
11
- describe( 'ProductDetails', () => {
12
- test( 'should render details', () => {
13
- const details = [
14
- { name: 'Lorem', value: 'Ipsum' },
15
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
16
- { value: 'Ipsum' },
17
- ];
18
- const component = TestRenderer.create(
19
- <ProductDetails details={ details } />
20
- );
21
-
22
- expect( component.toJSON() ).toMatchSnapshot();
23
- } );
24
-
25
- test( 'should not render hidden details', () => {
26
- const details = [
27
- { name: 'Lorem', value: 'Ipsum', hidden: true },
28
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM' },
29
- ];
30
- const component = TestRenderer.create(
31
- <ProductDetails details={ details } />
32
- );
33
-
34
- expect( component.toJSON() ).toMatchSnapshot();
35
- } );
36
-
37
- test( 'should not rendering anything if all details are hidden', () => {
38
- const details = [
39
- { name: 'Lorem', value: 'Ipsum', hidden: true },
40
- { name: 'LOREM', value: 'Ipsum', display: 'IPSUM', hidden: true },
41
- ];
42
- const component = TestRenderer.create(
43
- <ProductDetails details={ details } />
44
- );
45
-
46
- expect( component.toJSON() ).toMatchSnapshot();
47
- } );
48
-
49
- test( 'should not rendering anything if details is an empty array', () => {
50
- const details = [];
51
- const component = TestRenderer.create(
52
- <ProductDetails details={ details } />
53
- );
54
-
55
- expect( component.toJSON() ).toMatchSnapshot();
56
- } );
57
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-image/{index.tsx → index.js} RENAMED
@@ -2,18 +2,16 @@
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
- import { PLACEHOLDER_IMG_SRC } from '@woocommerce/settings';
 
6
 
7
- interface ProductImageProps {
8
- image: { alt?: string; thumbnail?: string };
9
- }
10
  /**
11
  * Formats and returns an image element.
12
  *
13
  * @param {Object} props Incoming props for the component.
14
  * @param {Object} props.image Image properties.
15
  */
16
- const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
17
  const imageProps = {
18
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
19
  alt: decodeEntities( image.alt ) || '',
@@ -22,4 +20,11 @@ const ProductImage = ( { image = {} }: ProductImageProps ): JSX.Element => {
22
  return <img { ...imageProps } alt={ imageProps.alt } />;
23
  };
24
 
 
 
 
 
 
 
 
25
  export default ProductImage;
2
  * External dependencies
3
  */
4
  import { decodeEntities } from '@wordpress/html-entities';
5
+ import { PLACEHOLDER_IMG_SRC } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
 
 
 
 
8
  /**
9
  * Formats and returns an image element.
10
  *
11
  * @param {Object} props Incoming props for the component.
12
  * @param {Object} props.image Image properties.
13
  */
14
+ const ProductImage = ( { image = {} } ) => {
15
  const imageProps = {
16
  src: image.thumbnail || PLACEHOLDER_IMG_SRC,
17
  alt: decodeEntities( image.alt ) || '',
20
  return <img { ...imageProps } alt={ imageProps.alt } />;
21
  };
22
 
23
+ ProductImage.propTypes = {
24
+ image: PropTypes.shape( {
25
+ alt: PropTypes.string,
26
+ thumbnail: PropTypes.string,
27
+ } ),
28
+ };
29
+
30
  export default ProductImage;
assets/js/base/components/cart-checkout/product-low-stock-badge/{index.tsx → index.js} RENAMED
@@ -2,24 +2,20 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import ProductBadge from '../product-badge';
10
 
11
- interface ProductLowStockBadgeProps {
12
- lowStockRemaining: number | null;
13
- }
14
  /**
15
  * Returns a low stock badge.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
- * @param {number} props.lowStockRemaining Whether or not there is low stock remaining.
19
  */
20
- const ProductLowStockBadge = ( {
21
- lowStockRemaining,
22
- }: ProductLowStockBadgeProps ): JSX.Element | null => {
23
  if ( ! lowStockRemaining ) {
24
  return null;
25
  }
@@ -35,4 +31,8 @@ const ProductLowStockBadge = ( {
35
  );
36
  };
37
 
 
 
 
 
38
  export default ProductLowStockBadge;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import ProductBadge from '../product-badge';
11
 
 
 
 
12
  /**
13
  * Returns a low stock badge.
14
  *
15
  * @param {Object} props Incoming props for the component.
16
+ * @param {boolean} props.lowStockRemaining Whether or not there is low stock remaining.
17
  */
18
+ const ProductLowStockBadge = ( { lowStockRemaining } ) => {
 
 
19
  if ( ! lowStockRemaining ) {
20
  return null;
21
  }
31
  );
32
  };
33
 
34
+ ProductLowStockBadge.propTypes = {
35
+ lowStockRemaining: PropTypes.number,
36
+ };
37
+
38
  export default ProductLowStockBadge;
assets/js/base/components/cart-checkout/product-metadata/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import ProductVariationData from '../product-variation-data';
10
+ import ProductSummary from '../product-summary';
11
+ import './style.scss';
12
+
13
+ const ProductMetadata = ( {
14
+ shortDescription = '',
15
+ fullDescription = '',
16
+ variation = [],
17
+ } ) => {
18
+ return (
19
+ <div className="wc-block-components-product-metadata">
20
+ <ProductSummary
21
+ className="wc-block-components-product-metadata__description"
22
+ shortDescription={ shortDescription }
23
+ fullDescription={ fullDescription }
24
+ />
25
+ <ProductVariationData
26
+ className="wc-block-components-product-metadata__variation-data"
27
+ variation={ variation }
28
+ />
29
+ </div>
30
+ );
31
+ };
32
+
33
+ ProductMetadata.propTypes = {
34
+ shortDescription: PropTypes.string,
35
+ fullDescription: PropTypes.string,
36
+ variation: PropTypes.array,
37
+ };
38
+
39
+ export default ProductMetadata;
assets/js/base/components/cart-checkout/product-metadata/index.tsx DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ProductResponseItemData } from '@woocommerce/type-defs/product-response';
5
- import { CartVariationItem } from '@woocommerce/type-defs/cart';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import ProductDetails from '../product-details';
11
- import ProductSummary from '../product-summary';
12
- import './style.scss';
13
-
14
- interface ProductMetadataProps {
15
- shortDescription?: string;
16
- fullDescription?: string;
17
- itemData: ProductResponseItemData[];
18
- variation?: CartVariationItem[];
19
- }
20
-
21
- const ProductMetadata = ( {
22
- shortDescription = '',
23
- fullDescription = '',
24
- itemData = [],
25
- variation = [],
26
- }: ProductMetadataProps ): JSX.Element => {
27
- return (
28
- <div className="wc-block-components-product-metadata">
29
- <ProductSummary
30
- className="wc-block-components-product-metadata__description"
31
- shortDescription={ shortDescription }
32
- fullDescription={ fullDescription }
33
- />
34
- <ProductDetails details={ itemData } />
35
- <ProductDetails
36
- details={ variation.map( ( { attribute = '', value } ) => ( {
37
- name: attribute,
38
- value,
39
- } ) ) }
40
- />
41
- </div>
42
- );
43
- };
44
-
45
- export default ProductMetadata;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-metadata/style.scss CHANGED
@@ -3,6 +3,6 @@
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
- margin: 0.25em 0;
7
  }
8
  }
3
 
4
  .wc-block-components-product-metadata__description > p,
5
  .wc-block-components-product-metadata__variation-data {
6
+ margin: 0.25em 0 0 0;
7
  }
8
  }
assets/js/base/components/cart-checkout/product-name/index.js ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { decodeEntities } from '@wordpress/html-entities';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import './style.scss';
11
+
12
+ const ProductName = ( { name, permalink, disabled = false } ) => {
13
+ return (
14
+ // we use tabIndex -1 to prevent the link from being focused, pointer-events
15
+ // disabled click events, so we get an almost disabled link.
16
+ <a
17
+ className="wc-block-components-product-name"
18
+ href={ permalink }
19
+ tabIndex={ disabled ? -1 : 0 }
20
+ >
21
+ { decodeEntities( name ) }
22
+ </a>
23
+ );
24
+ };
25
+
26
+ ProductName.propTypes = {
27
+ disabled: PropTypes.bool,
28
+ name: PropTypes.string,
29
+ permalink: PropTypes.string,
30
+ };
31
+
32
+ export default ProductName;
assets/js/base/components/{product-name → cart-checkout/product-name}/style.scss RENAMED
@@ -1,4 +1,6 @@
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
 
 
4
  }
1
  .wc-block-components-product-name {
2
  @include font-size(regular);
3
  @include wrap-break-word();
4
+ display: block;
5
+ max-width: max-content;
6
  }
assets/js/base/components/cart-checkout/product-sale-badge/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { createInterpolateElement } from 'wordpress-element';
5
+ import { __ } from '@wordpress/i18n';
6
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import ProductBadge from '../product-badge';
13
+
14
+ /**
15
+ * ProductSaleBadge
16
+ *
17
+ * @param {Object} props Incoming props.
18
+ * @param {Object} props.currency Currency object.
19
+ * @param {number} props.saleAmount Discounted amount.
20
+ *
21
+ * @return {*} The component.
22
+ */
23
+ const ProductSaleBadge = ( { currency, saleAmount } ) => {
24
+ if ( ! saleAmount || saleAmount <= 0 ) {
25
+ return null;
26
+ }
27
+ return (
28
+ <ProductBadge className="wc-block-components-sale-badge">
29
+ { createInterpolateElement(
30
+ /* translators: <price/> will be replaced by the discount amount */
31
+ __( 'Save <price/>', 'woo-gutenberg-products-block' ),
32
+ {
33
+ price: (
34
+ <FormattedMonetaryAmount
35
+ currency={ currency }
36
+ value={ saleAmount }
37
+ />
38
+ ),
39
+ }
40
+ ) }
41
+ </ProductBadge>
42
+ );
43
+ };
44
+
45
+ ProductSaleBadge.propTypes = {
46
+ currency: PropTypes.object,
47
+ saleAmount: PropTypes.number,
48
+ };
49
+
50
+ export default ProductSaleBadge;
assets/js/base/components/cart-checkout/product-sale-badge/index.tsx DELETED
@@ -1,62 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { createInterpolateElement } from 'wordpress-element';
5
- import { __, sprintf } from '@wordpress/i18n';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { Currency } from '@woocommerce/price-format';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import ProductBadge from '../product-badge';
13
-
14
- interface ProductSaleBadgeProps {
15
- currency: Currency;
16
- saleAmount: number;
17
- format: string;
18
- }
19
- /**
20
- * ProductSaleBadge
21
- *
22
- * @param {Object} props Incoming props.
23
- * @param {Object} props.currency Currency object.
24
- * @param {number} props.saleAmount Discounted amount.
25
- * @param {string} [props.format] Format to change the price.
26
- * @return {*} The component.
27
- */
28
- const ProductSaleBadge = ( {
29
- currency,
30
- saleAmount,
31
- format = '<price/>',
32
- }: ProductSaleBadgeProps ): JSX.Element | null => {
33
- if ( ! saleAmount || saleAmount <= 0 ) {
34
- return null;
35
- }
36
- if ( ! format.includes( '<price/>' ) ) {
37
- format = '<price/>';
38
- // eslint-disable-next-line no-console
39
- console.error( 'Price formats need to include the `<price/>` tag.' );
40
- }
41
-
42
- const formattedMessage = sprintf(
43
- /* translators: %s will be replaced by the discount amount */
44
- __( `Save %s`, 'woo-gutenberg-products-block' ),
45
- format
46
- );
47
-
48
- return (
49
- <ProductBadge className="wc-block-components-sale-badge">
50
- { createInterpolateElement( formattedMessage, {
51
- price: (
52
- <FormattedMonetaryAmount
53
- currency={ currency }
54
- value={ saleAmount }
55
- />
56
- ),
57
- } ) }
58
- </ProductBadge>
59
- );
60
- };
61
-
62
- export default ProductSaleBadge;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/product-summary/{index.tsx → index.js} RENAMED
@@ -1,14 +1,10 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import Summary from '@woocommerce/base-components/summary';
5
- import { blocksConfig } from '@woocommerce/block-settings';
6
 
7
- interface ProductSummaryProps {
8
- className?: string;
9
- shortDescription?: string;
10
- fullDescription?: string;
11
- }
12
  /**
13
  * Returns an element containing a summary of the product.
14
  *
@@ -21,7 +17,7 @@ const ProductSummary = ( {
21
  className,
22
  shortDescription = '',
23
  fullDescription = '',
24
- }: ProductSummaryProps ): JSX.Element | null => {
25
  const source = shortDescription ? shortDescription : fullDescription;
26
 
27
  if ( ! source ) {
@@ -33,9 +29,15 @@ const ProductSummary = ( {
33
  className={ className }
34
  source={ source }
35
  maxLength={ 15 }
36
- countType={ blocksConfig.wordCountType || 'words' }
37
  />
38
  );
39
  };
40
 
 
 
 
 
 
 
41
  export default ProductSummary;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import Summary from '@woocommerce/base-components/summary';
6
+ import { getSetting } from '@woocommerce/settings';
7
 
 
 
 
 
 
8
  /**
9
  * Returns an element containing a summary of the product.
10
  *
17
  className,
18
  shortDescription = '',
19
  fullDescription = '',
20
+ } ) => {
21
  const source = shortDescription ? shortDescription : fullDescription;
22
 
23
  if ( ! source ) {
29
  className={ className }
30
  source={ source }
31
  maxLength={ 15 }
32
+ countType={ getSetting( 'wordCountType', 'words' ) }
33
  />
34
  );
35
  };
36
 
37
+ ProductSummary.propTypes = {
38
+ className: PropTypes.string,
39
+ shortDescription: PropTypes.string,
40
+ fullDescription: PropTypes.string,
41
+ };
42
+
43
  export default ProductSummary;
assets/js/base/components/cart-checkout/product-variation-data/index.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { decodeEntities } from '@wordpress/html-entities';
5
+ import PropTypes from 'prop-types';
6
+ import classNames from 'classnames';
7
+
8
+ /**
9
+ * Returns a formatted element containing variation details.
10
+ *
11
+ * @param {Object} props Incoming props for the component.
12
+ * @param {string} props.className CSS class used.
13
+ * @param {Array<Object>} props.variation Variations in use.
14
+ */
15
+ const ProductVariationData = ( { className, variation = [] } ) => {
16
+ if ( ! variation || variation.length === 0 ) {
17
+ return null;
18
+ }
19
+
20
+ const variationsText = variation
21
+ .map( ( v ) => {
22
+ if ( v.attribute ) {
23
+ return `${ decodeEntities( v.attribute ) }: ${ decodeEntities(
24
+ v.value
25
+ ) }`;
26
+ }
27
+ // Support for product attributes with no name/key
28
+ return `${ decodeEntities( v.value ) }`;
29
+ } )
30
+ .join( ' / ' );
31
+
32
+ return (
33
+ <div
34
+ className={ classNames(
35
+ 'wc-block-components-product-variation-data',
36
+ className
37
+ ) }
38
+ >
39
+ { variationsText }
40
+ </div>
41
+ );
42
+ };
43
+
44
+ ProductVariationData.propTypes = {
45
+ variation: PropTypes.arrayOf(
46
+ PropTypes.shape( {
47
+ attribute: PropTypes.string,
48
+ value: PropTypes.string.isRequired,
49
+ } )
50
+ ),
51
+ };
52
+
53
+ export default ProductVariationData;
assets/js/base/components/cart-checkout/shipping-calculator/{address.tsx → address.js} RENAMED
@@ -1,29 +1,24 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { __ } from '@wordpress/i18n';
 
5
  import Button from '@woocommerce/base-components/button';
6
  import { useState } from '@wordpress/element';
7
  import isShallowEqual from '@wordpress/is-shallow-equal';
8
  import { useValidationContext } from '@woocommerce/base-context';
9
- import type { EnteredAddress, AddressFields } from '@woocommerce/settings';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
- import { AddressForm } from '../address-form';
16
 
17
- interface ShippingCalculatorAddressProps {
18
- address: EnteredAddress;
19
- onUpdate: ( address: EnteredAddress ) => void;
20
- addressFields: Partial< keyof AddressFields >[];
21
- }
22
  const ShippingCalculatorAddress = ( {
23
  address: initialAddress,
24
  onUpdate,
25
  addressFields,
26
- }: ShippingCalculatorAddressProps ): JSX.Element => {
27
  const [ address, setAddress ] = useState( initialAddress );
28
  const {
29
  hasValidationErrors,
@@ -35,10 +30,31 @@ const ShippingCalculatorAddress = ( {
35
  return ! hasValidationErrors;
36
  };
37
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  return (
39
  <form className="wc-block-components-shipping-calculator-address">
40
  <AddressForm
41
  fields={ addressFields }
 
42
  onChange={ setAddress }
43
  values={ address }
44
  />
@@ -60,4 +76,10 @@ const ShippingCalculatorAddress = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
63
  export default ShippingCalculatorAddress;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { __ } from '@wordpress/i18n';
6
+ import { AddressForm } from '@woocommerce/base-components/cart-checkout';
7
  import Button from '@woocommerce/base-components/button';
8
  import { useState } from '@wordpress/element';
9
  import isShallowEqual from '@wordpress/is-shallow-equal';
10
  import { useValidationContext } from '@woocommerce/base-context';
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
 
16
 
 
 
 
 
 
17
  const ShippingCalculatorAddress = ( {
18
  address: initialAddress,
19
  onUpdate,
20
  addressFields,
21
+ } ) => {
22
  const [ address, setAddress ] = useState( initialAddress );
23
  const {
24
  hasValidationErrors,
30
  return ! hasValidationErrors;
31
  };
32
 
33
+ // Make all fields optional except 'country'.
34
+ const fieldConfig = {};
35
+ addressFields.forEach( ( field ) => {
36
+ if ( field === 'country' ) {
37
+ fieldConfig[ field ] = {
38
+ ...fieldConfig[ field ],
39
+ errorMessage: __(
40
+ 'Please select a country to calculate rates.',
41
+ 'woo-gutenberg-products-block'
42
+ ),
43
+ required: true,
44
+ };
45
+ } else {
46
+ fieldConfig[ field ] = {
47
+ ...fieldConfig[ field ],
48
+ required: false,
49
+ };
50
+ }
51
+ } );
52
+
53
  return (
54
  <form className="wc-block-components-shipping-calculator-address">
55
  <AddressForm
56
  fields={ addressFields }
57
+ fieldConfig={ fieldConfig }
58
  onChange={ setAddress }
59
  values={ address }
60
  />
76
  );
77
  };
78
 
79
+ ShippingCalculatorAddress.propTypes = {
80
+ address: PropTypes.object.isRequired,
81
+ onUpdate: PropTypes.func.isRequired,
82
+ addressFields: PropTypes.array.isRequired,
83
+ };
84
+
85
  export default ShippingCalculatorAddress;
assets/js/base/components/cart-checkout/shipping-calculator/{index.tsx → index.js} RENAMED
@@ -1,8 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import { useShippingDataContext } from '@woocommerce/base-context';
5
- import type { EnteredAddress } from '@woocommerce/settings';
6
 
7
  /**
8
  * Internal dependencies
@@ -10,17 +10,10 @@ import type { EnteredAddress } from '@woocommerce/settings';
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
13
- interface ShippingCalculatorProps {
14
- onUpdate?: ( newAddress: EnteredAddress ) => void;
15
- addressFields?: Partial< keyof EnteredAddress >[];
16
- }
17
-
18
  const ShippingCalculator = ( {
19
- onUpdate = () => {
20
- /* Do nothing */
21
- },
22
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
23
- }: ShippingCalculatorProps ): JSX.Element => {
24
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
25
  return (
26
  <div className="wc-block-components-shipping-calculator">
@@ -36,4 +29,9 @@ const ShippingCalculator = ( {
36
  );
37
  };
38
 
 
 
 
 
 
39
  export default ShippingCalculator;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
  import { useShippingDataContext } from '@woocommerce/base-context';
 
6
 
7
  /**
8
  * Internal dependencies
10
  import ShippingCalculatorAddress from './address';
11
  import './style.scss';
12
 
 
 
 
 
 
13
  const ShippingCalculator = ( {
14
+ onUpdate = () => {},
 
 
15
  addressFields = [ 'country', 'state', 'city', 'postcode' ],
16
+ } ) => {
17
  const { shippingAddress, setShippingAddress } = useShippingDataContext();
18
  return (
19
  <div className="wc-block-components-shipping-calculator">
29
  );
30
  };
31
 
32
+ ShippingCalculator.propTypes = {
33
+ onUpdate: PropTypes.func,
34
+ addressFields: PropTypes.array,
35
+ };
36
+
37
  export default ShippingCalculator;
assets/js/base/components/cart-checkout/shipping-location/index.js ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { __, sprintf } from '@wordpress/i18n';
6
+ import {
7
+ SHIPPING_COUNTRIES,
8
+ SHIPPING_STATES,
9
+ } from '@woocommerce/block-settings';
10
+ import { decodeEntities } from '@wordpress/html-entities';
11
+
12
+ /**
13
+ * Shows a formatted shipping location.
14
+ *
15
+ * @param {Object} props Incoming props for the component.
16
+ * @param {Object} props.address Incoming address information.
17
+ */
18
+ const ShippingLocation = ( { address } ) => {
19
+ // we bail early if we don't have an address.
20
+ if ( Object.values( address ).length === 0 ) {
21
+ return null;
22
+ }
23
+ const formattedCountry =
24
+ typeof SHIPPING_COUNTRIES[ address.country ] === 'string'
25
+ ? decodeEntities( SHIPPING_COUNTRIES[ address.country ] )
26
+ : '';
27
+
28
+ const formattedState =
29
+ typeof SHIPPING_STATES[ address.country ] === 'object' &&
30
+ typeof SHIPPING_STATES[ address.country ][ address.state ] === 'string'
31
+ ? decodeEntities(
32
+ SHIPPING_STATES[ address.country ][ address.state ]
33
+ )
34
+ : address.state;
35
+
36
+ const addressParts = [];
37
+
38
+ addressParts.push( address.postcode.toUpperCase() );
39
+ addressParts.push( address.city );
40
+ addressParts.push( formattedState );
41
+ addressParts.push( formattedCountry );
42
+
43
+ const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
44
+
45
+ return (
46
+ formattedLocation && (
47
+ <span className="wc-block-components-shipping-address">
48
+ { sprintf(
49
+ /* Translators: %s location. */
50
+ __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
51
+ formattedLocation
52
+ ) + ' ' }
53
+ </span>
54
+ )
55
+ );
56
+ };
57
+
58
+ ShippingLocation.propTypes = {
59
+ address: PropTypes.shape( {
60
+ city: PropTypes.string,
61
+ state: PropTypes.string,
62
+ postcode: PropTypes.string,
63
+ country: PropTypes.string,
64
+ } ),
65
+ };
66
+
67
+ export default ShippingLocation;
assets/js/base/components/cart-checkout/shipping-location/index.tsx DELETED
@@ -1,70 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, sprintf } from '@wordpress/i18n';
5
- import { EnteredAddress, getSetting } from '@woocommerce/settings';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
-
8
- interface ShippingLocationProps {
9
- address: EnteredAddress;
10
- }
11
-
12
- /**
13
- * Shows a formatted shipping location.
14
- *
15
- * @param {Object} props Incoming props for the component.
16
- * @param {Object} props.address Incoming address information.
17
- */
18
- const ShippingLocation = ( {
19
- address,
20
- }: ShippingLocationProps ): JSX.Element | null => {
21
- // we bail early if we don't have an address.
22
- if ( Object.values( address ).length === 0 ) {
23
- return null;
24
- }
25
- const shippingCountries = getSetting( 'shippingCountries', {} ) as Record<
26
- string,
27
- string
28
- >;
29
- const shippingStates = getSetting( 'shippingStates', {} ) as Record<
30
- string,
31
- Record< string, string >
32
- >;
33
- const formattedCountry =
34
- typeof shippingCountries[ address.country ] === 'string'
35
- ? decodeEntities( shippingCountries[ address.country ] )
36
- : '';
37
-
38
- const formattedState =
39
- typeof shippingStates[ address.country ] === 'object' &&
40
- typeof shippingStates[ address.country ][ address.state ] === 'string'
41
- ? decodeEntities(
42
- shippingStates[ address.country ][ address.state ]
43
- )
44
- : address.state;
45
-
46
- const addressParts = [];
47
-
48
- addressParts.push( address.postcode.toUpperCase() );
49
- addressParts.push( address.city );
50
- addressParts.push( formattedState );
51
- addressParts.push( formattedCountry );
52
-
53
- const formattedLocation = addressParts.filter( Boolean ).join( ', ' );
54
-
55
- if ( ! formattedLocation ) {
56
- return null;
57
- }
58
-
59
- return (
60
- <span className="wc-block-components-shipping-address">
61
- { sprintf(
62
- /* translators: %s location. */
63
- __( 'Shipping to %s', 'woo-gutenberg-products-block' ),
64
- formattedLocation
65
- ) + ' ' }
66
- </span>
67
- );
68
- };
69
-
70
- export default ShippingLocation;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/index.tsx DELETED
@@ -1,152 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classNames from 'classnames';
5
- import { _n, sprintf } from '@wordpress/i18n';
6
- import { decodeEntities } from '@wordpress/html-entities';
7
- import type { ReactElement } from 'react';
8
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
9
- import { Panel } from '@woocommerce/blocks-checkout';
10
- import Label from '@woocommerce/base-components/label';
11
- import { useSelectShippingRate } from '@woocommerce/base-context/hooks';
12
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import PackageRates from './package-rates';
18
- import './style.scss';
19
-
20
- interface PackageItem {
21
- name: string;
22
- key: string;
23
- quantity: number;
24
- }
25
-
26
- interface Destination {
27
- // eslint-disable-next-line camelcase
28
- address_1: string;
29
- // eslint-disable-next-line camelcase
30
- address_2: string;
31
- city: string;
32
- state: string;
33
- postcode: string;
34
- country: string;
35
- }
36
-
37
- export interface PackageData {
38
- destination: Destination;
39
- name: string;
40
- // eslint-disable-next-line camelcase
41
- shipping_rates: CartShippingPackageShippingRate[];
42
- items: PackageItem[];
43
- }
44
-
45
- export type PackageRateRenderOption = (
46
- option: CartShippingPackageShippingRate
47
- ) => PackageRateOption;
48
-
49
- interface PackageProps {
50
- /* PackageId can be a string, WooCommerce Subscriptions uses strings for example, but WooCommerce core uses numbers */
51
- packageId: string | number;
52
- renderOption: PackageRateRenderOption;
53
- collapse?: boolean;
54
- packageData: PackageData;
55
- className?: string;
56
- collapsible?: boolean;
57
- noResultsMessage: ReactElement;
58
- showItems?: boolean;
59
- }
60
-
61
- export const ShippingRatesControlPackage = ( {
62
- packageId,
63
- className,
64
- noResultsMessage,
65
- renderOption,
66
- packageData,
67
- collapsible = false,
68
- collapse = false,
69
- showItems = false,
70
- }: PackageProps ): ReactElement => {
71
- const { selectShippingRate, selectedShippingRate } = useSelectShippingRate(
72
- packageId,
73
- packageData.shipping_rates
74
- );
75
-
76
- const header = (
77
- <>
78
- { ( showItems || collapsible ) && (
79
- <div className="wc-block-components-shipping-rates-control__package-title">
80
- { packageData.name }
81
- </div>
82
- ) }
83
- { showItems && (
84
- <ul className="wc-block-components-shipping-rates-control__package-items">
85
- { Object.values( packageData.items ).map( ( v ) => {
86
- const name = decodeEntities( v.name );
87
- const quantity = v.quantity;
88
- return (
89
- <li
90
- key={ v.key }
91
- className="wc-block-components-shipping-rates-control__package-item"
92
- >
93
- <Label
94
- label={
95
- quantity > 1
96
- ? `${ name } × ${ quantity }`
97
- : `${ name }`
98
- }
99
- screenReaderLabel={ sprintf(
100
- /* translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package */
101
- _n(
102
- '%1$s (%2$d unit)',
103
- '%1$s (%2$d units)',
104
- quantity,
105
- 'woo-gutenberg-products-block'
106
- ),
107
- name,
108
- quantity
109
- ) }
110
- />
111
- </li>
112
- );
113
- } ) }
114
- </ul>
115
- ) }
116
- </>
117
- );
118
- const body = (
119
- <PackageRates
120
- className={ className }
121
- noResultsMessage={ noResultsMessage }
122
- rates={ packageData.shipping_rates }
123
- onSelectRate={ selectShippingRate }
124
- selected={ selectedShippingRate }
125
- renderOption={ renderOption }
126
- />
127
- );
128
- if ( collapsible ) {
129
- return (
130
- <Panel
131
- className="wc-block-components-shipping-rates-control__package"
132
- initialOpen={ ! collapse }
133
- title={ header }
134
- >
135
- { body }
136
- </Panel>
137
- );
138
- }
139
- return (
140
- <div
141
- className={ classNames(
142
- 'wc-block-components-shipping-rates-control__package',
143
- className
144
- ) }
145
- >
146
- { header }
147
- { body }
148
- </div>
149
- );
150
- };
151
-
152
- export default ShippingRatesControlPackage;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/package-rates.tsx DELETED
@@ -1,69 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import RadioControl, {
5
- RadioControlOptionLayout,
6
- } from '@woocommerce/base-components/radio-control';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import type { ReactElement } from 'react';
9
- import type { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Internal dependencies
13
- */
14
- import { renderPackageRateOption } from './render-package-rate-option';
15
-
16
- interface PackageRates {
17
- onSelectRate: ( selectedRateId: string ) => void;
18
- rates: CartShippingPackageShippingRate[];
19
- renderOption?: (
20
- option: CartShippingPackageShippingRate
21
- ) => PackageRateOption;
22
- className?: string;
23
- noResultsMessage: ReactElement;
24
- selected?: string;
25
- }
26
-
27
- const PackageRates = ( {
28
- className,
29
- noResultsMessage,
30
- onSelectRate,
31
- rates,
32
- renderOption = renderPackageRateOption,
33
- selected,
34
- }: PackageRates ): ReactElement => {
35
- if ( rates.length === 0 ) {
36
- return noResultsMessage;
37
- }
38
-
39
- if ( rates.length > 1 ) {
40
- return (
41
- <RadioControl
42
- className={ className }
43
- onChange={ ( selectedRateId: string ) => {
44
- onSelectRate( selectedRateId );
45
- } }
46
- selected={ selected }
47
- options={ rates.map( renderOption ) }
48
- />
49
- );
50
- }
51
-
52
- const {
53
- label,
54
- secondaryLabel,
55
- description,
56
- secondaryDescription,
57
- } = renderOption( rates[ 0 ] );
58
-
59
- return (
60
- <RadioControlOptionLayout
61
- label={ label }
62
- secondaryLabel={ secondaryLabel }
63
- description={ description }
64
- secondaryDescription={ secondaryDescription }
65
- />
66
- );
67
- };
68
-
69
- export default PackageRates;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/render-package-rate-option.tsx DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import { getCurrencyFromPriceResponse } from '@woocommerce/price-format';
6
- import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
8
- import { getSetting } from '@woocommerce/settings';
9
- import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
10
-
11
- /**
12
- * Default render function for package rate options.
13
- *
14
- * @param {Object} rate Rate data.
15
- */
16
- export const renderPackageRateOption = (
17
- rate: CartShippingPackageShippingRate
18
- ): PackageRateOption => {
19
- const priceWithTaxes: number = getSetting(
20
- 'displayCartPricesIncludingTax',
21
- false
22
- )
23
- ? parseInt( rate.price, 10 ) + parseInt( rate.taxes, 10 )
24
- : parseInt( rate.price, 10 );
25
-
26
- return {
27
- label: decodeEntities( rate.name ),
28
- value: rate.rate_id,
29
- description: (
30
- <>
31
- { Number.isFinite( priceWithTaxes ) && (
32
- <FormattedMonetaryAmount
33
- currency={ getCurrencyFromPriceResponse( rate ) }
34
- value={ priceWithTaxes }
35
- />
36
- ) }
37
- { Number.isFinite( priceWithTaxes ) && rate.delivery_time
38
- ? ' — '
39
- : null }
40
- { decodeEntities( rate.delivery_time ) }
41
- </>
42
- ),
43
- };
44
- };
45
-
46
- export default renderPackageRateOption;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control-package/style.scss DELETED
@@ -1,43 +0,0 @@
1
- .wc-block-components-shipping-rates-control__package {
2
- .wc-block-components-panel__button {
3
- margin-bottom: 0;
4
- margin-top: 0;
5
- padding-bottom: em($gap-small);
6
- padding-top: em($gap-small);
7
- }
8
-
9
- // Remove panel padding because we are adding bottom padding to `.wc-block-components-radio-control`
10
- // and `.wc-block-components-radio-control__option-layout` in the next ruleset.
11
- .wc-block-components-panel__content {
12
- padding-bottom: 0;
13
- }
14
-
15
- .wc-block-components-radio-control,
16
- .wc-block-components-radio-control__option-layout {
17
- padding-bottom: 0;
18
- }
19
-
20
- .wc-block-components-radio-control .wc-block-components-radio-control__option-layout {
21
- padding-bottom: 0;
22
- }
23
- }
24
-
25
- .wc-block-components-shipping-rates-control__package-items {
26
- @include font-size(small);
27
- display: block;
28
- list-style: none;
29
- margin: 0;
30
- padding: 0;
31
- }
32
-
33
- .wc-block-components-shipping-rates-control__package-item {
34
- @include wrap-break-word();
35
- display: inline-block;
36
- margin: 0;
37
- padding: 0;
38
- }
39
-
40
- .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
41
- content: ", ";
42
- white-space: pre;
43
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/index.js ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import { speak } from '@wordpress/a11y';
8
+ import LoadingMask from '@woocommerce/base-components/loading-mask';
9
+ import {
10
+ getShippingRatesPackageCount,
11
+ getShippingRatesRateCount,
12
+ } from '@woocommerce/base-utils';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import Packages from './packages';
18
+ import './style.scss';
19
+
20
+ const ShippingRatesControl = ( {
21
+ shippingRates,
22
+ shippingRatesLoading,
23
+ className,
24
+ collapsibleWhenMultiple = false,
25
+ noResultsMessage,
26
+ renderOption,
27
+ } ) => {
28
+ useEffect( () => {
29
+ if ( shippingRatesLoading ) {
30
+ return;
31
+ }
32
+ const packages = getShippingRatesPackageCount( shippingRates );
33
+ const shippingOptions = getShippingRatesRateCount( shippingRates );
34
+ if ( shippingOptions === 0 ) {
35
+ speak(
36
+ __(
37
+ 'No shipping options were found.',
38
+ 'woo-gutenberg-products-block'
39
+ )
40
+ );
41
+ } else if ( packages === 1 ) {
42
+ speak(
43
+ sprintf(
44
+ // translators: %d number of shipping options found.
45
+ _n(
46
+ '%d shipping option was found.',
47
+ '%d shipping options were found.',
48
+ shippingOptions,
49
+ 'woo-gutenberg-products-block'
50
+ ),
51
+ shippingOptions
52
+ )
53
+ );
54
+ } else {
55
+ speak(
56
+ sprintf(
57
+ // translators: %d number of shipping packages packages.
58
+ _n(
59
+ 'Shipping option searched for %d package.',
60
+ 'Shipping options searched for %d packages.',
61
+ packages,
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ packages
65
+ ) +
66
+ ' ' +
67
+ sprintf(
68
+ // translators: %d number of shipping options available.
69
+ _n(
70
+ '%d shipping option was found',
71
+ '%d shipping options were found',
72
+ shippingOptions,
73
+ 'woo-gutenberg-products-block'
74
+ ),
75
+ shippingOptions
76
+ )
77
+ );
78
+ }
79
+ }, [ shippingRatesLoading, shippingRates ] );
80
+
81
+ return (
82
+ <LoadingMask
83
+ isLoading={ shippingRatesLoading }
84
+ screenReaderLabel={ __(
85
+ 'Loading shipping rates…',
86
+ 'woo-gutenberg-products-block'
87
+ ) }
88
+ showSpinner={ true }
89
+ >
90
+ <Packages
91
+ className={ className }
92
+ collapsible={
93
+ shippingRates.length > 1 && collapsibleWhenMultiple
94
+ }
95
+ noResultsMessage={ noResultsMessage }
96
+ renderOption={ renderOption }
97
+ shippingRates={ shippingRates }
98
+ />
99
+ </LoadingMask>
100
+ );
101
+ };
102
+
103
+ ShippingRatesControl.propTypes = {
104
+ noResultsMessage: PropTypes.string.isRequired,
105
+ renderOption: PropTypes.func.isRequired,
106
+ className: PropTypes.string,
107
+ collapsibleWhenMultiple: PropTypes.bool,
108
+ shippingRates: PropTypes.array,
109
+ shippingRatesLoading: PropTypes.bool,
110
+ };
111
+
112
+ export default ShippingRatesControl;
113
+ export { Packages };
assets/js/base/components/cart-checkout/shipping-rates-control/index.tsx DELETED
@@ -1,187 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { useEffect } from '@wordpress/element';
6
- import { speak } from '@wordpress/a11y';
7
- import LoadingMask from '@woocommerce/base-components/loading-mask';
8
- import { ExperimentalOrderShippingPackages } from '@woocommerce/blocks-checkout';
9
- import {
10
- getShippingRatesPackageCount,
11
- getShippingRatesRateCount,
12
- } from '@woocommerce/base-utils';
13
- import { useStoreCart } from '@woocommerce/base-context/hooks';
14
- import { CartResponseShippingRate } from '@woocommerce/type-defs/cart-response';
15
- import { ReactElement } from 'react';
16
-
17
- /**
18
- * Internal dependencies
19
- */
20
- import ShippingRatesControlPackage, {
21
- PackageRateRenderOption,
22
- } from '../shipping-rates-control-package';
23
-
24
- interface PackagesProps {
25
- packages: CartResponseShippingRate[];
26
- collapse?: boolean;
27
- collapsible?: boolean;
28
- showItems?: boolean;
29
- noResultsMessage: ReactElement;
30
- renderOption: PackageRateRenderOption;
31
- }
32
-
33
- /**
34
- * Renders multiple packages within the slotfill.
35
- *
36
- * @param {Object} props Incoming props.
37
- * @param {Array} props.packages Array of packages.
38
- * @param {boolean} props.collapsible If the package should be rendered as a
39
- * @param {ReactElement} props.noResultsMessage Rendered when there are no rates in a package.
40
- * collapsible panel.
41
- * @param {boolean} props.collapse If the panel should be collapsed by default,
42
- * only works if collapsible is true.
43
- * @param {boolean} props.showItems If we should items below the package name.
44
- * @param {PackageRateRenderOption} [props.renderOption] Function to render a shipping rate.
45
- * @return {JSX.Element|null} Rendered components.
46
- */
47
- const Packages = ( {
48
- packages,
49
- collapse,
50
- showItems,
51
- collapsible,
52
- noResultsMessage,
53
- renderOption,
54
- }: PackagesProps ): JSX.Element | null => {
55
- // If there are no packages, return nothing.
56
- if ( ! packages.length ) {
57
- return null;
58
- }
59
- return (
60
- <>
61
- { packages.map( ( { package_id: packageId, ...packageData } ) => (
62
- <ShippingRatesControlPackage
63
- key={ packageId }
64
- packageId={ packageId }
65
- packageData={ packageData }
66
- collapsible={ collapsible }
67
- collapse={ collapse }
68
- showItems={ showItems }
69
- noResultsMessage={ noResultsMessage }
70
- renderOption={ renderOption }
71
- />
72
- ) ) }
73
- </>
74
- );
75
- };
76
-
77
- interface ShippingRatesControlProps {
78
- collapsible?: boolean;
79
- shippingRates: CartResponseShippingRate[];
80
- className?: string;
81
- shippingRatesLoading: boolean;
82
- noResultsMessage: ReactElement;
83
- renderOption: PackageRateRenderOption;
84
- }
85
- /**
86
- * Renders the shipping rates control element.
87
- *
88
- * @param {Object} props Incoming props.
89
- * @param {Array} props.shippingRates Array of packages containing shipping rates.
90
- * @param {boolean} props.shippingRatesLoading True when rates are being loaded.
91
- * @param {string} props.className Class name for package rates.
92
- * @param {boolean} [props.collapsible] If true, when multiple packages are rendered they can be toggled open and closed.
93
- * @param {ReactElement} props.noResultsMessage Rendered when there are no packages.
94
- * @param {Function} [props.renderOption] Function to render a shipping rate.
95
- */
96
- const ShippingRatesControl = ( {
97
- shippingRates,
98
- shippingRatesLoading,
99
- className,
100
- collapsible = false,
101
- noResultsMessage,
102
- renderOption,
103
- }: ShippingRatesControlProps ): JSX.Element => {
104
- useEffect( () => {
105
- if ( shippingRatesLoading ) {
106
- return;
107
- }
108
- const packageCount = getShippingRatesPackageCount( shippingRates );
109
- const shippingOptions = getShippingRatesRateCount( shippingRates );
110
- if ( packageCount === 1 ) {
111
- speak(
112
- sprintf(
113
- /* translators: %d number of shipping options found. */
114
- _n(
115
- '%d shipping option was found.',
116
- '%d shipping options were found.',
117
- shippingOptions,
118
- 'woo-gutenberg-products-block'
119
- ),
120
- shippingOptions
121
- )
122
- );
123
- } else {
124
- speak(
125
- sprintf(
126
- /* translators: %d number of shipping packages packages. */
127
- _n(
128
- 'Shipping option searched for %d package.',
129
- 'Shipping options searched for %d packages.',
130
- packageCount,
131
- 'woo-gutenberg-products-block'
132
- ),
133
- packageCount
134
- ) +
135
- ' ' +
136
- sprintf(
137
- /* translators: %d number of shipping options available. */
138
- _n(
139
- '%d shipping option was found',
140
- '%d shipping options were found',
141
- shippingOptions,
142
- 'woo-gutenberg-products-block'
143
- ),
144
- shippingOptions
145
- )
146
- );
147
- }
148
- }, [ shippingRatesLoading, shippingRates ] );
149
-
150
- // Prepare props to pass to the ExperimentalOrderShippingPackages slot fill.
151
- // We need to pluck out receiveCart.
152
- // eslint-disable-next-line no-unused-vars
153
- const { extensions, ...cart } = useStoreCart();
154
- const slotFillProps = {
155
- className,
156
- collapsible,
157
- noResultsMessage,
158
- renderOption,
159
- extensions,
160
- cart,
161
- components: {
162
- ShippingRatesControlPackage,
163
- },
164
- };
165
-
166
- return (
167
- <LoadingMask
168
- isLoading={ shippingRatesLoading }
169
- screenReaderLabel={ __(
170
- 'Loading shipping rates…',
171
- 'woo-gutenberg-products-block'
172
- ) }
173
- showSpinner={ true }
174
- >
175
- <ExperimentalOrderShippingPackages.Slot { ...slotFillProps } />
176
- <ExperimentalOrderShippingPackages>
177
- <Packages
178
- packages={ shippingRates }
179
- noResultsMessage={ noResultsMessage }
180
- renderOption={ renderOption }
181
- />
182
- </ExperimentalOrderShippingPackages>
183
- </LoadingMask>
184
- );
185
- };
186
-
187
- export default ShippingRatesControl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/shipping-rates-control/package-options.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import RadioControl, {
6
+ RadioControlOptionLayout,
7
+ } from '@woocommerce/base-components/radio-control';
8
+ import { Notice } from 'wordpress-components';
9
+ import classnames from 'classnames';
10
+
11
+ const PackageOptions = ( {
12
+ className,
13
+ noResultsMessage,
14
+ onChange,
15
+ options,
16
+ renderOption,
17
+ selected,
18
+ } ) => {
19
+ if ( options.length === 0 ) {
20
+ return (
21
+ <Notice
22
+ isDismissible={ false }
23
+ className={ classnames(
24
+ 'wc-block-components-shipping-rates-control__no-results-notice',
25
+ 'woocommerce-message',
26
+ 'woocommerce-info'
27
+ ) }
28
+ >
29
+ { noResultsMessage }
30
+ </Notice>
31
+ );
32
+ }
33
+
34
+ if ( options.length > 1 ) {
35
+ return (
36
+ <RadioControl
37
+ className={ className }
38
+ onChange={ onChange }
39
+ selected={ selected }
40
+ options={ options.map( renderOption ) }
41
+ />
42
+ );
43
+ }
44
+
45
+ const {
46
+ label,
47
+ secondaryLabel,
48
+ description,
49
+ secondaryDescription,
50
+ } = renderOption( options[ 0 ] );
51
+
52
+ return (
53
+ <RadioControlOptionLayout
54
+ label={ label }
55
+ secondaryLabel={ secondaryLabel }
56
+ description={ description }
57
+ secondaryDescription={ secondaryDescription }
58
+ />
59
+ );
60
+ };
61
+
62
+ PackageOptions.propTypes = {
63
+ onChange: PropTypes.func.isRequired,
64
+ options: PropTypes.arrayOf( PropTypes.object ).isRequired,
65
+ renderOption: PropTypes.func.isRequired,
66
+ className: PropTypes.string,
67
+ noResultsMessage: PropTypes.string,
68
+ selected: PropTypes.string,
69
+ };
70
+
71
+ export default PackageOptions;
assets/js/base/components/cart-checkout/shipping-rates-control/package.js ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { _n, sprintf } from '@wordpress/i18n';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import Label from '@woocommerce/base-components/label';
8
+ import Title from '@woocommerce/base-components/title';
9
+ import Panel from '@woocommerce/base-components/panel';
10
+ import classNames from 'classnames';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import PackageOptions from './package-options';
16
+ import './style.scss';
17
+
18
+ const Package = ( {
19
+ className,
20
+ collapsible = false,
21
+ noResultsMessage,
22
+ onChange,
23
+ renderOption,
24
+ selected,
25
+ shippingRate,
26
+ showItems,
27
+ title,
28
+ } ) => {
29
+ const header = (
30
+ <>
31
+ { title && (
32
+ <Title
33
+ className="wc-block-components-shipping-rates-control__package-title"
34
+ headingLevel="3"
35
+ >
36
+ { title }
37
+ </Title>
38
+ ) }
39
+ { showItems && (
40
+ <ul className="wc-block-components-shipping-rates-control__package-items">
41
+ { Object.values( shippingRate.items ).map( ( v ) => {
42
+ const name = decodeEntities( v.name );
43
+ const quantity = v.quantity;
44
+ return (
45
+ <li
46
+ key={ name }
47
+ className="wc-block-components-shipping-rates-control__package-item"
48
+ >
49
+ <Label
50
+ label={ `${ name } ×${ quantity }` }
51
+ screenReaderLabel={ sprintf(
52
+ // translators: %1$s name of the product (ie: Sunglasses), %2$d number of units in the current cart package
53
+ _n(
54
+ '%1$s (%2$d unit)',
55
+ '%1$s (%2$d units)',
56
+ quantity,
57
+ 'woo-gutenberg-products-block'
58
+ ),
59
+ name,
60
+ quantity
61
+ ) }
62
+ />
63
+ </li>
64
+ );
65
+ } ) }
66
+ </ul>
67
+ ) }
68
+ </>
69
+ );
70
+ const body = (
71
+ <PackageOptions
72
+ className={ className }
73
+ noResultsMessage={ noResultsMessage }
74
+ onChange={ onChange }
75
+ options={ shippingRate.shipping_rates }
76
+ renderOption={ renderOption }
77
+ selected={ selected }
78
+ />
79
+ );
80
+ if ( collapsible ) {
81
+ return (
82
+ <Panel
83
+ className="wc-block-components-shipping-rates-control__package"
84
+ hasBorder={ true }
85
+ initialOpen={ true }
86
+ title={ header }
87
+ >
88
+ { body }
89
+ </Panel>
90
+ );
91
+ }
92
+ return (
93
+ <div
94
+ className={ classNames(
95
+ 'wc-block-components-shipping-rates-control__package',
96
+ className
97
+ ) }
98
+ >
99
+ { header }
100
+ { body }
101
+ </div>
102
+ );
103
+ };
104
+
105
+ Package.propTypes = {
106
+ onChange: PropTypes.func.isRequired,
107
+ renderOption: PropTypes.func.isRequired,
108
+ shippingRate: PropTypes.shape( {
109
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ).isRequired,
110
+ items: PropTypes.arrayOf(
111
+ PropTypes.shape( {
112
+ name: PropTypes.string.isRequired,
113
+ key: PropTypes.string.isRequired,
114
+ quantity: PropTypes.number.isRequired,
115
+ } ).isRequired
116
+ ).isRequired,
117
+ } ).isRequired,
118
+ className: PropTypes.string,
119
+ collapsible: PropTypes.bool,
120
+ noResultsMessage: PropTypes.string,
121
+ selected: PropTypes.string,
122
+ showItems: PropTypes.bool,
123
+ title: PropTypes.string,
124
+ };
125
+
126
+ export default Package;
assets/js/base/components/cart-checkout/shipping-rates-control/packages.js ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { useSelectShippingRate } from '@woocommerce/base-hooks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import Package from './package';
11
+ import './style.scss';
12
+
13
+ const Packages = ( {
14
+ className,
15
+ collapsible = false,
16
+ noResultsMessage,
17
+ renderOption,
18
+ shippingRates = [],
19
+ } ) => {
20
+ const { selectShippingRate, selectedShippingRates } = useSelectShippingRate(
21
+ shippingRates
22
+ );
23
+ /* eslint-disable camelcase */
24
+ return (
25
+ <div className="wc-block-components-shipping-rates-control">
26
+ { shippingRates.map( ( { package_id, ...shippingRate } ) => (
27
+ <Package
28
+ key={ package_id }
29
+ className={ className }
30
+ collapsible={ collapsible }
31
+ noResultsMessage={ noResultsMessage }
32
+ onChange={ ( newShippingRate ) => {
33
+ selectShippingRate( newShippingRate, package_id );
34
+ } }
35
+ renderOption={ renderOption }
36
+ selected={ selectedShippingRates[ package_id ] }
37
+ shippingRate={ shippingRate }
38
+ showItems={ shippingRates.length > 1 }
39
+ title={
40
+ shippingRates.length > 1 ? shippingRate.name : null
41
+ }
42
+ />
43
+ ) ) }
44
+ </div>
45
+ );
46
+ /* eslint-enable */
47
+ };
48
+
49
+ Packages.propTypes = {
50
+ renderOption: PropTypes.func.isRequired,
51
+ className: PropTypes.string,
52
+ collapsible: PropTypes.bool,
53
+ noResultsMessage: PropTypes.string,
54
+ shippingRates: PropTypes.arrayOf(
55
+ PropTypes.shape( {
56
+ items: PropTypes.arrayOf(
57
+ PropTypes.shape( {
58
+ key: PropTypes.string,
59
+ name: PropTypes.string,
60
+ quantity: PropTypes.number,
61
+ } )
62
+ ).isRequired,
63
+ package_id: PropTypes.number,
64
+ name: PropTypes.string,
65
+ destination: PropTypes.object,
66
+ shipping_rates: PropTypes.arrayOf( PropTypes.object ),
67
+ } ).isRequired
68
+ ).isRequired,
69
+ };
70
+
71
+ export default Packages;
assets/js/base/components/cart-checkout/shipping-rates-control/style.scss ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-block-components-shipping-rates-control__package {
2
+ .wc-block-components-shipping-rates-control__package-title {
3
+ margin: 0;
4
+ }
5
+ }
6
+
7
+ .wc-block-components-shipping-rates-control__package-items {
8
+ @include font-size(small);
9
+ display: block;
10
+ list-style: none;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ .wc-block-components-shipping-rates-control__package-item {
16
+ @include wrap-break-word();
17
+ display: inline-block;
18
+ margin: 0;
19
+ padding: 0;
20
+ }
21
+
22
+ .wc-block-components-shipping-rates-control__package-item:not(:last-child)::after {
23
+ content: ", ";
24
+ white-space: pre;
25
+ }
26
+
27
+ .components-notice.wc-block-components-shipping-rates-control__no-results-notice {
28
+ margin-bottom: 0;
29
+ }
30
+
31
+ .wc-block-components-shipping-rates-control {
32
+ .wc-blocks-components-panel__content {
33
+ padding-bottom: 0;
34
+ }
35
+ }
assets/js/base/components/cart-checkout/totals/discount/stories/index.js DELETED
@@ -1,37 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, boolean } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsDiscount from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsDiscount',
15
- component: TotalsDiscount,
16
- };
17
-
18
- export const Default = () => {
19
- const cartCoupons = [ { code: 'COUPON' } ];
20
- const currency = currencyKnob();
21
- const isRemovingCoupon = boolean( 'Toggle isRemovingCoupon state', false );
22
- const totalDiscount = text( 'Total discount', '1000' );
23
- const totalDiscountTax = text( 'Total discount tax', '200' );
24
-
25
- return (
26
- <TotalsDiscount
27
- cartCoupons={ cartCoupons }
28
- currency={ currency }
29
- isRemovingCoupon={ isRemovingCoupon }
30
- removeCoupon={ () => void null }
31
- values={ {
32
- total_discount: totalDiscount,
33
- total_discount_tax: totalDiscountTax,
34
- } }
35
- />
36
- );
37
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/discount/style.scss DELETED
@@ -1,9 +0,0 @@
1
- .wc-block-components-totals-discount__coupon-list {
2
- list-style: none;
3
- margin: 0;
4
- padding: 0;
5
- }
6
-
7
- .wc-block-components-totals-discount .wc-block-components-totals-item__value {
8
- color: $discount-color;
9
- }
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/stories/index.js DELETED
@@ -1,32 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsFooterItem from '../';
11
-
12
- export default {
13
- title:
14
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsFooterItem',
15
- component: TotalsFooterItem,
16
- };
17
-
18
- export const Default = () => {
19
- const currency = currencyKnob();
20
- const totalPrice = text( 'Total price', '1200' );
21
- const totalTax = text( 'Total tax', '200' );
22
-
23
- return (
24
- <TotalsFooterItem
25
- currency={ currency }
26
- values={ {
27
- total_price: totalPrice,
28
- total_tax: totalTax,
29
- } }
30
- />
31
- );
32
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/__snapshots__/index.js.snap DELETED
@@ -1,79 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is 0 1`] = `
4
- <div>
5
- <div
6
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
7
- >
8
- <span
9
- class="wc-block-components-totals-item__label"
10
- >
11
- Total
12
- </span>
13
- <span
14
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
15
- >
16
- £85.00
17
- </span>
18
- <div
19
- class="wc-block-components-totals-item__description"
20
- />
21
- </div>
22
- </div>
23
- `;
24
-
25
- exports[`TotalsFooterItem Does not show the "including %s of tax" line if tax is disabled 1`] = `
26
- <div>
27
- <div
28
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
29
- >
30
- <span
31
- class="wc-block-components-totals-item__label"
32
- >
33
- Total
34
- </span>
35
- <span
36
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
37
- >
38
- £85.00
39
- </span>
40
- <div
41
- class="wc-block-components-totals-item__description"
42
- />
43
- </div>
44
- </div>
45
- `;
46
-
47
- exports[`TotalsFooterItem Shows the "including %s of tax" line if tax is greater than 0 1`] = `
48
- <div>
49
- <div
50
- class="wc-block-components-totals-item wc-block-components-totals-footer-item"
51
- >
52
- <span
53
- class="wc-block-components-totals-item__label"
54
- >
55
- Total
56
- </span>
57
- <span
58
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-item__value"
59
- >
60
- £85.00
61
- </span>
62
- <div
63
- class="wc-block-components-totals-item__description"
64
- >
65
- <p
66
- class="wc-block-components-totals-footer-item-tax"
67
- >
68
- Including
69
- <span
70
- class="wc-block-formatted-money-amount wc-block-components-formatted-money-amount wc-block-components-totals-footer-item-tax-value"
71
- >
72
- £1.00
73
- </span>
74
- in taxes
75
- </p>
76
- </div>
77
- </div>
78
- </div>
79
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/footer-item/test/index.js DELETED
@@ -1,81 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render } from '@testing-library/react';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import TotalsFooterItem from '../index';
10
- import { allSettings } from '../../../../../../settings/shared/settings-init';
11
-
12
- describe( 'TotalsFooterItem', () => {
13
- beforeEach( () => {
14
- allSettings.taxesEnabled = true;
15
- allSettings.displayCartPricesIncludingTax = true;
16
- } );
17
- const currency = {
18
- code: 'GBP',
19
- decimalSeparator: '.',
20
- minorUnit: 2,
21
- prefix: '£',
22
- suffix: '',
23
- symbol: '£',
24
- thousandSeparator: ',',
25
- };
26
-
27
- const values = {
28
- currency_code: 'GBP',
29
- currency_decimal_separator: '.',
30
- currency_minor_unit: 2,
31
- currency_prefix: '£',
32
- currency_suffix: '',
33
- currency_symbol: '£',
34
- currency_thousand_separator: ',',
35
- tax_lines: [],
36
- length: 2,
37
- total_discount: '0',
38
- total_discount_tax: '0',
39
- total_fees: '0',
40
- total_fees_tax: '0',
41
- total_items: '7100',
42
- total_items_tax: '0',
43
- total_price: '8500',
44
- total_shipping: '0',
45
- total_shipping_tax: '0',
46
- total_tax: '0',
47
- };
48
-
49
- it( 'Does not show the "including %s of tax" line if tax is 0', () => {
50
- const { container } = render(
51
- <TotalsFooterItem currency={ currency } values={ values } />
52
- );
53
- expect( container ).toMatchSnapshot();
54
- } );
55
-
56
- it( 'Does not show the "including %s of tax" line if tax is disabled', () => {
57
- allSettings.taxesEnabled = false;
58
- /* This shouldn't ever happen if taxes are disabled, but this is to test whether the taxesEnabled setting works */
59
- const valuesWithTax = {
60
- ...values,
61
- total_tax: '100',
62
- total_items_tax: '100',
63
- };
64
- const { container } = render(
65
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
66
- );
67
- expect( container ).toMatchSnapshot();
68
- } );
69
-
70
- it( 'Shows the "including %s of tax" line if tax is greater than 0', () => {
71
- const valuesWithTax = {
72
- ...values,
73
- total_tax: '100',
74
- total_items_tax: '100',
75
- };
76
- const { container } = render(
77
- <TotalsFooterItem currency={ currency } values={ valuesWithTax } />
78
- );
79
- expect( container ).toMatchSnapshot();
80
- } );
81
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/index.js CHANGED
@@ -1,4 +1,8 @@
1
- export { default as TotalsCoupon } from './coupon';
2
- export { default as TotalsDiscount } from './discount';
3
- export { default as TotalsFooterItem } from './footer-item';
4
- export { default as TotalsShipping } from './shipping';
 
 
 
 
1
+ export { default as SubtotalsItem } from './subtotals-item';
2
+ export { default as TotalsCouponCodeInput } from './totals-coupon-code-input';
3
+ export { default as TotalsDiscountItem } from './totals-discount-item';
4
+ export { default as TotalsFeesItem } from './totals-fees-item';
5
+ export { default as TotalsFooterItem } from './totals-footer-item';
6
+ export { default as TotalsItem } from './totals-item';
7
+ export { default as TotalsShippingItem } from './totals-shipping-item';
8
+ export { default as TotalsTaxesItem } from './totals-taxes-item';
assets/js/base/components/cart-checkout/totals/shipping/index.tsx DELETED
@@ -1,215 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { __ } from '@wordpress/i18n';
6
- import { useState } from '@wordpress/element';
7
- import { useStoreCart } from '@woocommerce/base-context/hooks';
8
- import { TotalsItem } from '@woocommerce/blocks-checkout';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
- import { getSetting, EnteredAddress } from '@woocommerce/settings';
12
- import { ShippingVia } from '@woocommerce/base-components/cart-checkout/totals/shipping/shipping-via';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import ShippingRateSelector from './shipping-rate-selector';
18
- import hasShippingRate from './has-shipping-rate';
19
- import ShippingCalculator from '../../shipping-calculator';
20
- import ShippingLocation from '../../shipping-location';
21
- import './style.scss';
22
-
23
- interface CalculatorButtonProps {
24
- label?: string;
25
- isShippingCalculatorOpen: boolean;
26
- setIsShippingCalculatorOpen: ( isShippingCalculatorOpen: boolean ) => void;
27
- }
28
-
29
- const CalculatorButton = ( {
30
- label = __( 'Calculate', 'woo-gutenberg-products-block' ),
31
- isShippingCalculatorOpen,
32
- setIsShippingCalculatorOpen,
33
- }: CalculatorButtonProps ): ReactElement => {
34
- return (
35
- <button
36
- className="wc-block-components-totals-shipping__change-address-button"
37
- onClick={ () => {
38
- setIsShippingCalculatorOpen( ! isShippingCalculatorOpen );
39
- } }
40
- aria-expanded={ isShippingCalculatorOpen }
41
- >
42
- { label }
43
- </button>
44
- );
45
- };
46
-
47
- interface ShippingAddressProps {
48
- showCalculator: boolean;
49
- isShippingCalculatorOpen: boolean;
50
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
51
- shippingAddress: EnteredAddress;
52
- }
53
-
54
- const ShippingAddress = ( {
55
- showCalculator,
56
- isShippingCalculatorOpen,
57
- setIsShippingCalculatorOpen,
58
- shippingAddress,
59
- }: ShippingAddressProps ): ReactElement | null => {
60
- return (
61
- <>
62
- <ShippingLocation address={ shippingAddress } />
63
- { showCalculator && (
64
- <CalculatorButton
65
- label={ __(
66
- '(change address)',
67
- 'woo-gutenberg-products-block'
68
- ) }
69
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
70
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
71
- />
72
- ) }
73
- </>
74
- );
75
- };
76
-
77
- interface NoShippingPlaceholderProps {
78
- showCalculator: boolean;
79
- isShippingCalculatorOpen: boolean;
80
- setIsShippingCalculatorOpen: CalculatorButtonProps[ 'setIsShippingCalculatorOpen' ];
81
- }
82
-
83
- const NoShippingPlaceholder = ( {
84
- showCalculator,
85
- isShippingCalculatorOpen,
86
- setIsShippingCalculatorOpen,
87
- }: NoShippingPlaceholderProps ): ReactElement => {
88
- if ( ! showCalculator ) {
89
- return (
90
- <em>
91
- { __(
92
- 'Calculated during checkout',
93
- 'woo-gutenberg-products-block'
94
- ) }
95
- </em>
96
- );
97
- }
98
-
99
- return (
100
- <CalculatorButton
101
- isShippingCalculatorOpen={ isShippingCalculatorOpen }
102
- setIsShippingCalculatorOpen={ setIsShippingCalculatorOpen }
103
- />
104
- );
105
- };
106
-
107
- interface TotalShippingProps {
108
- currency: Currency;
109
- values: {
110
- // eslint-disable-next-line camelcase
111
- total_shipping: string;
112
- // eslint-disable-next-line camelcase
113
- total_shipping_tax: string;
114
- }; // Values in use
115
- showCalculator?: boolean; //Whether to display the rate selector below the shipping total.
116
- showRateSelector?: boolean; // Whether to show shipping calculator or not.
117
- className?: string;
118
- }
119
-
120
- const TotalsShipping = ( {
121
- currency,
122
- values,
123
- showCalculator = true,
124
- showRateSelector = true,
125
- className,
126
- }: TotalShippingProps ): ReactElement => {
127
- const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
128
- false
129
- );
130
- const {
131
- shippingAddress,
132
- cartHasCalculatedShipping,
133
- shippingRates,
134
- shippingRatesLoading,
135
- } = useStoreCart();
136
-
137
- const totalShippingValue = getSetting(
138
- 'displayCartPricesIncludingTax',
139
- false
140
- )
141
- ? parseInt( values.total_shipping, 10 ) +
142
- parseInt( values.total_shipping_tax, 10 )
143
- : parseInt( values.total_shipping, 10 );
144
- const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
145
- const calculatorButtonProps = {
146
- isShippingCalculatorOpen,
147
- setIsShippingCalculatorOpen,
148
- };
149
-
150
- const selectedShippingRates = shippingRates.flatMap(
151
- ( shippingPackage ) => {
152
- return shippingPackage.shipping_rates
153
- .filter( ( rate ) => rate.selected )
154
- .flatMap( ( rate ) => rate.name );
155
- }
156
- );
157
-
158
- return (
159
- <div
160
- className={ classnames(
161
- 'wc-block-components-totals-shipping',
162
- className
163
- ) }
164
- >
165
- <TotalsItem
166
- label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
167
- value={
168
- cartHasCalculatedShipping ? (
169
- totalShippingValue
170
- ) : (
171
- <NoShippingPlaceholder
172
- showCalculator={ showCalculator }
173
- { ...calculatorButtonProps }
174
- />
175
- )
176
- }
177
- description={
178
- <>
179
- { cartHasCalculatedShipping && (
180
- <>
181
- <ShippingVia
182
- selectedShippingRates={
183
- selectedShippingRates
184
- }
185
- />
186
- <ShippingAddress
187
- shippingAddress={ shippingAddress }
188
- showCalculator={ showCalculator }
189
- { ...calculatorButtonProps }
190
- />
191
- </>
192
- ) }
193
- </>
194
- }
195
- currency={ currency }
196
- />
197
- { showCalculator && isShippingCalculatorOpen && (
198
- <ShippingCalculator
199
- onUpdate={ () => {
200
- setIsShippingCalculatorOpen( false );
201
- } }
202
- />
203
- ) }
204
- { showRateSelector && cartHasCalculatedShipping && (
205
- <ShippingRateSelector
206
- hasRates={ hasRates }
207
- shippingRates={ shippingRates }
208
- shippingRatesLoading={ shippingRatesLoading }
209
- />
210
- ) }
211
- </div>
212
- );
213
- };
214
-
215
- export default TotalsShipping;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/shipping-rate-selector.js DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { Notice } from 'wordpress-components';
6
- import classnames from 'classnames';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import ShippingRatesControl from '../../shipping-rates-control';
12
-
13
- const ShippingRateSelector = ( {
14
- hasRates,
15
- shippingRates,
16
- shippingRatesLoading,
17
- } ) => {
18
- const legend = hasRates
19
- ? __( 'Shipping options', 'woo-gutenberg-products-block' )
20
- : __( 'Choose a shipping option', 'woo-gutenberg-products-block' );
21
- return (
22
- <fieldset className="wc-block-components-totals-shipping__fieldset">
23
- <legend className="screen-reader-text">{ legend }</legend>
24
- <ShippingRatesControl
25
- className="wc-block-components-totals-shipping__options"
26
- collapsible={ true }
27
- noResultsMessage={
28
- <Notice
29
- isDismissible={ false }
30
- className={ classnames(
31
- 'wc-block-components-shipping-rates-control__no-results-notice',
32
- 'woocommerce-error'
33
- ) }
34
- >
35
- { __(
36
- 'No shipping options were found.',
37
- 'woo-gutenberg-products-block'
38
- ) }
39
- </Notice>
40
- }
41
- shippingRates={ shippingRates }
42
- shippingRatesLoading={ shippingRatesLoading }
43
- />
44
- </fieldset>
45
- );
46
- };
47
-
48
- export default ShippingRateSelector;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/shipping-via.tsx DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- export const ShippingVia = ( {
7
- selectedShippingRates,
8
- }: {
9
- selectedShippingRates: string[];
10
- } ): JSX.Element => {
11
- return (
12
- <div className="wc-block-components-totals-item__description wc-block-components-totals-shipping__via">
13
- { __( 'via', 'woo-gutenberg-products-block' ) }{ ' ' }
14
- { selectedShippingRates.join( ', ' ) }
15
- </div>
16
- );
17
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/shipping/stories/index.js DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { boolean, text } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import TotalsShipping from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@blocks-checkout/TotalsShipping',
14
- component: TotalsShipping,
15
- };
16
-
17
- export const Default = () => {
18
- const currency = currencyKnob();
19
- const showCalculator = boolean( 'Show calculator', true );
20
- const showRateSelector = boolean( 'Show rate selector', true );
21
- const totalShipping = text( 'Total shipping', '1000' );
22
- const totalShippingTax = text( 'Total shipping tax', '200' );
23
-
24
- return (
25
- <TotalsShipping
26
- currency={ currency }
27
- showCalculator={ showCalculator }
28
- showRateSelector={ showRateSelector }
29
- values={ {
30
- total_shipping: totalShipping,
31
- total_shipping_tax: totalShippingTax,
32
- } }
33
- />
34
- );
35
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/cart-checkout/totals/subtotals-item/index.js ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import PropTypes from 'prop-types';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import TotalsItem from '../totals-item';
12
+
13
+ const SubtotalsItem = ( { currency, values } ) => {
14
+ const { total_items: totalItems, total_items_tax: totalItemsTax } = values;
15
+ const itemsValue = parseInt( totalItems, 10 );
16
+ const itemsTaxValue = parseInt( totalItemsTax, 10 );
17
+
18
+ return (
19
+ <TotalsItem
20
+ currency={ currency }
21
+ label={ __( 'Subtotal', 'woo-gutenberg-products-block' ) }
22
+ value={
23
+ DISPLAY_CART_PRICES_INCLUDING_TAX
24
+ ? itemsValue + itemsTaxValue
25
+ : itemsValue
26
+ }
27
+ />
28
+ );
29
+ };
30
+
31
+ SubtotalsItem.propTypes = {
32
+ currency: PropTypes.object.isRequired,
33
+ values: PropTypes.shape( {
34
+ total_items: PropTypes.string,
35
+ total_items_tax: PropTypes.string,
36
+ } ).isRequired,
37
+ };
38
+
39
+ export default SubtotalsItem;
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/index.js RENAMED
@@ -6,21 +6,19 @@ import { useState, useEffect, useRef } from '@wordpress/element';
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
 
9
  import LoadingMask from '@woocommerce/base-components/loading-mask';
10
  import PropTypes from 'prop-types';
11
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import {
13
- ValidationInputError,
14
- useValidationContext,
15
- } from '@woocommerce/base-context';
16
- import { Panel } from '@woocommerce/blocks-checkout';
17
 
18
  /**
19
  * Internal dependencies
20
  */
21
  import './style.scss';
22
 
23
- const TotalsCoupon = ( {
24
  instanceId,
25
  isLoading = false,
26
  initialOpen = false,
@@ -29,6 +27,7 @@ const TotalsCoupon = ( {
29
  const [ couponValue, setCouponValue ] = useState( '' );
30
  const currentIsLoading = useRef( false );
31
  const { getValidationError, getValidationErrorId } = useValidationContext();
 
32
  const validationError = getValidationError( 'coupon' );
33
 
34
  useEffect( () => {
@@ -45,21 +44,22 @@ const TotalsCoupon = ( {
45
  return (
46
  <Panel
47
  className="wc-block-components-totals-coupon"
48
- hasBorder={ false }
49
  initialOpen={ initialOpen }
50
  title={
51
  <Label
52
  label={ __(
53
- 'Coupon code',
54
  'woo-gutenberg-products-block'
55
  ) }
56
  screenReaderLabel={ __(
57
- 'Apply a coupon code',
58
  'woo-gutenberg-products-block'
59
  ) }
60
  htmlFor={ textInputId }
61
  />
62
  }
 
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
@@ -113,9 +113,9 @@ const TotalsCoupon = ( {
113
  );
114
  };
115
 
116
- TotalsCoupon.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
- export default withInstanceId( TotalsCoupon );
6
  import Button from '@woocommerce/base-components/button';
7
  import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
8
  import Label from '@woocommerce/base-components/label';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
  import LoadingMask from '@woocommerce/base-components/loading-mask';
11
  import PropTypes from 'prop-types';
12
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
13
+ import { useValidationContext } from '@woocommerce/base-context';
14
+ import Panel from '@woocommerce/base-components/panel';
 
 
 
15
 
16
  /**
17
  * Internal dependencies
18
  */
19
  import './style.scss';
20
 
21
+ const TotalsCouponCodeInput = ( {
22
  instanceId,
23
  isLoading = false,
24
  initialOpen = false,
27
  const [ couponValue, setCouponValue ] = useState( '' );
28
  const currentIsLoading = useRef( false );
29
  const { getValidationError, getValidationErrorId } = useValidationContext();
30
+
31
  const validationError = getValidationError( 'coupon' );
32
 
33
  useEffect( () => {
44
  return (
45
  <Panel
46
  className="wc-block-components-totals-coupon"
47
+ hasBorder={ true }
48
  initialOpen={ initialOpen }
49
  title={
50
  <Label
51
  label={ __(
52
+ 'Coupon Code?',
53
  'woo-gutenberg-products-block'
54
  ) }
55
  screenReaderLabel={ __(
56
+ 'Introduce Coupon Code',
57
  'woo-gutenberg-products-block'
58
  ) }
59
  htmlFor={ textInputId }
60
  />
61
  }
62
+ titleTag="h2"
63
  >
64
  <LoadingMask
65
  screenReaderLabel={ __(
113
  );
114
  };
115
 
116
+ TotalsCouponCodeInput.propTypes = {
117
  onSubmit: PropTypes.func,
118
  isLoading: PropTypes.bool,
119
  };
120
 
121
+ export default withInstanceId( TotalsCouponCodeInput );
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/stories/index.js RENAMED
@@ -10,12 +10,11 @@ import {
10
  /**
11
  * Internal dependencies
12
  */
13
- import TotalsCoupon from '../';
14
 
15
  export default {
16
- title:
17
- 'WooCommerce Blocks/@base-components/cart-checkout/totals/TotalsCoupon',
18
- component: TotalsCoupon,
19
  };
20
 
21
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
@@ -25,7 +24,7 @@ const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
25
  setValidationErrors( { coupon: invalidCouponText } );
26
  }
27
  };
28
- return <TotalsCoupon isLoading={ isLoading } onSubmit={ onSubmit } />;
29
  };
30
 
31
  export const Default = () => {
10
  /**
11
  * Internal dependencies
12
  */
13
+ import CouponInput from '../';
14
 
15
  export default {
16
+ title: 'WooCommerce Blocks/@base-components/CouponInput',
17
+ component: CouponInput,
 
18
  };
19
 
20
  const StoryComponent = ( { validCoupon, isLoading, invalidCouponText } ) => {
24
  setValidationErrors( { coupon: invalidCouponText } );
25
  }
26
  };
27
+ return <CouponInput isLoading={ isLoading } onSubmit={ onSubmit } />;
28
  };
29
 
30
  export const Default = () => {
assets/js/base/components/cart-checkout/totals/{coupon → totals-coupon-code-input}/style.scss RENAMED
@@ -1,19 +1,7 @@
1
- .wc-block-components-totals-coupon {
2
-
3
- .wc-block-components-panel__button {
4
- margin-top: 0;
5
- padding-top: 0;
6
- }
7
-
8
- .wc-block-components-panel__content {
9
- padding-bottom: 0;
10
- }
11
- }
12
-
13
  .wc-block-components-totals-coupon__form {
14
  display: flex;
15
- width: 100%;
16
  margin-bottom: 0;
 
17
 
18
  .wc-block-components-totals-coupon__input {
19
  margin-bottom: 0;
@@ -22,20 +10,22 @@
22
  }
23
 
24
  .wc-block-components-totals-coupon__button {
25
- height: em(48px);
26
  flex-shrink: 0;
27
  margin-left: $gap-smaller;
28
  padding-left: $gap-large;
29
  padding-right: $gap-large;
30
  white-space: nowrap;
31
  }
32
-
33
- .wc-block-components-totals-coupon__button.no-margin {
34
- margin: 0;
35
- }
36
  }
37
 
38
  .wc-block-components-totals-coupon__content {
39
  flex-direction: column;
40
  position: relative;
 
 
 
 
 
 
41
  }
 
 
 
 
 
 
 
 
 
 
 
 
1
  .wc-block-components-totals-coupon__form {
2
  display: flex;
 
3
  margin-bottom: 0;
4
+ width: 100%;
5
 
6
  .wc-block-components-totals-coupon__input {
7
  margin-bottom: 0;
10
  }
11
 
12
  .wc-block-components-totals-coupon__button {
13
+ height: 48px;
14
  flex-shrink: 0;
15
  margin-left: $gap-smaller;
16
  padding-left: $gap-large;
17
  padding-right: $gap-large;
18
  white-space: nowrap;
19
  }
 
 
 
 
20
  }
21
 
22
  .wc-block-components-totals-coupon__content {
23
  flex-direction: column;
24
  position: relative;
25
+
26
+ .wc-block-components-validation-error {
27
+ margin-top: $gap-smaller;
28
+ position: relative;
29
+ width: 100%;
30
+ }
31
  }
assets/js/base/components/cart-checkout/totals/{discount → totals-discount-item}/index.js RENAMED
@@ -2,21 +2,18 @@
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
 
5
  import LoadingMask from '@woocommerce/base-components/loading-mask';
6
  import { RemovableChip } from '@woocommerce/base-components/chip';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { getSetting } from '@woocommerce/settings';
13
 
14
  /**
15
  * Internal dependencies
16
  */
 
17
  import './style.scss';
18
 
19
- const TotalsDiscount = ( {
20
  cartCoupons = [],
21
  currency,
22
  isRemovingCoupon,
@@ -34,27 +31,16 @@ const TotalsDiscount = ( {
34
  }
35
 
36
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
37
- const discountTotalValue = getSetting(
38
- 'displayCartPricesIncludingTax',
39
- false
40
- )
41
  ? discountValue + discountTaxValue
42
  : discountValue;
43
 
44
- const filteredCartCoupons = __experimentalApplyCheckoutFilter( {
45
- arg: {
46
- context: 'summary',
47
- },
48
- filterName: 'coupons',
49
- defaultValue: cartCoupons,
50
- } );
51
-
52
  return (
53
  <TotalsItem
54
  className="wc-block-components-totals-discount"
55
  currency={ currency }
56
  description={
57
- filteredCartCoupons.length !== 0 && (
58
  <LoadingMask
59
  screenReaderLabel={ __(
60
  'Removing coupon…',
@@ -64,36 +50,34 @@ const TotalsDiscount = ( {
64
  showSpinner={ false }
65
  >
66
  <ul className="wc-block-components-totals-discount__coupon-list">
67
- { filteredCartCoupons.map( ( cartCoupon ) => {
68
- return (
69
- <RemovableChip
70
- key={ 'coupon-' + cartCoupon.code }
71
- className="wc-block-components-totals-discount__coupon-list-item"
72
- text={ cartCoupon.label }
73
- screenReaderText={ sprintf(
74
- /* translators: %s Coupon code. */
75
- __(
76
- 'Coupon: %s',
77
- 'woo-gutenberg-products-block'
78
- ),
79
- cartCoupon.label
80
- ) }
81
- disabled={ isRemovingCoupon }
82
- onRemove={ () => {
83
- removeCoupon( cartCoupon.code );
84
- } }
85
- radius="large"
86
- ariaLabel={ sprintf(
87
- /* translators: %s is a coupon code. */
88
- __(
89
- 'Remove coupon "%s"',
90
- 'woo-gutenberg-products-block'
91
- ),
92
- cartCoupon.label
93
- ) }
94
- />
95
- );
96
- } ) }
97
  </ul>
98
  </LoadingMask>
99
  )
@@ -108,7 +92,7 @@ const TotalsDiscount = ( {
108
  );
109
  };
110
 
111
- TotalsDiscount.propTypes = {
112
  cartCoupons: PropTypes.arrayOf(
113
  PropTypes.shape( {
114
  code: PropTypes.string.isRequired,
@@ -123,4 +107,4 @@ TotalsDiscount.propTypes = {
123
  } ).isRequired,
124
  };
125
 
126
- export default TotalsDiscount;
2
  * External dependencies
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
  import LoadingMask from '@woocommerce/base-components/loading-mask';
7
  import { RemovableChip } from '@woocommerce/base-components/chip';
8
  import PropTypes from 'prop-types';
 
 
 
 
 
9
 
10
  /**
11
  * Internal dependencies
12
  */
13
+ import TotalsItem from '../totals-item';
14
  import './style.scss';
15
 
16
+ const TotalsDiscountItem = ( {
17
  cartCoupons = [],
18
  currency,
19
  isRemovingCoupon,
31
  }
32
 
33
  const discountTaxValue = parseInt( totalDiscountTax, 10 );
34
+ const discountTotalValue = DISPLAY_CART_PRICES_INCLUDING_TAX
 
 
 
35
  ? discountValue + discountTaxValue
36
  : discountValue;
37
 
 
 
 
 
 
 
 
 
38
  return (
39
  <TotalsItem
40
  className="wc-block-components-totals-discount"
41
  currency={ currency }
42
  description={
43
+ cartCoupons.length !== 0 && (
44
  <LoadingMask
45
  screenReaderLabel={ __(
46
  'Removing coupon…',
50
  showSpinner={ false }
51
  >
52
  <ul className="wc-block-components-totals-discount__coupon-list">
53
+ { cartCoupons.map( ( cartCoupon ) => (
54
+ <RemovableChip
55
+ key={ 'coupon-' + cartCoupon.code }
56
+ className="wc-block-components-totals-discount__coupon-list-item"
57
+ text={ cartCoupon.code }
58
+ screenReaderText={ sprintf(
59
+ /* Translators: %s Coupon code. */
60
+ __(
61
+ 'Coupon: %s',
62
+ 'woo-gutenberg-products-block'
63
+ ),
64
+ cartCoupon.code
65
+ ) }
66
+ disabled={ isRemovingCoupon }
67
+ onRemove={ () => {
68
+ removeCoupon( cartCoupon.code );
69
+ } }
70
+ radius="large"
71
+ ariaLabel={ sprintf(
72
+ /* Translators: %s is a coupon code. */
73
+ __(
74
+ 'Remove coupon "%s"',
75
+ 'woo-gutenberg-products-block'
76
+ ),
77
+ cartCoupon.code
78
+ ) }
79
+ />
80
+ ) ) }
 
 
81
  </ul>
82
  </LoadingMask>
83
  )
92
  );
93
  };
94
 
95
+ TotalsDiscountItem.propTypes = {
96
  cartCoupons: PropTypes.arrayOf(
97
  PropTypes.shape( {
98
  code: PropTypes.string.isRequired,
107
  } ).isRequired,
108
  };
109
 
110
+ export default TotalsDiscountItem;
assets/js/base/components/cart-checkout/totals/totals-discount-item/style.scss ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ .wc-block-components-totals-discount__coupon-list {
2
+ list-style: none;
3
+ margin: 0;
4
+ padding: 0;
5
+ }
assets/js/base/components/cart-checkout/totals/totals-fees-item/index.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import { useShippingDataContext } from '@woocommerce/base-context';
7
+ import PropTypes from 'prop-types';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import TotalsItem from '../totals-item';
13
+
14
+ const TotalsFeesItem = ( { currency, values } ) => {
15
+ const { needsShipping } = useShippingDataContext();
16
+ if ( ! needsShipping ) {
17
+ return null;
18
+ }
19
+ const { total_fees: totalFees, total_fees_tax: totalFeesTax } = values;
20
+ const feesValue = parseInt( totalFees, 10 );
21
+
22
+ if ( ! feesValue ) {
23
+ return null;
24
+ }
25
+
26
+ const feesTaxValue = parseInt( totalFeesTax, 10 );
27
+
28
+ return (
29
+ <TotalsItem
30
+ className="wc-block-components-totals-fees"
31
+ currency={ currency }
32
+ label={ __( 'Fees', 'woo-gutenberg-products-block' ) }
33
+ value={
34
+ DISPLAY_CART_PRICES_INCLUDING_TAX
35
+ ? feesValue + feesTaxValue
36
+ : feesValue
37
+ }
38
+ />
39
+ );
40
+ };
41
+
42
+ TotalsFeesItem.propTypes = {
43
+ currency: PropTypes.object.isRequired,
44
+ values: PropTypes.shape( {
45
+ total_fees: PropTypes.string,
46
+ total_fees_tax: PropTypes.string,
47
+ } ).isRequired,
48
+ };
49
+
50
+ export default TotalsFeesItem;
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/index.js RENAMED
@@ -2,50 +2,28 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import { createInterpolateElement } from 'wordpress-element';
6
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
7
  import PropTypes from 'prop-types';
8
- import {
9
- __experimentalApplyCheckoutFilter,
10
- TotalsItem,
11
- } from '@woocommerce/blocks-checkout';
12
- import { useStoreCart } from '@woocommerce/base-context/hooks';
13
- import { getSetting } from '@woocommerce/settings';
14
 
15
  /**
16
  * Internal dependencies
17
  */
 
18
  import './style.scss';
19
 
20
  const TotalsFooterItem = ( { currency, values } ) => {
21
- const SHOW_TAXES =
22
- getSetting( 'taxesEnabled', true ) &&
23
- getSetting( 'displayCartPricesIncludingTax', false );
24
-
25
  const { total_price: totalPrice, total_tax: totalTax } = values;
26
 
27
- // Prepare props to pass to the __experimentalApplyCheckoutFilter filter.
28
- // We need to pluck out receiveCart.
29
- // eslint-disable-next-line no-unused-vars
30
- const { receiveCart, ...cart } = useStoreCart();
31
- const label = __experimentalApplyCheckoutFilter( {
32
- filterName: 'totalLabel',
33
- defaultValue: __( 'Total', 'woo-gutenberg-products-block' ),
34
- extensions: cart.extensions,
35
- arg: { cart },
36
- } );
37
-
38
- const parsedTaxValue = parseInt( totalTax, 10 );
39
-
40
  return (
41
  <TotalsItem
42
  className="wc-block-components-totals-footer-item"
43
  currency={ currency }
44
- label={ label }
45
  value={ parseInt( totalPrice, 10 ) }
46
  description={
47
- SHOW_TAXES &&
48
- parsedTaxValue !== 0 && (
49
  <p className="wc-block-components-totals-footer-item-tax">
50
  { createInterpolateElement(
51
  __(
@@ -57,7 +35,8 @@ const TotalsFooterItem = ( { currency, values } ) => {
57
  <FormattedMonetaryAmount
58
  className="wc-block-components-totals-footer-item-tax-value"
59
  currency={ currency }
60
- value={ parsedTaxValue }
 
61
  />
62
  ),
63
  }
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
  import { createInterpolateElement } from 'wordpress-element';
7
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
8
  import PropTypes from 'prop-types';
 
 
 
 
 
 
9
 
10
  /**
11
  * Internal dependencies
12
  */
13
+ import TotalsItem from '../totals-item';
14
  import './style.scss';
15
 
16
  const TotalsFooterItem = ( { currency, values } ) => {
 
 
 
 
17
  const { total_price: totalPrice, total_tax: totalTax } = values;
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  return (
20
  <TotalsItem
21
  className="wc-block-components-totals-footer-item"
22
  currency={ currency }
23
+ label={ __( 'Total', 'woo-gutenberg-products-block' ) }
24
  value={ parseInt( totalPrice, 10 ) }
25
  description={
26
+ DISPLAY_CART_PRICES_INCLUDING_TAX && (
 
27
  <p className="wc-block-components-totals-footer-item-tax">
28
  { createInterpolateElement(
29
  __(
35
  <FormattedMonetaryAmount
36
  className="wc-block-components-totals-footer-item-tax-value"
37
  currency={ currency }
38
+ displayType="text"
39
+ value={ parseInt( totalTax, 10 ) }
40
  />
41
  ),
42
  }
assets/js/base/components/cart-checkout/totals/{footer-item → totals-footer-item}/style.scss RENAMED
@@ -5,7 +5,7 @@
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
- font-weight: 700;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
5
  }
6
 
7
  .wc-block-components-totals-item__label {
8
+ font-weight: normal;
9
  }
10
 
11
  .wc-block-components-totals-footer-item-tax {
assets/js/base/components/cart-checkout/totals/totals-item/index.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { isValidElement } from '@wordpress/element';
7
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import './style.scss';
13
+
14
+ const TotalsItem = ( { className, currency, label, value, description } ) => {
15
+ return (
16
+ <div
17
+ className={ classnames(
18
+ 'wc-block-components-totals-item',
19
+ className
20
+ ) }
21
+ >
22
+ <span className="wc-block-components-totals-item__label">
23
+ { label }
24
+ </span>
25
+ { isValidElement( value ) ? (
26
+ <div className="wc-block-components-totals-item__value">
27
+ { value }
28
+ </div>
29
+ ) : (
30
+ <FormattedMonetaryAmount
31
+ className="wc-block-components-totals-item__value"
32
+ currency={ currency }
33
+ displayType="text"
34
+ value={ value }
35
+ />
36
+ ) }
37
+ <div className="wc-block-components-totals-item__description">
38
+ { description }
39
+ </div>
40
+ </div>
41
+ );
42
+ };
43
+
44
+ TotalsItem.propTypes = {
45
+ currency: PropTypes.object,
46
+ label: PropTypes.string.isRequired,
47
+ value: PropTypes.oneOfType( [ PropTypes.number, PropTypes.node ] ),
48
+ className: PropTypes.string,
49
+ description: PropTypes.node,
50
+ };
51
+
52
+ export default TotalsItem;
{packages/checkout/totals/item → assets/js/base/components/cart-checkout/totals/totals-item}/style.scss RENAMED
@@ -1,20 +1,16 @@
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
- margin: em($gap-small) 0 0;
5
  width: 100%;
6
-
7
- &:first-child {
8
- margin-top: 0;
9
- }
10
  }
11
 
12
  .wc-block-components-totals-item__label {
13
  flex-grow: 1;
 
14
  }
15
 
16
  .wc-block-components-totals-item__value {
17
- font-weight: bold;
18
  white-space: nowrap;
19
  }
20
 
1
  .wc-block-components-totals-item {
2
  display: flex;
3
  flex-wrap: wrap;
4
+ padding: em($gap-small) 0;
5
  width: 100%;
 
 
 
 
6
  }
7
 
8
  .wc-block-components-totals-item__label {
9
  flex-grow: 1;
10
+ font-weight: bold;
11
  }
12
 
13
  .wc-block-components-totals-item__value {
 
14
  white-space: nowrap;
15
  }
16
 
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/has-shipping-rate.js RENAMED
File without changes
assets/js/base/components/cart-checkout/totals/totals-shipping-item/index.js ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
6
+ import {
7
+ ShippingCalculator,
8
+ ShippingLocation,
9
+ } from '@woocommerce/base-components/cart-checkout';
10
+ import PropTypes from 'prop-types';
11
+ import { useState } from '@wordpress/element';
12
+ import { useStoreCart } from '@woocommerce/base-hooks';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import TotalsItem from '../totals-item';
18
+ import ShippingRateSelector from './shipping-rate-selector';
19
+ import hasShippingRate from './has-shipping-rate';
20
+ import './style.scss';
21
+
22
+ /**
23
+ * Renders the shipping totals row, rates, and calculator if enabled.
24
+ *
25
+ * @param {Object} props Incoming props for the component.
26
+ * @param {Object} props.currency Currency information.
27
+ * @param {Object} props.values Values in use.
28
+ * @param {boolean} props.isCheckout Whether in checkout or not.
29
+ * @param {boolean} props.showCalculator Whether to show shipping calculator or not.
30
+ * @param {boolean} props.showRatesWithoutAddress Whether to show rates without address or not.
31
+ */
32
+ const TotalsShippingItem = ( {
33
+ currency,
34
+ values,
35
+ isCheckout = false,
36
+ showCalculator = true,
37
+ showRatesWithoutAddress = false,
38
+ } ) => {
39
+ const [ isShippingCalculatorOpen, setIsShippingCalculatorOpen ] = useState(
40
+ false
41
+ );
42
+ const {
43
+ shippingRates,
44
+ shippingRatesLoading,
45
+ hasShippingAddress,
46
+ shippingAddress,
47
+ } = useStoreCart();
48
+ const totalShippingValue = DISPLAY_CART_PRICES_INCLUDING_TAX
49
+ ? parseInt( values.total_shipping, 10 ) +
50
+ parseInt( values.total_shipping_tax, 10 )
51
+ : parseInt( values.total_shipping, 10 );
52
+ const hasRates = hasShippingRate( shippingRates ) || totalShippingValue;
53
+ const showingRates = showRatesWithoutAddress || hasShippingAddress;
54
+
55
+ // If we have no rates, and an address is needed.
56
+ if ( ! hasRates && ! hasShippingAddress && ! isCheckout ) {
57
+ return (
58
+ <>
59
+ <TotalsItem
60
+ className="wc-block-components-totals-shipping"
61
+ label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
62
+ value={
63
+ showCalculator ? (
64
+ <button
65
+ className="wc-block-components-totals-shipping__change-address-button"
66
+ onClick={ () => {
67
+ setIsShippingCalculatorOpen(
68
+ ! isShippingCalculatorOpen
69
+ );
70
+ } }
71
+ >
72
+ { __(
73
+ 'Calculate',
74
+ 'woo-gutenberg-products-block'
75
+ ) }
76
+ </button>
77
+ ) : (
78
+ <em>
79
+ { __(
80
+ 'Calculated during checkout',
81
+ 'woo-gutenberg-products-block'
82
+ ) }
83
+ </em>
84
+ )
85
+ }
86
+ />
87
+ { showCalculator && isShippingCalculatorOpen && (
88
+ <ShippingCalculator
89
+ onUpdate={ () => {
90
+ setIsShippingCalculatorOpen( false );
91
+ } }
92
+ />
93
+ ) }
94
+ </>
95
+ );
96
+ }
97
+
98
+ return (
99
+ <div className="wc-block-components-totals-shipping">
100
+ <TotalsItem
101
+ label={ __( 'Shipping', 'woo-gutenberg-products-block' ) }
102
+ value={ totalShippingValue ? totalShippingValue : '' }
103
+ description={
104
+ <>
105
+ <ShippingLocation address={ shippingAddress } />{ ' ' }
106
+ { showCalculator && (
107
+ <button
108
+ className="wc-block-components-totals-shipping__change-address-button"
109
+ onClick={ () => {
110
+ setIsShippingCalculatorOpen(
111
+ ! isShippingCalculatorOpen
112
+ );
113
+ } }
114
+ aria-expanded={ isShippingCalculatorOpen }
115
+ >
116
+ { __(
117
+ '(change address)',
118
+ 'woo-gutenberg-products-block'
119
+ ) }
120
+ </button>
121
+ ) }
122
+ </>
123
+ }
124
+ currency={ currency }
125
+ />
126
+ { showCalculator && isShippingCalculatorOpen && (
127
+ <ShippingCalculator
128
+ onUpdate={ () => {
129
+ setIsShippingCalculatorOpen( false );
130
+ } }
131
+ />
132
+ ) }
133
+ { ! isCheckout && showingRates && (
134
+ <ShippingRateSelector
135
+ hasRates={ hasRates }
136
+ shippingRates={ shippingRates }
137
+ shippingRatesLoading={ shippingRatesLoading }
138
+ />
139
+ ) }
140
+ </div>
141
+ );
142
+ };
143
+
144
+ TotalsShippingItem.propTypes = {
145
+ currency: PropTypes.object.isRequired,
146
+ values: PropTypes.shape( {
147
+ total_shipping: PropTypes.string,
148
+ total_shipping_tax: PropTypes.string,
149
+ } ).isRequired,
150
+ isCheckout: PropTypes.bool,
151
+ showCalculator: PropTypes.bool,
152
+ showRatesWithoutAddress: PropTypes.bool,
153
+ };
154
+
155
+ export default TotalsShippingItem;
assets/js/base/components/cart-checkout/totals/totals-shipping-item/shipping-rate-selector.js ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
+ import { decodeEntities } from '@wordpress/html-entities';
7
+ import { getCurrencyFromPriceResponse } from '@woocommerce/base-utils';
8
+ import { ShippingRatesControl } from '@woocommerce/base-components/cart-checkout';
9
+ import { DISPLAY_CART_PRICES_INCLUDING_TAX } from '@woocommerce/block-settings';
10
+
11
+ const renderShippingRatesControlOption = ( option ) => {
12
+ const priceWithTaxes = DISPLAY_CART_PRICES_INCLUDING_TAX
13
+ ? parseInt( option.price, 10 ) + parseInt( option.taxes, 10 )
14
+ : parseInt( option.price, 10 );
15
+ return {
16
+ label: decodeEntities( option.name ),
17
+ value: option.rate_id,
18
+ description: (
19
+ <>
20
+ { Number.isFinite( priceWithTaxes ) && (
21
+ <FormattedMonetaryAmount
22
+ currency={ getCurrencyFromPriceResponse( option ) }
23
+ value={ priceWithTaxes }
24
+ />
25
+ ) }
26
+ { Number.isFinite( priceWithTaxes ) && option.delivery_time
27
+ ? ' — '
28
+ : null }
29
+ { decodeEntities( option.delivery_time ) }
30
+ </>
31
+ ),
32
+ };
33
+ };
34
+
35
+ const ShippingRateSelector = ( {
36
+ hasRates,
37
+ shippingRates,
38
+ shippingRatesLoading,
39
+ } ) => {
40
+ return (
41
+ <fieldset className="wc-block-components-totals-shipping__fieldset">
42
+ <legend className="screen-reader-text">
43
+ { hasRates
44
+ ? __( 'Shipping options', 'woo-gutenberg-products-block' )
45
+ : __(
46
+ 'Choose a shipping option',
47
+ 'woo-gutenberg-products-block'
48
+ ) }
49
+ </legend>
50
+ <ShippingRatesControl
51
+ className="wc-block-components-totals-shipping__options"
52
+ collapsibleWhenMultiple={ true }
53
+ noResultsMessage={ __(
54
+ 'No shipping options were found.',
55
+ 'woo-gutenberg-products-block'
56
+ ) }
57
+ renderOption={ renderShippingRatesControlOption }
58
+ shippingRates={ shippingRates }
59
+ shippingRatesLoading={ shippingRatesLoading }
60
+ />
61
+ </fieldset>
62
+ );
63
+ };
64
+
65
+ export default ShippingRateSelector;
assets/js/base/components/cart-checkout/totals/{shipping → totals-shipping-item}/style.scss RENAMED
@@ -7,10 +7,6 @@
7
  border: 0;
8
  }
9
 
10
- .wc-block-components-totals-shipping__via {
11
- margin-bottom: $gap;
12
- }
13
-
14
  .wc-block-components-totals-shipping__options {
15
  .wc-block-components-radio-control__label,
16
  .wc-block-components-radio-control__description,
@@ -21,8 +17,15 @@
21
  }
22
  }
23
 
 
 
 
 
 
 
 
24
  .wc-block-components-shipping-rates-control__no-results-notice {
25
- margin: 0 0 em($gap-small);
26
  }
27
 
28
  .wc-block-components-totals-shipping__change-address-button {
@@ -34,9 +37,8 @@
34
  opacity: 0.8;
35
  }
36
  }
37
- }
38
 
39
- // Extra classes for specificity.
40
- .theme-twentytwentyone.theme-twentytwentyone.theme-twentytwentyone .wc-block-components-totals-shipping__change-address-button {
41
- @include link-button();
42
  }
7
  border: 0;
8
  }
9
 
 
 
 
 
10
  .wc-block-components-totals-shipping__options {
11
  .wc-block-components-radio-control__label,
12
  .wc-block-components-radio-control__description,
17
  }
18
  }
19
 
20
+ .wc-block-components-radio-control__option,
21
+ .wc-block-components-radio-control__option-layout {
22
+ &:last-child::after {
23
+ display: none;
24
+ }
25
+ }
26
+
27
  .wc-block-components-shipping-rates-control__no-results-notice {
28
+ margin-bottom: em($gap-small);
29
  }
30
 
31
  .wc-block-components-totals-shipping__change-address-button {
37
  opacity: 0.8;
38
  }
39
  }
 
40
 
41
+ .wc-blocks-components-panel:last-child::after {
42
+ border-bottom-width: 0;
43
+ }
44
  }
assets/js/base/components/cart-checkout/totals/totals-taxes-item/index.js ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
+ import {
7
+ TAXES_ENABLED,
8
+ DISPLAY_ITEMIZED_TAXES,
9
+ } from '@woocommerce/block-settings';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import TotalsItem from '../totals-item';
15
+ import './style.scss';
16
+
17
+ const TotalsTaxesItem = ( { currency, values } ) => {
18
+ const { total_tax: totalTax, tax_lines: taxLines } = values;
19
+
20
+ if ( ! TAXES_ENABLED ) {
21
+ return null;
22
+ }
23
+
24
+ if ( ! DISPLAY_ITEMIZED_TAXES ) {
25
+ return (
26
+ <TotalsItem
27
+ className="wc-block-components-totals-taxes"
28
+ currency={ currency }
29
+ label={ __( 'Taxes', 'woo-gutenberg-products-block' ) }
30
+ value={ parseInt( totalTax, 10 ) }
31
+ />
32
+ );
33
+ }
34
+
35
+ return (
36
+ <>
37
+ { taxLines.map( ( { name, price }, i ) => (
38
+ <TotalsItem
39
+ key={ `tax-line-${ i }` }
40
+ className="wc-block-components-totals-taxes"
41
+ currency={ currency }
42
+ label={ name }
43
+ value={ parseInt( price, 10 ) }
44
+ />
45
+ ) ) }{ ' ' }
46
+ </>
47
+ );
48
+ };
49
+
50
+ TotalsTaxesItem.propTypes = {
51
+ currency: PropTypes.object.isRequired,
52
+ values: PropTypes.shape( {
53
+ total_tax: PropTypes.string,
54
+ } ).isRequired,
55
+ };
56
+
57
+ export default TotalsTaxesItem;
assets/js/base/components/cart-checkout/totals/totals-taxes-item/style.scss ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ .wc-block-components-totals-taxes {
2
+ @include with-translucent-border(1px 0 0);
3
+ }
assets/js/base/components/checkbox-control/stories/index.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text } from '@storybook/addon-knobs';
5
- import { useState } from 'react';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import CheckboxControl from '../';
11
-
12
- export default {
13
- title: 'WooCommerce Blocks/@base-components/CheckboxControl',
14
- component: CheckboxControl,
15
- };
16
-
17
- export const Default = () => {
18
- const [ checked, setChecked ] = useState( false );
19
-
20
- return (
21
- <CheckboxControl
22
- label={ text( 'Label', 'Yes please' ) }
23
- checked={ checked }
24
- onChange={ ( value ) => setChecked( value ) }
25
- />
26
- );
27
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/checkbox-control/style.scss CHANGED
@@ -6,28 +6,22 @@
6
  position: relative;
7
 
8
  .wc-block-components-checkbox__input[type="checkbox"] {
9
- font-size: 1em;
10
  appearance: none;
11
- border: 2px solid $input-border-gray;
12
  border-radius: 2px;
13
- height: em(24px);
14
- width: em(24px);
15
  margin: 0;
16
- min-height: 24px;
17
- min-width: 24px;
18
  overflow: hidden;
19
  position: static;
20
  vertical-align: middle;
21
  background-color: #fff;
22
 
23
  &:checked {
24
- background: #fff;
25
- border-color: $input-border-gray;
26
- }
27
-
28
- &::before,
29
- &::after {
30
- content: "";
31
  }
32
 
33
  &:not(:checked) + .wc-block-components-checkbox__mark {
@@ -36,57 +30,33 @@
36
 
37
  .has-dark-controls & {
38
  border-color: $controls-border-dark;
39
- background-color: $input-background-dark;
40
 
41
  &:checked {
42
- background: $input-background-dark;
43
  border-color: $controls-border-dark;
44
  }
45
  }
46
  }
47
 
48
  .wc-block-components-checkbox__mark {
49
- fill: #000;
50
  position: absolute;
51
- left: em(3px);
52
  top: em(-2px);
53
- width: em(18px);
54
- height: em(18px);
55
-
56
- .has-dark-controls & {
57
- fill: #fff;
58
- }
59
  }
60
 
61
  .wc-block-components-checkbox__label {
62
- padding-left: $gap;
63
  vertical-align: middle;
64
  }
65
  }
66
 
67
  // Hack to hide the check mark in IE11
68
  // See comment: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/2320/#issuecomment-621936576
69
- @include ie11() {
70
- .wc-block-components-checkbox__mark {
71
- display: none;
72
- }
73
- }
74
-
75
- .theme-twentytwentyone {
76
- .wc-block-components-checkbox__input[type="checkbox"],
77
- .has-dark-controls .wc-block-components-checkbox__input[type="checkbox"] {
78
- background-color: #fff;
79
- border-color: var(--form--border-color);
80
- position: relative;
81
- }
82
-
83
- .wc-block-components-checkbox__input[type="checkbox"]:checked,
84
- .has-dark-controls
85
- .wc-block-components-checkbox__input[type="checkbox"]:checked {
86
- background-color: #fff;
87
- border-color: var(--form--border-color);
88
- }
89
-
90
  .wc-block-components-checkbox__mark {
91
  display: none;
92
  }
6
  position: relative;
7
 
8
  .wc-block-components-checkbox__input[type="checkbox"] {
 
9
  appearance: none;
10
+ border: 2px solid currentColor;
11
  border-radius: 2px;
12
+ height: em(18px);
13
+ width: em(18px);
14
  margin: 0;
15
+ min-height: 18px;
16
+ min-width: 18px;
17
  overflow: hidden;
18
  position: static;
19
  vertical-align: middle;
20
  background-color: #fff;
21
 
22
  &:checked {
23
+ background: currentColor;
24
+ border-color: currentColor;
 
 
 
 
 
25
  }
26
 
27
  &:not(:checked) + .wc-block-components-checkbox__mark {
30
 
31
  .has-dark-controls & {
32
  border-color: $controls-border-dark;
33
+ background-color: transparent;
34
 
35
  &:checked {
36
+ background: transparent;
37
  border-color: $controls-border-dark;
38
  }
39
  }
40
  }
41
 
42
  .wc-block-components-checkbox__mark {
43
+ fill: #fff;
44
  position: absolute;
45
+ left: em(1px);
46
  top: em(-2px);
47
+ width: em(16px);
48
+ height: em(16px);
 
 
 
 
49
  }
50
 
51
  .wc-block-components-checkbox__label {
52
+ padding-left: $gap-smaller;
53
  vertical-align: middle;
54
  }
55
  }
56
 
57
  // Hack to hide the check mark in IE11
58
  // See comment: https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/2320/#issuecomment-621936576
59
+ @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  .wc-block-components-checkbox__mark {
61
  display: none;
62
  }
assets/js/base/components/checkbox-list/index.js CHANGED
@@ -16,7 +16,7 @@ import './style.scss';
16
  *
17
  * @param {Object} props Incoming props for the component.
18
  * @param {string} props.className CSS class used.
19
- * @param {function(string):any} props.onChange Function called when inputs change.
20
  * @param {Array} props.options Options for list.
21
  * @param {Array} props.checked Which items are checked.
22
  * @param {boolean} props.isLoading If loading or not.
@@ -58,7 +58,7 @@ const CheckboxList = ( {
58
  } }
59
  aria-expanded={ false }
60
  aria-label={ sprintf(
61
- /* translators: %s is referring the remaining count of options */
62
  _n(
63
  'Show %s more option',
64
  'Show %s more options',
@@ -69,7 +69,7 @@ const CheckboxList = ( {
69
  ) }
70
  >
71
  { sprintf(
72
- /* translators: %s number of options to reveal. */
73
  _n(
74
  'Show %s more',
75
  'Show %s more',
@@ -110,7 +110,7 @@ const CheckboxList = ( {
110
  const optionCount = options.length;
111
  const shouldTruncateOptions = optionCount > limit + 5;
112
  return (
113
- <>
114
  { options.map( ( option, index ) => (
115
  <Fragment key={ option.value }>
116
  <li
@@ -138,11 +138,10 @@ const CheckboxList = ( {
138
  </Fragment>
139
  ) ) }
140
  { shouldTruncateOptions && renderedShowLess }
141
- </>
142
  );
143
  }, [
144
  options,
145
- onChange,
146
  checked,
147
  showExpanded,
148
  limit,
16
  *
17
  * @param {Object} props Incoming props for the component.
18
  * @param {string} props.className CSS class used.
19
+ * @param {function():any} props.onChange Function called when inputs change.
20
  * @param {Array} props.options Options for list.
21
  * @param {Array} props.checked Which items are checked.
22
  * @param {boolean} props.isLoading If loading or not.
58
  } }
59
  aria-expanded={ false }
60
  aria-label={ sprintf(
61
+ /* Translators: %s is referring the remaining count of options */
62
  _n(
63
  'Show %s more option',
64
  'Show %s more options',
69
  ) }
70
  >
71
  { sprintf(
72
+ // translators: %s number of options to reveal.
73
  _n(
74
  'Show %s more',
75
  'Show %s more',
110
  const optionCount = options.length;
111
  const shouldTruncateOptions = optionCount > limit + 5;
112
  return (
113
+ <Fragment>
114
  { options.map( ( option, index ) => (
115
  <Fragment key={ option.value }>
116
  <li
138
  </Fragment>
139
  ) ) }
140
  { shouldTruncateOptions && renderedShowLess }
141
+ </Fragment>
142
  );
143
  }, [
144
  options,
 
145
  checked,
146
  showExpanded,
147
  limit,
assets/js/base/components/chip/removable-chip.js CHANGED
@@ -9,7 +9,7 @@ import { Icon, noAlt } from '@woocommerce/icons';
9
  /**
10
  * Internal dependencies
11
  */
12
- import Chip from './chip.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
9
  /**
10
  * Internal dependencies
11
  */
12
+ import { Chip } from './index.js';
13
 
14
  /**
15
  * Component used to render a "chip" -- an item containing some text with
assets/js/base/components/chip/stories/index.js DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { text, select, boolean } from '@storybook/addon-knobs';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import * as components from '../';
10
-
11
- export default {
12
- title: 'WooCommerce Blocks/@base-components/Chip',
13
- component: Chip,
14
- };
15
-
16
- const radii = [ 'none', 'small', 'medium', 'large' ];
17
-
18
- export const Chip = () => (
19
- <components.Chip
20
- text={ text( 'Text', 'example' ) }
21
- radius={ select( 'Radius', radii ) }
22
- screenReaderText={ text(
23
- 'Screen reader text',
24
- 'Example screen reader text'
25
- ) }
26
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
27
- />
28
- );
29
-
30
- export const RemovableChip = () => (
31
- <components.RemovableChip
32
- text={ text( 'Text', 'example' ) }
33
- radius={ select( 'Radius', radii ) }
34
- screenReaderText={ text(
35
- 'Screen reader text',
36
- 'Example screen reader text'
37
- ) }
38
- disabled={ boolean( 'Disabled', false ) }
39
- removeOnAnyClick={ boolean( 'Remove on any click', false ) }
40
- element={ select( 'Element', [ 'li', 'div', 'span' ], 'li' ) }
41
- />
42
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/chip/style.scss CHANGED
@@ -14,8 +14,8 @@
14
  &:hover,
15
  &:focus,
16
  &:active {
17
- background: $gray-200;
18
- color: $gray-900;
19
  }
20
 
21
  &.wc-block-components-chip--radius-small {
@@ -55,11 +55,11 @@ button.wc-block-components-chip:hover > .wc-block-components-chip__remove,
55
  button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
56
  .wc-block-components-chip__remove:hover,
57
  .wc-block-components-chip__remove:focus {
58
- fill: $alert-red;
59
  }
60
 
61
  button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
62
  .wc-block-components-chip__remove:disabled {
63
- fill: $gray-600;
64
  cursor: not-allowed;
65
  }
14
  &:hover,
15
  &:focus,
16
  &:active {
17
+ background: $core-grey-light-500;
18
+ color: $core-grey-dark-800;
19
  }
20
 
21
  &.wc-block-components-chip--radius-small {
55
  button.wc-block-components-chip:focus > .wc-block-components-chip__remove,
56
  .wc-block-components-chip__remove:hover,
57
  .wc-block-components-chip__remove:focus {
58
+ fill: #d94f4f;
59
  }
60
 
61
  button.wc-block-components-chip:disabled > .wc-block-components-chip__remove,
62
  .wc-block-components-chip__remove:disabled {
63
+ fill: $core-grey-dark-100;
64
  cursor: not-allowed;
65
  }
assets/js/base/components/chip/test/__snapshots__/index.js.snap CHANGED
@@ -106,9 +106,9 @@ exports[`RemovableChip should render custom aria label 1`] = `
106
  onKeyDown={[Function]}
107
  >
108
  <svg
109
- aria-hidden={true}
110
  className="wc-block-components-chip__remove-icon"
111
- focusable={false}
112
  height={16}
113
  role="img"
114
  viewBox="0 0 20 20"
@@ -148,9 +148,9 @@ exports[`RemovableChip should render default aria label if text is a node 1`] =
148
  onKeyDown={[Function]}
149
  >
150
  <svg
151
- aria-hidden={true}
152
  className="wc-block-components-chip__remove-icon"
153
- focusable={false}
154
  height={16}
155
  role="img"
156
  viewBox="0 0 20 20"
@@ -188,9 +188,9 @@ exports[`RemovableChip should render screen reader text aria label 1`] = `
188
  onKeyDown={[Function]}
189
  >
190
  <svg
191
- aria-hidden={true}
192
  className="wc-block-components-chip__remove-icon"
193
- focusable={false}
194
  height={16}
195
  role="img"
196
  viewBox="0 0 20 20"
@@ -223,9 +223,9 @@ exports[`RemovableChip should render text and the remove button 1`] = `
223
  onKeyDown={[Function]}
224
  >
225
  <svg
226
- aria-hidden={true}
227
  className="wc-block-components-chip__remove-icon"
228
- focusable={false}
229
  height={16}
230
  role="img"
231
  viewBox="0 0 20 20"
@@ -258,9 +258,9 @@ exports[`RemovableChip should render with disabled remove button 1`] = `
258
  onKeyDown={[Function]}
259
  >
260
  <svg
261
- aria-hidden={true}
262
  className="wc-block-components-chip__remove-icon"
263
- focusable={false}
264
  height={16}
265
  role="img"
266
  viewBox="0 0 20 20"
@@ -294,9 +294,9 @@ exports[`RemovableChip with removeOnAnyClick should be a button when removeOnAny
294
  className="wc-block-components-chip__remove"
295
  >
296
  <svg
297
- aria-hidden={true}
298
  className="wc-block-components-chip__remove-icon"
299
- focusable={false}
300
  height={16}
301
  role="img"
302
  viewBox="0 0 20 20"
106
  onKeyDown={[Function]}
107
  >
108
  <svg
109
+ aria-hidden="true"
110
  className="wc-block-components-chip__remove-icon"
111
+ focusable="false"
112
  height={16}
113
  role="img"
114
  viewBox="0 0 20 20"
148
  onKeyDown={[Function]}
149
  >
150
  <svg
151
+ aria-hidden="true"
152
  className="wc-block-components-chip__remove-icon"
153
+ focusable="false"
154
  height={16}
155
  role="img"
156
  viewBox="0 0 20 20"
188
  onKeyDown={[Function]}
189
  >
190
  <svg
191
+ aria-hidden="true"
192
  className="wc-block-components-chip__remove-icon"
193
+ focusable="false"
194
  height={16}
195
  role="img"
196
  viewBox="0 0 20 20"
223
  onKeyDown={[Function]}
224
  >
225
  <svg
226
+ aria-hidden="true"
227
  className="wc-block-components-chip__remove-icon"
228
+ focusable="false"
229
  height={16}
230
  role="img"
231
  viewBox="0 0 20 20"
258
  onKeyDown={[Function]}
259
  >
260
  <svg
261
+ aria-hidden="true"
262
  className="wc-block-components-chip__remove-icon"
263
+ focusable="false"
264
  height={16}
265
  role="img"
266
  viewBox="0 0 20 20"
294
  className="wc-block-components-chip__remove"
295
  >
296
  <svg
297
+ aria-hidden="true"
298
  className="wc-block-components-chip__remove-icon"
299
+ focusable="false"
300
  height={16}
301
  role="img"
302
  viewBox="0 0 20 20"
assets/js/base/components/country-input/CountryInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface CountryInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- onChange: ( value: string ) => void;
8
- required?: boolean;
9
- errorMessage?: string;
10
- errorId: null | 'shipping-missing-country';
11
- }
12
-
13
- export type CountryInputWithCountriesProps = CountryInputProps & {
14
- countries: Record< string, string >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/billing-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const BillingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ BillingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingCountryInput;
assets/js/base/components/country-input/billing-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import type { CountryInputProps } from './CountryInputProps';
11
-
12
- const BillingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ ALLOWED_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default BillingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/{country-input.tsx → country-input.js} RENAMED
@@ -3,6 +3,7 @@
3
  */
4
  import { useMemo } from '@wordpress/element';
5
  import { __ } from '@wordpress/i18n';
 
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import classnames from 'classnames';
8
 
@@ -11,7 +12,6 @@ import classnames from 'classnames';
11
  */
12
  import { ValidatedSelect } from '../select';
13
  import './style.scss';
14
- import type { CountryInputWithCountriesProps } from './CountryInputProps';
15
 
16
  const CountryInput = ( {
17
  className,
@@ -27,7 +27,7 @@ const CountryInput = ( {
27
  'Please select a country.',
28
  'woo-gutenberg-products-block'
29
  ),
30
- }: CountryInputWithCountriesProps ): JSX.Element => {
31
  const options = useMemo(
32
  () =>
33
  Object.keys( countries ).map( ( key ) => ( {
@@ -81,4 +81,16 @@ const CountryInput = ( {
81
  );
82
  };
83
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  export default CountryInput;
3
  */
4
  import { useMemo } from '@wordpress/element';
5
  import { __ } from '@wordpress/i18n';
6
+ import PropTypes from 'prop-types';
7
  import { decodeEntities } from '@wordpress/html-entities';
8
  import classnames from 'classnames';
9
 
12
  */
13
  import { ValidatedSelect } from '../select';
14
  import './style.scss';
 
15
 
16
  const CountryInput = ( {
17
  className,
27
  'Please select a country.',
28
  'woo-gutenberg-products-block'
29
  ),
30
+ } ) => {
31
  const options = useMemo(
32
  () =>
33
  Object.keys( countries ).map( ( key ) => ( {
81
  );
82
  };
83
 
84
+ CountryInput.propTypes = {
85
+ countries: PropTypes.objectOf( PropTypes.string ).isRequired,
86
+ onChange: PropTypes.func.isRequired,
87
+ className: PropTypes.string,
88
+ id: PropTypes.string,
89
+ label: PropTypes.string,
90
+ value: PropTypes.string,
91
+ autoComplete: PropTypes.string,
92
+ errorId: PropTypes.string,
93
+ errorMessage: PropTypes.string,
94
+ };
95
+
96
  export default CountryInput;
assets/js/base/components/country-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/country-input/shipping-country-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import CountryInput from './country-input.js';
11
+
12
+ const ShippingCountryInput = ( props ) => {
13
+ return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
+ };
15
+
16
+ ShippingCountryInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingCountryInput;
assets/js/base/components/country-input/shipping-country-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_COUNTRIES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import CountryInput from './country-input';
10
- import { CountryInputProps } from './CountryInputProps';
11
-
12
- const ShippingCountryInput = ( props: CountryInputProps ): JSX.Element => {
13
- return <CountryInput countries={ SHIPPING_COUNTRIES } { ...props } />;
14
- };
15
-
16
- export default ShippingCountryInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/country-input/stories/index.js CHANGED
@@ -27,7 +27,7 @@ const StoryComponent = ( { label, errorMessage } ) => {
27
  } = useValidationContext();
28
  useEffect( () => {
29
  setValidationErrors( { country: errorMessage } );
30
- }, [ errorMessage, setValidationErrors ] );
31
  const updateCountry = ( country ) => {
32
  clearValidationError( 'country' );
33
  selectCountry( country );
27
  } = useValidationContext();
28
  useEffect( () => {
29
  setValidationErrors( { country: errorMessage } );
30
+ }, [ errorMessage ] );
31
  const updateCountry = ( country ) => {
32
  clearValidationError( 'country' );
33
  selectCountry( country );
assets/js/base/components/dropdown-selector/index.js CHANGED
@@ -155,7 +155,7 @@ const DropdownSelector = ( {
155
  checked.length > 0 && multiple
156
  ? null
157
  : sprintf(
158
- /* translators: %s attribute name. */
159
  __(
160
  'Any %s',
161
  'woo-gutenberg-products-block'
155
  checked.length > 0 && multiple
156
  ? null
157
  : sprintf(
158
+ // Translators: %s attribute name.
159
  __(
160
  'Any %s',
161
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/menu.js CHANGED
@@ -38,7 +38,7 @@ const DropdownSelectorMenu = ( {
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
41
- /* translators: %s is referring to the filter option being removed. */
42
  __(
43
  'Remove %s filter',
44
  'woo-gutenberg-products-block'
38
  item: option.value,
39
  'aria-label': selected
40
  ? sprintf(
41
+ /* Translators: %s is referring to the filter option being removed. */
42
  __(
43
  'Remove %s filter',
44
  'woo-gutenberg-products-block'
assets/js/base/components/dropdown-selector/selected-chip.js CHANGED
@@ -13,7 +13,7 @@ const DropdownSelectorSelectedChip = ( { onRemoveItem, option } ) => {
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
16
- /* translators: %s is referring to the filter option being removed. */
17
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
18
  option.name
19
  ) }
13
  onRemoveItem( option.value );
14
  } }
15
  ariaLabel={ sprintf(
16
+ /* Translators: %s is referring to the filter option being removed. */
17
  __( 'Remove %s filter', 'woo-gutenberg-products-block' ),
18
  option.name
19
  ) }
assets/js/base/components/dropdown-selector/style.scss CHANGED
@@ -20,7 +20,7 @@ $dropdown-selector-line-height: 18/14;
20
  padding: 2px $gap-smaller;
21
 
22
  .is-disabled & {
23
- background-color: $gray-200;
24
  }
25
 
26
  .is-multiple.has-checked > & {
@@ -102,7 +102,7 @@ $dropdown-selector-line-height: 18/14;
102
  .wc-block-components-dropdown-selector__selected-value {
103
  @include font-size(small);
104
  align-items: center;
105
- color: $gray-700;
106
  display: inline-flex;
107
  margin: em($gap-small/4) 0;
108
  padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
@@ -155,14 +155,14 @@ $dropdown-selector-line-height: 18/14;
155
 
156
  .wc-block-components-dropdown-selector__list-item {
157
  @include font-size(small);
158
- color: $gray-700;
159
  cursor: default;
160
  list-style: none;
161
  margin: 0;
162
  padding: 0 $gap-smallest;
163
 
164
  &.is-selected {
165
- background-color: $gray-300;
166
  }
167
 
168
  &:hover,
20
  padding: 2px $gap-smaller;
21
 
22
  .is-disabled & {
23
+ background-color: $core-grey-light-500;
24
  }
25
 
26
  .is-multiple.has-checked > & {
102
  .wc-block-components-dropdown-selector__selected-value {
103
  @include font-size(small);
104
  align-items: center;
105
+ color: $core-grey-dark-600;
106
  display: inline-flex;
107
  margin: em($gap-small/4) 0;
108
  padding: em($gap-smallest * 0.75) 0 em($gap-smallest * 0.75);
155
 
156
  .wc-block-components-dropdown-selector__list-item {
157
  @include font-size(small);
158
+ color: $core-grey-dark-600;
159
  cursor: default;
160
  list-style: none;
161
  margin: 0;
162
  padding: 0 $gap-smallest;
163
 
164
  &.is-selected {
165
+ background-color: $core-grey-light-600;
166
  }
167
 
168
  &:hover,
assets/js/base/components/filter-submit-button/index.js CHANGED
@@ -14,7 +14,7 @@ import './style.scss';
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
- /* translators: Submit button text for filters. */
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
14
  const FilterSubmitButton = ( {
15
  className,
16
  disabled,
17
+ // translators: Submit button text for filters.
18
  label = __( 'Go', 'woo-gutenberg-products-block' ),
19
  onClick,
20
  screenReaderLabel = __( 'Apply filter', 'woo-gutenberg-products-block' ),
assets/js/base/components/formatted-monetary-amount/{index.tsx → index.js} RENAMED
@@ -1,33 +1,21 @@
1
  /**
2
  * External dependencies
3
  */
4
- import NumberFormat, {
5
- NumberFormatValues,
6
- NumberFormatProps,
7
- } from 'react-number-format';
8
  import classNames from 'classnames';
9
- import type { Currency } from '@woocommerce/price-format';
10
- import type { ReactElement } from 'react';
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
  import './style.scss';
16
 
17
- interface FormattedMonetaryAmountProps {
18
- className?: string;
19
- displayType?: NumberFormatProps[ 'displayType' ];
20
- value: number | string; // Value of money amount.
21
- currency: Currency | Record< string, never >; // Currency configuration object.
22
- onValueChange?: ( unit: number ) => void; // Function to call when value changes.
23
- }
24
-
25
  /**
26
  * Formats currency data into the expected format for NumberFormat.
 
 
 
27
  */
28
- const currencyToNumberFormat = (
29
- currency: FormattedMonetaryAmountProps[ 'currency' ]
30
- ) => {
31
  return {
32
  thousandSeparator: currency.thousandSeparator,
33
  decimalSeparator: currency.decimalSeparator,
@@ -40,22 +28,25 @@ const currencyToNumberFormat = (
40
  };
41
 
42
  /**
43
- * FormattedMonetaryAmount component.
44
  *
45
  * Takes a price and returns a formatted price using the NumberFormat component.
 
 
 
 
 
 
 
46
  */
47
  const FormattedMonetaryAmount = ( {
48
  className,
49
- value: rawValue,
50
  currency,
51
  onValueChange,
52
- displayType = 'text',
53
  ...props
54
- }: FormattedMonetaryAmountProps ): ReactElement | null => {
55
- const value =
56
- typeof rawValue === 'string' ? parseInt( rawValue, 10 ) : rawValue;
57
-
58
- if ( ! Number.isFinite( value ) ) {
59
  return null;
60
  }
61
 
@@ -71,6 +62,7 @@ const FormattedMonetaryAmount = ( {
71
  className
72
  );
73
  const numberFormatProps = {
 
74
  ...props,
75
  ...currencyToNumberFormat( currency ),
76
  value: undefined,
@@ -80,20 +72,15 @@ const FormattedMonetaryAmount = ( {
80
 
81
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
82
  const onValueChangeWrapper = onValueChange
83
- ? ( values: NumberFormatValues ) => {
84
- const minorUnitValue =
85
- ( ( values.value as unknown ) as number ) *
86
- 10 ** currency.minorUnit;
87
  onValueChange( minorUnitValue );
88
  }
89
- : () => {
90
- /* not used */
91
- };
92
 
93
  return (
94
  <NumberFormat
95
  className={ classes }
96
- displayType={ displayType }
97
  { ...numberFormatProps }
98
  value={ priceValue }
99
  onValueChange={ onValueChangeWrapper }
1
  /**
2
  * External dependencies
3
  */
4
+ import NumberFormat from 'react-number-format';
 
 
 
5
  import classNames from 'classnames';
 
 
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import './style.scss';
11
 
 
 
 
 
 
 
 
 
12
  /**
13
  * Formats currency data into the expected format for NumberFormat.
14
+ *
15
+ * @param {Object} currency Currency data.
16
+ * @return {Object} Formatted props for NumberFormat.
17
  */
18
+ const currencyToNumberFormat = ( currency ) => {
 
 
19
  return {
20
  thousandSeparator: currency.thousandSeparator,
21
  decimalSeparator: currency.decimalSeparator,
28
  };
29
 
30
  /**
31
+ * Formatted price component.
32
  *
33
  * Takes a price and returns a formatted price using the NumberFormat component.
34
+ *
35
+ * @param {Object} props Component props.
36
+ * @param {string} props.className CSS class used.
37
+ * @param {number} props.value Value of money amount.
38
+ * @param {Object} props.currency Currency configuration object.
39
+ * @param {function():any} props.onValueChange Function to call when value changes.
40
+ * @param {Object} props.props Rest of props passed into component.
41
  */
42
  const FormattedMonetaryAmount = ( {
43
  className,
44
+ value,
45
  currency,
46
  onValueChange,
 
47
  ...props
48
+ } ) => {
49
+ if ( value === '-' ) {
 
 
 
50
  return null;
51
  }
52
 
62
  className
63
  );
64
  const numberFormatProps = {
65
+ displayType: 'text',
66
  ...props,
67
  ...currencyToNumberFormat( currency ),
68
  value: undefined,
72
 
73
  // Wrapper for NumberFormat onValueChange which handles subunit conversion.
74
  const onValueChangeWrapper = onValueChange
75
+ ? ( values ) => {
76
+ const minorUnitValue = values.value * 10 ** currency.minorUnit;
 
 
77
  onValueChange( minorUnitValue );
78
  }
79
+ : () => {};
 
 
80
 
81
  return (
82
  <NumberFormat
83
  className={ classes }
 
84
  { ...numberFormatProps }
85
  value={ priceValue }
86
  onValueChange={ onValueChangeWrapper }
assets/js/base/components/label/{index.tsx → index.js} RENAMED
@@ -1,29 +1,27 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { Fragment } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
- import type { ReactElement, HTMLProps } from 'react';
7
-
8
- interface LabelProps extends HTMLProps< HTMLElement > {
9
- label?: string;
10
- screenReaderLabel?: string;
11
- wrapperElement?: string;
12
- wrapperProps?: HTMLProps< HTMLElement >;
13
- }
14
 
15
  /**
16
  * Component used to render an accessible text given a label and/or a
17
  * screenReaderLabel. The wrapper element and wrapper props can also be
18
  * specified via props.
19
  *
 
 
 
 
 
20
  */
21
  const Label = ( {
22
  label,
23
  screenReaderLabel,
24
  wrapperElement,
25
  wrapperProps = {},
26
- }: LabelProps ): ReactElement => {
27
  let Wrapper;
28
 
29
  const hasLabel = typeof label !== 'undefined' && label !== null;
@@ -59,4 +57,11 @@ const Label = ( {
59
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
60
  };
61
 
 
 
 
 
 
 
 
62
  export default Label;
1
  /**
2
  * External dependencies
3
  */
4
+ import PropTypes from 'prop-types';
5
+ import { Fragment } from 'react';
6
  import classNames from 'classnames';
 
 
 
 
 
 
 
 
7
 
8
  /**
9
  * Component used to render an accessible text given a label and/or a
10
  * screenReaderLabel. The wrapper element and wrapper props can also be
11
  * specified via props.
12
  *
13
+ * @param {Object} props Incoming props for the component.
14
+ * @param {string} [props.label] Label content.
15
+ * @param {string} [props.screenReaderLabel] Content for screen readers.
16
+ * @param {string} [props.wrapperElement] What element is used to wrap the label.
17
+ * @param {Object} [props.wrapperProps] Props passed into wrapper element.
18
  */
19
  const Label = ( {
20
  label,
21
  screenReaderLabel,
22
  wrapperElement,
23
  wrapperProps = {},
24
+ } ) => {
25
  let Wrapper;
26
 
27
  const hasLabel = typeof label !== 'undefined' && label !== null;
57
  return <Wrapper { ...wrapperProps }>{ label }</Wrapper>;
58
  };
59
 
60
+ Label.propTypes = {
61
+ label: PropTypes.node,
62
+ screenReaderLabel: PropTypes.node,
63
+ wrapperElement: PropTypes.elementType,
64
+ wrapperProps: PropTypes.object,
65
+ };
66
+
67
  export default Label;
assets/js/base/components/loading-mask/index.js CHANGED
@@ -4,14 +4,13 @@
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
 
7
 
8
  /**
9
  * Internal dependencies
10
  */
11
  import './style.scss';
12
- import Spinner from '../spinner';
13
 
14
- // @todo Find a way to block buttons/form components when LoadingMask isLoading
15
  const LoadingMask = ( {
16
  children,
17
  className,
@@ -19,27 +18,29 @@ const LoadingMask = ( {
19
  showSpinner = false,
20
  isLoading = true,
21
  } ) => {
 
 
 
 
 
22
  return (
23
  <div
24
- className={ classNames( className, {
25
- 'wc-block-components-loading-mask': isLoading,
26
- } ) }
 
27
  >
28
- { isLoading && showSpinner && <Spinner /> }
29
  <div
30
- className={ classNames( {
31
- 'wc-block-components-loading-mask__children': isLoading,
32
- } ) }
33
- aria-hidden={ isLoading }
34
  >
35
  { children }
36
  </div>
37
- { isLoading && (
38
- <span className="screen-reader-text">
39
- { screenReaderLabel ||
40
- __( 'Loading…', 'woo-gutenberg-products-block' ) }
41
- </span>
42
- ) }
43
  </div>
44
  );
45
  };
4
  import { __ } from '@wordpress/i18n';
5
  import PropTypes from 'prop-types';
6
  import classNames from 'classnames';
7
+ import { Spinner } from 'wordpress-components';
8
 
9
  /**
10
  * Internal dependencies
11
  */
12
  import './style.scss';
 
13
 
 
14
  const LoadingMask = ( {
15
  children,
16
  className,
18
  showSpinner = false,
19
  isLoading = true,
20
  } ) => {
21
+ // If nothing is loading, just pass through the children.
22
+ if ( ! isLoading ) {
23
+ return children;
24
+ }
25
+
26
  return (
27
  <div
28
+ className={ classNames(
29
+ className,
30
+ 'wc-block-components-loading-mask'
31
+ ) }
32
  >
33
+ { showSpinner && <Spinner /> }
34
  <div
35
+ className="wc-block-components-loading-mask__children"
36
+ aria-hidden={ true }
 
 
37
  >
38
  { children }
39
  </div>
40
+ <span className="screen-reader-text">
41
+ { screenReaderLabel ||
42
+ __( 'Loading…', 'woo-gutenberg-products-block' ) }
43
+ </span>
 
 
44
  </div>
45
  );
46
  };
assets/js/base/components/loading-mask/style.scss CHANGED
@@ -1,7 +1,6 @@
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
4
- pointer-events: none;
5
 
6
  .components-spinner {
7
  position: absolute;
@@ -10,8 +9,8 @@
10
  left: 50%;
11
  transform: translate(-50%, -50%);
12
  }
 
13
 
14
- .wc-block-components-loading-mask__children {
15
- opacity: 0.25;
16
- }
17
  }
1
  .wc-block-components-loading-mask {
2
  position: relative;
3
  min-height: 18px + $gap;
 
4
 
5
  .components-spinner {
6
  position: absolute;
9
  left: 50%;
10
  transform: translate(-50%, -50%);
11
  }
12
+ }
13
 
14
+ .wc-block-components-loading-mask__children {
15
+ opacity: 0.5;
 
16
  }
packages/checkout/panel/index.tsx → assets/js/base/components/panel/index.js RENAMED
@@ -2,8 +2,8 @@
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
5
- import type { ReactNode, ReactElement } from 'react';
6
  import classNames from 'classnames';
 
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
@@ -11,15 +11,6 @@ import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
11
  */
12
  import './style.scss';
13
 
14
- interface PanelProps {
15
- children?: ReactNode;
16
- className?: string;
17
- initialOpen?: boolean;
18
- hasBorder?: boolean;
19
- title?: ReactNode;
20
- titleTag?: keyof JSX.IntrinsicElements;
21
- }
22
-
23
  const Panel = ( {
24
  children,
25
  className,
@@ -27,31 +18,31 @@ const Panel = ( {
27
  hasBorder = false,
28
  title,
29
  titleTag: TitleTag = 'div',
30
- }: PanelProps ): ReactElement => {
31
- const [ isOpen, setIsOpen ] = useState< boolean >( initialOpen );
32
 
33
  return (
34
  <div
35
- className={ classNames( className, 'wc-block-components-panel', {
36
  'has-border': hasBorder,
37
  } ) }
38
  >
39
  <TitleTag>
40
  <button
41
  aria-expanded={ isOpen }
42
- className="wc-block-components-panel__button"
43
  onClick={ () => setIsOpen( ! isOpen ) }
44
  >
45
  <Icon
46
  aria-hidden="true"
47
- className="wc-block-components-panel__button-icon"
48
  srcElement={ isOpen ? chevronUp : chevronDown }
49
  />
50
  { title }
51
  </button>
52
  </TitleTag>
53
  <div
54
- className="wc-block-components-panel__content"
55
  hidden={ ! isOpen }
56
  >
57
  { children }
@@ -60,4 +51,12 @@ const Panel = ( {
60
  );
61
  };
62
 
 
 
 
 
 
 
 
 
63
  export default Panel;
2
  * External dependencies
3
  */
4
  import { useState } from '@wordpress/element';
 
5
  import classNames from 'classnames';
6
+ import PropTypes from 'prop-types';
7
  import { Icon, chevronUp, chevronDown } from '@woocommerce/icons';
8
 
9
  /**
11
  */
12
  import './style.scss';
13
 
 
 
 
 
 
 
 
 
 
14
  const Panel = ( {
15
  children,
16
  className,
18
  hasBorder = false,
19
  title,
20
  titleTag: TitleTag = 'div',
21
+ } ) => {
22
+ const [ isOpen, setIsOpen ] = useState( initialOpen );
23
 
24
  return (
25
  <div
26
+ className={ classNames( className, 'wc-blocks-components-panel', {
27
  'has-border': hasBorder,
28
  } ) }
29
  >
30
  <TitleTag>
31
  <button
32
  aria-expanded={ isOpen }
33
+ className="wc-blocks-components-panel__button"
34
  onClick={ () => setIsOpen( ! isOpen ) }
35
  >
36
  <Icon
37
  aria-hidden="true"
38
+ className="wc-blocks-components-panel__button-icon"
39
  srcElement={ isOpen ? chevronUp : chevronDown }
40
  />
41
  { title }
42
  </button>
43
  </TitleTag>
44
  <div
45
+ className="wc-blocks-components-panel__content"
46
  hidden={ ! isOpen }
47
  >
48
  { children }
51
  );
52
  };
53
 
54
+ Panel.propTypes = {
55
+ className: PropTypes.string,
56
+ hasBorder: PropTypes.bool,
57
+ initialOpen: PropTypes.bool,
58
+ title: PropTypes.element,
59
+ titleTag: PropTypes.string,
60
+ };
61
+
62
  export default Panel;
assets/js/base/components/panel/style.scss ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .wc-blocks-components-panel.has-border {
2
+ @include with-translucent-border( 1px 0 );
3
+
4
+ + .wc-blocks-components-panel.has-border::after {
5
+ border-top-width: 0;
6
+ }
7
+ }
8
+
9
+ .wc-blocks-components-panel__button {
10
+ @include reset-box();
11
+ height: auto;
12
+ line-height: 1;
13
+ margin-bottom: em(6px);
14
+ margin-top: em(6px);
15
+ padding-bottom: em($gap-small - 6px);
16
+ padding-right: #{24px + $gap-smaller};
17
+ padding-top: em($gap-small - 6px);
18
+ position: relative;
19
+ text-align: left;
20
+ width: 100%;
21
+
22
+ &,
23
+ &:hover,
24
+ &:focus,
25
+ &:active {
26
+ @include reset-typography();
27
+ background: transparent;
28
+ box-shadow: none;
29
+ }
30
+
31
+ > .wc-blocks-components-panel__button-icon {
32
+ fill: currentColor;
33
+ position: absolute;
34
+ right: 0;
35
+ top: 50%;
36
+ transform: translateY(-50%);
37
+ width: auto;
38
+ }
39
+ }
40
+
41
+ .wc-blocks-components-panel__content {
42
+ padding-bottom: em($gap);
43
+ overflow: auto;
44
+ }
45
+
46
+ .theme-twentytwenty .wc-blocks-components-panel__button,
47
+ .theme-twentyseventeen .wc-blocks-components-panel__button {
48
+ background: transparent;
49
+ color: inherit;
50
+ }
assets/js/base/components/payment-methods/express-payment-methods.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ useExpressPaymentMethods,
6
+ usePaymentMethodInterface,
7
+ } from '@woocommerce/base-hooks';
8
+ import {
9
+ cloneElement,
10
+ isValidElement,
11
+ useCallback,
12
+ useRef,
13
+ } from '@wordpress/element';
14
+ import {
15
+ useEditorContext,
16
+ usePaymentMethodDataContext,
17
+ } from '@woocommerce/base-context';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import PaymentMethodErrorBoundary from './payment-method-error-boundary';
23
+
24
+ const ExpressPaymentMethods = () => {
25
+ const { isEditor } = useEditorContext();
26
+ const {
27
+ setActivePaymentMethod,
28
+ activePaymentMethod,
29
+ paymentMethodData,
30
+ setPaymentStatus,
31
+ } = usePaymentMethodDataContext();
32
+ const paymentMethodInterface = usePaymentMethodInterface();
33
+ const { paymentMethods } = useExpressPaymentMethods();
34
+ const previousActivePaymentMethod = useRef( activePaymentMethod );
35
+ const previousPaymentMethodData = useRef( paymentMethodData );
36
+
37
+ const onExpressPaymentClick = useCallback(
38
+ ( paymentMethodId ) => () => {
39
+ previousActivePaymentMethod.current = activePaymentMethod;
40
+ previousPaymentMethodData.current = paymentMethodData;
41
+ setPaymentStatus().started();
42
+ setActivePaymentMethod( paymentMethodId );
43
+ },
44
+ [
45
+ activePaymentMethod,
46
+ paymentMethodData,
47
+ setActivePaymentMethod,
48
+ setPaymentStatus,
49
+ ]
50
+ );
51
+ const onExpressPaymentClose = useCallback( () => {
52
+ setActivePaymentMethod( previousActivePaymentMethod.current );
53
+ if ( previousPaymentMethodData.current.isSavedToken ) {
54
+ setPaymentStatus().success( previousPaymentMethodData.current );
55
+ }
56
+ }, [ setActivePaymentMethod, setPaymentStatus ] );
57
+ const paymentMethodIds = Object.keys( paymentMethods );
58
+ const content =
59
+ paymentMethodIds.length > 0 ? (
60
+ paymentMethodIds.map( ( id ) => {
61
+ const expressPaymentMethod = isEditor
62
+ ? paymentMethods[ id ].edit
63
+ : paymentMethods[ id ].content;
64
+ return isValidElement( expressPaymentMethod ) ? (
65
+ <li key={ id } id={ `express-payment-method-${ id }` }>
66
+ { cloneElement( expressPaymentMethod, {
67
+ ...paymentMethodInterface,
68
+ onClick: onExpressPaymentClick( id ),
69
+ onClose: onExpressPaymentClose,
70
+ } ) }
71
+ </li>
72
+ ) : null;
73
+ } )
74
+ ) : (
75
+ <li key="noneRegistered">No registered Payment Methods</li>
76
+ );
77
+ return (
78
+ <PaymentMethodErrorBoundary isEditor={ isEditor }>
79
+ <ul className="wc-block-components-express-payment__event-buttons">
80
+ { content }
81
+ </ul>
82
+ </PaymentMethodErrorBoundary>
83
+ );
84
+ };
85
+
86
+ export default ExpressPaymentMethods;
assets/js/base/components/payment-methods/express-payment/cart-express-payment.js ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ useEmitResponse,
7
+ useExpressPaymentMethods,
8
+ } from '@woocommerce/base-hooks';
9
+ import { StoreNoticesProvider } from '@woocommerce/base-context';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import ExpressPaymentMethods from '../express-payment-methods';
15
+ import './style.scss';
16
+
17
+ const CartExpressPayment = () => {
18
+ const { paymentMethods, isInitialized } = useExpressPaymentMethods();
19
+ const { noticeContexts } = useEmitResponse();
20
+
21
+ if (
22
+ ! isInitialized ||
23
+ ( isInitialized && Object.keys( paymentMethods ).length === 0 )
24
+ ) {
25
+ return null;
26
+ }
27
+
28
+ return (
29
+ <>
30
+ <div className="wc-block-components-express-payment wc-block-components-express-payment--cart">
31
+ <div className="wc-block-components-express-payment__content">
32
+ <StoreNoticesProvider
33
+ context={ noticeContexts.EXPRESS_PAYMENTS }
34
+ >
35
+ <ExpressPaymentMethods />
36
+ </StoreNoticesProvider>
37
+ </div>
38
+ </div>
39
+ <div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--cart">
40
+ { /* translators: Shown in the Cart block between the express payment methods and the Proceed to Checkout button */ }
41
+ { __( 'Or', 'woo-gutenberg-products-block' ) }
42
+ </div>
43
+ </>
44
+ );
45
+ };
46
+
47
+ export default CartExpressPayment;
assets/js/base/components/payment-methods/express-payment/checkout-express-payment.js ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ useEmitResponse,
7
+ useExpressPaymentMethods,
8
+ } from '@woocommerce/base-hooks';
9
+ import {
10
+ StoreNoticesProvider,
11
+ useEditorContext,
12
+ } from '@woocommerce/base-context';
13
+ import Title from '@woocommerce/base-components/title';
14
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import ExpressPaymentMethods from '../express-payment-methods';
20
+ import './style.scss';
21
+
22
+ const CheckoutExpressPayment = () => {
23
+ const { paymentMethods, isInitialized } = useExpressPaymentMethods();
24
+ const { isEditor } = useEditorContext();
25
+ const { noticeContexts } = useEmitResponse();
26
+
27
+ if (
28
+ ! isInitialized ||
29
+ ( isInitialized && Object.keys( paymentMethods ).length === 0 )
30
+ ) {
31
+ // Make sure errors are shown in the editor and for admins. For example,
32
+ // when a payment method fails to register.
33
+ if ( isEditor || CURRENT_USER_IS_ADMIN ) {
34
+ return (
35
+ <StoreNoticesProvider
36
+ context={ noticeContexts.EXPRESS_PAYMENTS }
37
+ ></StoreNoticesProvider>
38
+ );
39
+ }
40
+ return null;
41
+ }
42
+
43
+ return (
44
+ <>
45
+ <div className="wc-block-components-express-payment wc-block-components-express-payment--checkout">
46
+ <div className="wc-block-components-express-payment__title-container">
47
+ <Title
48
+ className="wc-block-components-express-payment__title"
49
+ headingLevel="2"
50
+ >
51
+ { __(
52
+ 'Express checkout',
53
+ 'woo-gutenberg-products-block'
54
+ ) }
55
+ </Title>
56
+ </div>
57
+ <div className="wc-block-components-express-payment__content">
58
+ <StoreNoticesProvider
59
+ context={ noticeContexts.EXPRESS_PAYMENTS }
60
+ >
61
+ <p>
62
+ { __(
63
+ 'In a hurry? Use one of our express checkout options below:',
64
+ 'woo-gutenberg-products-block'
65
+ ) }
66
+ </p>
67
+ <ExpressPaymentMethods />
68
+ </StoreNoticesProvider>
69
+ </div>
70
+ </div>
71
+ <div className="wc-block-components-express-payment-continue-rule wc-block-components-express-payment-continue-rule--checkout">
72
+ { __( 'Or continue below', 'woo-gutenberg-products-block' ) }
73
+ </div>
74
+ </>
75
+ );
76
+ };
77
+
78
+ export default CheckoutExpressPayment;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/index.js RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/express-payment/style.scss RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/index.js RENAMED
File without changes
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/index.js RENAMED
@@ -43,7 +43,7 @@ const NoPaymentMethodsPlaceholder = () => {
43
  ) }
44
  </span>
45
  <Button
46
- isSecondary
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
43
  ) }
44
  </span>
45
  <Button
46
+ isDefault
47
  href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=checkout` }
48
  target="_blank"
49
  rel="noopener noreferrer"
assets/js/{blocks/cart-checkout → base/components}/payment-methods/no-payment-methods/style.scss RENAMED
@@ -9,7 +9,7 @@
9
  display: block;
10
 
11
  .components-button {
12
- background-color: $gray-900;
13
  color: $white;
14
  }
15
 
9
  display: block;
10
 
11
  .components-button {
12
+ background-color: $black;
13
  color: $white;
14
  }
15
 
assets/js/{blocks/cart-checkout → base/components}/payment-methods/payment-method-error-boundary.js RENAMED
@@ -3,9 +3,9 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
 
6
  import PropTypes from 'prop-types';
7
- import { CURRENT_USER_IS_ADMIN } from '@woocommerce/settings';
8
- import { StoreNoticesContainer } from '@woocommerce/base-context';
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { Component } from 'react';
6
+ import { StoreNoticesContainer } from '@woocommerce/base-components/store-notices-container';
7
  import PropTypes from 'prop-types';
8
+ import { CURRENT_USER_IS_ADMIN } from '@woocommerce/block-settings';
 
9
 
10
  class PaymentMethodErrorBoundary extends Component {
11
  state = { errorMessage: '', hasError: false };
assets/js/base/components/payment-methods/payment-method-options.js ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ usePaymentMethods,
6
+ usePaymentMethodInterface,
7
+ useStoreNotices,
8
+ useEmitResponse,
9
+ } from '@woocommerce/base-hooks';
10
+ import { cloneElement } from '@wordpress/element';
11
+ import { __ } from '@wordpress/i18n';
12
+ import {
13
+ useEditorContext,
14
+ usePaymentMethodDataContext,
15
+ } from '@woocommerce/base-context';
16
+
17
+ /**
18
+ * Internal dependencies
19
+ */
20
+ import Tabs from '../tabs';
21
+ import PaymentMethodTab from './payment-method-tab';
22
+
23
+ /**
24
+ * Component used to render all non-saved payment method options.
25
+ *
26
+ * @return {*} The rendered component.
27
+ */
28
+ const PaymentMethodOptions = () => {
29
+ const { setActivePaymentMethod } = usePaymentMethodDataContext();
30
+ const { paymentMethods } = usePaymentMethods();
31
+ const {
32
+ activePaymentMethod,
33
+ ...paymentMethodInterface
34
+ } = usePaymentMethodInterface();
35
+ const { noticeContexts } = useEmitResponse();
36
+ const { removeNotice } = useStoreNotices();
37
+ const { isEditor } = useEditorContext();
38
+
39
+ return (
40
+ <Tabs
41
+ className="wc-block-components-checkout-payment-methods"
42
+ onSelect={ ( tabName ) => {
43
+ setActivePaymentMethod( tabName );
44
+ removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
45
+ } }
46
+ tabs={ Object.keys( paymentMethods ).map( ( name ) => {
47
+ const {
48
+ ariaLabel,
49
+ edit,
50
+ content,
51
+ label,
52
+ supports,
53
+ } = paymentMethods[ name ];
54
+ const component = isEditor ? edit : content;
55
+ return {
56
+ name,
57
+ title:
58
+ typeof label === 'string'
59
+ ? label
60
+ : cloneElement( label, {
61
+ components:
62
+ paymentMethodInterface.components,
63
+ } ),
64
+ ariaLabel,
65
+ content: (
66
+ <PaymentMethodTab
67
+ allowsSaving={ supports.savePaymentInfo }
68
+ >
69
+ { cloneElement( component, {
70
+ activePaymentMethod,
71
+ ...paymentMethodInterface,
72
+ } ) }
73
+ </PaymentMethodTab>
74
+ ),
75
+ };
76
+ } ) }
77
+ initialTabName={ activePaymentMethod }
78
+ ariaLabel={ __(
79
+ 'Payment Methods',
80
+ 'woo-gutenberg-products-block'
81
+ ) }
82
+ id="wc-block-payment-methods"
83
+ />
84
+ );
85
+ };
86
+
87
+ export default PaymentMethodOptions;
assets/js/{blocks/cart-checkout/payment-methods/payment-method-card.js → base/components/payment-methods/payment-method-tab.js} RENAMED
@@ -16,16 +16,16 @@ import PropTypes from 'prop-types';
16
  import PaymentMethodErrorBoundary from './payment-method-error-boundary';
17
 
18
  /**
19
- * Component used to render the contents of a payment method card.
20
  *
21
- * @param {Object} props Incoming props for the component.
22
- * @param {boolean} props.showSaveOption Whether that payment method allows saving
23
- * the data for future purchases.
24
- * @param {Object} props.children Content of the payment method card.
25
  *
26
  * @return {*} The rendered component.
27
  */
28
- const PaymentMethodCard = ( { children, showSaveOption } ) => {
29
  const { isEditor } = useEditorContext();
30
  const {
31
  shouldSavePayment,
@@ -36,7 +36,7 @@ const PaymentMethodCard = ( { children, showSaveOption } ) => {
36
  return (
37
  <PaymentMethodErrorBoundary isEditor={ isEditor }>
38
  { children }
39
- { customerId > 0 && showSaveOption && (
40
  <CheckboxControl
41
  className="wc-block-components-payment-methods__save-card-info"
42
  label={ __(
@@ -53,9 +53,9 @@ const PaymentMethodCard = ( { children, showSaveOption } ) => {
53
  );
54
  };
55
 
56
- PaymentMethodCard.propTypes = {
57
- showSaveOption: PropTypes.bool,
58
  children: PropTypes.node,
59
  };
60
 
61
- export default PaymentMethodCard;
16
  import PaymentMethodErrorBoundary from './payment-method-error-boundary';
17
 
18
  /**
19
+ * Component used to render the contents of a payment method tab.
20
  *
21
+ * @param {Object} props Incoming props for the component.
22
+ * @param {boolean} props.allowsSaving Whether that payment method allows saving
23
+ * the data for future purchases.
24
+ * @param {Object} props.children Content of the payment method tab.
25
  *
26
  * @return {*} The rendered component.
27
  */
28
+ const PaymentMethodTab = ( { children, allowsSaving } ) => {
29
  const { isEditor } = useEditorContext();
30
  const {
31
  shouldSavePayment,
36
  return (
37
  <PaymentMethodErrorBoundary isEditor={ isEditor }>
38
  { children }
39
+ { customerId > 0 && allowsSaving && (
40
  <CheckboxControl
41
  className="wc-block-components-payment-methods__save-card-info"
42
  label={ __(
53
  );
54
  };
55
 
56
+ PaymentMethodTab.propTypes = {
57
+ allowsSaving: PropTypes.bool,
58
  children: PropTypes.node,
59
  };
60
 
61
+ export default PaymentMethodTab;
assets/js/base/components/payment-methods/payment-methods.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { usePaymentMethods } from '@woocommerce/base-hooks';
5
+ import { useCallback, useState } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import NoPaymentMethods from './no-payment-methods';
11
+ import PaymentMethodOptions from './payment-method-options';
12
+ import SavedPaymentMethodOptions from './saved-payment-method-options';
13
+
14
+ /**
15
+ * PaymentMethods component.
16
+ *
17
+ * @return {*} The rendered component.
18
+ */
19
+ const PaymentMethods = () => {
20
+ const { isInitialized, paymentMethods } = usePaymentMethods();
21
+ const [ showNewPaymentMethods, setShowNewPaymentMethods ] = useState(
22
+ true
23
+ );
24
+ const onChange = useCallback(
25
+ ( token ) => {
26
+ setShowNewPaymentMethods( token === '0' );
27
+ },
28
+ [ setShowNewPaymentMethods ]
29
+ );
30
+
31
+ if ( isInitialized && Object.keys( paymentMethods ).length === 0 ) {
32
+ return <NoPaymentMethods />;
33
+ }
34
+
35
+ return (
36
+ <>
37
+ <SavedPaymentMethodOptions onChange={ onChange } />
38
+ { showNewPaymentMethods && <PaymentMethodOptions /> }
39
+ </>
40
+ );
41
+ };
42
+
43
+ export default PaymentMethods;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/saved-payment-method-options.js RENAMED
@@ -1,20 +1,15 @@
1
  /**
2
  * External dependencies
3
  */
4
- import {
5
- useEffect,
6
- useRef,
7
- useCallback,
8
- cloneElement,
9
- } from '@wordpress/element';
10
  import { __, sprintf } from '@wordpress/i18n';
11
- import { usePaymentMethodDataContext } from '@woocommerce/base-context';
12
- import RadioControl from '@woocommerce/base-components/radio-control';
13
  import {
14
- usePaymentMethodInterface,
15
- usePaymentMethods,
16
- } from '@woocommerce/base-context/hooks';
 
17
  import { getPaymentMethods } from '@woocommerce/blocks-registry';
 
18
 
19
  /**
20
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
@@ -37,7 +32,7 @@ const getCcOrEcheckPaymentMethodOption = (
37
  return {
38
  value: tokenId + '',
39
  label: sprintf(
40
- /* translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
41
  __(
42
  '%1$s ending in %2$s (expires %3$s)',
43
  'woo-gutenberg-product-blocks'
@@ -50,9 +45,9 @@ const getCcOrEcheckPaymentMethodOption = (
50
  onChange: ( token ) => {
51
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
52
  setActivePaymentMethod( method.gateway );
53
- setPaymentStatus().started( {
54
  payment_method: method.gateway,
55
- [ savedTokenKey ]: token + '',
56
  isSavedToken: true,
57
  } );
58
  },
@@ -76,7 +71,7 @@ const getDefaultPaymentMethodOptions = (
76
  return {
77
  value: tokenId + '',
78
  label: sprintf(
79
- /* translators: %s is the name of the payment method gateway. */
80
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
81
  method.gateway
82
  ),
@@ -84,27 +79,24 @@ const getDefaultPaymentMethodOptions = (
84
  onChange: ( token ) => {
85
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
86
  setActivePaymentMethod( method.gateway );
87
- setPaymentStatus().started( {
88
  payment_method: method.gateway,
89
- [ savedTokenKey ]: token + '',
90
  isSavedToken: true,
91
  } );
92
  },
93
  };
94
  };
95
 
96
- const SavedPaymentMethodOptions = () => {
 
97
  const {
98
  setPaymentStatus,
99
  customerPaymentMethods,
100
- activePaymentMethod,
101
  setActivePaymentMethod,
102
- activeSavedToken,
103
- setActiveSavedToken,
104
  } = usePaymentMethodDataContext();
 
105
  const standardMethods = getPaymentMethods();
106
- const { paymentMethods } = usePaymentMethods();
107
- const paymentMethodInterface = usePaymentMethodInterface();
108
 
109
  /**
110
  * @type {Object} Options
@@ -114,9 +106,13 @@ const SavedPaymentMethodOptions = () => {
114
 
115
  const updateToken = useCallback(
116
  ( token ) => {
117
- setActiveSavedToken( token );
 
 
 
 
118
  },
119
- [ setActiveSavedToken ]
120
  );
121
 
122
  useEffect( () => {
@@ -125,6 +121,11 @@ const SavedPaymentMethodOptions = () => {
125
  .flatMap( ( type ) => {
126
  const typeMethods = customerPaymentMethods[ type ];
127
  return typeMethods.map( ( paymentMethod ) => {
 
 
 
 
 
128
  const option =
129
  type === 'cc' || type === 'echeck'
130
  ? getCcOrEcheckPaymentMethodOption(
@@ -137,11 +138,7 @@ const SavedPaymentMethodOptions = () => {
137
  setActivePaymentMethod,
138
  setPaymentStatus
139
  );
140
- if (
141
- ! activePaymentMethod &&
142
- paymentMethod.is_default &&
143
- activeSavedToken === ''
144
- ) {
145
  updateToken( paymentMethod.tokenId + '' );
146
  option.onChange( paymentMethod.tokenId );
147
  }
@@ -153,34 +150,31 @@ const SavedPaymentMethodOptions = () => {
153
  }, [
154
  customerPaymentMethods,
155
  updateToken,
156
- activeSavedToken,
157
- activePaymentMethod,
158
  setActivePaymentMethod,
159
  setPaymentStatus,
160
  standardMethods,
161
  ] );
162
 
163
- const savedPaymentMethodHandler =
164
- !! activeSavedToken &&
165
- paymentMethods[ activePaymentMethod ] &&
166
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent
167
- ? cloneElement(
168
- paymentMethods[ activePaymentMethod ]?.savedTokenComponent,
169
- { token: activeSavedToken, ...paymentMethodInterface }
170
- )
171
- : null;
172
-
173
  return currentOptions.current.length > 0 ? (
174
- <>
175
- <RadioControl
176
- id={ 'wc-payment-method-saved-tokens' }
177
- selected={ activeSavedToken }
178
- onChange={ updateToken }
179
- options={ currentOptions.current }
180
- />
181
- { savedPaymentMethodHandler }
182
- </>
183
  ) : null;
184
  };
185
 
 
 
 
 
186
  export default SavedPaymentMethodOptions;
1
  /**
2
  * External dependencies
3
  */
4
+ import { useEffect, useState, useRef, useCallback } from '@wordpress/element';
 
 
 
 
 
5
  import { __, sprintf } from '@wordpress/i18n';
 
 
6
  import {
7
+ useEditorContext,
8
+ usePaymentMethodDataContext,
9
+ } from '@woocommerce/base-context';
10
+ import RadioControl from '@woocommerce/base-components/radio-control';
11
  import { getPaymentMethods } from '@woocommerce/blocks-registry';
12
+ import PropTypes from 'prop-types';
13
 
14
  /**
15
  * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
32
  return {
33
  value: tokenId + '',
34
  label: sprintf(
35
+ /* Translators: %1$s is referring to the payment method brand, %2$s is referring to the last 4 digits of the payment card, %3$s is referring to the expiry date. */
36
  __(
37
  '%1$s ending in %2$s (expires %3$s)',
38
  'woo-gutenberg-product-blocks'
45
  onChange: ( token ) => {
46
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
47
  setActivePaymentMethod( method.gateway );
48
+ setPaymentStatus().success( {
49
  payment_method: method.gateway,
50
+ [ savedTokenKey ]: token,
51
  isSavedToken: true,
52
  } );
53
  },
71
  return {
72
  value: tokenId + '',
73
  label: sprintf(
74
+ // Translators: %s is the name of the payment method gateway.
75
  __( 'Saved token for %s', 'woo-gutenberg-products-block' ),
76
  method.gateway
77
  ),
79
  onChange: ( token ) => {
80
  const savedTokenKey = `wc-${ method.gateway }-payment-token`;
81
  setActivePaymentMethod( method.gateway );
82
+ setPaymentStatus().success( {
83
  payment_method: method.gateway,
84
+ [ savedTokenKey ]: token,
85
  isSavedToken: true,
86
  } );
87
  },
88
  };
89
  };
90
 
91
+ const SavedPaymentMethodOptions = ( { onChange } ) => {
92
+ const { isEditor } = useEditorContext();
93
  const {
94
  setPaymentStatus,
95
  customerPaymentMethods,
 
96
  setActivePaymentMethod,
 
 
97
  } = usePaymentMethodDataContext();
98
+ const [ selectedToken, setSelectedToken ] = useState( '' );
99
  const standardMethods = getPaymentMethods();
 
 
100
 
101
  /**
102
  * @type {Object} Options
106
 
107
  const updateToken = useCallback(
108
  ( token ) => {
109
+ if ( token === '0' ) {
110
+ setPaymentStatus().started();
111
+ }
112
+ setSelectedToken( token );
113
+ onChange( token );
114
  },
115
+ [ onChange, setSelectedToken, setPaymentStatus ]
116
  );
117
 
118
  useEffect( () => {
121
  .flatMap( ( type ) => {
122
  const typeMethods = customerPaymentMethods[ type ];
123
  return typeMethods.map( ( paymentMethod ) => {
124
+ const method =
125
+ standardMethods[ paymentMethod.method.gateway ];
126
+ if ( ! method?.supports?.savePaymentInfo ) {
127
+ return null;
128
+ }
129
  const option =
130
  type === 'cc' || type === 'echeck'
131
  ? getCcOrEcheckPaymentMethodOption(
138
  setActivePaymentMethod,
139
  setPaymentStatus
140
  );
141
+ if ( paymentMethod.is_default && selectedToken === '' ) {
 
 
 
 
142
  updateToken( paymentMethod.tokenId + '' );
143
  option.onChange( paymentMethod.tokenId );
144
  }
150
  }, [
151
  customerPaymentMethods,
152
  updateToken,
153
+ selectedToken,
 
154
  setActivePaymentMethod,
155
  setPaymentStatus,
156
  standardMethods,
157
  ] );
158
 
159
+ // In the editor, show `Use a new payment method` option as selected.
160
+ const selectedOption = isEditor ? '0' : selectedToken + '';
161
+ const newPaymentMethodOption = {
162
+ value: '0',
163
+ label: __( 'Use a new payment method', 'woo-gutenberg-product-blocks' ),
164
+ name: `wc-saved-payment-method-token-new`,
165
+ };
 
 
 
166
  return currentOptions.current.length > 0 ? (
167
+ <RadioControl
168
+ id={ 'wc-payment-method-saved-tokens' }
169
+ selected={ selectedOption }
170
+ onChange={ updateToken }
171
+ options={ [ ...currentOptions.current, newPaymentMethodOption ] }
172
+ />
 
 
 
173
  ) : null;
174
  };
175
 
176
+ SavedPaymentMethodOptions.propTypes = {
177
+ onChange: PropTypes.func.isRequired,
178
+ };
179
+
180
  export default SavedPaymentMethodOptions;
assets/js/{blocks/cart-checkout → base/components}/payment-methods/style.scss RENAMED
@@ -67,7 +67,7 @@
67
  left: 0;
68
  top: 0;
69
  transform-origin: top left;
70
- color: $gray-700;
71
  transition: transform 200ms ease;
72
  margin: 0 0 0 #{$gap + 1px};
73
  overflow: hidden;
@@ -109,14 +109,14 @@
109
  }
110
 
111
  .wc-block-gateway-input.has-error {
112
- border-color: $alert-red;
113
  &:focus {
114
- outline-color: $alert-red;
115
  }
116
  }
117
 
118
  .wc-block-gateway-input.has-error + label {
119
- color: $alert-red;
120
  }
121
  }
122
 
@@ -143,6 +143,21 @@
143
  }
144
  }
145
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  .wc-block-components-checkout-payment-methods * {
147
  pointer-events: all; // Overrides parent disabled component in editor context
148
  }
@@ -168,79 +183,3 @@
168
  margin-left: $gap-smaller;
169
  }
170
  }
171
-
172
- .wc-block-checkout__payment-method {
173
- .wc-block-components-radio-control__option {
174
- padding-left: 56px;
175
-
176
- &::after {
177
- content: none;
178
- }
179
-
180
- .wc-block-components-radio-control__input {
181
- left: 16px;
182
- }
183
- }
184
-
185
- // We need to add the first-child and last-child pseudoclasses for specificity.
186
- .wc-block-components-radio-control__option,
187
- .wc-block-components-radio-control__option:first-child,
188
- .wc-block-components-radio-control__option:last-child {
189
- margin: 0;
190
- padding-bottom: em($gap);
191
- padding-top: em($gap);
192
- }
193
-
194
- .wc-block-components-radio-control__option-checked {
195
- font-weight: bold;
196
- }
197
-
198
- .wc-block-components-radio-control-accordion-option,
199
- .wc-block-components-radio-control__option {
200
- @include with-translucent-border(1px 1px 0 1px);
201
- }
202
-
203
- .wc-block-components-radio-control__option:last-child::after,
204
- .wc-block-components-radio-control-accordion-option:last-child::after {
205
- border-width: 1px;
206
- }
207
-
208
- .wc-block-components-radio-control-accordion-option {
209
- .wc-block-components-radio-control__option::after {
210
- border-width: 0;
211
- }
212
- .wc-block-components-radio-control__label img {
213
- height: 24px;
214
- }
215
- }
216
-
217
- .wc-block-components-radio-control.disable-radio-control {
218
- .wc-block-components-radio-control__option {
219
- padding-left: 16px;
220
- }
221
-
222
- .wc-block-components-radio-control__input {
223
- display: none;
224
- }
225
- }
226
-
227
- .wc-block-components-checkout-step__description-payments-aligned {
228
- padding-top: 14px;
229
- height: 28px;
230
- }
231
-
232
- }
233
-
234
- .wc-block-components-radio-control-accordion-content {
235
- padding: 0 $gap em($gap) $gap;
236
-
237
- &:empty {
238
- display: none;
239
- }
240
- }
241
-
242
- .wc-block-checkout__order-notes {
243
- .wc-block-components-checkout-step__content {
244
- padding-bottom: 0;
245
- }
246
- }
67
  left: 0;
68
  top: 0;
69
  transform-origin: top left;
70
+ color: $gray-50;
71
  transition: transform 200ms ease;
72
  margin: 0 0 0 #{$gap + 1px};
73
  overflow: hidden;
109
  }
110
 
111
  .wc-block-gateway-input.has-error {
112
+ border-color: $error-red;
113
  &:focus {
114
+ outline-color: $error-red;
115
  }
116
  }
117
 
118
  .wc-block-gateway-input.has-error + label {
119
+ color: $error-red;
120
  }
121
  }
122
 
143
  }
144
  }
145
 
146
+ .wc-blocks-credit-card-images {
147
+ padding-top: $gap-small;
148
+ display: flex;
149
+
150
+ .wc-blocks-credit-cart-icon {
151
+ height: 18px;
152
+ width: auto;
153
+ margin-right: $gap-small;
154
+
155
+ &:last-child {
156
+ margin-right: 0;
157
+ }
158
+ }
159
+ }
160
+
161
  .wc-block-components-checkout-payment-methods * {
162
  pointer-events: all; // Overrides parent disabled component in editor context
163
  }
183
  margin-left: $gap-smaller;
184
  }
185
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/payment-methods/test/payment-methods.js ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react';
5
+ import {
6
+ registerPaymentMethod,
7
+ __experimentalDeRegisterPaymentMethod,
8
+ } from '@woocommerce/blocks-registry';
9
+ import { PaymentMethodDataProvider } from '@woocommerce/base-context';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import PaymentMethods from '../payment-methods';
15
+
16
+ jest.mock( '../payment-method-options', () => () => (
17
+ <span>Payment method options</span>
18
+ ) );
19
+ jest.mock( '../saved-payment-method-options', () => ( { onChange } ) => (
20
+ <>
21
+ <span>Saved payment method options</span>
22
+ <button onClick={ () => onChange( '1' ) }>Select saved</button>
23
+ <button onClick={ () => onChange( '0' ) }>Select not saved</button>
24
+ </>
25
+ ) );
26
+
27
+ const registerMockPaymentMethods = () => {
28
+ [ 'cheque' ].forEach( ( name ) => {
29
+ registerPaymentMethod(
30
+ ( Config ) =>
31
+ new Config( {
32
+ name,
33
+ label: name,
34
+ content: <div>A payment method</div>,
35
+ edit: <div>A payment method</div>,
36
+ icons: null,
37
+ canMakePayment: () => true,
38
+ ariaLabel: name,
39
+ } )
40
+ );
41
+ } );
42
+ };
43
+
44
+ const resetMockPaymentMethods = () => {
45
+ [ 'cheque' ].forEach( ( name ) => {
46
+ __experimentalDeRegisterPaymentMethod( name );
47
+ } );
48
+ };
49
+
50
+ describe( 'PaymentMethods', () => {
51
+ test( 'should show no payment methods component when there are no payment methods', async () => {
52
+ render(
53
+ <PaymentMethodDataProvider>
54
+ <PaymentMethods />
55
+ </PaymentMethodDataProvider>
56
+ );
57
+
58
+ await waitFor( () => {
59
+ const noPaymentMethods = screen.queryByText(
60
+ /no payment methods available/
61
+ );
62
+ expect( noPaymentMethods ).not.toBeNull();
63
+ } );
64
+ } );
65
+
66
+ test( 'should hide/show PaymentMethodOptions when a saved payment method is checked/unchecked', async () => {
67
+ registerMockPaymentMethods();
68
+ render(
69
+ <PaymentMethodDataProvider>
70
+ <PaymentMethods />
71
+ </PaymentMethodDataProvider>
72
+ );
73
+
74
+ await waitFor( () => {
75
+ const savedPaymentMethodOptions = screen.queryByText(
76
+ /Saved payment method options/
77
+ );
78
+ const paymentMethodOptions = screen.queryByText(
79
+ /Payment method options/
80
+ );
81
+ expect( savedPaymentMethodOptions ).not.toBeNull();
82
+ expect( paymentMethodOptions ).not.toBeNull();
83
+ } );
84
+
85
+ fireEvent.click( screen.getByText( 'Select saved' ) );
86
+
87
+ await waitFor( () => {
88
+ const savedPaymentMethodOptions = screen.queryByText(
89
+ /Saved payment method options/
90
+ );
91
+ const paymentMethodOptions = screen.queryByText(
92
+ /Payment method options/
93
+ );
94
+ expect( savedPaymentMethodOptions ).not.toBeNull();
95
+ expect( paymentMethodOptions ).toBeNull();
96
+ } );
97
+
98
+ fireEvent.click( screen.getByText( 'Select not saved' ) );
99
+
100
+ await waitFor( () => {
101
+ const savedPaymentMethodOptions = screen.queryByText(
102
+ /Saved payment method options/
103
+ );
104
+ const paymentMethodOptions = screen.queryByText(
105
+ /Payment method options/
106
+ );
107
+ expect( savedPaymentMethodOptions ).not.toBeNull();
108
+ expect( paymentMethodOptions ).not.toBeNull();
109
+ } );
110
+ resetMockPaymentMethods();
111
+ } );
112
+ } );
assets/js/base/components/price-slider/constrain-range-slider-values.js CHANGED
@@ -2,8 +2,8 @@
2
  * Validate a min and max value for a range slider against defined constraints (min, max, step).
3
  *
4
  * @param {Array} values Array containing min and max values.
5
- * @param {number|null} min Min allowed value for the sliders.
6
- * @param {number|null} max Max allowed value for the sliders.
7
  * @param {number} step Step value for the sliders.
8
  * @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
9
  * @return {Array} Validated and updated min/max values that fit within the range slider constraints.
2
  * Validate a min and max value for a range slider against defined constraints (min, max, step).
3
  *
4
  * @param {Array} values Array containing min and max values.
5
+ * @param {number} min Min allowed value for the sliders.
6
+ * @param {number} max Max allowed value for the sliders.
7
  * @param {number} step Step value for the sliders.
8
  * @param {boolean} isMin Whether we're currently interacting with the min range slider or not, so we update the correct values.
9
  * @return {Array} Validated and updated min/max values that fit within the range slider constraints.
assets/js/base/components/price-slider/index.js CHANGED
@@ -3,6 +3,7 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
 
6
  useState,
7
  useEffect,
8
  useCallback,
@@ -12,7 +13,6 @@ import {
12
  import PropTypes from 'prop-types';
13
  import classnames from 'classnames';
14
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
15
- import { isObject } from '@woocommerce/types';
16
 
17
  /**
18
  * Internal dependencies
@@ -112,6 +112,7 @@ const PriceSlider = ( {
112
  minConstraint,
113
  maxConstraint,
114
  hasValidConstraints,
 
115
  ] );
116
 
117
  /**
@@ -185,14 +186,7 @@ const PriceSlider = ( {
185
  parseInt( values[ 1 ], 10 ),
186
  ] );
187
  },
188
- [
189
- onChange,
190
- minPrice,
191
- maxPrice,
192
- minConstraint,
193
- maxConstraint,
194
- stepValue,
195
- ]
196
  );
197
 
198
  /**
@@ -227,7 +221,14 @@ const PriceSlider = ( {
227
  parseInt( values[ 1 ], 10 ),
228
  ] );
229
  },
230
- [ onChange, stepValue, minPriceInput, maxPriceInput ]
 
 
 
 
 
 
 
231
  );
232
 
233
  const classes = classnames(
@@ -242,13 +243,10 @@ const PriceSlider = ( {
242
  ! hasValidConstraints && 'is-disabled'
243
  );
244
 
245
- const activeElement = isObject( minRange.current )
246
- ? minRange.current.ownerDocument.activeElement
247
- : undefined;
248
  const minRangeStep =
249
- activeElement && activeElement === minRange.current ? stepValue : 1;
250
  const maxRangeStep =
251
- activeElement && activeElement === maxRange.current ? stepValue : 1;
252
 
253
  return (
254
  <div className={ classes }>
@@ -308,7 +306,7 @@ const PriceSlider = ( {
308
  </div>
309
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
310
  { showInputFields && (
311
- <>
312
  <FormattedMonetaryAmount
313
  currency={ currency }
314
  displayType="input"
@@ -345,7 +343,7 @@ const PriceSlider = ( {
345
  disabled={ isLoading || ! hasValidConstraints }
346
  value={ maxPriceInput }
347
  />
348
- </>
349
  ) }
350
  { ! showInputFields &&
351
  ! isLoading &&
@@ -356,11 +354,13 @@ const PriceSlider = ( {
356
  : &nbsp;
357
  <FormattedMonetaryAmount
358
  currency={ currency }
 
359
  value={ minPrice }
360
  />
361
  &nbsp;&ndash;&nbsp;
362
  <FormattedMonetaryAmount
363
  currency={ currency }
 
364
  value={ maxPrice }
365
  />
366
  </div>
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import {
6
+ Fragment,
7
  useState,
8
  useEffect,
9
  useCallback,
13
  import PropTypes from 'prop-types';
14
  import classnames from 'classnames';
15
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
 
16
 
17
  /**
18
  * Internal dependencies
112
  minConstraint,
113
  maxConstraint,
114
  hasValidConstraints,
115
+ stepValue,
116
  ] );
117
 
118
  /**
186
  parseInt( values[ 1 ], 10 ),
187
  ] );
188
  },
189
+ [ minPrice, maxPrice, minConstraint, maxConstraint, stepValue ]
 
 
 
 
 
 
 
190
  );
191
 
192
  /**
221
  parseInt( values[ 1 ], 10 ),
222
  ] );
223
  },
224
+ [
225
+ minConstraint,
226
+ maxConstraint,
227
+ stepValue,
228
+ minPriceInput,
229
+ maxPriceInput,
230
+ currency,
231
+ ]
232
  );
233
 
234
  const classes = classnames(
243
  ! hasValidConstraints && 'is-disabled'
244
  );
245
 
 
 
 
246
  const minRangeStep =
247
+ minRange && document.activeElement === minRange.current ? stepValue : 1;
248
  const maxRangeStep =
249
+ maxRange && document.activeElement === maxRange.current ? stepValue : 1;
250
 
251
  return (
252
  <div className={ classes }>
306
  </div>
307
  <div className="wc-block-price-filter__controls wc-block-components-price-slider__controls">
308
  { showInputFields && (
309
+ <Fragment>
310
  <FormattedMonetaryAmount
311
  currency={ currency }
312
  displayType="input"
343
  disabled={ isLoading || ! hasValidConstraints }
344
  value={ maxPriceInput }
345
  />
346
+ </Fragment>
347
  ) }
348
  { ! showInputFields &&
349
  ! isLoading &&
354
  : &nbsp;
355
  <FormattedMonetaryAmount
356
  currency={ currency }
357
+ displayType="text"
358
  value={ minPrice }
359
  />
360
  &nbsp;&ndash;&nbsp;
361
  <FormattedMonetaryAmount
362
  currency={ currency }
363
+ displayType="text"
364
  value={ maxPrice }
365
  />
366
  </div>
assets/js/base/components/price-slider/style.scss CHANGED
@@ -2,8 +2,8 @@
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
- width: 28px;
6
- height: 23px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
@@ -11,8 +11,7 @@
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
- background-image: url("data:image/svg+xml,%3Csvg width='56' height='46' viewBox='0 0 56 46' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0)'%3E%3Cpath d='M25.3176 9.9423L16.9013 3.7991C15.1953 2.5706 13.2618 1.9003 11.2146 2.0121H11.1009C6.21029 2.3471 2.11589 6.3681 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.9423V9.9423Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 9.94227L16.9013 3.79907C15.1953 2.57057 13.2618 1.90027 11.2146 2.01207H11.1009C6.21029 2.34707 2.11589 6.36807 2.00219 11.2827C1.88849 16.644 6.21019 21 11.6696 21H11.7833C13.603 21 15.4228 20.3298 16.9013 19.213L25.3176 12.958C26.2275 12.0645 26.2275 10.7242 25.3176 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M13 7V16M10 7V16V7Z' stroke='%23B8B8B8'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M25.3176 32.9423L16.9013 26.7991C15.1953 25.5706 13.2618 24.9003 11.2146 25.0121H11.1009C6.21029 25.347 2.11589 29.368 2.00219 34.2827C1.88849 39.644 6.21019 44 11.6696 44H11.7833C13.603 44 15.4228 43.3298 16.9013 42.213L25.3176 35.958C26.2275 35.0645 26.2275 33.7242 25.3176 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M13 30V39M10 30V39V30Z' stroke='%23757575'/%3E%3Cpath d='M30.6824 9.94227L39.0987 3.79907C40.8047 2.57057 42.7382 1.90027 44.7854 2.01207H44.8991C49.7897 2.34707 53.8841 6.36807 53.9978 11.2827C54.1115 16.644 49.7898 21 44.3304 21H44.2167C42.397 21 40.5772 20.3298 39.0987 19.213L30.6824 12.958C29.7725 12.0645 29.7725 10.7242 30.6824 9.94227V9.94227Z' fill='white' stroke='%23757575'/%3E%3Cpath d='M43 6.99997V16M46 6.99997V16V6.99997Z' stroke='%23B8B8B8'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' fill='%23F8F3F7' stroke='white' stroke-opacity='0.75' stroke-width='3'/%3E%3Cpath d='M30.6824 32.9423L39.0987 26.7991C40.8047 25.5706 42.7382 24.9003 44.7854 25.0121H44.8991C49.7897 25.347 53.8841 29.368 53.9978 34.2827C54.1115 39.644 49.7898 44 44.3304 44H44.2167C42.397 44 40.5772 43.3298 39.0987 42.213L30.6824 35.958C29.7725 35.0645 29.7725 33.7242 30.6824 32.9423V32.9423Z' stroke='%23757575'/%3E%3Cpath d='M43 30V39M46 30V39V30Z' stroke='%23757575'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0'%3E%3Crect width='56' height='46' fill='white'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A");
15
-
16
  transition: transform .2s ease-in-out;
17
  -webkit-appearance: none;
18
  -moz-appearance: none;
@@ -20,11 +19,12 @@
20
 
21
  &:hover {
22
  @include thumbFocus;
 
23
  }
24
  }
25
  @mixin thumbFocus {
26
- background-position-y: -23px;
27
- transform: scale(1.1);
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
@@ -49,6 +49,46 @@
49
  .wc-block-components-price-slider {
50
  margin-bottom: $gap-large;
51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
52
  &.wc-block-components-price-slider--has-filter-button {
53
  .wc-block-components-price-slider__controls {
54
  justify-content: flex-end;
@@ -59,211 +99,172 @@
59
  }
60
  }
61
  }
62
-
63
- &.is-loading,
64
- &.is-disabled {
65
- .wc-block-components-price-slider__range-input-wrapper,
66
- .wc-block-components-price-slider__amount,
67
- .wc-block-components-price-slider__button {
68
- @include placeholder();
69
- box-shadow: none;
 
 
 
70
  }
71
- }
72
-
73
- &.is-disabled:not(.is-loading) {
74
- .wc-block-components-price-slider__range-input-wrapper,
75
- .wc-block-components-price-slider__amount,
76
- .wc-block-components-price-slider__button {
77
- animation: none;
78
  }
79
- }
80
- }
81
-
82
- .wc-block-components-price-slider__range-input-wrapper {
83
- @include reset;
84
- height: 9px;
85
- clear: both;
86
- position: relative;
87
- box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
88
- background: #e1e1e1;
89
- margin: 15px 0;
90
- }
91
-
92
- .wc-block-components-price-slider__range-input-progress {
93
- height: 9px;
94
- width: 100%;
95
- position: absolute;
96
- left: 0;
97
- top: 0;
98
- --track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
99
- --range-color: #{$studio-woocommerce-purple-30};
100
- /*rtl:ignore*/
101
- background: var(--track-background);
102
- }
103
-
104
- .wc-block-components-price-slider__controls {
105
- display: flex;
106
-
107
- .wc-block-components-price-slider__amount {
108
- margin: 0;
109
- border-radius: 4px;
110
- width: auto;
111
- max-width: 100px;
112
- min-width: 0;
113
 
114
- &.wc-block-components-price-slider__amount--min {
115
- margin-right: 10px;
116
  }
117
- &.wc-block-components-price-slider__amount--max {
118
- margin-left: auto;
119
  }
120
- }
121
- }
122
- .wc-block-components-price-slider__range-input {
123
- @include reset;
124
- width: 100%;
125
- height: 0;
126
- display: block;
127
- position: relative;
128
- pointer-events: none;
129
- outline: none !important;
130
- position: absolute;
131
- left: 0;
132
- top: 0;
133
-
134
- &::-webkit-slider-runnable-track {
135
- @include track;
136
- }
137
- &::-webkit-slider-thumb {
138
- @include thumb;
139
- margin: -6px 0 0 0;
140
- }
141
- &::-webkit-slider-progress {
142
- @include reset;
143
- }
144
-
145
- &::-moz-focus-outer {
146
- border: 0;
147
- }
148
- &::-moz-range-track {
149
- @include track;
150
- }
151
- &::-moz-range-progress {
152
- @include reset;
153
- }
154
- &::-moz-range-thumb {
155
- @include thumb;
156
- }
157
-
158
- &::-ms-thumb {
159
- @include thumb;
160
- }
161
-
162
- &:focus {
163
- &::-webkit-slider-thumb {
164
- @include thumbFocus;
165
  }
166
  &::-moz-range-thumb {
167
- @include thumbFocus;
168
  }
 
169
  &::-ms-thumb {
170
- @include thumbFocus;
171
  }
172
- }
173
-
174
- &.wc-block-components-price-slider__range-input--min {
175
- z-index: 21;
176
 
177
- &::-webkit-slider-thumb {
178
- margin-left: -2px;
179
- background-position-x: left;
180
- }
181
- &::-moz-range-thumb {
182
- background-position-x: left;
183
- transform: translate(-2px, 4px);
 
 
 
184
  }
185
- &::-ms-thumb {
186
- background-position-x: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  }
188
- }
189
 
190
- &.wc-block-components-price-slider__range-input--max {
191
- z-index: 20;
192
 
193
- &::-webkit-slider-thumb {
194
- background-position-x: right;
195
- margin-left: 2px;
 
 
 
 
 
 
 
 
196
  }
197
- &::-moz-range-thumb {
198
- background-position-x: right;
199
- transform: translate(2px, 4px);
 
 
 
 
 
 
200
  }
201
- &::-ms-thumb {
202
- background-position-x: right;
 
 
 
 
 
203
  }
204
  }
205
  }
206
 
207
  .rtl {
208
- .wc-block-components-price-slider__range-input-progress {
209
  --track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
210
- --range-color: #{$studio-woocommerce-purple-30};
211
  background: var(--track-background);
212
  }
213
  }
214
 
215
- @mixin ie-fixes() {
216
- .wc-block-components-price-slider__range-input-wrapper {
217
- background: transparent;
218
- box-shadow: none;
219
- height: 24px;
220
- }
221
- .wc-block-components-price-slider__range-input-progress {
222
- background: #{$studio-woocommerce-purple-30};
223
- width: 100%;
224
- top: 7px;
225
- }
226
- .wc-block-components-price-slider__range-input {
227
- height: 24px;
228
- pointer-events: auto;
229
-
230
- &::-ms-track {
231
- /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
232
  background: transparent;
 
 
233
 
234
- /*leave room for the larger thumb to overflow with a transparent border */
235
- border-color: transparent;
236
- border-width: 7px 0;
237
-
238
- /*remove default tick marks*/
239
- color: transparent;
240
- }
241
- &::-ms-fill-lower {
242
- background: #e1e1e1;
243
- box-shadow: 0 0 0 1px inset #b8b8b8;
244
- }
245
- &::-ms-fill-upper {
246
- background: transparent;
247
- }
248
- &::-ms-tooltip {
249
- display: none;
250
  }
251
- &::-ms-thumb {
252
- transform: translate(1px, 0);
253
  pointer-events: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  }
255
- }
256
- .wc-block-components-price-slider__range-input--max {
257
- &::-ms-fill-upper {
258
- background: #e1e1e1;
259
- box-shadow: 0 0 0 1px inset #b8b8b8;
260
- }
261
- &::-ms-fill-lower {
262
- background: transparent;
263
  }
264
- }
265
 
266
- .wc-block-components-price-slider {
267
  &.is-loading,
268
  &.is-disabled {
269
  .wc-block-components-price-slider__range-input-wrapper {
@@ -281,80 +282,9 @@
281
  }
282
 
283
  /* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
284
- @include ie11() {
285
- @include ie-fixes();
286
  }
287
-
288
- // Targets Edge <= 18.
289
  @supports (-ms-ime-align:auto) {
290
- @include ie-fixes();
291
- }
292
-
293
- .theme-twentytwentyone {
294
- $border-width: 3px;
295
-
296
- .wc-block-components-price-slider__range-input-wrapper {
297
- background: transparent;
298
- border: $border-width solid currentColor;
299
- box-sizing: border-box;
300
- }
301
-
302
- .wc-block-components-price-slider__range-input-progress {
303
- --range-color: currentColor;
304
- margin: -$border-width;
305
- }
306
-
307
- .wc-block-price-filter__range-input {
308
- background: transparent;
309
- margin: -$border-width;
310
- width: calc(100% + #{$border-width * 2});
311
-
312
- &:hover,
313
- &:focus {
314
- &::-webkit-slider-thumb {
315
- filter: none;
316
- }
317
- &::-moz-range-thumb {
318
- filter: none;
319
- }
320
- &::-ms-thumb {
321
- filter: none;
322
- }
323
- }
324
-
325
- &::-webkit-slider-thumb {
326
- margin-top: -9px;
327
- }
328
-
329
- &.wc-block-components-price-slider__range-input--max::-moz-range-thumb {
330
- transform: translate(2px, 1px);
331
- }
332
-
333
- &.wc-block-components-price-slider__range-input--min::-moz-range-thumb {
334
- transform: translate(-2px, 1px);
335
- }
336
-
337
- &::-ms-track {
338
- border-color: transparent !important;
339
- }
340
- }
341
-
342
- @include ie11() {
343
- .wc-block-components-price-slider__range-input-wrapper {
344
- border: 0;
345
- height: auto;
346
- position: relative;
347
- height: 50px;
348
- }
349
-
350
- .wc-block-components-price-slider__range-input-progress {
351
- display: none;
352
- }
353
-
354
- .wc-block-price-filter__range-input {
355
- height: 100%;
356
- margin: 0;
357
- width: 100%;
358
- }
359
- }
360
  }
2
  @mixin thumb {
3
  background-color: transparent;
4
  background-position: 0 0;
5
+ width: 26px;
6
+ height: 21px;
7
  border: 0;
8
  padding: 0;
9
  margin: 0;
11
  cursor: pointer;
12
  z-index: 20;
13
  pointer-events: auto;
14
+ background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='52' height='42'%3E%3Cdefs%3E%3Cpath id='a' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath id='b' d='M23.3176 7.9423l-8.4163-6.1432C13.1953.5706 11.2618-.0997 9.2146.0121h-.1137C4.2103.347.1159 4.368.0022 9.2827-.1115 14.644 4.2102 19 9.6696 19h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3C/defs%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='%2395588A' d='M24.3176 8.9423l-8.4163-6.1432c-1.706-1.2285-3.6395-1.8988-5.6867-1.787h-.1137c-4.8906.335-8.985 4.356-9.0987 9.2706C.8885 15.644 5.2102 20 10.6696 20h.1137c1.8197 0 3.6395-.6702 5.118-1.787l8.4163-6.255c.9099-.8935.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M9 6v9m3-9v9'/%3E%3Cg fill-rule='nonzero' transform='translate(1 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23a'/%3E%3Cuse stroke='%2395588A' xlink:href='%23a'/%3E%3C/g%3E%3Cpath stroke='%2395588A' d='M9 27v9m3-9v9'/%3E%3Cg%3E%3Cpath fill='%23FFF' fill-rule='nonzero' stroke='%2395588A' d='M27.6824 8.9423l8.4163-6.1432c1.706-1.2285 3.6395-1.8988 5.6867-1.787h.1137c4.8906.335 8.985 4.356 9.0987 9.2706C51.1115 15.644 46.7898 20 41.3304 20h-.1137c-1.8197 0-3.6395-.6702-5.118-1.787l-8.4163-6.255c-.9099-.8935-.9099-2.2338 0-3.0157z'/%3E%3Cpath stroke='%23B8B8B8' d='M43 6v9m-3-9v9'/%3E%3C/g%3E%3Cg%3E%3Cg fill-rule='nonzero' transform='matrix(-1 0 0 1 51 22)'%3E%3Cuse fill='%23F8F3F7' stroke='%23FFF' stroke-opacity='.75' stroke-width='3' xlink:href='%23b'/%3E%3Cuse stroke='%2395588A' xlink:href='%23b'/%3E%3C/g%3E%3Cpath stroke='%2395588A' d='M43 27v9m-3-9v9'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
 
15
  transition: transform .2s ease-in-out;
16
  -webkit-appearance: none;
17
  -moz-appearance: none;
19
 
20
  &:hover {
21
  @include thumbFocus;
22
+ transform: scale(1.1);
23
  }
24
  }
25
  @mixin thumbFocus {
26
+ background-position-y: -21px;
27
+ filter: drop-shadow(3px 0 0 rgba(255, 255, 255, .75)) drop-shadow(-3px 0 0 rgba(255, 255, 255, .75));
28
  }
29
  /* stylelint-enable */
30
  @mixin track {
49
  .wc-block-components-price-slider {
50
  margin-bottom: $gap-large;
51
 
52
+ .wc-block-components-price-slider__range-input-wrapper {
53
+ @include reset;
54
+ height: 9px;
55
+ clear: both;
56
+ position: relative;
57
+ box-shadow: 0 0 0 1px inset rgba(0, 0, 0, 0.1);
58
+ background: #e1e1e1;
59
+ margin: 15px 0;
60
+
61
+ .wc-block-components-price-slider__range-input-progress {
62
+ height: 9px;
63
+ width: 100%;
64
+ position: absolute;
65
+ left: 0;
66
+ top: 0;
67
+ --track-background: linear-gradient(to right, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
68
+ --range-color: #a8739d;
69
+ /*rtl:ignore*/
70
+ background: var(--track-background);
71
+ }
72
+ }
73
+
74
+ .wc-block-components-price-slider__controls {
75
+ display: flex;
76
+
77
+ .wc-block-components-price-slider__amount {
78
+ margin: 0;
79
+ border-radius: 4px;
80
+ width: auto;
81
+ max-width: 100px;
82
+ min-width: 0;
83
+
84
+ &.wc-block-components-price-slider__amount--min {
85
+ margin-right: 10px;
86
+ }
87
+ &.wc-block-components-price-slider__amount--max {
88
+ margin-left: auto;
89
+ }
90
+ }
91
+ }
92
  &.wc-block-components-price-slider--has-filter-button {
93
  .wc-block-components-price-slider__controls {
94
  justify-content: flex-end;
99
  }
100
  }
101
  }
102
+ .wc-block-components-price-slider__range-input {
103
+ @include reset;
104
+ width: 100%;
105
+ height: 0;
106
+ display: block;
107
+ position: relative;
108
+ pointer-events: none;
109
+ outline: none !important;
110
+
111
+ &::-webkit-slider-runnable-track {
112
+ @include track;
113
  }
114
+ &::-webkit-slider-thumb {
115
+ @include thumb;
116
+ margin: -6px 0 0 0;
117
+ }
118
+ &::-webkit-slider-progress {
119
+ @include reset;
 
120
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
+ &::-moz-focus-outer {
123
+ border: 0;
124
  }
125
+ &::-moz-range-track {
126
+ @include track;
127
  }
128
+ &::-moz-range-progress {
129
+ @include reset;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
  }
131
  &::-moz-range-thumb {
132
+ @include thumb;
133
  }
134
+
135
  &::-ms-thumb {
136
+ @include thumb;
137
  }
 
 
 
 
138
 
139
+ &:focus {
140
+ &::-webkit-slider-thumb {
141
+ @include thumbFocus;
142
+ }
143
+ &::-moz-range-thumb {
144
+ @include thumbFocus;
145
+ }
146
+ &::-ms-thumb {
147
+ @include thumbFocus;
148
+ }
149
  }
150
+
151
+ &.wc-block-components-price-slider__range-input--min {
152
+ z-index: 21;
153
+
154
+ &::-webkit-slider-thumb {
155
+ margin-left: -2px;
156
+ background-position-x: left;
157
+ }
158
+ &::-moz-range-thumb {
159
+ background-position-x: left;
160
+ transform: translate(-2px, 4px);
161
+ }
162
+ &::-ms-thumb {
163
+ background-position-x: left;
164
+ }
165
  }
 
166
 
167
+ &.wc-block-components-price-slider__range-input--max {
168
+ z-index: 20;
169
 
170
+ &::-webkit-slider-thumb {
171
+ background-position-x: right;
172
+ margin-left: 2px;
173
+ }
174
+ &::-moz-range-thumb {
175
+ background-position-x: right;
176
+ transform: translate(2px, 4px);
177
+ }
178
+ &::-ms-thumb {
179
+ background-position-x: right;
180
+ }
181
  }
182
+ }
183
+
184
+ &.is-loading,
185
+ &.is-disabled {
186
+ .wc-block-components-price-slider__range-input-wrapper,
187
+ .wc-block-components-price-slider__amount,
188
+ .wc-block-components-price-slider__button {
189
+ @include placeholder();
190
+ box-shadow: none;
191
  }
192
+ }
193
+
194
+ &.is-disabled:not(.is-loading) {
195
+ .wc-block-components-price-slider__range-input-wrapper,
196
+ .wc-block-components-price-slider__amount,
197
+ .wc-block-components-price-slider__button {
198
+ animation: none;
199
  }
200
  }
201
  }
202
 
203
  .rtl {
204
+ .wc-block-components-price-slider .wc-block-components-price-slider__range-input-wrapper .wc-block-components-price-slider__range-input-progress {
205
  --track-background: linear-gradient(to left, transparent var(--low), var(--range-color) 0, var(--range-color) var(--high), transparent 0) no-repeat 0 100% / 100% 100%;
206
+ --range-color: #a8739d;
207
  background: var(--track-background);
208
  }
209
  }
210
 
211
+ @mixin ie {
212
+ .wc-block-components-price-slider {
213
+ .wc-block-components-price-slider__range-input-wrapper {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
214
  background: transparent;
215
+ box-shadow: none;
216
+ height: 24px;
217
 
218
+ .wc-block-components-price-slider__range-input-progress {
219
+ background: #a8739d;
220
+ box-shadow: 0 0 0 1px inset #95588a;
221
+ width: 100%;
222
+ top: 7px;
223
+ }
 
 
 
 
 
 
 
 
 
 
224
  }
225
+ .wc-block-components-price-slider__range-input {
226
+ height: 24px;
227
  pointer-events: auto;
228
+ position: absolute;
229
+ left: 0;
230
+ top: 0;
231
+
232
+ &::-ms-track {
233
+ /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
234
+ background: transparent;
235
+
236
+ /*leave room for the larger thumb to overflow with a transparent border */
237
+ border-color: transparent;
238
+ border-width: 7px 0;
239
+
240
+ /*remove default tick marks*/
241
+ color: transparent;
242
+ }
243
+ &::-ms-fill-lower {
244
+ background: #e1e1e1;
245
+ box-shadow: 0 0 0 1px inset #b8b8b8;
246
+ }
247
+ &::-ms-fill-upper {
248
+ background: transparent;
249
+ }
250
+ &::-ms-tooltip {
251
+ display: none;
252
+ }
253
+ &::-ms-thumb {
254
+ transform: translate(1px, 0);
255
+ pointer-events: auto;
256
+ }
257
  }
258
+ .wc-block-components-price-slider__range-input--max {
259
+ &::-ms-fill-upper {
260
+ background: #e1e1e1;
261
+ box-shadow: 0 0 0 1px inset #b8b8b8;
262
+ }
263
+ &::-ms-fill-lower {
264
+ background: transparent;
265
+ }
266
  }
 
267
 
 
268
  &.is-loading,
269
  &.is-disabled {
270
  .wc-block-components-price-slider__range-input-wrapper {
282
  }
283
 
284
  /* IE 11 will not support multi-range slider due to poor pointer-events support on the thumb. Reverts to 2 sliders. */
285
+ @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
286
+ @include ie;
287
  }
 
 
288
  @supports (-ms-ime-align:auto) {
289
+ @include ie;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
290
  }
assets/js/base/components/{product-list/product-list-item → product-list-item}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-list-item → product-list-item}/utils.js RENAMED
File without changes
assets/js/base/components/product-list/container.js CHANGED
@@ -7,12 +7,9 @@ import PropTypes from 'prop-types';
7
  /**
8
  * Internal dependencies
9
  */
10
- import ProductList from './product-list';
11
 
12
- const ProductListContainer = ( {
13
- attributes,
14
- hideOutOfStockItems = false,
15
- } ) => {
16
  const [ currentPage, setPage ] = useState( 1 );
17
  const [ currentSort, setSort ] = useState( attributes.orderby );
18
  useEffect( () => {
@@ -31,7 +28,6 @@ const ProductListContainer = ( {
31
  return (
32
  <ProductList
33
  attributes={ attributes }
34
- hideOutOfStockItems={ hideOutOfStockItems }
35
  currentPage={ currentPage }
36
  onPageChange={ onPageChange }
37
  onSortChange={ onSortChange }
@@ -42,7 +38,6 @@ const ProductListContainer = ( {
42
 
43
  ProductListContainer.propTypes = {
44
  attributes: PropTypes.object.isRequired,
45
- hideOutOfStockItems: PropTypes.bool,
46
  };
47
 
48
  export default ProductListContainer;
7
  /**
8
  * Internal dependencies
9
  */
10
+ import ProductList from './index';
11
 
12
+ const ProductListContainer = ( { attributes } ) => {
 
 
 
13
  const [ currentPage, setPage ] = useState( 1 );
14
  const [ currentSort, setSort ] = useState( attributes.orderby );
15
  useEffect( () => {
28
  return (
29
  <ProductList
30
  attributes={ attributes }
 
31
  currentPage={ currentPage }
32
  onPageChange={ onPageChange }
33
  onSortChange={ onSortChange }
38
 
39
  ProductListContainer.propTypes = {
40
  attributes: PropTypes.object.isRequired,
 
41
  };
42
 
43
  export default ProductListContainer;
assets/js/base/components/product-list/index.js CHANGED
@@ -1,2 +1,236 @@
1
- export { default as ProductList } from './product-list';
2
- export { default as ProductListContainer } from './container';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __, _n, sprintf } from '@wordpress/i18n';
5
+ import { isEqual } from 'lodash';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import Pagination from '@woocommerce/base-components/pagination';
9
+ import ProductSortSelect from '@woocommerce/base-components/product-sort-select';
10
+ import ProductListItem from '@woocommerce/base-components/product-list-item';
11
+ import { useEffect } from '@wordpress/element';
12
+ import {
13
+ usePrevious,
14
+ useStoreProducts,
15
+ useSynchronizedQueryState,
16
+ useQueryStateByKey,
17
+ } from '@woocommerce/base-hooks';
18
+ import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
19
+ import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
20
+ import { speak } from '@wordpress/a11y';
21
+
22
+ /**
23
+ * Internal dependencies
24
+ */
25
+ import './style.scss';
26
+ import NoProducts from './no-products';
27
+ import NoMatchingProducts from './no-matching-products';
28
+
29
+ const generateQuery = ( { sortValue, currentPage, attributes } ) => {
30
+ const { columns, rows } = attributes;
31
+ const getSortArgs = ( orderName ) => {
32
+ switch ( orderName ) {
33
+ case 'menu_order':
34
+ case 'popularity':
35
+ case 'rating':
36
+ case 'price':
37
+ return {
38
+ orderby: orderName,
39
+ order: 'asc',
40
+ };
41
+ case 'price-desc':
42
+ return {
43
+ orderby: 'price',
44
+ order: 'desc',
45
+ };
46
+ case 'date':
47
+ return {
48
+ orderby: 'date',
49
+ order: 'desc',
50
+ };
51
+ }
52
+ };
53
+ return {
54
+ ...getSortArgs( sortValue ),
55
+ catalog_visibility: 'catalog',
56
+ per_page: columns * rows,
57
+ page: currentPage,
58
+ };
59
+ };
60
+
61
+ /**
62
+ * Given a query state, returns the same query without the attributes related to
63
+ * pagination and sorting.
64
+ *
65
+ * @param {Object} query Query to extract the attributes from.
66
+ *
67
+ * @return {Object} Same query without pagination and sorting attributes.
68
+ */
69
+
70
+ const extractPaginationAndSortAttributes = ( query ) => {
71
+ /* eslint-disable-next-line no-unused-vars, camelcase */
72
+ const { order, orderby, page, per_page, ...totalQuery } = query;
73
+ return totalQuery;
74
+ };
75
+
76
+ const announceLoadingCompletion = ( totalProducts ) => {
77
+ if ( ! Number.isFinite( totalProducts ) ) {
78
+ return;
79
+ }
80
+
81
+ if ( totalProducts === 0 ) {
82
+ speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
83
+ } else {
84
+ speak(
85
+ sprintf(
86
+ // translators: %s is an integer higher than 0 (1, 2, 3...)
87
+ _n(
88
+ '%d product found',
89
+ '%d products found',
90
+ totalProducts,
91
+ 'woo-gutenberg-products-block'
92
+ ),
93
+ totalProducts
94
+ )
95
+ );
96
+ }
97
+ };
98
+
99
+ const ProductList = ( {
100
+ attributes,
101
+ currentPage,
102
+ onPageChange,
103
+ onSortChange,
104
+ sortValue,
105
+ scrollToTop,
106
+ } ) => {
107
+ const [ queryState ] = useSynchronizedQueryState(
108
+ generateQuery( {
109
+ attributes,
110
+ sortValue,
111
+ currentPage,
112
+ } )
113
+ );
114
+ const { products, totalProducts, productsLoading } = useStoreProducts(
115
+ queryState
116
+ );
117
+ const { parentClassName } = useInnerBlockLayoutContext();
118
+ const totalQuery = extractPaginationAndSortAttributes( queryState );
119
+
120
+ // These are possible filters.
121
+ const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
122
+ 'attributes',
123
+ []
124
+ );
125
+ const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
126
+ const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
127
+
128
+ // Only update previous query totals if the query is different and
129
+ // the total number of products is a finite number.
130
+ const previousQueryTotals = usePrevious(
131
+ { totalQuery, totalProducts },
132
+ (
133
+ { totalQuery: nextQuery, totalProducts: nextProducts },
134
+ { totalQuery: currentQuery } = {}
135
+ ) =>
136
+ ! isEqual( nextQuery, currentQuery ) &&
137
+ Number.isFinite( nextProducts )
138
+ );
139
+ const isPreviousTotalQueryEqual =
140
+ typeof previousQueryTotals === 'object' &&
141
+ isEqual( totalQuery, previousQueryTotals.totalQuery );
142
+ useEffect( () => {
143
+ // If query state (excluding pagination/sorting attributes) changed,
144
+ // reset pagination to the first page.
145
+ if ( ! isPreviousTotalQueryEqual ) {
146
+ onPageChange( 1 );
147
+
148
+ // Make sure there was a previous query, so we don't announce it on page load.
149
+ if ( previousQueryTotals ) {
150
+ announceLoadingCompletion( totalProducts );
151
+ }
152
+ }
153
+ }, [ queryState ] );
154
+
155
+ const onPaginationChange = ( newPage ) => {
156
+ scrollToTop( { focusableSelector: 'a, button' } );
157
+ onPageChange( newPage );
158
+ };
159
+
160
+ const getClassnames = () => {
161
+ const { columns, rows, alignButtons, align } = attributes;
162
+ const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
163
+
164
+ return classnames(
165
+ parentClassName,
166
+ alignClass,
167
+ 'has-' + columns + '-columns',
168
+ {
169
+ 'has-multiple-rows': rows > 1,
170
+ 'has-aligned-buttons': alignButtons,
171
+ }
172
+ );
173
+ };
174
+
175
+ const { contentVisibility } = attributes;
176
+ const perPage = attributes.columns * attributes.rows;
177
+ const totalPages =
178
+ ! Number.isFinite( totalProducts ) && isPreviousTotalQueryEqual
179
+ ? Math.ceil( previousQueryTotals.totalProducts / perPage )
180
+ : Math.ceil( totalProducts / perPage );
181
+ const listProducts = products.length
182
+ ? products
183
+ : Array.from( { length: perPage } );
184
+ const hasProducts = products.length !== 0 || productsLoading;
185
+ const hasFilters =
186
+ productAttributes.length > 0 ||
187
+ Number.isFinite( minPrice ) ||
188
+ Number.isFinite( maxPrice );
189
+
190
+ return (
191
+ <div className={ getClassnames() }>
192
+ { contentVisibility.orderBy && hasProducts && (
193
+ <ProductSortSelect
194
+ onChange={ onSortChange }
195
+ value={ sortValue }
196
+ />
197
+ ) }
198
+ { ! hasProducts && hasFilters && (
199
+ <NoMatchingProducts
200
+ resetCallback={ () => {
201
+ setProductAttributes( [] );
202
+ setMinPrice( null );
203
+ setMaxPrice( null );
204
+ } }
205
+ />
206
+ ) }
207
+ { ! hasProducts && ! hasFilters && <NoProducts /> }
208
+ { hasProducts && (
209
+ <ul className={ `${ parentClassName }__products` }>
210
+ { listProducts.map( ( product = {}, i ) => (
211
+ <ProductListItem
212
+ key={ product.id || i }
213
+ attributes={ attributes }
214
+ product={ product }
215
+ />
216
+ ) ) }
217
+ </ul>
218
+ ) }
219
+ { totalPages > 1 && (
220
+ <Pagination
221
+ currentPage={ currentPage }
222
+ onPageChange={ onPaginationChange }
223
+ totalPages={ totalPages }
224
+ />
225
+ ) }
226
+ </div>
227
+ );
228
+ };
229
+
230
+ ProductList.propTypes = {
231
+ attributes: PropTypes.object.isRequired,
232
+ // From withScrollToTop.
233
+ scrollToTop: PropTypes.func,
234
+ };
235
+
236
+ export default withScrollToTop( ProductList );
assets/js/base/components/product-list/product-list.js DELETED
@@ -1,262 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __, _n, sprintf } from '@wordpress/i18n';
5
- import { isEqual } from 'lodash';
6
- import PropTypes from 'prop-types';
7
- import classnames from 'classnames';
8
- import Pagination from '@woocommerce/base-components/pagination';
9
- import { useEffect } from '@wordpress/element';
10
- import { usePrevious } from '@woocommerce/base-hooks';
11
- import {
12
- useStoreEvents,
13
- useStoreProducts,
14
- useSynchronizedQueryState,
15
- useQueryStateByKey,
16
- } from '@woocommerce/base-context/hooks';
17
- import withScrollToTop from '@woocommerce/base-hocs/with-scroll-to-top';
18
- import { useInnerBlockLayoutContext } from '@woocommerce/shared-context';
19
- import { speak } from '@wordpress/a11y';
20
-
21
- /**
22
- * Internal dependencies
23
- */
24
- import NoProducts from './no-products';
25
- import NoMatchingProducts from './no-matching-products';
26
- import ProductSortSelect from './product-sort-select';
27
- import ProductListItem from './product-list-item';
28
- import './style.scss';
29
-
30
- const generateQuery = ( {
31
- sortValue,
32
- currentPage,
33
- attributes,
34
- hideOutOfStockItems,
35
- } ) => {
36
- const { columns, rows } = attributes;
37
- const getSortArgs = ( orderName ) => {
38
- switch ( orderName ) {
39
- case 'menu_order':
40
- case 'popularity':
41
- case 'rating':
42
- case 'price':
43
- return {
44
- orderby: orderName,
45
- order: 'asc',
46
- };
47
- case 'price-desc':
48
- return {
49
- orderby: 'price',
50
- order: 'desc',
51
- };
52
- case 'date':
53
- return {
54
- orderby: 'date',
55
- order: 'desc',
56
- };
57
- }
58
- };
59
-
60
- return {
61
- ...getSortArgs( sortValue ),
62
- catalog_visibility: 'catalog',
63
- per_page: columns * rows,
64
- page: currentPage,
65
- ...( hideOutOfStockItems && {
66
- stock_status: [ 'instock', 'onbackorder' ],
67
- } ),
68
- };
69
- };
70
-
71
- /**
72
- * Given a query state, returns the same query without the attributes related to
73
- * pagination and sorting.
74
- *
75
- * @param {Object} query Query to extract the attributes from.
76
- *
77
- * @return {Object} Same query without pagination and sorting attributes.
78
- */
79
-
80
- const extractPaginationAndSortAttributes = ( query ) => {
81
- /* eslint-disable-next-line no-unused-vars, camelcase */
82
- const { order, orderby, page, per_page, ...totalQuery } = query;
83
- return totalQuery || {};
84
- };
85
-
86
- const announceLoadingCompletion = ( totalProducts ) => {
87
- if ( ! Number.isFinite( totalProducts ) ) {
88
- return;
89
- }
90
-
91
- if ( totalProducts === 0 ) {
92
- speak( __( 'No products found', 'woo-gutenberg-products-block' ) );
93
- } else {
94
- speak(
95
- sprintf(
96
- /* translators: %s is an integer higher than 0 (1, 2, 3...) */
97
- _n(
98
- '%d product found',
99
- '%d products found',
100
- totalProducts,
101
- 'woo-gutenberg-products-block'
102
- ),
103
- totalProducts
104
- )
105
- );
106
- }
107
- };
108
-
109
- const areQueryTotalsDifferent = (
110
- { totalQuery: nextQuery, totalProducts: nextProducts },
111
- { totalQuery: currentQuery } = {}
112
- ) => ! isEqual( nextQuery, currentQuery ) && Number.isFinite( nextProducts );
113
-
114
- const ProductList = ( {
115
- attributes,
116
- currentPage,
117
- onPageChange,
118
- onSortChange,
119
- sortValue,
120
- scrollToTop,
121
- hideOutOfStockItems = false,
122
- } ) => {
123
- const [ queryState ] = useSynchronizedQueryState(
124
- generateQuery( {
125
- attributes,
126
- sortValue,
127
- currentPage,
128
- hideOutOfStockItems,
129
- } )
130
- );
131
- const { products, totalProducts, productsLoading } = useStoreProducts(
132
- queryState
133
- );
134
- const { parentClassName, parentName } = useInnerBlockLayoutContext();
135
- const totalQuery = extractPaginationAndSortAttributes( queryState );
136
- const { dispatchStoreEvent } = useStoreEvents();
137
-
138
- // These are possible filters.
139
- const [ productAttributes, setProductAttributes ] = useQueryStateByKey(
140
- 'attributes',
141
- []
142
- );
143
- const [ minPrice, setMinPrice ] = useQueryStateByKey( 'min_price' );
144
- const [ maxPrice, setMaxPrice ] = useQueryStateByKey( 'max_price' );
145
-
146
- // Only update previous query totals if the query is different and the total number of products is a finite number.
147
- const previousQueryTotals = usePrevious(
148
- { totalQuery, totalProducts },
149
- areQueryTotalsDifferent
150
- );
151
-
152
- // If the product list changes, trigger an event.
153
- useEffect( () => {
154
- dispatchStoreEvent( 'product-list-render', {
155
- products,
156
- listName: parentName,
157
- } );
158
- }, [ products, parentName, dispatchStoreEvent ] );
159
-
160
- // If query state (excluding pagination/sorting attributes) changed, reset pagination to the first page.
161
- useEffect( () => {
162
- if ( isEqual( totalQuery, previousQueryTotals?.totalQuery ) ) {
163
- return;
164
- }
165
- onPageChange( 1 );
166
-
167
- // Make sure there was a previous query, so we don't announce it on page load.
168
- if ( previousQueryTotals?.totalQuery ) {
169
- announceLoadingCompletion( totalProducts );
170
- }
171
- }, [
172
- previousQueryTotals?.totalQuery,
173
- totalProducts,
174
- onPageChange,
175
- totalQuery,
176
- ] );
177
-
178
- const onPaginationChange = ( newPage ) => {
179
- scrollToTop( { focusableSelector: 'a, button' } );
180
- onPageChange( newPage );
181
- };
182
-
183
- const getClassnames = () => {
184
- const { columns, rows, alignButtons, align } = attributes;
185
- const alignClass = typeof align !== 'undefined' ? 'align' + align : '';
186
-
187
- return classnames(
188
- parentClassName,
189
- alignClass,
190
- 'has-' + columns + '-columns',
191
- {
192
- 'has-multiple-rows': rows > 1,
193
- 'has-aligned-buttons': alignButtons,
194
- }
195
- );
196
- };
197
-
198
- const { contentVisibility } = attributes;
199
- const perPage = attributes.columns * attributes.rows;
200
- const totalPages =
201
- ! Number.isFinite( totalProducts ) &&
202
- Number.isFinite( previousQueryTotals?.totalProducts ) &&
203
- isEqual( totalQuery, previousQueryTotals?.totalQuery )
204
- ? Math.ceil( previousQueryTotals.totalProducts / perPage )
205
- : Math.ceil( totalProducts / perPage );
206
- const listProducts = products.length
207
- ? products
208
- : Array.from( { length: perPage } );
209
- const hasProducts = products.length !== 0 || productsLoading;
210
- const hasFilters =
211
- productAttributes.length > 0 ||
212
- Number.isFinite( minPrice ) ||
213
- Number.isFinite( maxPrice );
214
-
215
- return (
216
- <div className={ getClassnames() }>
217
- { contentVisibility.orderBy && hasProducts && (
218
- <ProductSortSelect
219
- onChange={ onSortChange }
220
- value={ sortValue }
221
- />
222
- ) }
223
- { ! hasProducts && hasFilters && (
224
- <NoMatchingProducts
225
- resetCallback={ () => {
226
- setProductAttributes( [] );
227
- setMinPrice( null );
228
- setMaxPrice( null );
229
- } }
230
- />
231
- ) }
232
- { ! hasProducts && ! hasFilters && <NoProducts /> }
233
- { hasProducts && (
234
- <ul className={ `${ parentClassName }__products` }>
235
- { listProducts.map( ( product = {}, i ) => (
236
- <ProductListItem
237
- key={ product.id || i }
238
- attributes={ attributes }
239
- product={ product }
240
- />
241
- ) ) }
242
- </ul>
243
- ) }
244
- { totalPages > 1 && (
245
- <Pagination
246
- currentPage={ currentPage }
247
- onPageChange={ onPaginationChange }
248
- totalPages={ totalPages }
249
- />
250
- ) }
251
- </div>
252
- );
253
- };
254
-
255
- ProductList.propTypes = {
256
- attributes: PropTypes.object.isRequired,
257
- hideOutOfStockItems: PropTypes.bool,
258
- // From withScrollToTop.
259
- scrollToTop: PropTypes.func,
260
- };
261
-
262
- export default withScrollToTop( ProductList );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-list/style.scss CHANGED
@@ -55,11 +55,6 @@
55
  list-style: none;
56
  }
57
 
58
- // Increased specificity necessary as Gutenberg's generic reset overrides box sizing
59
- .wc-block-grid__product.wc-block-grid__product {
60
- box-sizing: border-box;
61
- }
62
-
63
  .theme-twentytwenty .wc-block-grid,
64
  .wc-block-grid {
65
  &.has-aligned-buttons {
@@ -79,25 +74,15 @@
79
  max-width: 100% / $i;
80
  }
81
  }
82
- // Adjust font size as more cols are added.
83
- &.has-6-columns .wc-block-grid__product {
84
- font-size: 0.5em;
85
- }
86
- &.has-6-columns.alignfull,
87
- &.has-5-columns {
88
- .wc-block-grid__product {
89
- font-size: 0.58em;
90
- }
91
- }
92
- &.has-5-columns.alignfull,
93
- &.has-4-columns:not(.alignwide):not(.alignfull) {
94
  .wc-block-grid__product {
95
- font-size: 0.75em;
96
  }
97
  }
98
- &.has-3-columns:not(.alignwide):not(.alignfull) {
99
- font-size: 0.92em;
100
- }
101
  }
102
 
103
  @include breakpoint( "<480px" ) {
55
  list-style: none;
56
  }
57
 
 
 
 
 
 
58
  .theme-twentytwenty .wc-block-grid,
59
  .wc-block-grid {
60
  &.has-aligned-buttons {
74
  max-width: 100% / $i;
75
  }
76
  }
77
+ &.has-4-columns:not(.alignwide):not(.alignfull),
78
+ &.has-5-columns:not(.alignfull),
79
+ &.has-6-columns:not(.alignfull),
80
+ &.has-7-columns,
81
+ &.has-8-columns {
 
 
 
 
 
 
 
82
  .wc-block-grid__product {
83
+ font-size: 0.8em;
84
  }
85
  }
 
 
 
86
  }
87
 
88
  @include breakpoint( "<480px" ) {
assets/js/base/components/product-name/index.tsx DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { decodeEntities } from '@wordpress/html-entities';
5
- import classnames from 'classnames';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import './style.scss';
11
-
12
- /**
13
- * Render the Product name.
14
- *
15
- * The store API runs titles through `wp_kses_post()` which removes dangerous HTML tags, so using it inside `dangerouslySetInnerHTML` is considered safe.
16
- */
17
- export default ( {
18
- className = '',
19
- disabled = false,
20
- name,
21
- permalink = '',
22
- ...props
23
- }: {
24
- className: string;
25
- disabled: boolean;
26
- name: string;
27
- permalink: string;
28
- } ): JSX.Element => {
29
- const classes = classnames( 'wc-block-components-product-name', className );
30
- return disabled ? (
31
- <span
32
- className={ classes }
33
- { ...props }
34
- dangerouslySetInnerHTML={ {
35
- __html: decodeEntities( name ),
36
- } }
37
- />
38
- ) : (
39
- <a
40
- className={ classes }
41
- href={ permalink }
42
- { ...props }
43
- dangerouslySetInnerHTML={ {
44
- __html: decodeEntities( name ),
45
- } }
46
- />
47
- );
48
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/stories/index.js DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { boolean } from '@storybook/addon-knobs';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductName from '../';
10
-
11
- export default {
12
- title: 'WooCommerce Blocks/@base-components/cart-checkout/ProductName',
13
- component: ProductName,
14
- };
15
-
16
- export const Default = () => {
17
- const disabled = boolean( 'disabled', false );
18
-
19
- return (
20
- <ProductName
21
- disabled={ disabled }
22
- name={ 'Test product' }
23
- permalink={ '/' }
24
- />
25
- );
26
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/test/__snapshots__/index.js.snap DELETED
@@ -1,49 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductName should merge classes and props 1`] = `
4
- <a
5
- className="wc-block-components-product-name lorem-ipsum"
6
- dangerouslySetInnerHTML={
7
- Object {
8
- "__html": "Test product",
9
- }
10
- }
11
- href="/"
12
- rel="nofollow"
13
- />
14
- `;
15
-
16
- exports[`ProductName should not render a link if disabled is true 1`] = `
17
- <span
18
- className="wc-block-components-product-name"
19
- dangerouslySetInnerHTML={
20
- Object {
21
- "__html": "Test product",
22
- }
23
- }
24
- />
25
- `;
26
-
27
- exports[`ProductName should render a link if disabled is false 1`] = `
28
- <a
29
- className="wc-block-components-product-name"
30
- dangerouslySetInnerHTML={
31
- Object {
32
- "__html": "Test product",
33
- }
34
- }
35
- href="/"
36
- />
37
- `;
38
-
39
- exports[`ProductName should render a link if disabled is not defined 1`] = `
40
- <a
41
- className="wc-block-components-product-name"
42
- dangerouslySetInnerHTML={
43
- Object {
44
- "__html": "Test product",
45
- }
46
- }
47
- href="/"
48
- />
49
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-name/test/index.js DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductName from '..';
10
-
11
- describe( 'ProductName', () => {
12
- test( 'should not render a link if disabled is true', () => {
13
- const component = TestRenderer.create(
14
- <ProductName disabled={ true } name="Test product" permalink="/" />
15
- );
16
-
17
- expect( component.toJSON() ).toMatchSnapshot();
18
- } );
19
-
20
- test( 'should render a link if disabled is false', () => {
21
- const component = TestRenderer.create(
22
- <ProductName disabled={ false } name="Test product" permalink="/" />
23
- );
24
-
25
- expect( component.toJSON() ).toMatchSnapshot();
26
- } );
27
-
28
- test( 'should render a link if disabled is not defined', () => {
29
- const component = TestRenderer.create(
30
- <ProductName name="Test product" permalink="/" />
31
- );
32
-
33
- expect( component.toJSON() ).toMatchSnapshot();
34
- } );
35
-
36
- test( 'should merge classes and props', () => {
37
- const component = TestRenderer.create(
38
- <ProductName
39
- className="lorem-ipsum"
40
- name="Test product"
41
- permalink="/"
42
- rel="nofollow"
43
- />
44
- );
45
-
46
- expect( component.toJSON() ).toMatchSnapshot();
47
- } );
48
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/index.js CHANGED
@@ -1,12 +1,10 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { __, sprintf } from '@wordpress/i18n';
5
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
  import classNames from 'classnames';
7
  import PropTypes from 'prop-types';
8
- import { createInterpolateElement } from 'wordpress-element';
9
- import { formatPrice } from '@woocommerce/price-format';
10
 
11
  /**
12
  * Internal dependencies
@@ -14,6 +12,7 @@ import { formatPrice } from '@woocommerce/price-format';
14
  import './style.scss';
15
 
16
  const PriceRange = ( {
 
17
  currency,
18
  maxPrice,
19
  minPrice,
@@ -21,44 +20,32 @@ const PriceRange = ( {
21
  priceStyle,
22
  } ) => {
23
  return (
24
- <>
25
- <span className="screen-reader-text">
26
- { sprintf(
27
- /* translators: %1$s min price, %2$s max price */
28
- __(
29
- 'Price between %1$s and %2$s',
30
- 'woo-gutenberg-products-block'
31
- ),
32
- formatPrice( minPrice ),
33
- formatPrice( maxPrice )
34
  ) }
35
- </span>
36
- <span aria-hidden={ true }>
37
- <FormattedMonetaryAmount
38
- className={ classNames(
39
- 'wc-block-components-product-price__value',
40
- priceClassName
41
- ) }
42
- currency={ currency }
43
- value={ minPrice }
44
- style={ priceStyle }
45
- />
46
- &nbsp;&mdash;&nbsp;
47
- <FormattedMonetaryAmount
48
- className={ classNames(
49
- 'wc-block-components-product-price__value',
50
- priceClassName
51
- ) }
52
- currency={ currency }
53
- value={ maxPrice }
54
- style={ priceStyle }
55
- />
56
- </span>
57
- </>
58
  );
59
  };
60
 
61
  const SalePrice = ( {
 
62
  currency,
63
  regularPriceClassName,
64
  regularPriceStyle,
@@ -68,7 +55,7 @@ const SalePrice = ( {
68
  price,
69
  } ) => {
70
  return (
71
- <>
72
  <span className="screen-reader-text">
73
  { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
74
  </span>
@@ -106,7 +93,7 @@ const SalePrice = ( {
106
  ) }
107
  value={ price }
108
  />
109
- </>
110
  );
111
  };
112
 
@@ -114,7 +101,6 @@ const ProductPrice = ( {
114
  align,
115
  className,
116
  currency,
117
- format = '<price/>',
118
  maxPrice = null,
119
  minPrice = null,
120
  price = null,
@@ -133,25 +119,12 @@ const ProductPrice = ( {
133
  }
134
  );
135
 
136
- if ( ! format.includes( '<price/>' ) ) {
137
- format = '<price/>';
138
- // eslint-disable-next-line no-console
139
- console.error( 'Price formats need to include the `<price/>` tag.' );
140
- }
141
-
142
  const isDiscounted = regularPrice && price !== regularPrice;
143
- let priceComponent = (
144
- <span
145
- className={ classNames(
146
- 'wc-block-components-product-price__value',
147
- priceClassName
148
- ) }
149
- />
150
- );
151
 
152
  if ( isDiscounted ) {
153
- priceComponent = (
154
  <SalePrice
 
155
  currency={ currency }
156
  price={ price }
157
  priceClassName={ priceClassName }
@@ -161,9 +134,12 @@ const ProductPrice = ( {
161
  regularPriceStyle={ regularPriceStyle }
162
  />
163
  );
164
- } else if ( minPrice !== null && maxPrice !== null ) {
165
- priceComponent = (
 
 
166
  <PriceRange
 
167
  currency={ currency }
168
  maxPrice={ maxPrice }
169
  minPrice={ minPrice }
@@ -171,25 +147,32 @@ const ProductPrice = ( {
171
  priceStyle={ priceStyle }
172
  />
173
  );
174
- } else if ( price !== null ) {
175
- priceComponent = (
176
- <FormattedMonetaryAmount
177
- className={ classNames(
178
- 'wc-block-components-product-price__value',
179
- priceClassName
180
- ) }
181
- currency={ currency }
182
- value={ price }
183
- style={ priceStyle }
184
- />
 
 
 
 
185
  );
186
  }
187
 
188
  return (
189
  <span className={ wrapperClassName }>
190
- { createInterpolateElement( format, {
191
- price: priceComponent,
192
- } ) }
 
 
 
193
  </span>
194
  );
195
  };
@@ -198,7 +181,6 @@ ProductPrice.propTypes = {
198
  align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
199
  className: PropTypes.string,
200
  currency: PropTypes.object,
201
- format: PropTypes.string,
202
  price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
203
  priceClassName: PropTypes.string,
204
  priceStyle: PropTypes.object,
1
  /**
2
  * External dependencies
3
  */
4
+ import { __ } from '@wordpress/i18n';
5
  import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
6
  import classNames from 'classnames';
7
  import PropTypes from 'prop-types';
 
 
8
 
9
  /**
10
  * Internal dependencies
12
  import './style.scss';
13
 
14
  const PriceRange = ( {
15
+ className,
16
  currency,
17
  maxPrice,
18
  minPrice,
20
  priceStyle,
21
  } ) => {
22
  return (
23
+ <span className={ className }>
24
+ <FormattedMonetaryAmount
25
+ className={ classNames(
26
+ 'wc-block-components-product-price__value',
27
+ priceClassName
 
 
 
 
 
28
  ) }
29
+ currency={ currency }
30
+ value={ minPrice }
31
+ style={ priceStyle }
32
+ />
33
+ &nbsp;&mdash;&nbsp;
34
+ <FormattedMonetaryAmount
35
+ className={ classNames(
36
+ 'wc-block-components-product-price__value',
37
+ priceClassName
38
+ ) }
39
+ currency={ currency }
40
+ value={ maxPrice }
41
+ style={ priceStyle }
42
+ />
43
+ </span>
 
 
 
 
 
 
 
 
44
  );
45
  };
46
 
47
  const SalePrice = ( {
48
+ className,
49
  currency,
50
  regularPriceClassName,
51
  regularPriceStyle,
55
  price,
56
  } ) => {
57
  return (
58
+ <span className={ className }>
59
  <span className="screen-reader-text">
60
  { __( 'Previous price:', 'woo-gutenberg-products-block' ) }
61
  </span>
93
  ) }
94
  value={ price }
95
  />
96
+ </span>
97
  );
98
  };
99
 
101
  align,
102
  className,
103
  currency,
 
104
  maxPrice = null,
105
  minPrice = null,
106
  price = null,
119
  }
120
  );
121
 
 
 
 
 
 
 
122
  const isDiscounted = regularPrice && price !== regularPrice;
 
 
 
 
 
 
 
 
123
 
124
  if ( isDiscounted ) {
125
+ return (
126
  <SalePrice
127
+ className={ wrapperClassName }
128
  currency={ currency }
129
  price={ price }
130
  priceClassName={ priceClassName }
134
  regularPriceStyle={ regularPriceStyle }
135
  />
136
  );
137
+ }
138
+
139
+ if ( minPrice !== null && maxPrice !== null ) {
140
+ return (
141
  <PriceRange
142
+ className={ wrapperClassName }
143
  currency={ currency }
144
  maxPrice={ maxPrice }
145
  minPrice={ minPrice }
147
  priceStyle={ priceStyle }
148
  />
149
  );
150
+ }
151
+
152
+ if ( price !== null ) {
153
+ return (
154
+ <span className={ wrapperClassName }>
155
+ <FormattedMonetaryAmount
156
+ className={ classNames(
157
+ 'wc-block-components-product-price__value',
158
+ priceClassName
159
+ ) }
160
+ currency={ currency }
161
+ value={ price }
162
+ style={ priceStyle }
163
+ />
164
+ </span>
165
  );
166
  }
167
 
168
  return (
169
  <span className={ wrapperClassName }>
170
+ <span
171
+ className={ classNames(
172
+ 'wc-block-components-product-price__value',
173
+ priceClassName
174
+ ) }
175
+ />
176
  </span>
177
  );
178
  };
181
  align: PropTypes.oneOf( [ 'left', 'center', 'right' ] ),
182
  className: PropTypes.string,
183
  currency: PropTypes.object,
 
184
  price: PropTypes.oneOfType( [ PropTypes.number, PropTypes.string ] ),
185
  priceClassName: PropTypes.string,
186
  priceStyle: PropTypes.object,
assets/js/base/components/product-price/stories/index.js CHANGED
@@ -2,7 +2,6 @@
2
  * External dependencies
3
  */
4
  import { number, select } from '@storybook/addon-knobs';
5
- import { currencyKnob } from '@woocommerce/knobs';
6
 
7
  /**
8
  * Internal dependencies
@@ -14,9 +13,37 @@ export default {
14
  component: ProductPrice,
15
  };
16
 
17
- export const standard = () => {
18
  const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
19
- const currency = currencyKnob();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  const price = number( 'Price', 4000 );
21
 
22
  return (
@@ -25,8 +52,7 @@ export const standard = () => {
25
  };
26
 
27
  export const sale = () => {
28
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
29
- const currency = currencyKnob();
30
  const price = number( 'Price', 3000 );
31
  const regularPrice = number( 'Regular price', 4000 );
32
 
@@ -41,8 +67,7 @@ export const sale = () => {
41
  };
42
 
43
  export const range = () => {
44
- const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
45
- const currency = currencyKnob();
46
  const minPrice = number( 'Min price', 3000 );
47
  const maxPrice = number( 'Max price', 5000 );
48
 
2
  * External dependencies
3
  */
4
  import { number, select } from '@storybook/addon-knobs';
 
5
 
6
  /**
7
  * Internal dependencies
13
  component: ProductPrice,
14
  };
15
 
16
+ const getKnobs = () => {
17
  const align = select( 'Align', [ 'left', 'center', 'right' ], 'left' );
18
+ const currencies = [
19
+ {
20
+ label: 'USD',
21
+ code: 'USD',
22
+ symbol: '$',
23
+ thousandSeparator: ',',
24
+ decimalSeparator: '.',
25
+ minorUnit: 2,
26
+ prefix: '$',
27
+ suffix: '',
28
+ },
29
+ {
30
+ label: 'EUR',
31
+ code: 'EUR',
32
+ symbol: '€',
33
+ thousandSeparator: '.',
34
+ decimalSeparator: ',',
35
+ minorUnit: 2,
36
+ prefix: '',
37
+ suffix: '€',
38
+ },
39
+ ];
40
+ const currency = select( 'Currency', currencies, currencies[ 0 ] );
41
+
42
+ return { align, currency };
43
+ };
44
+
45
+ export const standard = () => {
46
+ const { align, currency } = getKnobs();
47
  const price = number( 'Price', 4000 );
48
 
49
  return (
52
  };
53
 
54
  export const sale = () => {
55
+ const { align, currency } = getKnobs();
 
56
  const price = number( 'Price', 3000 );
57
  const regularPrice = number( 'Regular price', 4000 );
58
 
67
  };
68
 
69
  export const range = () => {
70
+ const { align, currency } = getKnobs();
 
71
  const minPrice = number( 'Min price', 3000 );
72
  const maxPrice = number( 'Max price', 5000 );
73
 
assets/js/base/components/product-price/test/__snapshots__/index.js.snap DELETED
@@ -1,57 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`ProductPrice should apply the format if one is provided 1`] = `
4
- <span
5
- className="price wc-block-components-product-price"
6
- >
7
- pre price
8
- <span
9
- className="screen-reader-text"
10
- >
11
- Previous price:
12
- </span>
13
- <del
14
- className="wc-block-components-product-price__regular"
15
- >
16
- £1.00
17
- </del>
18
- <span
19
- className="screen-reader-text"
20
- >
21
- Discounted price:
22
- </span>
23
- <ins
24
- className="wc-block-components-product-price__value is-discounted"
25
- >
26
- £0.50
27
- </ins>
28
- Test format
29
- </span>
30
- `;
31
-
32
- exports[`ProductPrice should use default price if no format is provided 1`] = `
33
- <span
34
- className="price wc-block-components-product-price"
35
- >
36
- <span
37
- className="screen-reader-text"
38
- >
39
- Previous price:
40
- </span>
41
- <del
42
- className="wc-block-components-product-price__regular"
43
- >
44
- £1.00
45
- </del>
46
- <span
47
- className="screen-reader-text"
48
- >
49
- Discounted price:
50
- </span>
51
- <ins
52
- className="wc-block-components-product-price__value is-discounted"
53
- >
54
- £0.50
55
- </ins>
56
- </span>
57
- `;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/product-price/test/index.js DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import TestRenderer from 'react-test-renderer';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import ProductPrice from '../index';
10
-
11
- describe( 'ProductPrice', () => {
12
- const currency = {
13
- code: 'GBP',
14
- currency_code: 'GBP',
15
- currency_decimal_separator: '.',
16
- currency_minor_unit: 2,
17
- currency_prefix: '£',
18
- currency_suffix: '',
19
- currency_symbol: '£',
20
- currency_thousand_separator: ',',
21
- decimalSeparator: '.',
22
- minorUnit: 2,
23
- prefix: '£',
24
- price: '61400',
25
- price_range: null,
26
- raw_prices: {
27
- precision: 6,
28
- price: '614000000',
29
- regular_price: '614000000',
30
- sale_price: '614000000',
31
- },
32
- regular_price: '61400',
33
- sale_price: '61400',
34
- suffix: '',
35
- symbol: '£',
36
- thousandSeparator: ',',
37
- };
38
-
39
- test( 'should use default price if no format is provided', () => {
40
- const component = TestRenderer.create(
41
- <ProductPrice
42
- price={ 50 }
43
- regularPrice={ 100 }
44
- currency={ currency }
45
- />
46
- );
47
-
48
- expect( component.toJSON() ).toMatchSnapshot();
49
- } );
50
-
51
- test( 'should apply the format if one is provided', () => {
52
- const component = TestRenderer.create(
53
- <ProductPrice
54
- price={ 50 }
55
- regularPrice={ 100 }
56
- currency={ currency }
57
- format="pre price <price/> Test format"
58
- />
59
- );
60
-
61
- expect( component.toJSON() ).toMatchSnapshot();
62
- } );
63
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/index.js RENAMED
File without changes
assets/js/base/components/{product-list/product-sort-select → product-sort-select}/style.scss RENAMED
File without changes
assets/js/base/components/quantity-selector/{index.tsx → index.js} RENAMED
@@ -3,37 +3,25 @@
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
 
6
  import classNames from 'classnames';
7
  import { useCallback } from '@wordpress/element';
8
  import { DOWN, UP } from '@wordpress/keycodes';
9
- import { isNumber } from '@woocommerce/types';
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
16
- interface QuantitySelectorProps {
17
- className?: string;
18
- quantity?: number;
19
- minimum?: number;
20
- maximum: number;
21
- onChange: ( newQuantity: number ) => void;
22
- itemName?: string;
23
- disabled: boolean;
24
- }
25
-
26
  const QuantitySelector = ( {
27
  className,
28
  quantity = 1,
29
  minimum = 1,
30
  maximum,
31
- onChange = () => {
32
- /* Do nothing. */
33
- },
34
  itemName = '',
35
  disabled,
36
- }: QuantitySelectorProps ): JSX.Element => {
37
  const classes = classNames(
38
  'wc-block-components-quantity-selector',
39
  className
@@ -84,7 +72,7 @@ const QuantitySelector = ( {
84
  onKeyDown={ quantityInputOnKeyDown }
85
  onChange={ ( event ) => {
86
  let value =
87
- ! isNumber( event.target.value ) || ! event.target.value
88
  ? 0
89
  : parseInt( event.target.value, 10 );
90
  if ( hasMaximum ) {
@@ -96,7 +84,7 @@ const QuantitySelector = ( {
96
  }
97
  } }
98
  aria-label={ sprintf(
99
- /* translators: %s refers to the item name in the cart. */
100
  __(
101
  'Quantity of %s in your cart.',
102
  'woo-gutenberg-products-block'
@@ -116,7 +104,7 @@ const QuantitySelector = ( {
116
  onChange( newQuantity );
117
  speak(
118
  sprintf(
119
- /* translators: %s refers to the item name in the cart. */
120
  __(
121
  'Quantity reduced to %s.',
122
  'woo-gutenberg-products-block'
@@ -140,7 +128,7 @@ const QuantitySelector = ( {
140
  onChange( newQuantity );
141
  speak(
142
  sprintf(
143
- /* translators: %s refers to the item name in the cart. */
144
  __(
145
  'Quantity increased to %s.',
146
  'woo-gutenberg-products-block'
@@ -156,4 +144,14 @@ const QuantitySelector = ( {
156
  );
157
  };
158
 
 
 
 
 
 
 
 
 
 
 
159
  export default QuantitySelector;
3
  */
4
  import { __, sprintf } from '@wordpress/i18n';
5
  import { speak } from '@wordpress/a11y';
6
+ import PropTypes from 'prop-types';
7
  import classNames from 'classnames';
8
  import { useCallback } from '@wordpress/element';
9
  import { DOWN, UP } from '@wordpress/keycodes';
 
10
 
11
  /**
12
  * Internal dependencies
13
  */
14
  import './style.scss';
15
 
 
 
 
 
 
 
 
 
 
 
16
  const QuantitySelector = ( {
17
  className,
18
  quantity = 1,
19
  minimum = 1,
20
  maximum,
21
+ onChange = () => null,
 
 
22
  itemName = '',
23
  disabled,
24
+ } ) => {
25
  const classes = classNames(
26
  'wc-block-components-quantity-selector',
27
  className
72
  onKeyDown={ quantityInputOnKeyDown }
73
  onChange={ ( event ) => {
74
  let value =
75
+ isNaN( event.target.value ) || ! event.target.value
76
  ? 0
77
  : parseInt( event.target.value, 10 );
78
  if ( hasMaximum ) {
84
  }
85
  } }
86
  aria-label={ sprintf(
87
+ /* Translators: %s refers to the item name in the cart. */
88
  __(
89
  'Quantity of %s in your cart.',
90
  'woo-gutenberg-products-block'
104
  onChange( newQuantity );
105
  speak(
106
  sprintf(
107
+ /* Translators: %s refers to the item name in the cart. */
108
  __(
109
  'Quantity reduced to %s.',
110
  'woo-gutenberg-products-block'
128
  onChange( newQuantity );
129
  speak(
130
  sprintf(
131
+ /* Translators: %s refers to the item name in the cart. */
132
  __(
133
  'Quantity increased to %s.',
134
  'woo-gutenberg-products-block'
144
  );
145
  };
146
 
147
+ QuantitySelector.propTypes = {
148
+ className: PropTypes.string,
149
+ quantity: PropTypes.number,
150
+ minimum: PropTypes.number,
151
+ maximum: PropTypes.number,
152
+ onChange: PropTypes.func,
153
+ itemName: PropTypes.string,
154
+ disabled: PropTypes.bool,
155
+ };
156
+
157
  export default QuantitySelector;
assets/js/base/components/quantity-selector/style.scss CHANGED
@@ -6,19 +6,18 @@
6
  box-shadow: none;
7
 
8
  &:focus {
9
- outline: 2px solid $gray-300;
10
  }
11
  }
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
- width: 107px;
16
- border: 1px solid $gray-300;
17
  background: #fff;
18
  border-radius: 4px;
19
  // needed so that buttons fill the container.
20
  box-sizing: content-box;
21
- margin: 0 0 0.25em 0;
22
 
23
  .has-dark-controls & {
24
  background-color: transparent;
@@ -43,11 +42,11 @@
43
  -moz-appearance: textfield;
44
 
45
  &:focus {
46
- background: $gray-100;
47
- outline: 1px solid $gray-300;
48
  }
49
  &:disabled {
50
- color: $gray-600;
51
  }
52
 
53
  .has-dark-controls & {
@@ -67,24 +66,22 @@
67
  -webkit-appearance: none;
68
  margin: 0;
69
  }
70
-
71
  .wc-block-components-quantity-selector__button {
72
  @include reset-button;
73
  @include font-size(regular);
74
  min-width: 30px;
75
  cursor: pointer;
76
- color: $gray-900;
77
  font-style: normal;
78
  text-align: center;
79
- text-decoration: none;
80
 
81
  &:hover,
82
  &:focus {
83
  @include reset-button;
84
- color: $gray-900;
85
  }
86
  &:disabled {
87
- color: $gray-600;
88
  cursor: default;
89
  @include reset-button;
90
  }
@@ -101,21 +98,10 @@
101
  }
102
  }
103
  }
104
-
105
- > .wc-block-components-quantity-selector__button--minus {
106
  order: 1;
107
  }
108
-
109
- > .wc-block-components-quantity-selector__button--plus {
110
  order: 3;
111
  }
112
  }
113
-
114
- .theme-twentyseventeen {
115
- .wc-block-components-quantity-selector .wc-block-components-quantity-selector__button {
116
- &:hover,
117
- &:focus {
118
- background: none transparent;
119
- }
120
- }
121
- }
6
  box-shadow: none;
7
 
8
  &:focus {
9
+ outline: 2px solid $core-grey-light-600;
10
  }
11
  }
12
 
13
  .wc-block-components-quantity-selector {
14
  display: flex;
15
+ min-width: 100px;
16
+ border: 1px solid $core-grey-light-600;
17
  background: #fff;
18
  border-radius: 4px;
19
  // needed so that buttons fill the container.
20
  box-sizing: content-box;
 
21
 
22
  .has-dark-controls & {
23
  background-color: transparent;
42
  -moz-appearance: textfield;
43
 
44
  &:focus {
45
+ background: $core-grey-light-200;
46
+ outline: 1px solid $core-grey-light-600;
47
  }
48
  &:disabled {
49
+ color: $core-grey-dark-100;
50
  }
51
 
52
  .has-dark-controls & {
66
  -webkit-appearance: none;
67
  margin: 0;
68
  }
 
69
  .wc-block-components-quantity-selector__button {
70
  @include reset-button;
71
  @include font-size(regular);
72
  min-width: 30px;
73
  cursor: pointer;
74
+ color: $core-grey-dark-700;
75
  font-style: normal;
76
  text-align: center;
 
77
 
78
  &:hover,
79
  &:focus {
80
  @include reset-button;
81
+ color: $core-grey-dark-900;
82
  }
83
  &:disabled {
84
+ color: $core-grey-dark-100;
85
  cursor: default;
86
  @include reset-button;
87
  }
98
  }
99
  }
100
  }
101
+ .wc-block-components-quantity-selector__button--minus {
 
102
  order: 1;
103
  }
104
+ .wc-block-components-quantity-selector__button--plus {
 
105
  order: 3;
106
  }
107
  }
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control-accordion/index.js DELETED
@@ -1,73 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import classnames from 'classnames';
5
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import RadioControlOption from '../radio-control/option';
11
-
12
- const RadioControlAccordion = ( {
13
- className,
14
- instanceId,
15
- id,
16
- selected,
17
- onChange,
18
- options = [],
19
- } ) => {
20
- const radioControlId = id || instanceId;
21
-
22
- return (
23
- options.length && (
24
- <div
25
- className={ classnames(
26
- 'wc-block-components-radio-control',
27
- className
28
- ) }
29
- >
30
- { options.map( ( option ) => {
31
- const hasOptionContent =
32
- typeof option === 'object' && 'content' in option;
33
- const checked = option.value === selected;
34
- return (
35
- <div
36
- className="wc-block-components-radio-control-accordion-option"
37
- key={ option.value }
38
- >
39
- <RadioControlOption
40
- name={ `radio-control-${ radioControlId }` }
41
- checked={ checked }
42
- option={ option }
43
- onChange={ ( value ) => {
44
- onChange( value );
45
- if (
46
- typeof option.onChange === 'function'
47
- ) {
48
- option.onChange( value );
49
- }
50
- } }
51
- />
52
- { hasOptionContent && checked && (
53
- <div
54
- className={ classnames(
55
- 'wc-block-components-radio-control-accordion-content',
56
- {
57
- 'wc-block-components-radio-control-accordion-content-hide': ! checked,
58
- }
59
- ) }
60
- >
61
- { option.content }
62
- </div>
63
- ) }
64
- </div>
65
- );
66
- } ) }
67
- </div>
68
- )
69
- );
70
- };
71
-
72
- export default withInstanceId( RadioControlAccordion );
73
- export { RadioControlAccordion };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/radio-control/_mixin.scss ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @mixin radio-control-styles {
2
+ .wc-block-components-radio-control__option {
3
+ @include reset-typography();
4
+ @include with-translucent-border(0 0 1px);
5
+ display: block;
6
+ padding: $gap-small $gap-small 0 #{$gap-larger * 2};
7
+ }
8
+
9
+ .wc-block-components-radio-control__option-layout {
10
+ @include with-translucent-border(0 0 1px);
11
+ display: table;
12
+ width: 100%;
13
+ padding-bottom: $gap-small;
14
+ }
15
+
16
+ .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
17
+ &::after {
18
+ display: none;
19
+ }
20
+ }
21
+
22
+ .wc-block-components-radio-control__input {
23
+ left: $gap-large;
24
+ position: absolute;
25
+ top: $gap-small;
26
+ }
27
+
28
+ .wc-block-components-radio-control__label-group,
29
+ .wc-block-components-radio-control__description-group {
30
+ display: table-row;
31
+
32
+ > span {
33
+ display: table-cell;
34
+ }
35
+
36
+ .wc-block-components-radio-control__secondary-label,
37
+ .wc-block-components-radio-control__secondary-description {
38
+ text-align: right;
39
+ min-width: 50%;
40
+ }
41
+ }
42
+
43
+ .wc-block-components-radio-control__label,
44
+ .wc-block-components-radio-control__secondary-label {
45
+ line-height: 20px;
46
+ // Currently, max() CSS function calls need to be wrapped with unquote.
47
+ // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
48
+ line-height: unquote("max(1rem, 20px)");
49
+ }
50
+
51
+ .wc-block-components-radio-control__description,
52
+ .wc-block-components-radio-control__secondary-description {
53
+ @include font-size(small);
54
+ line-height: 20px;
55
+ }
56
+ }
57
+
58
+ @mixin radio-control-input-styles {
59
+ // Extra class for specificity.
60
+ .wc-block-components-radio-control {
61
+ .wc-block-components-radio-control__input {
62
+ appearance: none;
63
+ background: transparent;
64
+ border: 2px solid currentColor;
65
+ border-radius: 50%;
66
+ display: inline-block;
67
+ height: 1.25rem;
68
+ min-height: 20px;
69
+ min-width: 20px;
70
+ width: 1.25rem;
71
+
72
+ &:checked::before {
73
+ background: currentColor;
74
+ border-radius: 50%;
75
+ content: "";
76
+ display: block;
77
+ height: 0.625em;
78
+ left: 50%;
79
+ margin: 0;
80
+ min-height: 10px;
81
+ min-width: 10px;
82
+ position: absolute;
83
+ top: 50%;
84
+ transform: translate(-50%, -50%);
85
+ width: 0.625em;
86
+ }
87
+
88
+ .has-dark-controls & {
89
+ border-color: $controls-border-dark;
90
+
91
+ &:checked::before {
92
+ background: $input-text-dark;
93
+ }
94
+ }
95
+ }
96
+
97
+ @include breakpoint( ">782px" ) {
98
+ .wc-block-components-radio-control__input {
99
+ height: 1rem;
100
+ margin-top: 2px;
101
+ min-height: 16px;
102
+ min-width: 16px;
103
+ width: 1rem;
104
+
105
+ &:checked::before {
106
+ height: 0.5em;
107
+ min-height: 8px;
108
+ min-width: 8px;
109
+ width: 0.5em;
110
+ }
111
+ }
112
+ }
113
+ }
114
+ }
assets/js/base/components/radio-control/index.js CHANGED
@@ -30,7 +30,7 @@ const RadioControl = ( {
30
  >
31
  { options.map( ( option ) => (
32
  <RadioControlOption
33
- key={ `${ radioControlId }-${ option.value }` }
34
  name={ `radio-control-${ radioControlId }` }
35
  checked={ option.value === selected }
36
  option={ option }
30
  >
31
  { options.map( ( option ) => (
32
  <RadioControlOption
33
+ key={ option.value }
34
  name={ `radio-control-${ radioControlId }` }
35
  checked={ option.value === selected }
36
  option={ option }
assets/js/base/components/radio-control/{option-layout.tsx → option-layout.js} RENAMED
@@ -1,22 +1,16 @@
1
- /**
2
- * External dependencies
3
- */
4
- import type { ReactElement } from 'react';
5
- import type { PackageRateOption } from '@woocommerce/type-defs/shipping';
6
-
7
  const OptionLayout = ( {
8
  label,
9
  secondaryLabel,
10
  description,
11
  secondaryDescription,
12
  id,
13
- }: Partial< PackageRateOption > ): ReactElement => {
14
  return (
15
  <div className="wc-block-components-radio-control__option-layout">
16
  <div className="wc-block-components-radio-control__label-group">
17
  { label && (
18
  <span
19
- id={ id && `${ id }__label` }
20
  className="wc-block-components-radio-control__label"
21
  >
22
  { label }
@@ -24,7 +18,7 @@ const OptionLayout = ( {
24
  ) }
25
  { secondaryLabel && (
26
  <span
27
- id={ id && `${ id }__secondary-label` }
28
  className="wc-block-components-radio-control__secondary-label"
29
  >
30
  { secondaryLabel }
@@ -34,7 +28,7 @@ const OptionLayout = ( {
34
  <div className="wc-block-components-radio-control__description-group">
35
  { description && (
36
  <span
37
- id={ id && `${ id }__description` }
38
  className="wc-block-components-radio-control__description"
39
  >
40
  { description }
@@ -42,7 +36,7 @@ const OptionLayout = ( {
42
  ) }
43
  { secondaryDescription && (
44
  <span
45
- id={ id && `${ id }__secondary-description` }
46
  className="wc-block-components-radio-control__secondary-description"
47
  >
48
  { secondaryDescription }
 
 
 
 
 
 
1
  const OptionLayout = ( {
2
  label,
3
  secondaryLabel,
4
  description,
5
  secondaryDescription,
6
  id,
7
+ } ) => {
8
  return (
9
  <div className="wc-block-components-radio-control__option-layout">
10
  <div className="wc-block-components-radio-control__label-group">
11
  { label && (
12
  <span
13
+ id={ id ? `${ id }__label` : null }
14
  className="wc-block-components-radio-control__label"
15
  >
16
  { label }
18
  ) }
19
  { secondaryLabel && (
20
  <span
21
+ id={ id ? `${ id }__secondary-label` : null }
22
  className="wc-block-components-radio-control__secondary-label"
23
  >
24
  { secondaryLabel }
28
  <div className="wc-block-components-radio-control__description-group">
29
  { description && (
30
  <span
31
+ id={ id ? `${ id }__description` : null }
32
  className="wc-block-components-radio-control__description"
33
  >
34
  { description }
36
  ) }
37
  { secondaryDescription && (
38
  <span
39
+ id={ id ? `${ id }__secondary-description` : null }
40
  className="wc-block-components-radio-control__secondary-description"
41
  >
42
  { secondaryDescription }
assets/js/base/components/radio-control/option.js CHANGED
@@ -20,12 +20,7 @@ const Option = ( { checked, name, onChange, option } ) => {
20
 
21
  return (
22
  <label
23
- className={ classnames(
24
- 'wc-block-components-radio-control__option',
25
- {
26
- 'wc-block-components-radio-control__option-checked': checked,
27
- }
28
- ) }
29
  htmlFor={ `${ name }-${ value }` }
30
  >
31
  <input
20
 
21
  return (
22
  <label
23
+ className="wc-block-components-radio-control__option"
 
 
 
 
 
24
  htmlFor={ `${ name }-${ value }` }
25
  >
26
  <input
assets/js/base/components/radio-control/style.scss CHANGED
@@ -1,115 +1,4 @@
1
- .wc-block-components-radio-control__option {
2
- @include reset-typography();
3
- display: block;
4
- margin: em($gap) 0;
5
- padding: 0 0 0 em($gap-largest);
6
- position: relative;
7
 
8
- &:first-child {
9
- margin-top: 0;
10
- }
11
- &:last-child {
12
- margin-bottom: 0;
13
- }
14
- }
15
-
16
- .wc-block-components-radio-control__option-layout {
17
- display: table;
18
- width: 100%;
19
- }
20
-
21
- .wc-block-components-radio-control__option .wc-block-components-radio-control__option-layout {
22
- &::after {
23
- display: none;
24
- }
25
- }
26
-
27
- .wc-block-components-radio-control__label-group,
28
- .wc-block-components-radio-control__description-group {
29
- display: table-row;
30
-
31
- > span {
32
- display: table-cell;
33
- }
34
-
35
- .wc-block-components-radio-control__secondary-label,
36
- .wc-block-components-radio-control__secondary-description {
37
- text-align: right;
38
- min-width: 50%;
39
- }
40
- }
41
-
42
- .wc-block-components-radio-control__label,
43
- .wc-block-components-radio-control__secondary-label {
44
- // Currently, max() CSS function calls need to be wrapped with unquote.
45
- // See: https://github.com/sass/sass/issues/2378#issuecomment-367490840
46
- // These values should be the same as the control input height.
47
- line-height: unquote("max(1.5rem, 24px)");
48
- }
49
-
50
- .wc-block-components-radio-control__description,
51
- .wc-block-components-radio-control__secondary-description {
52
- @include font-size( small );
53
- line-height: 20px;
54
- }
55
-
56
- // Extra class for specificity.
57
- .wc-block-components-radio-control {
58
- .wc-block-components-radio-control__input {
59
- appearance: none;
60
- background: #fff;
61
- border: 2px solid $input-border-gray;
62
- border-radius: 50%;
63
- display: inline-block;
64
- height: em(24px); // =1.5rem
65
- min-height: 24px;
66
- min-width: 24px;
67
- width: em(24px);
68
- // The code belows centers the input vertically.
69
- position: absolute;
70
- left: 0;
71
- top: 50%;
72
- transform: translate(0, -50%);
73
-
74
- &:checked::before {
75
- background: #000;
76
- border-radius: 50%;
77
- content: "";
78
- display: block;
79
- height: em(12px);
80
- left: 50%;
81
- margin: 0;
82
- min-height: 12px;
83
- min-width: 12px;
84
- position: absolute;
85
- top: 50%;
86
- transform: translate(-50%, -50%);
87
- width: em(12px);
88
- }
89
-
90
- .has-dark-controls & {
91
- border-color: $controls-border-dark;
92
- background-color: $input-background-dark;
93
-
94
- &:checked::before {
95
- background: $input-text-dark;
96
- }
97
- }
98
- }
99
- }
100
-
101
- .theme-twentytwentyone {
102
- .wc-block-components-radio-control .wc-block-components-radio-control__input {
103
- &:checked {
104
- border-width: 2px;
105
-
106
- &::before {
107
- background-color: var(--form--color-text);
108
- }
109
- }
110
-
111
- &::after {
112
- display: none;
113
- }
114
- }
115
- }
1
+ @import "./mixin";
 
 
 
 
 
2
 
3
+ @include radio-control-styles;
4
+ @include radio-control-input-styles;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/read-more/test/index.js CHANGED
@@ -11,19 +11,19 @@ const longContent =
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
- it( 'Truncate long HTML content to length of 10', () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
- it( 'Truncate long HTML content, but avoid cutting off HTML tags.', () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
- it( 'No need to truncate short HTML content.', () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
11
 
12
  describe( 'ReadMore Component', () => {
13
  describe( 'Test the truncateHtml function', () => {
14
+ it( 'Truncate long HTML content to length of 10', async () => {
15
  const truncatedContent = truncateHtml( longContent, 10 );
16
 
17
  expect( truncatedContent ).toEqual( '<p>Lorem ipsum...</p>' );
18
  } );
19
+ it( 'Truncate long HTML content, but avoid cutting off HTML tags.', async () => {
20
  const truncatedContent = truncateHtml( longContent, 40 );
21
 
22
  expect( truncatedContent ).toEqual(
23
  '<p>Lorem ipsum dolor sit amet, <strong>consectetur...</strong></p>'
24
  );
25
  } );
26
+ it( 'No need to truncate short HTML content.', async () => {
27
  const truncatedContent = truncateHtml( shortContent, 100 );
28
 
29
  expect( truncatedContent ).toEqual(
assets/js/base/components/reviews/review-list-item/index.js CHANGED
@@ -124,19 +124,22 @@ function getReviewRating( review ) {
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
127
- const ratingText = sprintf(
128
- /* translators: %f is referring to the average rating value */
129
- __( 'Rated %f out of 5', 'woo-gutenberg-products-block' ),
130
- rating
131
- );
132
  return (
133
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
134
  <div
135
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
136
  role="img"
137
- aria-label={ ratingText }
138
  >
139
- <span style={ starStyle }>{ ratingText }</span>
 
 
 
 
 
 
 
 
 
140
  </div>
141
  </div>
142
  );
124
  const starStyle = {
125
  width: ( rating / 5 ) * 100 + '%' /* stylelint-disable-line */,
126
  };
 
 
 
 
 
127
  return (
128
  <div className="wc-block-review-list-item__rating wc-block-components-review-list-item__rating">
129
  <div
130
  className="wc-block-review-list-item__rating__stars wc-block-components-review-list-item__rating__stars"
131
  role="img"
 
132
  >
133
+ <span style={ starStyle }>
134
+ { sprintf(
135
+ /* Translators: %f to the average rating for the review. */
136
+ __(
137
+ 'Rated %f out of 5',
138
+ 'woo-gutenberg-products-block'
139
+ ),
140
+ rating
141
+ ) }
142
+ </span>
143
  </div>
144
  </div>
145
  );
assets/js/base/components/reviews/review-list/index.js CHANGED
@@ -2,7 +2,10 @@
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
- import { getSetting } from '@woocommerce/settings';
 
 
 
6
 
7
  /**
8
  * Internal dependencies
@@ -11,13 +14,11 @@ import ReviewListItem from '../review-list-item';
11
  import './style.scss';
12
 
13
  const ReviewList = ( { attributes, reviews } ) => {
14
- const showAvatars = getSetting( 'showAvatars', true );
15
- const reviewRatingsEnabled = getSetting( 'reviewRatingsEnabled', true );
16
  const showReviewImage =
17
- ( showAvatars || attributes.imageType === 'product' ) &&
18
  attributes.showReviewImage;
19
  const showReviewRating =
20
- reviewRatingsEnabled && attributes.showReviewRating;
21
  const attrs = {
22
  ...attributes,
23
  showReviewImage,
2
  * External dependencies
3
  */
4
  import PropTypes from 'prop-types';
5
+ import {
6
+ REVIEW_RATINGS_ENABLED,
7
+ SHOW_AVATARS,
8
+ } from '@woocommerce/block-settings';
9
 
10
  /**
11
  * Internal dependencies
14
  import './style.scss';
15
 
16
  const ReviewList = ( { attributes, reviews } ) => {
 
 
17
  const showReviewImage =
18
+ ( SHOW_AVATARS || attributes.imageType === 'product' ) &&
19
  attributes.showReviewImage;
20
  const showReviewRating =
21
+ REVIEW_RATINGS_ENABLED && attributes.showReviewRating;
22
  const attrs = {
23
  ...attributes,
24
  showReviewImage,
assets/js/base/components/select/index.js CHANGED
@@ -1,2 +1,61 @@
1
- export { default as Select } from './select';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  export { default as ValidatedSelect } from './validated';
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import classnames from 'classnames';
6
+ import { CustomSelectControl } from 'wordpress-components';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import './style.scss';
12
+
13
+ const Select = ( {
14
+ className,
15
+ feedback,
16
+ id,
17
+ label,
18
+ onChange,
19
+ options,
20
+ value,
21
+ } ) => {
22
+ return (
23
+ <div
24
+ id={ id }
25
+ className={ classnames( 'wc-block-components-select', className, {
26
+ 'is-active': value,
27
+ } ) }
28
+ >
29
+ <CustomSelectControl
30
+ label={ label }
31
+ onChange={ ( { selectedItem } ) => {
32
+ onChange( selectedItem.key );
33
+ } }
34
+ options={ options }
35
+ value={ value }
36
+ />
37
+ { feedback }
38
+ </div>
39
+ );
40
+ };
41
+
42
+ Select.propTypes = {
43
+ onChange: PropTypes.func.isRequired,
44
+ options: PropTypes.arrayOf(
45
+ PropTypes.shape( {
46
+ key: PropTypes.string.isRequired,
47
+ name: PropTypes.string.isRequired,
48
+ } ).isRequired
49
+ ).isRequired,
50
+ className: PropTypes.string,
51
+ feedback: PropTypes.node,
52
+ id: PropTypes.string,
53
+ label: PropTypes.string,
54
+ value: PropTypes.shape( {
55
+ key: PropTypes.string.isRequired,
56
+ name: PropTypes.string.isRequired,
57
+ } ),
58
+ };
59
+
60
+ export default Select;
61
  export { default as ValidatedSelect } from './validated';
assets/js/base/components/select/select.js DELETED
@@ -1,60 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import PropTypes from 'prop-types';
5
- import classnames from 'classnames';
6
- import { CustomSelectControl } from 'wordpress-components';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import './style.scss';
12
-
13
- const Select = ( {
14
- className,
15
- feedback,
16
- id,
17
- label,
18
- onChange,
19
- options,
20
- value,
21
- } ) => {
22
- return (
23
- <div
24
- id={ id }
25
- className={ classnames( 'wc-block-components-select', className, {
26
- 'is-active': value,
27
- } ) }
28
- >
29
- <CustomSelectControl
30
- label={ label }
31
- onChange={ ( { selectedItem } ) => {
32
- onChange( selectedItem.key );
33
- } }
34
- options={ options }
35
- value={ value || null }
36
- />
37
- { feedback }
38
- </div>
39
- );
40
- };
41
-
42
- Select.propTypes = {
43
- onChange: PropTypes.func.isRequired,
44
- options: PropTypes.arrayOf(
45
- PropTypes.shape( {
46
- key: PropTypes.string.isRequired,
47
- name: PropTypes.string.isRequired,
48
- } ).isRequired
49
- ).isRequired,
50
- className: PropTypes.string,
51
- feedback: PropTypes.node,
52
- id: PropTypes.string,
53
- label: PropTypes.string,
54
- value: PropTypes.shape( {
55
- key: PropTypes.string.isRequired,
56
- name: PropTypes.string.isRequired,
57
- } ),
58
- };
59
-
60
- export default Select;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/style.scss CHANGED
@@ -1,9 +1,8 @@
1
- .wc-block-components-form .wc-block-components-select,
2
  .wc-block-components-select {
3
  height: 3em;
4
  position: relative;
5
 
6
- label.components-custom-select-control__label {
7
  @include reset-typography();
8
  @include font-size(regular);
9
  line-height: 1.375; // =22px when font-size is 16px.
@@ -11,7 +10,7 @@
11
  transform: translateY(0.75em);
12
  transform-origin: top left;
13
  transition: all 200ms ease;
14
- color: $gray-700;
15
  z-index: 1;
16
  margin: 0 0 0 #{$gap + 1px};
17
  overflow: hidden;
@@ -37,17 +36,17 @@
37
  &:hover,
38
  &:focus,
39
  &:active {
40
- border-color: $alert-red;
41
  }
42
  &:focus {
43
- outline: 1px dotted $alert-red;
44
  outline-offset: 2px;
45
  }
46
  }
47
  }
48
 
49
  &.has-error label {
50
- color: $alert-red;
51
  }
52
 
53
  .components-custom-select-control__button {
@@ -56,7 +55,7 @@
56
  &:focus,
57
  &:active {
58
  @include font-size(regular);
59
- background: #fff;
60
  box-shadow: none;
61
  color: $input-text-active;
62
  font-family: inherit;
@@ -71,10 +70,8 @@
71
  text-transform: none;
72
  white-space: nowrap;
73
  width: 100%;
74
- opacity: initial;
75
- border-radius: 4px;
76
  .has-dark-controls & {
77
- background: $input-background-dark;
78
  border-color: $input-border-dark;
79
  color: $input-text-dark;
80
  }
@@ -93,7 +90,6 @@
93
  margin: 0;
94
  max-height: 300px;
95
  overflow: auto;
96
- color: $input-text-active;
97
 
98
  // Required by IE11.
99
  &:empty {
@@ -122,41 +118,3 @@
122
  display: none;
123
  }
124
  }
125
-
126
- .theme-twentytwentyone {
127
- // Extra classes for specificity.
128
- &.theme-twentytwentyone.theme-twentytwentyone .components-custom-select-control__button {
129
- background-color: #fff;
130
- color: $input-text-active;
131
- }
132
-
133
- &.is-dark-theme {
134
- // If the theme is in dark mode, as well as the block, then this selector will match.
135
- .has-dark-controls {
136
- .components-custom-select-control__item {
137
- color: $input-text-dark;
138
- }
139
- }
140
-
141
- // If the theme is in dark mode, but the block isn't, then this selector will match.
142
- .components-custom-select-control__item {
143
- color: $input-text-active;
144
- }
145
- }
146
- }
147
-
148
- .theme-twentyseventeen {
149
- // Extra classes for specificity.
150
- &.theme-twentyseventeen.theme-twentyseventeen {
151
- .components-custom-select-control__button {
152
- background-color: $select-dropdown-light;
153
- color: $input-text-active;
154
- }
155
- .has-dark-controls {
156
- .components-custom-select-control__button {
157
- background-color: $select-dropdown-dark;
158
- color: $input-text-dark;
159
- }
160
- }
161
- }
162
- }
 
1
  .wc-block-components-select {
2
  height: 3em;
3
  position: relative;
4
 
5
+ label {
6
  @include reset-typography();
7
  @include font-size(regular);
8
  line-height: 1.375; // =22px when font-size is 16px.
10
  transform: translateY(0.75em);
11
  transform-origin: top left;
12
  transition: all 200ms ease;
13
+ color: $gray-50;
14
  z-index: 1;
15
  margin: 0 0 0 #{$gap + 1px};
16
  overflow: hidden;
36
  &:hover,
37
  &:focus,
38
  &:active {
39
+ border-color: $error-red;
40
  }
41
  &:focus {
42
+ outline: 1px dotted $error-red;
43
  outline-offset: 2px;
44
  }
45
  }
46
  }
47
 
48
  &.has-error label {
49
+ color: $error-red;
50
  }
51
 
52
  .components-custom-select-control__button {
55
  &:focus,
56
  &:active {
57
  @include font-size(regular);
58
+ background-color: #fff;
59
  box-shadow: none;
60
  color: $input-text-active;
61
  font-family: inherit;
70
  text-transform: none;
71
  white-space: nowrap;
72
  width: 100%;
 
 
73
  .has-dark-controls & {
74
+ background-color: $input-background-dark;
75
  border-color: $input-border-dark;
76
  color: $input-text-dark;
77
  }
90
  margin: 0;
91
  max-height: 300px;
92
  overflow: auto;
 
93
 
94
  // Required by IE11.
95
  &:empty {
118
  display: none;
119
  }
120
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/select/validated.js CHANGED
@@ -3,19 +3,17 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
 
6
  import { useShallowEqual } from '@woocommerce/base-hooks';
7
  import PropTypes from 'prop-types';
8
  import classnames from 'classnames';
9
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
10
- import {
11
- ValidationInputError,
12
- useValidationContext,
13
- } from '@woocommerce/base-context';
14
 
15
  /**
16
  * Internal dependencies
17
  */
18
- import Select from './select';
 
19
  import './style.scss';
20
 
21
  const ValidatedSelect = ( {
@@ -43,7 +41,7 @@ const ValidatedSelect = ( {
43
  clearValidationError,
44
  } = useValidationContext();
45
 
46
- useEffect( () => {
47
  if ( ! required || currentValue ) {
48
  clearValidationError( errorId );
49
  } else {
@@ -54,21 +52,18 @@ const ValidatedSelect = ( {
54
  },
55
  } );
56
  }
57
- }, [
58
- clearValidationError,
59
- currentValue,
60
- errorId,
61
- errorMessage,
62
- required,
63
- setValidationErrors,
64
- ] );
65
 
66
  // Remove validation errors when unmounted.
67
  useEffect( () => {
68
  return () => {
69
  clearValidationError( errorId );
70
  };
71
- }, [ clearValidationError, errorId ] );
72
 
73
  const error = getValidationError( errorId ) || {};
74
 
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import { useEffect } from 'react';
6
+ import { useValidationContext } from '@woocommerce/base-context';
7
  import { useShallowEqual } from '@woocommerce/base-hooks';
8
  import PropTypes from 'prop-types';
9
  import classnames from 'classnames';
10
  import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
 
 
 
 
11
 
12
  /**
13
  * Internal dependencies
14
  */
15
+ import { ValidationInputError } from '../validation';
16
+ import Select from './index';
17
  import './style.scss';
18
 
19
  const ValidatedSelect = ( {
41
  clearValidationError,
42
  } = useValidationContext();
43
 
44
+ const validateSelect = () => {
45
  if ( ! required || currentValue ) {
46
  clearValidationError( errorId );
47
  } else {
52
  },
53
  } );
54
  }
55
+ };
56
+
57
+ useEffect( () => {
58
+ validateSelect();
59
+ }, [ currentValue ] );
 
 
 
60
 
61
  // Remove validation errors when unmounted.
62
  useEffect( () => {
63
  return () => {
64
  clearValidationError( errorId );
65
  };
66
+ }, [ errorId ] );
67
 
68
  const error = getValidationError( errorId ) || {};
69
 
assets/js/base/components/sidebar-layout/style.scss CHANGED
@@ -18,9 +18,11 @@
18
  padding-left: percentage($gap-large / 1060px);
19
  width: 35%;
20
 
21
- .wc-block-components-panel > h2 {
22
- @include font-size(regular);
23
- @include reset-box();
 
 
24
  }
25
  }
26
 
@@ -45,23 +47,16 @@
45
  .is-large {
46
  .wc-block-components-sidebar {
47
  .wc-block-components-totals-item,
48
- .wc-block-components-panel {
49
  padding-left: $gap;
50
  padding-right: $gap;
51
  }
52
  }
53
  }
54
 
55
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
56
- @include reset-typography();
57
- .wc-block-components-panel__button {
58
- font-weight: 400;
59
- }
60
- }
61
-
62
  // For Twenty Twenty we need to increase specificity a bit more.
63
  .theme-twentytwenty {
64
- .wc-block-components-sidebar .wc-block-components-panel > h2 {
65
  @include font-size(large);
66
  @include reset-box();
67
  }
18
  padding-left: percentage($gap-large / 1060px);
19
  width: 35%;
20
 
21
+ .wc-blocks-components-panel {
22
+ > h2 {
23
+ @include font-size(large);
24
+ @include reset-box();
25
+ }
26
  }
27
  }
28
 
47
  .is-large {
48
  .wc-block-components-sidebar {
49
  .wc-block-components-totals-item,
50
+ .wc-blocks-components-panel {
51
  padding-left: $gap;
52
  padding-right: $gap;
53
  }
54
  }
55
  }
56
 
 
 
 
 
 
 
 
57
  // For Twenty Twenty we need to increase specificity a bit more.
58
  .theme-twentytwenty {
59
+ .wc-block-components-sidebar .wc-blocks-components-panel > h2 {
60
  @include font-size(large);
61
  @include reset-box();
62
  }
assets/js/base/components/spinner/index.tsx DELETED
@@ -1,10 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import './style.scss';
5
-
6
- const Spinner = (): JSX.Element => {
7
- return <span className="wc-block-components-spinner" aria-hidden="true" />;
8
- };
9
-
10
- export default Spinner;
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/spinner/style.scss DELETED
@@ -1,37 +0,0 @@
1
- .wc-block-components-spinner {
2
- position: absolute;
3
- width: 100%;
4
- height: 100%;
5
- color: inherit;
6
- box-sizing: content-box;
7
- text-align: center;
8
- font-size: 1.25em;
9
-
10
- &::after {
11
- content: " ";
12
- position: absolute;
13
- top: 50%;
14
- left: 50%;
15
- margin: -0.5em 0 0 -0.5em;
16
- width: 1em;
17
- height: 1em;
18
- box-sizing: border-box;
19
- transform-origin: 50% 50%;
20
- transform: translateZ(0) scale(0.5);
21
- backface-visibility: hidden;
22
- border-radius: 50%;
23
- border: 0.2em solid currentColor;
24
- border-left-color: transparent;
25
- animation: wc-block-components-spinner__animation 1s infinite linear;
26
- }
27
- }
28
-
29
- @keyframes wc-block-components-spinner__animation {
30
- 0% {
31
- animation-timing-function: cubic-bezier(0.5856, 0.0703, 0.4143, 0.9297);
32
- transform: rotate(0deg);
33
- }
34
- 100% {
35
- transform: rotate(360deg);
36
- }
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/StateInputProps.ts DELETED
@@ -1,15 +0,0 @@
1
- export interface StateInputProps {
2
- className?: string;
3
- label: string;
4
- id: string;
5
- autoComplete?: string;
6
- value: string;
7
- country: string;
8
- onChange: ( value: string ) => void;
9
- required?: boolean;
10
- errorMessage?: string;
11
- }
12
-
13
- export type StateInputWithStatesProps = StateInputProps & {
14
- states: Record< string, Record< string, string > >;
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/billing-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { ALLOWED_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const BillingStateInput = ( props ) => {
13
+ return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
+ };
15
+
16
+ BillingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default BillingStateInput;
assets/js/base/components/state-input/billing-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { ALLOWED_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const BillingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ ALLOWED_STATES } { ...props } />;
14
- };
15
-
16
- export default BillingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{index.ts → index.js} RENAMED
File without changes
assets/js/base/components/state-input/shipping-state-input.js ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import PropTypes from 'prop-types';
5
+ import { SHIPPING_STATES } from '@woocommerce/block-settings';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import StateInput from './state-input.js';
11
+
12
+ const ShippingStateInput = ( props ) => {
13
+ return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
+ };
15
+
16
+ ShippingStateInput.propTypes = {
17
+ onChange: PropTypes.func.isRequired,
18
+ className: PropTypes.string,
19
+ label: PropTypes.string,
20
+ value: PropTypes.string,
21
+ };
22
+
23
+ export default ShippingStateInput;
assets/js/base/components/state-input/shipping-state-input.tsx DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { SHIPPING_STATES } from '@woocommerce/block-settings';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import StateInput from './state-input';
10
- import type { StateInputProps } from './StateInputProps';
11
-
12
- const ShippingStateInput = ( props: StateInputProps ): JSX.Element => {
13
- return <StateInput states={ SHIPPING_STATES } { ...props } />;
14
- };
15
-
16
- export default ShippingStateInput;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/state-input/{state-input.tsx → state-input.js} RENAMED
@@ -2,6 +2,7 @@
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
 
5
  import { decodeEntities } from '@wordpress/html-entities';
6
  import { useCallback, useMemo } from '@wordpress/element';
7
  import classnames from 'classnames';
@@ -9,10 +10,9 @@ import classnames from 'classnames';
9
  /**
10
  * Internal dependencies
11
  */
12
- import { ValidatedTextInput } from '../text-input';
13
  import { ValidatedSelect } from '../select';
14
  import './style.scss';
15
- import type { StateInputWithStatesProps } from './StateInputProps';
16
 
17
  const StateInput = ( {
18
  className,
@@ -24,7 +24,7 @@ const StateInput = ( {
24
  autoComplete = 'off',
25
  value = '',
26
  required = false,
27
- }: StateInputWithStatesProps ): JSX.Element => {
28
  const countryStates = states[ country ];
29
  const options = useMemo(
30
  () =>
@@ -100,7 +100,7 @@ const StateInput = ( {
100
  );
101
  }
102
  return (
103
- <ValidatedTextInput
104
  className={ className }
105
  id={ id }
106
  label={ label }
@@ -112,4 +112,20 @@ const StateInput = ( {
112
  );
113
  };
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  export default StateInput;
2
  * External dependencies
3
  */
4
  import { __ } from '@wordpress/i18n';
5
+ import PropTypes from 'prop-types';
6
  import { decodeEntities } from '@wordpress/html-entities';
7
  import { useCallback, useMemo } from '@wordpress/element';
8
  import classnames from 'classnames';
10
  /**
11
  * Internal dependencies
12
  */
13
+ import { DebouncedValidatedTextInput } from '../text-input';
14
  import { ValidatedSelect } from '../select';
15
  import './style.scss';
 
16
 
17
  const StateInput = ( {
18
  className,
24
  autoComplete = 'off',
25
  value = '',
26
  required = false,
27
+ } ) => {
28
  const countryStates = states[ country ];
29
  const options = useMemo(
30
  () =>
100
  );
101
  }
102
  return (
103
+ <DebouncedValidatedTextInput
104
  className={ className }
105
  id={ id }
106
  label={ label }
112
  );
113
  };
114
 
115
+ StateInput.propTypes = {
116
+ states: PropTypes.objectOf(
117
+ PropTypes.oneOfType( [
118
+ PropTypes.array,
119
+ PropTypes.objectOf( PropTypes.string ),
120
+ ] )
121
+ ).isRequired,
122
+ onChange: PropTypes.func.isRequired,
123
+ autoComplete: PropTypes.string,
124
+ id: PropTypes.string,
125
+ className: PropTypes.string,
126
+ country: PropTypes.string,
127
+ label: PropTypes.string,
128
+ value: PropTypes.string,
129
+ };
130
+
131
  export default StateInput;
assets/js/base/components/store-notices-container/index.js ADDED
@@ -0,0 +1,2 @@
 
 
1
+ export { default as StoreNoticesContainer } from './store-notices-container';
2
+ export { default as SnackbarNoticesContainer } from './snackbar-notices';
assets/js/base/components/store-notices-container/snackbar-notices.js ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { SnackbarList } from 'wordpress-components';
5
+ import { useStoreNotices } from '@woocommerce/base-hooks';
6
+ import { useEditorContext } from '@woocommerce/base-context';
7
+
8
+ const NoticesContainer = () => {
9
+ const { isEditor } = useEditorContext();
10
+ const { notices, removeNotice } = useStoreNotices();
11
+
12
+ if ( isEditor ) {
13
+ return null;
14
+ }
15
+
16
+ const snackbarNotices = notices.filter(
17
+ ( notice ) => notice.type === 'snackbar'
18
+ );
19
+
20
+ return (
21
+ <SnackbarList
22
+ notices={ snackbarNotices }
23
+ className={ 'wc-block-components-notices__snackbar' }
24
+ onRemove={ removeNotice }
25
+ />
26
+ );
27
+ };
28
+
29
+ export default NoticesContainer;
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/store-notices-container.js RENAMED
@@ -4,6 +4,7 @@
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
 
7
 
8
  /**
9
  * Internal dependencies
@@ -23,7 +24,8 @@ const getWooClassName = ( { status = 'default' } ) => {
23
  return '';
24
  };
25
 
26
- const StoreNoticesContainer = ( { className, notices, removeNotice } ) => {
 
27
  const regularNotices = notices.filter(
28
  ( notice ) => notice.type !== 'snackbar'
29
  );
4
  import PropTypes from 'prop-types';
5
  import classnames from 'classnames';
6
  import { Notice } from 'wordpress-components';
7
+ import { useStoreNoticesContext } from '@woocommerce/base-context';
8
 
9
  /**
10
  * Internal dependencies
24
  return '';
25
  };
26
 
27
+ const StoreNoticesContainer = ( { className, notices } ) => {
28
+ const { removeNotice } = useStoreNoticesContext();
29
  const regularNotices = notices.filter(
30
  ( notice ) => notice.type !== 'snackbar'
31
  );
assets/js/base/{context/providers/store-notices/components → components/store-notices-container}/style.scss RENAMED
@@ -8,12 +8,12 @@
8
  .components-notice__dismiss {
9
  background: transparent none;
10
  padding: 0;
11
- margin: 0 0 0 auto;
12
  border: 0;
13
  outline: 0;
14
- color: currentColor;
15
  svg {
16
- fill: currentColor;
17
  vertical-align: text-top;
18
  }
19
  }
@@ -22,3 +22,24 @@
22
  margin-top: 1em;
23
  }
24
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
  .components-notice__dismiss {
9
  background: transparent none;
10
  padding: 0;
11
+ margin: 0 0 0 0.5em;
12
  border: 0;
13
  outline: 0;
14
+ color: #fff;
15
  svg {
16
+ fill: #fff;
17
  vertical-align: text-top;
18
  }
19
  }
22
  margin-top: 1em;
23
  }
24
  }
25
+
26
+ .wc-block-components-notices__snackbar {
27
+ position: fixed;
28
+ bottom: 20px;
29
+ left: 16px;
30
+ width: auto;
31
+
32
+ @include breakpoint( "<782px" ) {
33
+ position: fixed;
34
+ top: 10px;
35
+ left: 0;
36
+ bottom: auto;
37
+ }
38
+
39
+ .components-snackbar-list__notice-container {
40
+ @include breakpoint( "<782px" ) {
41
+ margin-left: 10px;
42
+ margin-right: 10px;
43
+ }
44
+ }
45
+ }
assets/js/base/components/summary/{index.tsx → index.js} RENAMED
@@ -2,19 +2,12 @@
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
5
- import { WordCountType } from '@woocommerce/block-settings';
6
 
7
  /**
8
  * Internal dependencies
9
  */
10
  import { generateSummary } from './utils';
11
 
12
- interface SummaryProps {
13
- className?: string;
14
- source: string;
15
- maxLength?: number;
16
- countType?: WordCountType;
17
- }
18
  /**
19
  * Summary component.
20
  *
@@ -29,7 +22,7 @@ export const Summary = ( {
29
  maxLength = 15,
30
  countType = 'words',
31
  className = '',
32
- }: SummaryProps ): JSX.Element => {
33
  const summaryText = useMemo( () => {
34
  return generateSummary( source, maxLength, countType );
35
  }, [ source, maxLength, countType ] );
2
  * External dependencies
3
  */
4
  import { RawHTML, useMemo } from '@wordpress/element';
 
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
  import { generateSummary } from './utils';
10
 
 
 
 
 
 
 
11
  /**
12
  * Summary component.
13
  *
22
  maxLength = 15,
23
  countType = 'words',
24
  className = '',
25
+ } ) => {
26
  const summaryText = useMemo( () => {
27
  return generateSummary( source, maxLength, countType );
28
  }, [ source, maxLength, countType ] );
assets/js/base/components/text-input/debounced-validated.js ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { useState, useEffect } from '@wordpress/element';
5
+ import { ValidatedTextInput } from '@woocommerce/base-components/text-input';
6
+ import { useShallowEqual } from '@woocommerce/base-hooks';
7
+ import { useDebouncedCallback } from 'use-debounce';
8
+ import PropTypes from 'prop-types';
9
+
10
+ const DebouncedValidatedTextInput = ( { onChange, value = '', ...props } ) => {
11
+ // Keep a local copy of the value so we can debounce updates.
12
+ const [ inputValue, setInputValue ] = useState( value );
13
+ const [ debouncedCallback ] = useDebouncedCallback( ( newValue ) => {
14
+ onChange( newValue );
15
+ }, 400 );
16
+ const debouncedOnChange = useShallowEqual( debouncedCallback );
17
+ useEffect( () => {
18
+ debouncedOnChange( inputValue );
19
+ }, [ debouncedOnChange, inputValue ] );
20
+
21
+ return (
22
+ <ValidatedTextInput
23
+ onChange={ setInputValue }
24
+ value={ inputValue }
25
+ { ...props }
26
+ />
27
+ );
28
+ };
29
+
30
+ DebouncedValidatedTextInput.propTypes = {
31
+ onChange: PropTypes.func.isRequired,
32
+ value: PropTypes.string,
33
+ };
34
+
35
+ export default DebouncedValidatedTextInput;
assets/js/base/components/text-input/{text-input.tsx → index.js} RENAMED
@@ -1,7 +1,8 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { forwardRef, InputHTMLAttributes } from 'react';
 
5
  import classnames from 'classnames';
6
  import { useState } from '@wordpress/element';
7
 
@@ -11,24 +12,7 @@ import { useState } from '@wordpress/element';
11
  import Label from '../label';
12
  import './style.scss';
13
 
14
- interface TextInputProps
15
- extends Omit<
16
- InputHTMLAttributes< HTMLInputElement >,
17
- 'onChange' | 'onBlur'
18
- > {
19
- id: string;
20
- ariaLabel?: string;
21
- label?: string;
22
- ariaDescribedBy?: string;
23
- screenReaderLabel?: string;
24
- help?: string;
25
- feedback?: boolean | JSX.Element;
26
- autoComplete?: string;
27
- onChange: ( newValue: string ) => void;
28
- onBlur?: ( newValue: string ) => void;
29
- }
30
-
31
- const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
32
  (
33
  {
34
  className,
@@ -45,11 +29,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
45
  value = '',
46
  onChange,
47
  required = false,
48
- onBlur = () => {
49
- /* Do nothing */
50
- },
51
  feedback,
52
- ...rest
53
  },
54
  ref
55
  ) => {
@@ -76,8 +57,8 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
76
  onChange( event.target.value );
77
  } }
78
  onFocus={ () => setIsActive( true ) }
79
- onBlur={ ( event ) => {
80
- onBlur( event.target.value );
81
  setIsActive( false );
82
  } }
83
  aria-label={ ariaLabel || label }
@@ -88,7 +69,6 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
88
  : ariaDescribedBy
89
  }
90
  required={ required }
91
- { ...rest }
92
  />
93
  <Label
94
  label={ label }
@@ -113,4 +93,21 @@ const TextInput = forwardRef< HTMLInputElement, TextInputProps >(
113
  }
114
  );
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  export default TextInput;
 
 
1
  /**
2
  * External dependencies
3
  */
4
+ import { forwardRef } from 'react';
5
+ import PropTypes from 'prop-types';
6
  import classnames from 'classnames';
7
  import { useState } from '@wordpress/element';
8
 
12
  import Label from '../label';
13
  import './style.scss';
14
 
15
+ const TextInput = forwardRef(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  (
17
  {
18
  className,
29
  value = '',
30
  onChange,
31
  required = false,
32
+ onBlur = () => {},
 
 
33
  feedback,
 
34
  },
35
  ref
36
  ) => {
57
  onChange( event.target.value );
58
  } }
59
  onFocus={ () => setIsActive( true ) }
60
+ onBlur={ () => {
61
+ onBlur();
62
  setIsActive( false );
63
  } }
64
  aria-label={ ariaLabel || label }
69
  : ariaDescribedBy
70
  }
71
  required={ required }
 
72
  />
73
  <Label
74
  label={ label }
93
  }
94
  );
95
 
96
+ TextInput.propTypes = {
97
+ id: PropTypes.string.isRequired,
98
+ onChange: PropTypes.func.isRequired,
99
+ value: PropTypes.string,
100
+ ariaLabel: PropTypes.string,
101
+ ariaDescribedBy: PropTypes.string,
102
+ label: PropTypes.string,
103
+ screenReaderLabel: PropTypes.string,
104
+ disabled: PropTypes.bool,
105
+ help: PropTypes.string,
106
+ autoCapitalize: PropTypes.string,
107
+ autoComplete: PropTypes.string,
108
+ required: PropTypes.bool,
109
+ };
110
+
111
  export default TextInput;
112
+ export { default as ValidatedTextInput } from './validated';
113
+ export { default as DebouncedValidatedTextInput } from './debounced-validated';
assets/js/base/components/text-input/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export { default as TextInput } from './text-input';
2
- export { default as ValidatedTextInput } from './validated-text-input';
 
 
assets/js/base/components/text-input/style.scss CHANGED
@@ -1,4 +1,3 @@
1
- .wc-block-components-form .wc-block-components-text-input,
2
  .wc-block-components-text-input {
3
  position: relative;
4
  margin-top: em($gap-large);
@@ -13,7 +12,7 @@
13
  top: 0;
14
  transform-origin: top left;
15
  line-height: 1.375; // =22px when font-size is 16px.
16
- color: $gray-700;
17
  transition: transform 200ms ease;
18
  margin: 0 0 0 #{$gap + 1px};
19
  overflow: hidden;
@@ -40,7 +39,6 @@
40
  input[type="tel"],
41
  input[type="url"],
42
  input[type="text"],
43
- input[type="number"],
44
  input[type="email"] {
45
  @include font-size(regular);
46
  background-color: #fff;
@@ -58,35 +56,17 @@
58
 
59
  &:focus {
60
  background-color: #fff;
61
- color: $input-text-active;
62
  }
63
-
64
  .has-dark-controls & {
65
  background-color: $input-background-dark;
66
  border-color: $input-border-dark;
67
  color: $input-text-dark;
68
-
69
- &:focus {
70
- background-color: $input-background-dark;
71
- color: $input-text-dark;
72
- }
73
- }
74
- }
75
-
76
- input[type="number"] {
77
- -moz-appearance: textfield;
78
-
79
- &::-webkit-outer-spin-button,
80
- &::-webkit-inner-spin-button {
81
- appearance: none;
82
- margin: 0;
83
  }
84
  }
85
 
86
  &.is-active input[type="tel"],
87
  &.is-active input[type="url"],
88
  &.is-active input[type="text"],
89
- &.is-active input[type="number"],
90
  &.is-active input[type="email"] {
91
  padding: em($gap-large) 0 em($gap-smallest) $gap;
92
  }
@@ -96,16 +76,16 @@
96
  &:hover,
97
  &:focus,
98
  &:active {
99
- border-color: $alert-red;
100
  }
101
  &:focus {
102
- outline: 1px dotted $alert-red;
103
  outline-offset: 2px;
104
  }
105
  }
106
 
107
  &.has-error label {
108
- color: $alert-red;
109
  }
110
 
111
  &:only-child {
 
1
  .wc-block-components-text-input {
2
  position: relative;
3
  margin-top: em($gap-large);
12
  top: 0;
13
  transform-origin: top left;
14
  line-height: 1.375; // =22px when font-size is 16px.
15
+ color: $gray-50;
16
  transition: transform 200ms ease;
17
  margin: 0 0 0 #{$gap + 1px};
18
  overflow: hidden;
39
  input[type="tel"],
40
  input[type="url"],
41
  input[type="text"],
 
42
  input[type="email"] {
43
  @include font-size(regular);
44
  background-color: #fff;
56
 
57
  &:focus {
58
  background-color: #fff;
 
59
  }
 
60
  .has-dark-controls & {
61
  background-color: $input-background-dark;
62
  border-color: $input-border-dark;
63
  color: $input-text-dark;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  }
65
  }
66
 
67
  &.is-active input[type="tel"],
68
  &.is-active input[type="url"],
69
  &.is-active input[type="text"],
 
70
  &.is-active input[type="email"] {
71
  padding: em($gap-large) 0 em($gap-smallest) $gap;
72
  }
76
  &:hover,
77
  &:focus,
78
  &:active {
79
+ border-color: $error-red;
80
  }
81
  &:focus {
82
+ outline: 1px dotted $error-red;
83
  outline-offset: 2px;
84
  }
85
  }
86
 
87
  &.has-error label {
88
+ color: $error-red;
89
  }
90
 
91
  &:only-child {
assets/js/base/components/text-input/validated-text-input.tsx DELETED
@@ -1,166 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import { useCallback, useRef, useEffect, useState } from 'react';
6
- import classnames from 'classnames';
7
- import {
8
- ValidationInputError,
9
- useValidationContext,
10
- } from '@woocommerce/base-context';
11
- import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
12
- import { isString } from '@woocommerce/types';
13
-
14
- /**
15
- * Internal dependencies
16
- */
17
- import TextInput from './text-input';
18
- import './style.scss';
19
-
20
- interface ValidatedTextInputPropsWithId {
21
- instanceId?: string;
22
- id: string;
23
- }
24
-
25
- interface ValidatedTextInputPropsWithInstanceId {
26
- instanceId: string;
27
- id?: string;
28
- }
29
-
30
- type ValidatedTextInputProps = (
31
- | ValidatedTextInputPropsWithId
32
- | ValidatedTextInputPropsWithInstanceId
33
- ) & {
34
- className?: string;
35
- ariaDescribedBy?: string;
36
- errorId?: string;
37
- validateOnMount?: boolean;
38
- focusOnMount?: boolean;
39
- showError?: boolean;
40
- errorMessage?: string;
41
- onChange: ( newValue: string ) => void;
42
- };
43
-
44
- const ValidatedTextInput = ( {
45
- className,
46
- instanceId,
47
- id,
48
- ariaDescribedBy,
49
- errorId,
50
- validateOnMount = true,
51
- focusOnMount = false,
52
- onChange,
53
- showError = true,
54
- errorMessage: passedErrorMessage = '',
55
- ...rest
56
- }: ValidatedTextInputProps ) => {
57
- const [ isPristine, setIsPristine ] = useState( true );
58
- const inputRef = useRef< HTMLInputElement >( null );
59
- const {
60
- getValidationError,
61
- hideValidationError,
62
- setValidationErrors,
63
- clearValidationError,
64
- getValidationErrorId,
65
- } = useValidationContext();
66
-
67
- const textInputId =
68
- typeof id !== 'undefined' ? id : 'textinput-' + instanceId;
69
- const errorIdString = errorId !== undefined ? errorId : textInputId;
70
-
71
- const validateInput = useCallback(
72
- ( errorsHidden = true ) => {
73
- const inputObject = inputRef.current || null;
74
- if ( ! inputObject ) {
75
- return;
76
- }
77
- // Trim white space before validation.
78
- inputObject.value = inputObject.value.trim();
79
- const inputIsValid = inputObject.checkValidity();
80
- if ( inputIsValid ) {
81
- clearValidationError( errorIdString );
82
- } else {
83
- setValidationErrors( {
84
- [ errorIdString ]: {
85
- message:
86
- inputObject.validationMessage ||
87
- __(
88
- 'Invalid value.',
89
- 'woo-gutenberg-products-block'
90
- ),
91
- hidden: errorsHidden,
92
- },
93
- } );
94
- }
95
- },
96
- [ clearValidationError, errorIdString, setValidationErrors ]
97
- );
98
-
99
- useEffect( () => {
100
- if ( isPristine ) {
101
- if ( focusOnMount ) {
102
- inputRef.current?.focus();
103
- }
104
- setIsPristine( false );
105
- }
106
- }, [ focusOnMount, isPristine, setIsPristine ] );
107
-
108
- useEffect( () => {
109
- if ( isPristine ) {
110
- if ( validateOnMount ) {
111
- validateInput();
112
- }
113
- setIsPristine( false );
114
- }
115
- }, [ isPristine, setIsPristine, validateOnMount, validateInput ] );
116
-
117
- // Remove validation errors when unmounted.
118
- useEffect( () => {
119
- return () => {
120
- clearValidationError( errorIdString );
121
- };
122
- }, [ clearValidationError, errorIdString ] );
123
-
124
- // @todo - When useValidationContext is converted to TypeScript, remove this cast and use the correct type.
125
- const errorMessage = ( getValidationError( errorIdString ) || {} ) as {
126
- message?: string;
127
- hidden?: boolean;
128
- };
129
- if ( isString( passedErrorMessage ) && passedErrorMessage !== '' ) {
130
- errorMessage.message = passedErrorMessage;
131
- }
132
- const hasError = errorMessage.message && ! errorMessage.hidden;
133
- const describedBy =
134
- showError && hasError && getValidationErrorId( errorIdString )
135
- ? getValidationErrorId( errorIdString )
136
- : ariaDescribedBy;
137
-
138
- return (
139
- <TextInput
140
- className={ classnames( className, {
141
- 'has-error': hasError,
142
- } ) }
143
- id={ textInputId }
144
- onBlur={ () => {
145
- validateInput( false );
146
- } }
147
- feedback={
148
- showError && (
149
- <ValidationInputError
150
- errorMessage={ passedErrorMessage }
151
- propertyName={ errorIdString }
152
- />
153
- )
154
- }
155
- ref={ inputRef }
156
- onChange={ ( val ) => {
157
- hideValidationError( errorIdString );
158
- onChange( val );
159
- } }
160
- ariaDescribedBy={ describedBy }
161
- { ...rest }
162
- />
163
- );
164
- };
165
-
166
- export default withInstanceId( ValidatedTextInput );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/components/text-input/validated.js ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useRef, useEffect } from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import classnames from 'classnames';
8
+ import { useValidationContext } from '@woocommerce/base-context';
9
+ import { ValidationInputError } from '@woocommerce/base-components/validation';
10
+ import { withInstanceId } from '@woocommerce/base-hocs/with-instance-id';
11
+
12
+ /**
13
+ * Internal dependencies
14
+ */
15
+ import TextInput from './index';
16
+ import './style.scss';
17
+
18
+ const ValidatedTextInput = ( {
19
+ className,
20
+ instanceId,
21
+ id,
22
+ ariaDescribedBy,
23
+ errorId,
24
+ validateOnMount = true,
25
+ focusOnMount = false,
26
+ onChange,
27
+ showError = true,
28
+ ...rest
29
+ } ) => {
30
+ const inputRef = useRef();
31
+ const {
32
+ getValidationError,
33
+ hideValidationError,
34
+ setValidationErrors,
35
+ clearValidationError,
36
+ getValidationErrorId,
37
+ } = useValidationContext();
38
+
39
+ const textInputId = id || 'textinput-' + instanceId;
40
+ errorId = errorId || textInputId;
41
+
42
+ const validateInput = ( errorsHidden = true ) => {
43
+ if ( inputRef.current.checkValidity() ) {
44
+ clearValidationError( errorId );
45
+ } else {
46
+ setValidationErrors( {
47
+ [ errorId ]: {
48
+ message:
49
+ inputRef.current.validationMessage ||
50
+ __( 'Invalid value.', 'woo-gutenberg-products-block' ),
51
+ hidden: errorsHidden,
52
+ },
53
+ } );
54
+ }
55
+ };
56
+
57
+ useEffect( () => {
58
+ if ( focusOnMount ) {
59
+ inputRef.current.focus();
60
+ }
61
+ }, [ focusOnMount ] );
62
+
63
+ useEffect( () => {
64
+ if ( validateOnMount ) {
65
+ validateInput();
66
+ }
67
+ }, [ validateOnMount ] );
68
+
69
+ // Remove validation errors when unmounted.
70
+ useEffect( () => {
71
+ return () => {
72
+ clearValidationError( errorId );
73
+ };
74
+ }, [ errorId ] );
75
+
76
+ const errorMessage = getValidationError( errorId ) || {};
77
+ const hasError = errorMessage.message && ! errorMessage.hidden;
78
+ const describedBy =
79
+ showError && hasError && getValidationErrorId( errorId )
80
+ ? getValidationErrorId( errorId )
81
+ : ariaDescribedBy;
82
+
83
+ return (
84
+ <TextInput
85
+ className={ classnames( className, {
86
+ 'has-error': hasError,
87
+ } ) }
88
+ id={ textInputId }
89
+ onBlur={ () => {
90
+ validateInput( false );
91
+ } }
92
+ feedback={
93
+ showError && <ValidationInputError propertyName={ errorId } />
94
+ }
95
+ ref={ inputRef }
96
+ onChange={ ( val ) => {
97
+ hideValidationError( errorId );
98
+ onChange( val );
99
+ } }
100
+ ariaDescribedBy={ describedBy }
101
+ { ...rest }
102
+ />
103
+ );
104
+ };
105
+
106
+ ValidatedTextInput.propTypes = {
107
+ onChange: PropTypes.func.isRequired,
108
+ id: PropTypes.string,
109
+ value: PropTypes.string,
110
+ ariaDescribedBy: PropTypes.string,
111
+ errorId: PropTypes.string,
112
+ validateOnMount: PropTypes.bool,
113
+ focusOnMount: PropTypes.bool,
114
+ showError: PropTypes.bool,
115
+ };
116
+
117
+ export default withInstanceId( ValidatedTextInput );
assets/js/base/components/textarea/style.scss CHANGED
@@ -20,10 +20,3 @@
20
  }
21
  }
22
  }
23
-
24
- .theme-twentytwentyone {
25
- .has-dark-controls .wc-block-components-textarea {
26
- background-color: $input-background-dark;
27
- color: $input-text-dark;
28
- }
29
- }
20
  }
21
  }
22
  }
 
 
 
 
 
 
 
assets/js/base/components/title/index.js CHANGED
@@ -15,7 +15,7 @@ import './style.scss';
15
  * Component that renders a block title.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
- * @param {React.ReactNode} [props.children] Children elements this component wraps.
19
  * @param {string} [props.className] CSS class used.
20
  * @param {string} props.headingLevel Heading level for title.
21
  * @param {Object} [props.props] Rest of props passed through to component.
15
  * Component that renders a block title.
16
  *
17
  * @param {Object} props Incoming props for the component.
18
+ * @param {React.ReactChildren} [props.children] Children elements this component wraps.
19
  * @param {string} [props.className] CSS class used.
20
  * @param {string} props.headingLevel Heading level for title.
21
  * @param {Object} [props.props] Rest of props passed through to component.
assets/js/base/components/title/style.scss CHANGED
@@ -2,7 +2,6 @@
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
5
- word-break: break-word;
6
  }
7
 
8
  // For Twenty Twenty we need to increase specificity a bit more.
@@ -10,6 +9,5 @@
10
  .wc-block-components-title.wc-block-components-title {
11
  @include reset-box();
12
  @include font-size(large);
13
- word-break: break-word;
14
  }
15
  }
2
  .wc-block-components-title.wc-block-components-title {
3
  @include reset-box();
4
  @include font-size(large);
 
5
  }
6
 
7
  // For Twenty Twenty we need to increase specificity a bit more.
9
  .wc-block-components-title.wc-block-components-title {
10
  @include reset-box();
11
  @include font-size(large);
 
12
  }
13
  }
assets/js/base/{context/providers/validation/components → components/validation}/index.js RENAMED
File without changes
assets/js/base/{context/providers/validation/components/validation-input-error → components/validation}/style.scss RENAMED
@@ -1,6 +1,6 @@
1
  .wc-block-components-validation-error {
2
  @include font-size(smaller);
3
- color: $alert-red;
4
  max-width: 100%;
5
  position: absolute;
6
  top: calc(100% - 1px);
1
  .wc-block-components-validation-error {
2
  @include font-size(smaller);
3
+ color: $error-red;
4
  max-width: 100%;
5
  position: absolute;
6
  top: calc(100% - 1px);
assets/js/base/{context/providers/validation/components/validation-input-error/index.js → components/validation/validation-input-error.js} RENAMED
@@ -1,12 +1,12 @@
1
  /**
2
  * External dependencies
3
  */
 
4
  import PropTypes from 'prop-types';
5
 
6
  /**
7
  * Internal dependencies
8
  */
9
- import { useValidationContext } from '../../context';
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
@@ -15,8 +15,7 @@ export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
-
19
- if ( ! errorMessage || typeof errorMessage !== 'string' ) {
20
  const error = getValidationError( propertyName ) || {};
21
  if ( error.message && ! error.hidden ) {
22
  errorMessage = error.message;
@@ -37,5 +36,3 @@ ValidationInputError.propTypes = {
37
  propertyName: PropTypes.string,
38
  elementId: PropTypes.string,
39
  };
40
-
41
- export default ValidationInputError;
1
  /**
2
  * External dependencies
3
  */
4
+ import { useValidationContext } from '@woocommerce/base-context';
5
  import PropTypes from 'prop-types';
6
 
7
  /**
8
  * Internal dependencies
9
  */
 
10
  import './style.scss';
11
 
12
  export const ValidationInputError = ( {
15
  elementId = '',
16
  } ) => {
17
  const { getValidationError, getValidationErrorId } = useValidationContext();
18
+ if ( ! errorMessage ) {
 
19
  const error = getValidationError( propertyName ) || {};
20
  if ( error.message && ! error.hidden ) {
21
  errorMessage = error.message;
36
  propertyName: PropTypes.string,
37
  elementId: PropTypes.string,
38
  };
 
 
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/actions.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/constants.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/event-emit.js RENAMED
@@ -6,7 +6,7 @@ import {
6
  reducer,
7
  emitEvent,
8
  emitEventWithAbort,
9
- } from '../../../event-emit';
10
 
11
  const EMIT_TYPES = {
12
  ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
@@ -28,7 +28,7 @@ const EMIT_TYPES = {
28
  *
29
  * @return {Object} An object with the add to cart form emitter registration
30
  */
31
- const emitterObservers = ( dispatcher ) => ( {
32
  onAddToCartAfterProcessingWithSuccess: emitterCallback(
33
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
34
  dispatcher
@@ -43,4 +43,10 @@ const emitterObservers = ( dispatcher ) => ( {
43
  ),
44
  } );
45
 
46
- export { EMIT_TYPES, emitterObservers, reducer, emitEvent, emitEventWithAbort };
 
 
 
 
 
 
6
  reducer,
7
  emitEvent,
8
  emitEventWithAbort,
9
+ } from '../../shared/event-emit';
10
 
11
  const EMIT_TYPES = {
12
  ADD_TO_CART_BEFORE_PROCESSING: 'add_to_cart_before_processing',
28
  *
29
  * @return {Object} An object with the add to cart form emitter registration
30
  */
31
+ const emitterSubscribers = ( dispatcher ) => ( {
32
  onAddToCartAfterProcessingWithSuccess: emitterCallback(
33
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
34
  dispatcher
43
  ),
44
  } );
45
 
46
+ export {
47
+ EMIT_TYPES,
48
+ emitterSubscribers,
49
+ reducer,
50
+ emitEvent,
51
+ emitEventWithAbort,
52
+ };
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/index.js RENAMED
@@ -9,7 +9,11 @@ import {
9
  useEffect,
10
  } from '@wordpress/element';
11
  import { __ } from '@wordpress/i18n';
12
- import { useShallowEqual } from '@woocommerce/base-hooks';
 
 
 
 
13
  import {
14
  productIsPurchasable,
15
  productSupportsAddToCartForm,
@@ -23,14 +27,12 @@ import { reducer } from './reducer';
23
  import { DEFAULT_STATE, STATUS } from './constants';
24
  import {
25
  EMIT_TYPES,
26
- emitterObservers,
27
  emitEvent,
28
  emitEventWithAbort,
29
  reducer as emitReducer,
30
  } from './event-emit';
31
- import { useValidationContext } from '../../validation';
32
- import { useStoreNotices } from '../../../hooks/use-store-notices';
33
- import { useEmitResponse } from '../../../hooks/use-emit-response';
34
 
35
  /**
36
  * @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
@@ -97,7 +99,7 @@ export const AddToCartFormStateContextProvider = ( {
97
  reducer,
98
  DEFAULT_STATE
99
  );
100
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
101
  const currentObservers = useShallowEqual( observers );
102
  const { addErrorNotice, removeNotices } = useStoreNotices();
103
  const { setValidationErrors } = useValidationContext();
@@ -112,16 +114,16 @@ export const AddToCartFormStateContextProvider = ( {
112
  */
113
  const eventRegistration = useMemo(
114
  () => ( {
115
- onAddToCartAfterProcessingWithSuccess: emitterObservers(
116
- observerDispatch
117
  ).onAddToCartAfterProcessingWithSuccess,
118
- onAddToCartAfterProcessingWithError: emitterObservers(
119
- observerDispatch
120
  ).onAddToCartAfterProcessingWithError,
121
- onAddToCartBeforeProcessing: emitterObservers( observerDispatch )
122
  .onAddToCartBeforeProcessing,
123
  } ),
124
- [ observerDispatch ]
125
  );
126
 
127
  /**
@@ -206,31 +208,17 @@ export const AddToCartFormStateContextProvider = ( {
206
  */
207
  useEffect( () => {
208
  if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
209
- // @todo: This data package differs from what is passed through in
210
- // the checkout state context. Should we introduce a "context"
211
- // property in the data package for this emitted event so that
212
- // observers are able to know what context the event is firing in?
213
  const data = {
214
  processingResponse: addToCartFormState.processingResponse,
215
  };
216
 
217
- const handleErrorResponse = ( observerResponses ) => {
218
- let handled = false;
219
- observerResponses.forEach( ( response ) => {
220
- const { message, messageContext } = response;
221
- if (
222
- ( isErrorResponse( response ) ||
223
- isFailResponse( response ) ) &&
224
- message
225
- ) {
226
- const errorOptions = messageContext
227
- ? { context: messageContext }
228
- : undefined;
229
- handled = true;
230
- addErrorNotice( message, errorOptions );
231
- }
232
- } );
233
- return handled;
234
  };
235
 
236
  if ( addToCartFormState.hasError ) {
@@ -239,8 +227,13 @@ export const AddToCartFormStateContextProvider = ( {
239
  currentObservers,
240
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
241
  data
242
- ).then( ( observerResponses ) => {
243
- if ( ! handleErrorResponse( observerResponses ) ) {
 
 
 
 
 
244
  // no error handling in place by anything so let's fall back to default
245
  const message =
246
  data.processingResponse?.message ||
@@ -261,8 +254,12 @@ export const AddToCartFormStateContextProvider = ( {
261
  currentObservers,
262
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
263
  data
264
- ).then( ( observerResponses ) => {
265
- if ( handleErrorResponse( observerResponses ) ) {
 
 
 
 
266
  // this will set an error which will end up
267
  // triggering the onAddToCartAfterProcessingWithError emitter.
268
  // and then setting to IDLE state.
9
  useEffect,
10
  } from '@wordpress/element';
11
  import { __ } from '@wordpress/i18n';
12
+ import {
13
+ useStoreNotices,
14
+ useEmitResponse,
15
+ useShallowEqual,
16
+ } from '@woocommerce/base-hooks';
17
  import {
18
  productIsPurchasable,
19
  productSupportsAddToCartForm,
27
  import { DEFAULT_STATE, STATUS } from './constants';
28
  import {
29
  EMIT_TYPES,
30
+ emitterSubscribers,
31
  emitEvent,
32
  emitEventWithAbort,
33
  reducer as emitReducer,
34
  } from './event-emit';
35
+ import { useValidationContext } from '../../shared/validation';
 
 
36
 
37
  /**
38
  * @typedef {import('@woocommerce/type-defs/add-to-cart-form').AddToCartFormDispatchActions} AddToCartFormDispatchActions
99
  reducer,
100
  DEFAULT_STATE
101
  );
102
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
103
  const currentObservers = useShallowEqual( observers );
104
  const { addErrorNotice, removeNotices } = useStoreNotices();
105
  const { setValidationErrors } = useValidationContext();
114
  */
115
  const eventRegistration = useMemo(
116
  () => ( {
117
+ onAddToCartAfterProcessingWithSuccess: emitterSubscribers(
118
+ subscriber
119
  ).onAddToCartAfterProcessingWithSuccess,
120
+ onAddToCartAfterProcessingWithError: emitterSubscribers(
121
+ subscriber
122
  ).onAddToCartAfterProcessingWithError,
123
+ onAddToCartBeforeProcessing: emitterSubscribers( subscriber )
124
  .onAddToCartBeforeProcessing,
125
  } ),
126
+ [ subscriber ]
127
  );
128
 
129
  /**
208
  */
209
  useEffect( () => {
210
  if ( addToCartFormState.status === STATUS.AFTER_PROCESSING ) {
 
 
 
 
211
  const data = {
212
  processingResponse: addToCartFormState.processingResponse,
213
  };
214
 
215
+ const handleErrorResponse = ( response ) => {
216
+ if ( response.message ) {
217
+ const errorOptions = response.messageContext
218
+ ? { context: response.messageContext }
219
+ : undefined;
220
+ addErrorNotice( response.message, errorOptions );
221
+ }
 
 
 
 
 
 
 
 
 
 
222
  };
223
 
224
  if ( addToCartFormState.hasError ) {
227
  currentObservers,
228
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_ERROR,
229
  data
230
+ ).then( ( response ) => {
231
+ if (
232
+ isErrorResponse( response ) ||
233
+ isFailResponse( response )
234
+ ) {
235
+ handleErrorResponse( response );
236
+ } else {
237
  // no error handling in place by anything so let's fall back to default
238
  const message =
239
  data.processingResponse?.message ||
254
  currentObservers,
255
  EMIT_TYPES.ADD_TO_CART_AFTER_PROCESSING_WITH_SUCCESS,
256
  data
257
+ ).then( ( response ) => {
258
+ if (
259
+ isErrorResponse( response ) ||
260
+ isFailResponse( response )
261
+ ) {
262
+ handleErrorResponse( response );
263
  // this will set an error which will end up
264
  // triggering the onAddToCartAfterProcessingWithError emitter.
265
  // and then setting to IDLE state.
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form-state/reducer.js RENAMED
File without changes
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/index.js RENAMED
@@ -1,8 +1,12 @@
 
 
 
 
 
1
  /**
2
  * Internal dependencies
3
  */
4
  import { AddToCartFormStateContextProvider } from '../form-state';
5
- import { ValidationContextProvider } from '../../validation';
6
  import FormSubmit from './submit';
7
 
8
  /**
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { ValidationContextProvider } from '@woocommerce/base-context';
5
+
6
  /**
7
  * Internal dependencies
8
  */
9
  import { AddToCartFormStateContextProvider } from '../form-state';
 
10
  import FormSubmit from './submit';
11
 
12
  /**
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/form/submit/index.js RENAMED
@@ -3,16 +3,14 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
 
 
 
 
6
  import { useEffect, useCallback, useState } from '@wordpress/element';
 
7
  import { decodeEntities } from '@wordpress/html-entities';
8
-
9
- /**
10
- * Internal dependencies
11
- */
12
- import { useAddToCartFormContext } from '../../form-state';
13
- import { useValidationContext } from '../../../validation';
14
- import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
15
- import { useStoreNotices } from '../../../../hooks/use-store-notices';
16
 
17
  /**
18
  * FormSubmit.
@@ -109,6 +107,7 @@ const FormSubmit = () => {
109
  }
110
  dispatchActions.setAfterProcessing( response );
111
  setIsSubmitting( false );
 
112
  } );
113
  } )
114
  .catch( ( error ) => {
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
6
+ import {
7
+ useAddToCartFormContext,
8
+ useValidationContext,
9
+ } from '@woocommerce/base-context';
10
  import { useEffect, useCallback, useState } from '@wordpress/element';
11
+ import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
12
  import { decodeEntities } from '@wordpress/html-entities';
13
+ import { triggerFragmentRefresh } from '@woocommerce/base-utils';
 
 
 
 
 
 
 
14
 
15
  /**
16
  * FormSubmit.
107
  }
108
  dispatchActions.setAfterProcessing( response );
109
  setIsSubmitting( false );
110
+ triggerFragmentRefresh();
111
  } );
112
  } )
113
  .catch( ( error ) => {
assets/js/base/context/{providers/add-to-cart-form → add-to-cart-form}/index.js RENAMED
File without changes
assets/js/base/context/cart-checkout/billing/constants.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
3
+ * @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
4
+ */
5
+
6
+ /**
7
+ * External dependencies
8
+ */
9
+ import { getSetting } from '@woocommerce/settings';
10
+ import { mapValues } from 'lodash';
11
+ import { decodeEntities } from '@wordpress/html-entities';
12
+
13
+ const checkoutData = getSetting( 'checkoutData', {} );
14
+
15
+ /**
16
+ * @type {BillingData}
17
+ */
18
+ export const DEFAULT_BILLING_DATA = {
19
+ first_name: '',
20
+ last_name: '',
21
+ company: '',
22
+ address_1: '',
23
+ address_2: '',
24
+ city: '',
25
+ state: '',
26
+ postcode: '',
27
+ country: '',
28
+ email: '',
29
+ phone: '',
30
+ };
31
+
32
+ const billingAddress = mapValues( checkoutData.billing_address, ( value ) =>
33
+ decodeEntities( value )
34
+ );
35
+
36
+ /**
37
+ * @type {BillingData}
38
+ */
39
+ export const DEFAULT_STATE = {
40
+ ...DEFAULT_BILLING_DATA,
41
+ ...billingAddress,
42
+ };
43
+
44
+ /**
45
+ * @type {BillingDataContext}
46
+ */
47
+ export const DEFAULT_BILLING_CONTEXT_DATA = {
48
+ billingData: DEFAULT_BILLING_DATA,
49
+ setBillingData: () => null,
50
+ };
assets/js/base/context/cart-checkout/billing/index.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useState,
8
+ useCallback,
9
+ } from '@wordpress/element';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { DEFAULT_STATE, DEFAULT_BILLING_CONTEXT_DATA } from './constants';
15
+
16
+ /**
17
+ * @typedef {import('@woocommerce/type-defs/contexts').BillingDataContext} BillingDataContext
18
+ */
19
+
20
+ const BillingDataContext = createContext( DEFAULT_BILLING_CONTEXT_DATA );
21
+
22
+ /**
23
+ * @return {BillingDataContext} Returns data and functions related to billing.
24
+ */
25
+ export const useBillingDataContext = () => {
26
+ return useContext( BillingDataContext );
27
+ };
28
+
29
+ export const BillingDataProvider = ( { children } ) => {
30
+ const [ billingData, setBillingDataState ] = useState( DEFAULT_STATE );
31
+
32
+ const setBillingData = useCallback( ( newData ) => {
33
+ setBillingDataState( ( prevState ) => ( {
34
+ ...prevState,
35
+ ...newData,
36
+ } ) );
37
+ }, [] );
38
+
39
+ /**
40
+ * @type {BillingDataContext}
41
+ */
42
+ const billingDataValue = {
43
+ billingData,
44
+ setBillingData,
45
+ };
46
+ return (
47
+ <BillingDataContext.Provider value={ billingDataValue }>
48
+ { children }
49
+ </BillingDataContext.Provider>
50
+ );
51
+ };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/cart/index.js RENAMED
@@ -1,7 +1,9 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { CheckoutProvider } from '../checkout';
 
 
5
 
6
  /**
7
  * Cart provider
@@ -16,8 +18,12 @@ import { CheckoutProvider } from '../checkout';
16
  */
17
  export const CartProvider = ( { children, redirectUrl } ) => {
18
  return (
19
- <CheckoutProvider isCart={ true } redirectUrl={ redirectUrl }>
20
- { children }
21
- </CheckoutProvider>
 
 
 
 
22
  );
23
  };
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { ShippingDataProvider } from '../shipping';
5
+ import { CheckoutStateProvider } from '../checkout-state';
6
+ import { PaymentMethodDataProvider } from '../payment-methods';
7
 
8
  /**
9
  * Cart provider
18
  */
19
  export const CartProvider = ( { children, redirectUrl } ) => {
20
  return (
21
+ <CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ true }>
22
+ <ShippingDataProvider>
23
+ <PaymentMethodDataProvider>
24
+ { children }
25
+ </PaymentMethodDataProvider>
26
+ </ShippingDataProvider>
27
+ </CheckoutStateProvider>
28
  );
29
  };
assets/js/base/context/cart-checkout/checkout-state/actions.js ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { TYPES } from './constants';
5
+
6
+ const {
7
+ SET_PRISTINE,
8
+ SET_IDLE,
9
+ SET_PROCESSING,
10
+ SET_BEFORE_PROCESSING,
11
+ SET_AFTER_PROCESSING,
12
+ SET_PROCESSING_RESPONSE,
13
+ SET_REDIRECT_URL,
14
+ SET_COMPLETE,
15
+ SET_HAS_ERROR,
16
+ SET_NO_ERROR,
17
+ INCREMENT_CALCULATING,
18
+ DECREMENT_CALCULATING,
19
+ SET_ORDER_ID,
20
+ SET_SHOULD_CREATE_ACCOUNT,
21
+ SET_ORDER_NOTES,
22
+ } = TYPES;
23
+
24
+ /**
25
+ * All the actions that can be dispatched for the checkout.
26
+ */
27
+ export const actions = {
28
+ setPristine: () => ( {
29
+ type: SET_PRISTINE,
30
+ } ),
31
+ setIdle: () => ( {
32
+ type: SET_IDLE,
33
+ } ),
34
+ setProcessing: () => ( {
35
+ type: SET_PROCESSING,
36
+ } ),
37
+ setRedirectUrl: ( url ) => ( {
38
+ type: SET_REDIRECT_URL,
39
+ url,
40
+ } ),
41
+ setProcessingResponse: ( data ) => ( {
42
+ type: SET_PROCESSING_RESPONSE,
43
+ data,
44
+ } ),
45
+ setComplete: ( data ) => ( {
46
+ type: SET_COMPLETE,
47
+ data,
48
+ } ),
49
+ setBeforeProcessing: () => ( {
50
+ type: SET_BEFORE_PROCESSING,
51
+ } ),
52
+ setAfterProcessing: () => ( {
53
+ type: SET_AFTER_PROCESSING,
54
+ } ),
55
+ setHasError: ( hasError = true ) => {
56
+ const type = hasError ? SET_HAS_ERROR : SET_NO_ERROR;
57
+ return { type };
58
+ },
59
+ incrementCalculating: () => ( {
60
+ type: INCREMENT_CALCULATING,
61
+ } ),
62
+ decrementCalculating: () => ( {
63
+ type: DECREMENT_CALCULATING,
64
+ } ),
65
+ setOrderId: ( orderId ) => ( {
66
+ type: SET_ORDER_ID,
67
+ orderId,
68
+ } ),
69
+ setShouldCreateAccount: ( shouldCreateAccount ) => ( {
70
+ type: SET_SHOULD_CREATE_ACCOUNT,
71
+ shouldCreateAccount,
72
+ } ),
73
+ setOrderNotes: ( orderNotes ) => ( {
74
+ type: SET_ORDER_NOTES,
75
+ orderNotes,
76
+ } ),
77
+ };
assets/js/base/context/cart-checkout/checkout-state/constants.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { getSetting } from '@woocommerce/settings';
5
+
6
+ /**
7
+ * @type {import("@woocommerce/type-defs/checkout").CheckoutStatusConstants}
8
+ */
9
+ export const STATUS = {
10
+ PRISTINE: 'pristine',
11
+ IDLE: 'idle',
12
+ PROCESSING: 'processing',
13
+ COMPLETE: 'complete',
14
+ BEFORE_PROCESSING: 'before_processing',
15
+ AFTER_PROCESSING: 'after_processing',
16
+ };
17
+
18
+ const checkoutData = getSetting( 'checkoutData', {
19
+ order_id: 0,
20
+ customer_id: 0,
21
+ } );
22
+
23
+ export const DEFAULT_STATE = {
24
+ redirectUrl: '',
25
+ status: STATUS.PRISTINE,
26
+ hasError: false,
27
+ calculatingCount: 0,
28
+ orderId: checkoutData.order_id,
29
+ orderNotes: '',
30
+ customerId: checkoutData.customer_id,
31
+ shouldCreateAccount: false,
32
+ processingResponse: null,
33
+ };
34
+
35
+ export const TYPES = {
36
+ SET_IDLE: 'set_idle',
37
+ SET_PRISTINE: 'set_pristine',
38
+ SET_REDIRECT_URL: 'set_redirect_url',
39
+ SET_COMPLETE: 'set_checkout_complete',
40
+ SET_BEFORE_PROCESSING: 'set_before_processing',
41
+ SET_AFTER_PROCESSING: 'set_after_processing',
42
+ SET_PROCESSING_RESPONSE: 'set_processing_response',
43
+ SET_PROCESSING: 'set_checkout_is_processing',
44
+ SET_HAS_ERROR: 'set_checkout_has_error',
45
+ SET_NO_ERROR: 'set_checkout_no_error',
46
+ SET_ORDER_ID: 'set_checkout_order_id',
47
+ SET_ORDER_NOTES: 'set_checkout_order_notes',
48
+ INCREMENT_CALCULATING: 'increment_calculating',
49
+ DECREMENT_CALCULATING: 'decrement_calculating',
50
+ };
assets/js/base/context/cart-checkout/checkout-state/event-emit.js ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ emitterCallback,
6
+ reducer,
7
+ emitEvent,
8
+ emitEventWithAbort,
9
+ } from '../../shared/event-emit';
10
+
11
+ const EMIT_TYPES = {
12
+ CHECKOUT_BEFORE_PROCESSING: 'checkout_before_processing',
13
+ CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS:
14
+ 'checkout_after_processing_with_success',
15
+ CHECKOUT_AFTER_PROCESSING_WITH_ERROR:
16
+ 'checkout_after_processing_with_error',
17
+ };
18
+
19
+ /**
20
+ * Receives a reducer dispatcher and returns an object with the
21
+ * callback registration function for the checkout emit
22
+ * events.
23
+ *
24
+ * Calling the event registration function with the callback will register it
25
+ * for the event emitter and will return a dispatcher for removing the
26
+ * registered callback (useful for implementation in `useEffect`).
27
+ *
28
+ * @param {Function} dispatcher The emitter reducer dispatcher.
29
+ *
30
+ * @return {Object} An object with the checkout emmitter registration
31
+ */
32
+ const emitterSubscribers = ( dispatcher ) => ( {
33
+ onCheckoutAfterProcessingWithSuccess: emitterCallback(
34
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
35
+ dispatcher
36
+ ),
37
+ onCheckoutAfterProcessingWithError: emitterCallback(
38
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
39
+ dispatcher
40
+ ),
41
+ onCheckoutBeforeProcessing: emitterCallback(
42
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
43
+ dispatcher
44
+ ),
45
+ } );
46
+
47
+ export {
48
+ EMIT_TYPES,
49
+ emitterSubscribers,
50
+ reducer,
51
+ emitEvent,
52
+ emitEventWithAbort,
53
+ };
assets/js/base/context/cart-checkout/checkout-state/index.js ADDED
@@ -0,0 +1,345 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useReducer,
8
+ useRef,
9
+ useMemo,
10
+ useEffect,
11
+ useCallback,
12
+ } from '@wordpress/element';
13
+ import { __ } from '@wordpress/i18n';
14
+ import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
15
+
16
+ /**
17
+ * Internal dependencies
18
+ */
19
+ import { actions } from './actions';
20
+ import { reducer, prepareResponseData } from './reducer';
21
+ import { DEFAULT_STATE, STATUS } from './constants';
22
+ import {
23
+ EMIT_TYPES,
24
+ emitterSubscribers,
25
+ emitEvent,
26
+ emitEventWithAbort,
27
+ reducer as emitReducer,
28
+ } from './event-emit';
29
+ import { useValidationContext } from '../../shared/validation';
30
+
31
+ /**
32
+ * @typedef {import('@woocommerce/type-defs/checkout').CheckoutDispatchActions} CheckoutDispatchActions
33
+ * @typedef {import('@woocommerce/type-defs/contexts').CheckoutDataContext} CheckoutDataContext
34
+ */
35
+
36
+ const CheckoutContext = createContext( {
37
+ isComplete: false,
38
+ isIdle: false,
39
+ isCalculating: false,
40
+ isProcessing: false,
41
+ isBeforeProcessing: false,
42
+ isAfterProcessing: false,
43
+ hasError: false,
44
+ redirectUrl: '',
45
+ orderId: 0,
46
+ orderNotes: '',
47
+ customerId: 0,
48
+ onSubmit: () => void null,
49
+ onCheckoutAfterProcessingWithSuccess: ( callback ) => void callback,
50
+ onCheckoutAfterProcessingWithError: ( callback ) => void callback,
51
+ onCheckoutBeforeProcessing: ( callback ) => void callback,
52
+ dispatchActions: {
53
+ resetCheckout: () => void null,
54
+ setRedirectUrl: ( url ) => void url,
55
+ setHasError: ( hasError ) => void hasError,
56
+ setAfterProcessing: ( response ) => void response,
57
+ incrementCalculating: () => void null,
58
+ decrementCalculating: () => void null,
59
+ setOrderId: ( id ) => void id,
60
+ setOrderNotes: ( orderNotes ) => void orderNotes,
61
+ },
62
+ hasOrder: false,
63
+ isCart: false,
64
+ } );
65
+
66
+ /**
67
+ * @return {CheckoutDataContext} Returns the checkout data context value
68
+ */
69
+ export const useCheckoutContext = () => {
70
+ return useContext( CheckoutContext );
71
+ };
72
+
73
+ /**
74
+ * Checkout state provider
75
+ * This provides provides an api interface exposing checkout state for use with
76
+ * cart or checkout blocks.
77
+ *
78
+ * @param {Object} props Incoming props for the provider.
79
+ * @param {Object} props.children The children being wrapped.
80
+ * @param {string} props.redirectUrl Initialize what the checkout will
81
+ * redirect to after successful
82
+ * submit.
83
+ * @param {boolean} props.isCart If context provider is being used
84
+ * in cart context.
85
+ */
86
+ export const CheckoutStateProvider = ( {
87
+ children,
88
+ redirectUrl,
89
+ isCart = false,
90
+ } ) => {
91
+ // note, this is done intentionally so that the default state now has
92
+ // the redirectUrl for when checkout is reset to PRISTINE state.
93
+ DEFAULT_STATE.redirectUrl = redirectUrl;
94
+ const [ checkoutState, dispatch ] = useReducer( reducer, DEFAULT_STATE );
95
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
96
+ const currentObservers = useRef( observers );
97
+ const { setValidationErrors } = useValidationContext();
98
+ const { addErrorNotice, removeNotices } = useStoreNotices();
99
+ const isCalculating = checkoutState.calculatingCount > 0;
100
+ const {
101
+ isSuccessResponse,
102
+ isErrorResponse,
103
+ isFailResponse,
104
+ shouldRetry,
105
+ } = useEmitResponse();
106
+
107
+ // set observers on ref so it's always current.
108
+ useEffect( () => {
109
+ currentObservers.current = observers;
110
+ }, [ observers ] );
111
+ const onCheckoutAfterProcessingWithSuccess = useMemo(
112
+ () =>
113
+ emitterSubscribers( subscriber )
114
+ .onCheckoutAfterProcessingWithSuccess,
115
+ [ subscriber ]
116
+ );
117
+ const onCheckoutAfterProcessingWithError = useMemo(
118
+ () =>
119
+ emitterSubscribers( subscriber ).onCheckoutAfterProcessingWithError,
120
+ [ subscriber ]
121
+ );
122
+ const onCheckoutBeforeProcessing = useMemo(
123
+ () => emitterSubscribers( subscriber ).onCheckoutBeforeProcessing,
124
+ [ subscriber ]
125
+ );
126
+
127
+ /**
128
+ * @type {CheckoutDispatchActions}
129
+ */
130
+ const dispatchActions = useMemo(
131
+ () => ( {
132
+ resetCheckout: () => void dispatch( actions.setPristine() ),
133
+ setRedirectUrl: ( url ) =>
134
+ void dispatch( actions.setRedirectUrl( url ) ),
135
+ setHasError: ( hasError ) =>
136
+ void dispatch( actions.setHasError( hasError ) ),
137
+ incrementCalculating: () =>
138
+ void dispatch( actions.incrementCalculating() ),
139
+ decrementCalculating: () =>
140
+ void dispatch( actions.decrementCalculating() ),
141
+ setOrderId: ( orderId ) =>
142
+ void dispatch( actions.setOrderId( orderId ) ),
143
+ setOrderNotes: ( orderNotes ) =>
144
+ void dispatch( actions.setOrderNotes( orderNotes ) ),
145
+ setAfterProcessing: ( response ) => {
146
+ // capture general error message if this is an error response.
147
+ if (
148
+ ! response.payment_result &&
149
+ response.message &&
150
+ response?.data?.status !== 200
151
+ ) {
152
+ response.payment_result = {
153
+ ...response.payment_result,
154
+ message: response.message,
155
+ };
156
+ }
157
+ if ( response.payment_result ) {
158
+ if (
159
+ // eslint-disable-next-line camelcase
160
+ response.payment_result?.redirect_url
161
+ ) {
162
+ dispatch(
163
+ actions.setRedirectUrl(
164
+ response.payment_result.redirect_url
165
+ )
166
+ );
167
+ }
168
+ dispatch(
169
+ actions.setProcessingResponse(
170
+ prepareResponseData( response.payment_result )
171
+ )
172
+ );
173
+ }
174
+ void dispatch( actions.setAfterProcessing() );
175
+ },
176
+ } ),
177
+ []
178
+ );
179
+
180
+ // emit events.
181
+ useEffect( () => {
182
+ const status = checkoutState.status;
183
+ if ( status === STATUS.BEFORE_PROCESSING ) {
184
+ removeNotices( 'error' );
185
+ emitEvent(
186
+ currentObservers.current,
187
+ EMIT_TYPES.CHECKOUT_BEFORE_PROCESSING,
188
+ {}
189
+ ).then( ( response ) => {
190
+ if ( response !== true ) {
191
+ if ( Array.isArray( response ) ) {
192
+ response.forEach(
193
+ ( { errorMessage, validationErrors } ) => {
194
+ addErrorNotice( errorMessage );
195
+ setValidationErrors( validationErrors );
196
+ }
197
+ );
198
+ }
199
+ dispatch( actions.setIdle() );
200
+ } else {
201
+ dispatch( actions.setProcessing() );
202
+ }
203
+ } );
204
+ }
205
+ }, [
206
+ checkoutState.status,
207
+ setValidationErrors,
208
+ addErrorNotice,
209
+ removeNotices,
210
+ dispatch,
211
+ ] );
212
+
213
+ useEffect( () => {
214
+ if ( checkoutState.status === STATUS.AFTER_PROCESSING ) {
215
+ const data = {
216
+ redirectUrl: checkoutState.redirectUrl,
217
+ orderId: checkoutState.orderId,
218
+ customerId: checkoutState.customerId,
219
+ customerNote: checkoutState.customerNote,
220
+ processingResponse: checkoutState.processingResponse,
221
+ };
222
+ if ( checkoutState.hasError ) {
223
+ // allow payment methods or other things to customize the error
224
+ // with a fallback if nothing customizes it.
225
+ emitEventWithAbort(
226
+ currentObservers.current,
227
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_ERROR,
228
+ data
229
+ ).then( ( response ) => {
230
+ if (
231
+ isErrorResponse( response ) ||
232
+ isFailResponse( response )
233
+ ) {
234
+ if ( response.message ) {
235
+ const errorOptions = response.messageContext
236
+ ? { context: response.messageContext }
237
+ : undefined;
238
+ addErrorNotice( response.message, errorOptions );
239
+ }
240
+ // irrecoverable error so set complete
241
+ if ( ! shouldRetry( response ) ) {
242
+ dispatch( actions.setComplete( response ) );
243
+ } else {
244
+ dispatch( actions.setIdle() );
245
+ }
246
+ } else {
247
+ // no error handling in place by anything so let's fall
248
+ // back to default
249
+ const message =
250
+ data.processingResponse?.message ||
251
+ __(
252
+ 'Something went wrong. Please contact us to get assistance.',
253
+ 'woo-gutenberg-products-block'
254
+ );
255
+ addErrorNotice( message, {
256
+ id: 'checkout',
257
+ } );
258
+ dispatch( actions.setIdle() );
259
+ }
260
+ } );
261
+ } else {
262
+ emitEventWithAbort(
263
+ currentObservers.current,
264
+ EMIT_TYPES.CHECKOUT_AFTER_PROCESSING_WITH_SUCCESS,
265
+ data
266
+ ).then( ( response ) => {
267
+ if ( isSuccessResponse( response ) ) {
268
+ dispatch( actions.setComplete( response ) );
269
+ } else if (
270
+ isErrorResponse( response ) ||
271
+ isFailResponse( response )
272
+ ) {
273
+ if ( response.message ) {
274
+ const errorOptions = response.messageContext
275
+ ? { context: response.messageContext }
276
+ : undefined;
277
+ addErrorNotice( response.message, errorOptions );
278
+ }
279
+ if ( ! shouldRetry( response ) ) {
280
+ dispatch( actions.setComplete( response ) );
281
+ } else {
282
+ // this will set an error which will end up
283
+ // triggering the onCheckoutAfterProcessingWithErrors emitter.
284
+ // and then setting checkout to IDLE state.
285
+ dispatch( actions.setHasError( true ) );
286
+ }
287
+ } else {
288
+ // nothing hooked in had any response type so let's just
289
+ // consider successful
290
+ dispatch( actions.setComplete() );
291
+ }
292
+ } );
293
+ }
294
+ }
295
+ }, [
296
+ checkoutState.status,
297
+ checkoutState.hasError,
298
+ checkoutState.redirectUrl,
299
+ checkoutState.orderId,
300
+ checkoutState.customerId,
301
+ checkoutState.customerNote,
302
+ checkoutState.processingResponse,
303
+ dispatchActions,
304
+ addErrorNotice,
305
+ isErrorResponse,
306
+ isFailResponse,
307
+ isSuccessResponse,
308
+ ] );
309
+
310
+ const onSubmit = useCallback( () => {
311
+ dispatch( actions.setBeforeProcessing() );
312
+ }, [] );
313
+
314
+ /**
315
+ * @type {CheckoutDataContext}
316
+ */
317
+ const checkoutData = {
318
+ onSubmit,
319
+ isComplete: checkoutState.status === STATUS.COMPLETE,
320
+ isIdle: checkoutState.status === STATUS.IDLE,
321
+ isCalculating,
322
+ isProcessing: checkoutState.status === STATUS.PROCESSING,
323
+ isBeforeProcessing: checkoutState.status === STATUS.BEFORE_PROCESSING,
324
+ isAfterProcessing: checkoutState.status === STATUS.AFTER_PROCESSING,
325
+ hasError: checkoutState.hasError,
326
+ redirectUrl: checkoutState.redirectUrl,
327
+ onCheckoutAfterProcessingWithSuccess,
328
+ onCheckoutAfterProcessingWithError,
329
+ onCheckoutBeforeProcessing,
330
+ dispatchActions,
331
+ isCart,
332
+ orderId: checkoutState.orderId,
333
+ hasOrder: !! checkoutState.orderId,
334
+ customerId: checkoutState.customerId,
335
+ orderNotes: checkoutState.orderNotes,
336
+ shouldCreateAccount: checkoutState.shouldCreateAccount,
337
+ setShouldCreateAccount: ( value ) =>
338
+ dispatch( actions.setShouldCreateAccount( value ) ),
339
+ };
340
+ return (
341
+ <CheckoutContext.Provider value={ checkoutData }>
342
+ { children }
343
+ </CheckoutContext.Provider>
344
+ );
345
+ };
assets/js/base/context/cart-checkout/checkout-state/reducer.js ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { TYPES, DEFAULT_STATE, STATUS } from './constants';
5
+
6
+ const {
7
+ SET_PRISTINE,
8
+ SET_IDLE,
9
+ SET_PROCESSING,
10
+ SET_BEFORE_PROCESSING,
11
+ SET_AFTER_PROCESSING,
12
+ SET_PROCESSING_RESPONSE,
13
+ SET_REDIRECT_URL,
14
+ SET_COMPLETE,
15
+ SET_HAS_ERROR,
16
+ SET_NO_ERROR,
17
+ INCREMENT_CALCULATING,
18
+ DECREMENT_CALCULATING,
19
+ SET_ORDER_ID,
20
+ SET_ORDER_NOTES,
21
+ SET_SHOULD_CREATE_ACCOUNT,
22
+ } = TYPES;
23
+
24
+ const {
25
+ PRISTINE,
26
+ IDLE,
27
+ PROCESSING,
28
+ BEFORE_PROCESSING,
29
+ AFTER_PROCESSING,
30
+ COMPLETE,
31
+ } = STATUS;
32
+
33
+ /**
34
+ * Prepares the payment_result data from the server checkout endpoint response.
35
+ *
36
+ * @param {Object} data The value of `payment_result` from the checkout
37
+ * processing endpoint response.
38
+ * @param {string} data.message If there was a general error message it will appear
39
+ * on this property.
40
+ * @param {string} data.payment_status The payment status. One of 'success', 'failure',
41
+ * 'pending', 'error'.
42
+ * @param {Array<Object>} data.payment_details An array of Objects with a 'key' property that is a
43
+ * string and value property that is a string. These are
44
+ * converted to a flat object where the key becomes the
45
+ * object property and value the property value.
46
+ *
47
+ * @return {Object} A new object with 'paymentStatus', and 'paymentDetails' as the properties.
48
+ */
49
+ export const prepareResponseData = ( data ) => {
50
+ const responseData = {
51
+ message: data?.message || '',
52
+ paymentStatus: data.payment_status,
53
+ paymentDetails: {},
54
+ };
55
+ if ( Array.isArray( data.payment_details ) ) {
56
+ data.payment_details.forEach( ( { key, value } ) => {
57
+ responseData.paymentDetails[ key ] = value;
58
+ } );
59
+ }
60
+ return responseData;
61
+ };
62
+
63
+ /**
64
+ * Reducer for the checkout state
65
+ *
66
+ * @param {Object} state Current state.
67
+ * @param {Object} action Incoming action object.
68
+ * @param {string} action.url URL passed in.
69
+ * @param {string} action.type Type of action.
70
+ * @param {string} action.orderId Order ID.
71
+ * @param {Array} action.orderNotes Order notes.
72
+ * @param {boolean} action.shouldCreateAccount True if shopper has requested a user account (signup checkbox).
73
+ * @param {Object} action.data Other action payload.
74
+ */
75
+ export const reducer = (
76
+ state = DEFAULT_STATE,
77
+ { url, type, orderId, orderNotes, shouldCreateAccount, data }
78
+ ) => {
79
+ let newState = state;
80
+ switch ( type ) {
81
+ case SET_PRISTINE:
82
+ newState = DEFAULT_STATE;
83
+ break;
84
+ case SET_IDLE:
85
+ newState =
86
+ state.status !== IDLE
87
+ ? {
88
+ ...state,
89
+ status: IDLE,
90
+ }
91
+ : state;
92
+ break;
93
+ case SET_REDIRECT_URL:
94
+ newState =
95
+ url !== state.url
96
+ ? {
97
+ ...state,
98
+ redirectUrl: url,
99
+ }
100
+ : state;
101
+ break;
102
+ case SET_PROCESSING_RESPONSE:
103
+ newState = {
104
+ ...state,
105
+ processingResponse: data,
106
+ };
107
+ break;
108
+
109
+ case SET_COMPLETE:
110
+ newState =
111
+ state.status !== COMPLETE
112
+ ? {
113
+ ...state,
114
+ status: COMPLETE,
115
+ redirectUrl: data?.redirectUrl || state.redirectUrl,
116
+ }
117
+ : state;
118
+ break;
119
+ case SET_PROCESSING:
120
+ newState =
121
+ state.status !== PROCESSING
122
+ ? {
123
+ ...state,
124
+ status: PROCESSING,
125
+ hasError: false,
126
+ }
127
+ : state;
128
+ // clear any error state.
129
+ newState =
130
+ newState.hasError === false
131
+ ? newState
132
+ : { ...newState, hasError: false };
133
+ break;
134
+ case SET_BEFORE_PROCESSING:
135
+ newState =
136
+ state.status !== BEFORE_PROCESSING
137
+ ? {
138
+ ...state,
139
+ status: BEFORE_PROCESSING,
140
+ hasError: false,
141
+ }
142
+ : state;
143
+ break;
144
+ case SET_AFTER_PROCESSING:
145
+ newState =
146
+ state.status !== AFTER_PROCESSING
147
+ ? {
148
+ ...state,
149
+ status: AFTER_PROCESSING,
150
+ }
151
+ : state;
152
+ break;
153
+ case SET_HAS_ERROR:
154
+ newState = state.hasError
155
+ ? state
156
+ : {
157
+ ...state,
158
+ hasError: true,
159
+ };
160
+ newState =
161
+ state.status === PROCESSING ||
162
+ state.status === BEFORE_PROCESSING
163
+ ? {
164
+ ...newState,
165
+ status: IDLE,
166
+ }
167
+ : newState;
168
+ break;
169
+ case SET_NO_ERROR:
170
+ newState = state.hasError
171
+ ? {
172
+ ...state,
173
+ hasError: false,
174
+ }
175
+ : state;
176
+ break;
177
+ case INCREMENT_CALCULATING:
178
+ newState = {
179
+ ...state,
180
+ calculatingCount: state.calculatingCount + 1,
181
+ };
182
+ break;
183
+ case DECREMENT_CALCULATING:
184
+ newState = {
185
+ ...state,
186
+ calculatingCount: Math.max( 0, state.calculatingCount - 1 ),
187
+ };
188
+ break;
189
+ case SET_ORDER_ID:
190
+ newState = {
191
+ ...state,
192
+ orderId,
193
+ };
194
+ break;
195
+ case SET_SHOULD_CREATE_ACCOUNT:
196
+ if ( shouldCreateAccount !== state.shouldCreateAccount ) {
197
+ newState = {
198
+ ...state,
199
+ shouldCreateAccount,
200
+ };
201
+ }
202
+ break;
203
+ case SET_ORDER_NOTES:
204
+ if ( state.orderNotes !== orderNotes ) {
205
+ newState = {
206
+ ...state,
207
+ orderNotes,
208
+ };
209
+ }
210
+ break;
211
+ }
212
+ // automatically update state to idle from pristine as soon as it
213
+ // initially changes.
214
+ if (
215
+ newState !== state &&
216
+ type !== SET_PRISTINE &&
217
+ newState.status === PRISTINE
218
+ ) {
219
+ newState.status = IDLE;
220
+ }
221
+ return newState;
222
+ };
assets/js/base/context/cart-checkout/checkout/index.js ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { PaymentMethodDataProvider } from '../payment-methods';
5
+ import { ShippingDataProvider } from '../shipping';
6
+ import { BillingDataProvider } from '../billing';
7
+ import { CheckoutStateProvider } from '../checkout-state';
8
+ import CheckoutProcessor from './processor';
9
+
10
+ /**
11
+ * Checkout provider
12
+ * This wraps the checkout and provides an api interface for the checkout to
13
+ * children via various hooks.
14
+ *
15
+ * @param {Object} props Incoming props for the provider.
16
+ * @param {Object} props.children The children being wrapped.
17
+ * @param {string} [props.redirectUrl] Initialize what the checkout will
18
+ * redirect to after successful
19
+ * submit.
20
+ */
21
+ export const CheckoutProvider = ( { children, redirectUrl } ) => {
22
+ return (
23
+ <CheckoutStateProvider redirectUrl={ redirectUrl } isCart={ false }>
24
+ <BillingDataProvider>
25
+ <ShippingDataProvider>
26
+ <PaymentMethodDataProvider>
27
+ { children }
28
+ <CheckoutProcessor />
29
+ </PaymentMethodDataProvider>
30
+ </ShippingDataProvider>
31
+ </BillingDataProvider>
32
+ </CheckoutStateProvider>
33
+ );
34
+ };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/checkout/processor/index.js RENAMED
@@ -3,6 +3,13 @@
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
 
 
 
 
 
 
 
6
  import {
7
  useEffect,
8
  useRef,
@@ -10,22 +17,34 @@ import {
10
  useState,
11
  useMemo,
12
  } from '@wordpress/element';
13
- import {
14
- emptyHiddenAddressFields,
15
- formatStoreApiErrorMessage,
16
- } from '@woocommerce/base-utils';
17
 
18
  /**
19
- * Internal dependencies
20
  */
21
- import { preparePaymentData } from './utils';
22
- import { useCheckoutContext } from '../../checkout-state';
23
- import { useShippingDataContext } from '../../shipping';
24
- import { useCustomerDataContext } from '../../customer';
25
- import { usePaymentMethodDataContext } from '../../payment-methods';
26
- import { useValidationContext } from '../../../validation';
27
- import { useStoreCart } from '../../../../hooks/cart/use-store-cart';
28
- import { useStoreNotices } from '../../../../hooks/use-store-notices';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  /**
31
  * CheckoutProcessor component.
@@ -37,7 +56,7 @@ import { useStoreNotices } from '../../../../hooks/use-store-notices';
37
  const CheckoutProcessor = () => {
38
  const {
39
  hasError: checkoutHasError,
40
- onCheckoutValidationBeforeProcessing,
41
  dispatchActions,
42
  redirectUrl,
43
  isProcessing: checkoutIsProcessing,
@@ -47,12 +66,11 @@ const CheckoutProcessor = () => {
47
  shouldCreateAccount,
48
  } = useCheckoutContext();
49
  const { hasValidationErrors } = useValidationContext();
50
- const { shippingErrorStatus } = useShippingDataContext();
51
- const { billingData, shippingAddress } = useCustomerDataContext();
52
  const { cartNeedsPayment, receiveCart } = useStoreCart();
53
  const {
54
  activePaymentMethod,
55
- isExpressPaymentMethodActive,
56
  currentStatus: currentPaymentStatus,
57
  paymentMethodData,
58
  expressPaymentMethods,
@@ -64,6 +82,9 @@ const CheckoutProcessor = () => {
64
  const currentShippingAddress = useRef( shippingAddress );
65
  const currentRedirectUrl = useRef( redirectUrl );
66
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
 
 
 
67
 
68
  const paymentMethodId = useMemo( () => {
69
  const merged = { ...expressPaymentMethods, ...paymentMethods };
@@ -71,20 +92,20 @@ const CheckoutProcessor = () => {
71
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
72
 
73
  const checkoutWillHaveError =
74
- ( hasValidationErrors && ! isExpressPaymentMethodActive ) ||
75
  currentPaymentStatus.hasError ||
76
  shippingErrorStatus.hasError;
77
 
78
  // If express payment method is active, let's suppress notices
79
  useEffect( () => {
80
- setIsSuppressed( isExpressPaymentMethodActive );
81
- }, [ isExpressPaymentMethodActive, setIsSuppressed ] );
82
 
83
  useEffect( () => {
84
  if (
85
  checkoutWillHaveError !== checkoutHasError &&
86
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
87
- ! isExpressPaymentMethodActive
88
  ) {
89
  dispatchActions.setHasError( checkoutWillHaveError );
90
  }
@@ -93,7 +114,7 @@ const CheckoutProcessor = () => {
93
  checkoutHasError,
94
  checkoutIsProcessing,
95
  checkoutIsBeforeProcessing,
96
- isExpressPaymentMethodActive,
97
  dispatchActions,
98
  ] );
99
 
@@ -144,33 +165,29 @@ const CheckoutProcessor = () => {
144
 
145
  useEffect( () => {
146
  let unsubscribeProcessing;
147
- if ( ! isExpressPaymentMethodActive ) {
148
- unsubscribeProcessing = onCheckoutValidationBeforeProcessing(
149
  checkValidation,
150
  0
151
  );
152
  }
153
  return () => {
154
- if ( ! isExpressPaymentMethodActive ) {
155
  unsubscribeProcessing();
156
  }
157
  };
158
  }, [
159
- onCheckoutValidationBeforeProcessing,
160
  checkValidation,
161
- isExpressPaymentMethodActive,
162
  ] );
163
 
164
  const processOrder = useCallback( () => {
165
  setIsProcessingOrder( true );
166
  removeNotice( 'checkout' );
167
  let data = {
168
- billing_address: emptyHiddenAddressFields(
169
- currentBillingData.current
170
- ),
171
- shipping_address: emptyHiddenAddressFields(
172
- currentShippingAddress.current
173
- ),
174
  customer_note: orderNotes,
175
  should_create_account: shouldCreateAccount,
176
  };
@@ -196,55 +213,37 @@ const CheckoutProcessor = () => {
196
  // Update nonce.
197
  triggerFetch.setNonce( fetchResponse.headers );
198
 
199
- // Update user using headers.
200
- dispatchActions.setCustomerId(
201
- fetchResponse.headers.get( 'X-WC-Store-API-User' )
202
- );
203
-
204
  // Handle response.
205
  fetchResponse.json().then( function ( response ) {
206
  if ( ! fetchResponse.ok ) {
207
  // We received an error response.
208
- addErrorNotice(
209
- formatStoreApiErrorMessage( response ),
210
- {
211
  id: 'checkout',
212
- }
213
- );
 
 
 
 
 
 
 
 
 
 
214
  dispatchActions.setHasError();
215
  }
216
  dispatchActions.setAfterProcessing( response );
217
  setIsProcessingOrder( false );
218
  } );
219
  } )
220
- .catch( ( errorResponse ) => {
221
- // Update nonce.
222
- triggerFetch.setNonce( errorResponse.headers );
223
-
224
- // If new customer ID returned, update the store.
225
- if ( errorResponse.headers?.get( 'X-WC-Store-API-User' ) ) {
226
- dispatchActions.setCustomerId(
227
- errorResponse.headers.get( 'X-WC-Store-API-User' )
228
- );
229
- }
230
-
231
- errorResponse.json().then( function ( response ) {
232
- // If updated cart state was returned, update the store.
233
  if ( response.data?.cart ) {
234
  receiveCart( response.data.cart );
235
  }
236
- addErrorNotice( formatStoreApiErrorMessage( response ), {
237
- id: 'checkout',
238
- } );
239
-
240
- response.additional_errors?.forEach?.(
241
- ( additionalError ) => {
242
- addErrorNotice( additionalError.message, {
243
- id: additionalError.error_code,
244
- } );
245
- }
246
- );
247
-
248
  dispatchActions.setHasError();
249
  dispatchActions.setAfterProcessing( response );
250
  setIsProcessingOrder( false );
3
  */
4
  import { __ } from '@wordpress/i18n';
5
  import triggerFetch from '@wordpress/api-fetch';
6
+ import {
7
+ useCheckoutContext,
8
+ useShippingDataContext,
9
+ useBillingDataContext,
10
+ usePaymentMethodDataContext,
11
+ useValidationContext,
12
+ } from '@woocommerce/base-context';
13
  import {
14
  useEffect,
15
  useRef,
17
  useState,
18
  useMemo,
19
  } from '@wordpress/element';
20
+ import { useStoreCart, useStoreNotices } from '@woocommerce/base-hooks';
 
 
 
21
 
22
  /**
23
+ * @typedef {import('@woocommerce/type-defs/payments').PaymentDataItem} PaymentDataItem
24
  */
25
+
26
+ /**
27
+ * Utility function for preparing payment data for the request.
28
+ *
29
+ * @param {Object} paymentData Arbitrary payment data provided by the payment method.
30
+ * @param {boolean} shouldSave Whether to save the payment method info to user account.
31
+ * @param {Object} activePaymentMethod The current active payment method.
32
+ *
33
+ * @return {PaymentDataItem[]} Returns the payment data as an array of
34
+ * PaymentDataItem objects.
35
+ */
36
+ const preparePaymentData = ( paymentData, shouldSave, activePaymentMethod ) => {
37
+ const apiData = Object.keys( paymentData ).map( ( property ) => {
38
+ const value = paymentData[ property ];
39
+ return { key: property, value };
40
+ }, [] );
41
+ const savePaymentMethodKey = `wc-${ activePaymentMethod }-new-payment-method`;
42
+ apiData.push( {
43
+ key: savePaymentMethodKey,
44
+ value: shouldSave,
45
+ } );
46
+ return apiData;
47
+ };
48
 
49
  /**
50
  * CheckoutProcessor component.
56
  const CheckoutProcessor = () => {
57
  const {
58
  hasError: checkoutHasError,
59
+ onCheckoutBeforeProcessing,
60
  dispatchActions,
61
  redirectUrl,
62
  isProcessing: checkoutIsProcessing,
66
  shouldCreateAccount,
67
  } = useCheckoutContext();
68
  const { hasValidationErrors } = useValidationContext();
69
+ const { shippingAddress, shippingErrorStatus } = useShippingDataContext();
70
+ const { billingData } = useBillingDataContext();
71
  const { cartNeedsPayment, receiveCart } = useStoreCart();
72
  const {
73
  activePaymentMethod,
 
74
  currentStatus: currentPaymentStatus,
75
  paymentMethodData,
76
  expressPaymentMethods,
82
  const currentShippingAddress = useRef( shippingAddress );
83
  const currentRedirectUrl = useRef( redirectUrl );
84
  const [ isProcessingOrder, setIsProcessingOrder ] = useState( false );
85
+ const expressPaymentMethodActive = Object.keys(
86
+ expressPaymentMethods
87
+ ).includes( activePaymentMethod );
88
 
89
  const paymentMethodId = useMemo( () => {
90
  const merged = { ...expressPaymentMethods, ...paymentMethods };
92
  }, [ activePaymentMethod, expressPaymentMethods, paymentMethods ] );
93
 
94
  const checkoutWillHaveError =
95
+ ( hasValidationErrors && ! expressPaymentMethodActive ) ||
96
  currentPaymentStatus.hasError ||
97
  shippingErrorStatus.hasError;
98
 
99
  // If express payment method is active, let's suppress notices
100
  useEffect( () => {
101
+ setIsSuppressed( expressPaymentMethodActive );
102
+ }, [ expressPaymentMethodActive, setIsSuppressed ] );
103
 
104
  useEffect( () => {
105
  if (
106
  checkoutWillHaveError !== checkoutHasError &&
107
  ( checkoutIsProcessing || checkoutIsBeforeProcessing ) &&
108
+ ! expressPaymentMethodActive
109
  ) {
110
  dispatchActions.setHasError( checkoutWillHaveError );
111
  }
114
  checkoutHasError,
115
  checkoutIsProcessing,
116
  checkoutIsBeforeProcessing,
117
+ expressPaymentMethodActive,
118
  dispatchActions,
119
  ] );
120
 
165
 
166
  useEffect( () => {
167
  let unsubscribeProcessing;
168
+ if ( ! expressPaymentMethodActive ) {
169
+ unsubscribeProcessing = onCheckoutBeforeProcessing(
170
  checkValidation,
171
  0
172
  );
173
  }
174
  return () => {
175
+ if ( ! expressPaymentMethodActive ) {
176
  unsubscribeProcessing();
177
  }
178
  };
179
  }, [
180
+ onCheckoutBeforeProcessing,
181
  checkValidation,
182
+ expressPaymentMethodActive,
183
  ] );
184
 
185
  const processOrder = useCallback( () => {
186
  setIsProcessingOrder( true );
187
  removeNotice( 'checkout' );
188
  let data = {
189
+ billing_address: currentBillingData.current,
190
+ shipping_address: currentShippingAddress.current,
 
 
 
 
191
  customer_note: orderNotes,
192
  should_create_account: shouldCreateAccount,
193
  };
213
  // Update nonce.
214
  triggerFetch.setNonce( fetchResponse.headers );
215
 
 
 
 
 
 
216
  // Handle response.
217
  fetchResponse.json().then( function ( response ) {
218
  if ( ! fetchResponse.ok ) {
219
  // We received an error response.
220
+ if ( response.body && response.body.message ) {
221
+ addErrorNotice( response.body.message, {
 
222
  id: 'checkout',
223
+ } );
224
+ } else {
225
+ addErrorNotice(
226
+ __(
227
+ 'Something went wrong. Please contact us to get assistance.',
228
+ 'woo-gutenberg-products-block'
229
+ ),
230
+ {
231
+ id: 'checkout',
232
+ }
233
+ );
234
+ }
235
  dispatchActions.setHasError();
236
  }
237
  dispatchActions.setAfterProcessing( response );
238
  setIsProcessingOrder( false );
239
  } );
240
  } )
241
+ .catch( ( error ) => {
242
+ error.json().then( function ( response ) {
243
+ // If updated cart state was returned, also update that.
 
 
 
 
 
 
 
 
 
 
244
  if ( response.data?.cart ) {
245
  receiveCart( response.data.cart );
246
  }
 
 
 
 
 
 
 
 
 
 
 
 
247
  dispatchActions.setHasError();
248
  dispatchActions.setAfterProcessing( response );
249
  setIsProcessingOrder( false );
assets/js/base/context/{providers/cart-checkout → cart-checkout}/index.js RENAMED
@@ -1,6 +1,6 @@
1
  export * from './payment-methods';
2
  export * from './shipping';
3
- export * from './customer';
4
  export * from './checkout';
5
  export * from './cart';
6
  export { useCheckoutContext } from './checkout-state';
1
  export * from './payment-methods';
2
  export * from './shipping';
3
+ export * from './billing';
4
  export * from './checkout';
5
  export * from './cart';
6
  export { useCheckoutContext } from './checkout-state';
assets/js/base/context/cart-checkout/payment-methods/actions.js ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ACTION_TYPES } from './constants';
5
+
6
+ /**
7
+ * @typedef {import('@woocommerce/type-defs/cart').CartBillingData} CartBillingData
8
+ */
9
+
10
+ const {
11
+ ERROR,
12
+ FAILED,
13
+ SUCCESS,
14
+ SET_REGISTERED_PAYMENT_METHODS,
15
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
16
+ SET_SHOULD_SAVE_PAYMENT_METHOD,
17
+ } = ACTION_TYPES;
18
+
19
+ /**
20
+ * Used to dispatch a status update only for the given type.
21
+ *
22
+ * @param {string} type
23
+ *
24
+ * @return {Object} The action object.
25
+ */
26
+ export const statusOnly = ( type ) => ( { type } );
27
+
28
+ /**
29
+ * Used to dispatch an error message along with setting current payment status
30
+ * to ERROR.
31
+ *
32
+ * @param {string} errorMessage Whatever error message accompanying the error
33
+ * condition.
34
+ *
35
+ * @return {Object} The action object.
36
+ */
37
+ export const error = ( errorMessage ) => ( {
38
+ type: ERROR,
39
+ errorMessage,
40
+ } );
41
+
42
+ /**
43
+ * Used to dispatch a payment failed status update.
44
+ *
45
+ * @param {Object} action Incoming data for the
46
+ * action.
47
+ * @param {string} action.errorMessage Any message accompanying
48
+ * the failed payment.
49
+ * @param {Object} action.paymentMethodData Arbitrary extra
50
+ * information about the
51
+ * payment method in use
52
+ * (varies per payment
53
+ * method).
54
+ *
55
+ * @return {Object} An action object.
56
+ */
57
+ export const failed = ( { errorMessage, paymentMethodData } ) => ( {
58
+ type: FAILED,
59
+ errorMessage,
60
+ paymentMethodData,
61
+ } );
62
+
63
+ /**
64
+ * Used to dispatch a payment success status update.
65
+ *
66
+ * @param {Object} action Incoming data for the
67
+ * action.
68
+ * @param {Object} action.paymentMethodData Arbitrary extra
69
+ * information about the
70
+ * payment method in use
71
+ * (varies per payment
72
+ * method).
73
+ *
74
+ * @return {Object} An action object.
75
+ */
76
+ export const success = ( { paymentMethodData } ) => ( {
77
+ type: SUCCESS,
78
+ paymentMethodData,
79
+ } );
80
+
81
+ /**
82
+ * Used to dispatch an action for updating a registered payment method in the
83
+ * state.
84
+ *
85
+ * @param {Object} paymentMethods Payment methods to register.
86
+ * @return {Object} An action object.
87
+ */
88
+ export const setRegisteredPaymentMethods = ( paymentMethods ) => ( {
89
+ type: SET_REGISTERED_PAYMENT_METHODS,
90
+ paymentMethods,
91
+ } );
92
+
93
+ /**
94
+ * Used to dispatch an action for updating a registered express payment
95
+ * method in the state.
96
+ *
97
+ * @param {Object} paymentMethods Payment methods to register.
98
+ * @return {Object} An action object.
99
+ */
100
+ export const setRegisteredExpressPaymentMethods = ( paymentMethods ) => ( {
101
+ type: SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
102
+ paymentMethods,
103
+ } );
104
+
105
+ /**
106
+ * Set a flag indicating that the payment method info (e.g. a payment card)
107
+ * should be saved to user account after order completion.
108
+ *
109
+ * @param {boolean} shouldSavePaymentMethod
110
+ * @return {Object} An action object.
111
+ */
112
+ export const setShouldSavePaymentMethod = ( shouldSavePaymentMethod ) => ( {
113
+ type: SET_SHOULD_SAVE_PAYMENT_METHOD,
114
+ shouldSavePaymentMethod,
115
+ } );
assets/js/base/context/cart-checkout/payment-methods/constants.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
3
+ */
4
+
5
+ export const STATUS = {
6
+ PRISTINE: 'pristine',
7
+ STARTED: 'started',
8
+ PROCESSING: 'processing',
9
+ ERROR: 'has_error',
10
+ FAILED: 'failed',
11
+ SUCCESS: 'success',
12
+ COMPLETE: 'complete',
13
+ };
14
+
15
+ export const ACTION_TYPES = {
16
+ ...STATUS,
17
+ SET_REGISTERED_PAYMENT_METHODS: 'set_registered_payment_methods',
18
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
19
+ 'set_registered_express_payment_methods',
20
+ SET_SHOULD_SAVE_PAYMENT_METHOD: 'set_should_save_payment_method',
21
+ };
22
+
23
+ /**
24
+ * @todo do typedefs for the payment event state.
25
+ */
26
+
27
+ // Note - if fields are added/shape is changed, you may want to update
28
+ // PRISTINE reducer clause to preserve your new field.
29
+ export const DEFAULT_PAYMENT_DATA = {
30
+ currentStatus: STATUS.PRISTINE,
31
+ shouldSavePaymentMethod: false,
32
+ paymentMethodData: {
33
+ payment_method: '',
34
+ // arbitrary data the payment method
35
+ // wants to pass along for payment
36
+ // processing server side.
37
+ },
38
+ hasSavedToken: false,
39
+ errorMessage: '',
40
+ paymentMethods: {},
41
+ expressPaymentMethods: {},
42
+ };
43
+
44
+ /**
45
+ * @type {PaymentMethodDataContext}
46
+ */
47
+ export const DEFAULT_PAYMENT_METHOD_DATA = {
48
+ setPaymentStatus: () => ( {
49
+ started: () => void null,
50
+ processing: () => void null,
51
+ completed: () => void null,
52
+ error: ( errorMessage ) => void errorMessage,
53
+ failed: ( errorMessage, paymentMethodData ) =>
54
+ void [ errorMessage, paymentMethodData ],
55
+ success: ( paymentMethodData, billingData ) =>
56
+ void [ paymentMethodData, billingData ],
57
+ } ),
58
+ currentStatus: {
59
+ isPristine: true,
60
+ isStarted: false,
61
+ isProcessing: false,
62
+ isFinished: false,
63
+ hasError: false,
64
+ hasFailed: false,
65
+ isSuccessful: false,
66
+ },
67
+ paymentStatuses: STATUS,
68
+ paymentMethodData: {},
69
+ errorMessage: '',
70
+ activePaymentMethod: '',
71
+ setActivePaymentMethod: () => void null,
72
+ customerPaymentMethods: {},
73
+ paymentMethods: {},
74
+ expressPaymentMethods: {},
75
+ paymentMethodsInitialized: false,
76
+ expressPaymentMethodsInitialized: false,
77
+ onPaymentProcessing: () => void null,
78
+ onPaymentSuccess: () => void null,
79
+ onPaymentFail: () => void null,
80
+ };
assets/js/base/context/cart-checkout/payment-methods/event-emit.js ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ reducer,
6
+ emitEvent,
7
+ emitEventWithAbort,
8
+ emitterCallback,
9
+ } from '../../shared/event-emit';
10
+
11
+ const EMIT_TYPES = {
12
+ PAYMENT_PROCESSING: 'payment_processing',
13
+ };
14
+
15
+ /**
16
+ * Receives a reducer dispatcher and returns an object with the
17
+ * various event emitters for the payment processing events.
18
+ *
19
+ * Calling the event registration function with the callback will register it
20
+ * for the event emitter and will return a dispatcher for removing the
21
+ * registered callback (useful for implementation in `useEffect`).
22
+ *
23
+ * @param {Function} dispatcher The emitter reducer dispatcher.
24
+ *
25
+ * @return {Object} An object with the various payment event emitter
26
+ * registration functions
27
+ */
28
+ const emitterSubscribers = ( dispatcher ) => ( {
29
+ onPaymentProcessing: emitterCallback(
30
+ EMIT_TYPES.PAYMENT_PROCESSING,
31
+ dispatcher
32
+ ),
33
+ } );
34
+
35
+ export {
36
+ EMIT_TYPES,
37
+ emitterSubscribers,
38
+ reducer,
39
+ emitEvent,
40
+ emitEventWithAbort,
41
+ };
assets/js/base/context/{providers/cart-checkout/payment-methods/index.ts → cart-checkout/payment-methods/index.js} RENAMED
File without changes
assets/js/base/context/cart-checkout/payment-methods/payment-method-data-context.js ADDED
@@ -0,0 +1,461 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import {
5
+ createContext,
6
+ useContext,
7
+ useState,
8
+ useReducer,
9
+ useCallback,
10
+ useEffect,
11
+ useRef,
12
+ useMemo,
13
+ } from '@wordpress/element';
14
+ import { getSetting } from '@woocommerce/settings';
15
+ import { useStoreNotices, useEmitResponse } from '@woocommerce/base-hooks';
16
+ import { useEditorContext } from '@woocommerce/base-context';
17
+
18
+ /**
19
+ * Internal dependencies
20
+ */
21
+ import {
22
+ STATUS,
23
+ DEFAULT_PAYMENT_DATA,
24
+ DEFAULT_PAYMENT_METHOD_DATA,
25
+ } from './constants';
26
+ import reducer from './reducer';
27
+ import {
28
+ statusOnly,
29
+ error,
30
+ failed,
31
+ success,
32
+ setRegisteredPaymentMethods,
33
+ setRegisteredExpressPaymentMethods,
34
+ setShouldSavePaymentMethod,
35
+ } from './actions';
36
+ import {
37
+ usePaymentMethods,
38
+ useExpressPaymentMethods,
39
+ } from './use-payment-method-registration';
40
+ import { useBillingDataContext } from '../billing';
41
+ import { useCheckoutContext } from '../checkout-state';
42
+ import { useShippingDataContext } from '../shipping';
43
+ import {
44
+ EMIT_TYPES,
45
+ emitterSubscribers,
46
+ emitEventWithAbort,
47
+ reducer as emitReducer,
48
+ } from './event-emit';
49
+ import { useValidationContext } from '../../shared/validation';
50
+
51
+ /**
52
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentMethodDataContext} PaymentMethodDataContext
53
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatch} PaymentStatusDispatch
54
+ * @typedef {import('@woocommerce/type-defs/contexts').PaymentStatusDispatchers} PaymentStatusDispatchers
55
+ * @typedef {import('@woocommerce/type-defs/billing').BillingData} BillingData
56
+ * @typedef {import('@woocommerce/type-defs/contexts').CustomerPaymentMethod} CustomerPaymentMethod
57
+ * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataResponse} ShippingDataResponse
58
+ */
59
+
60
+ const {
61
+ STARTED,
62
+ PROCESSING,
63
+ COMPLETE,
64
+ PRISTINE,
65
+ ERROR,
66
+ FAILED,
67
+ SUCCESS,
68
+ } = STATUS;
69
+
70
+ const PaymentMethodDataContext = createContext( DEFAULT_PAYMENT_METHOD_DATA );
71
+
72
+ /**
73
+ * @return {PaymentMethodDataContext} The data and functions exposed by the
74
+ * payment method context provider.
75
+ */
76
+ export const usePaymentMethodDataContext = () => {
77
+ return useContext( PaymentMethodDataContext );
78
+ };
79
+
80
+ /**
81
+ * Gets the payment methods saved for the current user after filtering out
82
+ * disabled ones.
83
+ *
84
+ * @param {Object[]} availablePaymentMethods List of available payment methods.
85
+ * @return {Object} Object containing the payment methods saved for a specific
86
+ * user which are available.
87
+ */
88
+ const getCustomerPaymentMethods = ( availablePaymentMethods = [] ) => {
89
+ const customerPaymentMethods = getSetting( 'customerPaymentMethods', {} );
90
+ const paymentMethodKeys = Object.keys( customerPaymentMethods );
91
+ if ( paymentMethodKeys.length === 0 ) {
92
+ return {};
93
+ }
94
+ const enabledCustomerPaymentMethods = {};
95
+ paymentMethodKeys.forEach( ( type ) => {
96
+ enabledCustomerPaymentMethods[ type ] = customerPaymentMethods[
97
+ type
98
+ ].filter( ( paymentMethod ) => {
99
+ return Object.keys( availablePaymentMethods ).includes(
100
+ paymentMethod.method.gateway
101
+ );
102
+ } );
103
+ } );
104
+ return enabledCustomerPaymentMethods;
105
+ };
106
+
107
+ /**
108
+ * PaymentMethodDataProvider is automatically included in the
109
+ * CheckoutDataProvider.
110
+ *
111
+ * This provides the api interface (via the context hook) for payment method
112
+ * status and data.
113
+ *
114
+ * @param {Object} props Incoming props for provider
115
+ * @param {Object} props.children The wrapped components in this
116
+ * provider.
117
+ */
118
+ export const PaymentMethodDataProvider = ( { children } ) => {
119
+ const { setBillingData } = useBillingDataContext();
120
+ const {
121
+ isProcessing: checkoutIsProcessing,
122
+ isIdle: checkoutIsIdle,
123
+ isCalculating: checkoutIsCalculating,
124
+ hasError: checkoutHasError,
125
+ } = useCheckoutContext();
126
+ const {
127
+ isSuccessResponse,
128
+ isErrorResponse,
129
+ isFailResponse,
130
+ noticeContexts,
131
+ } = useEmitResponse();
132
+ const [ activePaymentMethod, setActive ] = useState( '' );
133
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
134
+ const currentObservers = useRef( observers );
135
+
136
+ const { isEditor, previewData } = useEditorContext();
137
+ const [ paymentData, dispatch ] = useReducer(
138
+ reducer,
139
+ DEFAULT_PAYMENT_DATA
140
+ );
141
+ const setActivePaymentMethod = useCallback(
142
+ ( paymentMethodSlug ) => {
143
+ setActive( paymentMethodSlug );
144
+ dispatch( statusOnly( PRISTINE ) );
145
+ },
146
+ [ setActive, dispatch ]
147
+ );
148
+ const paymentMethodsDispatcher = useCallback(
149
+ ( paymentMethods ) => {
150
+ dispatch( setRegisteredPaymentMethods( paymentMethods ) );
151
+ },
152
+ [ dispatch ]
153
+ );
154
+ const expressPaymentMethodsDispatcher = useCallback(
155
+ ( paymentMethods ) => {
156
+ dispatch( setRegisteredExpressPaymentMethods( paymentMethods ) );
157
+ },
158
+ [ dispatch ]
159
+ );
160
+ const paymentMethodsInitialized = usePaymentMethods(
161
+ paymentMethodsDispatcher
162
+ );
163
+ const expressPaymentMethodsInitialized = useExpressPaymentMethods(
164
+ expressPaymentMethodsDispatcher
165
+ );
166
+ const { setValidationErrors } = useValidationContext();
167
+ const { addErrorNotice, removeNotice } = useStoreNotices();
168
+ const { setShippingAddress } = useShippingDataContext();
169
+ const setShouldSavePayment = useCallback(
170
+ ( shouldSave ) => {
171
+ dispatch( setShouldSavePaymentMethod( shouldSave ) );
172
+ },
173
+ [ dispatch ]
174
+ );
175
+
176
+ const customerPaymentMethods = useMemo( () => {
177
+ if ( isEditor && previewData.previewSavedPaymentMethods ) {
178
+ return previewData.previewSavedPaymentMethods;
179
+ }
180
+ if (
181
+ ! paymentMethodsInitialized ||
182
+ paymentData.paymentMethods.length === 0
183
+ ) {
184
+ return {};
185
+ }
186
+ return getCustomerPaymentMethods( paymentData.paymentMethods );
187
+ }, [
188
+ isEditor,
189
+ previewData.previewSavedPaymentMethods,
190
+ paymentMethodsInitialized,
191
+ paymentData.paymentMethods,
192
+ ] );
193
+
194
+ const setExpressPaymentError = useCallback(
195
+ ( message ) => {
196
+ if ( message ) {
197
+ addErrorNotice( message, {
198
+ context: noticeContexts.EXPRESS_PAYMENTS,
199
+ id: 'wc-express-payment-error',
200
+ } );
201
+ } else {
202
+ removeNotice(
203
+ 'wc-express-payment-error',
204
+ noticeContexts.EXPRESS_PAYMENTS
205
+ );
206
+ }
207
+ },
208
+ [ addErrorNotice, noticeContexts.EXPRESS_PAYMENTS, removeNotice ]
209
+ );
210
+ // ensure observers are always current.
211
+ useEffect( () => {
212
+ currentObservers.current = observers;
213
+ }, [ observers ] );
214
+ const onPaymentProcessing = useMemo(
215
+ () => emitterSubscribers( subscriber ).onPaymentProcessing,
216
+ [ subscriber ]
217
+ );
218
+
219
+ const currentStatus = useMemo(
220
+ () => ( {
221
+ isPristine: paymentData.currentStatus === PRISTINE,
222
+ isStarted: paymentData.currentStatus === STARTED,
223
+ isProcessing: paymentData.currentStatus === PROCESSING,
224
+ isFinished: [ ERROR, FAILED, SUCCESS ].includes(
225
+ paymentData.currentStatus
226
+ ),
227
+ hasError: paymentData.currentStatus === ERROR,
228
+ hasFailed: paymentData.currentStatus === FAILED,
229
+ isSuccessful: paymentData.currentStatus === SUCCESS,
230
+ } ),
231
+ [ paymentData.currentStatus ]
232
+ );
233
+
234
+ /**
235
+ * @type {PaymentStatusDispatch}
236
+ */
237
+ const setPaymentStatus = useCallback(
238
+ () => ( {
239
+ started: () => dispatch( statusOnly( STARTED ) ),
240
+ processing: () => dispatch( statusOnly( PROCESSING ) ),
241
+ completed: () => dispatch( statusOnly( COMPLETE ) ),
242
+ /**
243
+ * @param {string} errorMessage An error message
244
+ */
245
+ error: ( errorMessage ) => dispatch( error( errorMessage ) ),
246
+ /**
247
+ * @param {string} errorMessage An error message
248
+ * @param {Object} paymentMethodData Arbitrary payment method data to
249
+ * accompany the checkout submission.
250
+ * @param {BillingData|null} [billingData] The billing data accompanying the
251
+ * payment method.
252
+ */
253
+ failed: ( errorMessage, paymentMethodData, billingData = null ) => {
254
+ if ( billingData ) {
255
+ setBillingData( billingData );
256
+ }
257
+ dispatch(
258
+ failed( {
259
+ errorMessage,
260
+ paymentMethodData,
261
+ } )
262
+ );
263
+ },
264
+ /**
265
+ * @param {Object} [paymentMethodData] Arbitrary payment method data to
266
+ * accompany the checkout.
267
+ * @param {BillingData|null} [billingData] The billing data accompanying the
268
+ * payment method.
269
+ * @param {ShippingDataResponse|null} [shippingData] The shipping data accompanying the
270
+ * payment method.
271
+ */
272
+ success: (
273
+ paymentMethodData = {},
274
+ billingData = null,
275
+ shippingData = null
276
+ ) => {
277
+ if ( billingData ) {
278
+ setBillingData( billingData );
279
+ }
280
+ if ( shippingData !== null && shippingData?.address ) {
281
+ setShippingAddress( shippingData.address );
282
+ }
283
+ dispatch(
284
+ success( {
285
+ paymentMethodData,
286
+ } )
287
+ );
288
+ },
289
+ } ),
290
+ [ dispatch, setBillingData, setShippingAddress ]
291
+ );
292
+
293
+ // flip payment to processing if checkout processing is complete, there are
294
+ // no errors, and payment status is started.
295
+ useEffect( () => {
296
+ if (
297
+ checkoutIsProcessing &&
298
+ ! checkoutHasError &&
299
+ ! checkoutIsCalculating &&
300
+ ! currentStatus.isFinished
301
+ ) {
302
+ setPaymentStatus().processing();
303
+ }
304
+ }, [
305
+ checkoutIsProcessing,
306
+ checkoutHasError,
307
+ checkoutIsCalculating,
308
+ currentStatus.isFinished,
309
+ setPaymentStatus,
310
+ ] );
311
+
312
+ // When checkout is returned to idle, set payment status to pristine
313
+ // but only if payment status is already not finished.
314
+ useEffect( () => {
315
+ if ( checkoutIsIdle && ! currentStatus.isSuccessful ) {
316
+ dispatch( statusOnly( PRISTINE ) );
317
+ }
318
+ }, [ checkoutIsIdle, currentStatus.isSuccessful ] );
319
+
320
+ // if checkout has an error and payment is not being made with a saved token
321
+ // and payment status is success, then let's sync payment status back to
322
+ // pristine.
323
+ useEffect( () => {
324
+ if (
325
+ checkoutHasError &&
326
+ currentStatus.isSuccessful &&
327
+ ! paymentData.hasSavedToken
328
+ ) {
329
+ dispatch( statusOnly( PRISTINE ) );
330
+ }
331
+ }, [
332
+ checkoutHasError,
333
+ currentStatus.isSuccessful,
334
+ paymentData.hasSavedToken,
335
+ ] );
336
+
337
+ // Set active (selected) payment method as needed.
338
+ useEffect( () => {
339
+ const paymentMethodKeys = Object.keys( paymentData.paymentMethods );
340
+ const allPaymentMethodKeys = [
341
+ ...paymentMethodKeys,
342
+ ...Object.keys( paymentData.expressPaymentMethods ),
343
+ ];
344
+ if ( ! paymentMethodsInitialized || ! paymentMethodKeys.length ) {
345
+ return;
346
+ }
347
+
348
+ setActive( ( currentActivePaymentMethod ) => {
349
+ // If there's no active payment method, or the active payment method has
350
+ // been removed (e.g. COD vs shipping methods), set one as active.
351
+ // Note: It's possible that the active payment method might be an
352
+ // express payment method. So registered express payment methods are
353
+ // included in the check here.
354
+ if (
355
+ ! currentActivePaymentMethod ||
356
+ ! allPaymentMethodKeys.includes( currentActivePaymentMethod )
357
+ ) {
358
+ dispatch( statusOnly( PRISTINE ) );
359
+ return Object.keys( paymentData.paymentMethods )[ 0 ];
360
+ }
361
+ return currentActivePaymentMethod;
362
+ } );
363
+ }, [
364
+ paymentMethodsInitialized,
365
+ paymentData.paymentMethods,
366
+ paymentData.expressPaymentMethods,
367
+ setActive,
368
+ ] );
369
+
370
+ // emit events.
371
+ useEffect( () => {
372
+ // Note: the nature of this event emitter is that it will bail on any
373
+ // observer that returns a response that !== true. However, this still
374
+ // allows for other observers that return true for continuing through
375
+ // to the next observer (or bailing if there's a problem).
376
+ if ( currentStatus.isProcessing ) {
377
+ removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
378
+ emitEventWithAbort(
379
+ currentObservers.current,
380
+ EMIT_TYPES.PAYMENT_PROCESSING,
381
+ {}
382
+ ).then( ( response ) => {
383
+ if ( isSuccessResponse( response ) ) {
384
+ setPaymentStatus().success(
385
+ response?.meta?.paymentMethodData,
386
+ response?.meta?.billingData,
387
+ response?.meta?.shippingData
388
+ );
389
+ } else if ( isFailResponse( response ) ) {
390
+ if ( response.message && response.message.length ) {
391
+ addErrorNotice( response.message, {
392
+ id: 'wc-payment-error',
393
+ isDismissible: false,
394
+ context:
395
+ response?.messageContext ||
396
+ noticeContexts.PAYMENTS,
397
+ } );
398
+ }
399
+ setPaymentStatus().failed(
400
+ response?.message,
401
+ response?.meta?.paymentMethodData,
402
+ response?.meta?.billingData
403
+ );
404
+ } else if ( isErrorResponse( response ) ) {
405
+ if ( response.message && response.message.length ) {
406
+ addErrorNotice( response.message, {
407
+ id: 'wc-payment-error',
408
+ isDismissible: false,
409
+ context:
410
+ response?.messageContext ||
411
+ noticeContexts.PAYMENTS,
412
+ } );
413
+ }
414
+ setPaymentStatus().error( response.message );
415
+ setValidationErrors( response?.validationErrors );
416
+ } else {
417
+ // otherwise there are no payment methods doing anything so
418
+ // just consider success
419
+ setPaymentStatus().success();
420
+ }
421
+ } );
422
+ }
423
+ }, [
424
+ currentStatus.isProcessing,
425
+ setValidationErrors,
426
+ setPaymentStatus,
427
+ removeNotice,
428
+ noticeContexts.PAYMENTS,
429
+ isSuccessResponse,
430
+ isFailResponse,
431
+ isErrorResponse,
432
+ addErrorNotice,
433
+ ] );
434
+
435
+ /**
436
+ * @type {PaymentMethodDataContext}
437
+ */
438
+ const paymentContextData = {
439
+ setPaymentStatus,
440
+ currentStatus,
441
+ paymentStatuses: STATUS,
442
+ paymentMethodData: paymentData.paymentMethodData,
443
+ errorMessage: paymentData.errorMessage,
444
+ activePaymentMethod,
445
+ setActivePaymentMethod,
446
+ onPaymentProcessing,
447
+ customerPaymentMethods,
448
+ paymentMethods: paymentData.paymentMethods,
449
+ expressPaymentMethods: paymentData.expressPaymentMethods,
450
+ paymentMethodsInitialized,
451
+ expressPaymentMethodsInitialized,
452
+ setExpressPaymentError,
453
+ shouldSavePayment: paymentData.shouldSavePaymentMethod,
454
+ setShouldSavePayment,
455
+ };
456
+ return (
457
+ <PaymentMethodDataContext.Provider value={ paymentContextData }>
458
+ { children }
459
+ </PaymentMethodDataContext.Provider>
460
+ );
461
+ };
assets/js/base/context/cart-checkout/payment-methods/reducer.js ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { ACTION_TYPES, DEFAULT_PAYMENT_DATA } from './constants';
5
+ const {
6
+ STARTED,
7
+ ERROR,
8
+ FAILED,
9
+ SUCCESS,
10
+ PROCESSING,
11
+ PRISTINE,
12
+ COMPLETE,
13
+ SET_REGISTERED_PAYMENT_METHODS,
14
+ SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
15
+ SET_SHOULD_SAVE_PAYMENT_METHOD,
16
+ } = ACTION_TYPES;
17
+
18
+ const hasSavedPaymentToken = ( paymentMethodData ) => {
19
+ return !! (
20
+ typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
21
+ );
22
+ };
23
+
24
+ /**
25
+ * Reducer for payment data state
26
+ *
27
+ * @param {Object} state Current state.
28
+ * @param {Object} action Current action.
29
+ * @param {string} action.type Action type.
30
+ * @param {Object} action.paymentMethodData Payment method data payload.
31
+ * @param {boolean} action.shouldSavePaymentMethod Should save payment method flag.
32
+ * @param {string} action.errorMessage Error message to store in state.
33
+ * @param {Object} action.paymentMethods Registered payment methods.
34
+ */
35
+ const reducer = (
36
+ state = DEFAULT_PAYMENT_DATA,
37
+ {
38
+ type,
39
+ paymentMethodData,
40
+ shouldSavePaymentMethod,
41
+ errorMessage,
42
+ paymentMethods,
43
+ }
44
+ ) => {
45
+ switch ( type ) {
46
+ case STARTED:
47
+ return state.currentStatus !== STARTED
48
+ ? {
49
+ ...state,
50
+ currentStatus: STARTED,
51
+ }
52
+ : state;
53
+ case ERROR:
54
+ return state.currentStatus !== ERROR
55
+ ? {
56
+ ...state,
57
+ currentStatus: ERROR,
58
+ errorMessage: errorMessage || state.errorMessage,
59
+ }
60
+ : state;
61
+ case FAILED:
62
+ return state.currentStatus !== FAILED
63
+ ? {
64
+ ...state,
65
+ currentStatus: FAILED,
66
+ paymentMethodData:
67
+ paymentMethodData || state.paymentMethodData,
68
+ errorMessage: errorMessage || state.errorMessage,
69
+ }
70
+ : state;
71
+ case SUCCESS:
72
+ return state.currentStatus !== SUCCESS
73
+ ? {
74
+ ...state,
75
+ currentStatus: SUCCESS,
76
+ paymentMethodData:
77
+ paymentMethodData || state.paymentMethodData,
78
+ hasSavedToken: hasSavedPaymentToken(
79
+ paymentMethodData
80
+ ),
81
+ }
82
+ : state;
83
+ case PROCESSING:
84
+ return state.currentStatus !== PROCESSING
85
+ ? {
86
+ ...state,
87
+ currentStatus: PROCESSING,
88
+ errorMessage: '',
89
+ }
90
+ : state;
91
+ case COMPLETE:
92
+ return state.currentStatus !== COMPLETE
93
+ ? {
94
+ ...state,
95
+ currentStatus: COMPLETE,
96
+ }
97
+ : state;
98
+
99
+ case PRISTINE:
100
+ return {
101
+ ...DEFAULT_PAYMENT_DATA,
102
+ currentStatus: PRISTINE,
103
+ // keep payment method registration state
104
+ paymentMethods: {
105
+ ...state.paymentMethods,
106
+ },
107
+ expressPaymentMethods: {
108
+ ...state.expressPaymentMethods,
109
+ },
110
+ shouldSavePaymentMethod: state.shouldSavePaymentMethod,
111
+ };
112
+ case SET_REGISTERED_PAYMENT_METHODS:
113
+ return {
114
+ ...state,
115
+ paymentMethods,
116
+ };
117
+ case SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
118
+ return {
119
+ ...state,
120
+ expressPaymentMethods: {
121
+ ...state.expressPaymentMethods,
122
+ ...paymentMethods,
123
+ },
124
+ };
125
+ case SET_SHOULD_SAVE_PAYMENT_METHOD:
126
+ return {
127
+ ...state,
128
+ shouldSavePaymentMethod,
129
+ };
130
+ }
131
+ return state;
132
+ };
133
+
134
+ export default reducer;
assets/js/base/context/{providers/cart-checkout → cart-checkout}/payment-methods/test/payment-method-data-context.js RENAMED
@@ -11,8 +11,10 @@ import {
11
  __experimentalDeRegisterPaymentMethod,
12
  __experimentalDeRegisterExpressPaymentMethod,
13
  } from '@woocommerce/blocks-registry';
14
- import { default as fetchMock } from 'jest-fetch-mock';
15
-
 
 
16
  /**
17
  * Internal dependencies
18
  */
@@ -20,15 +22,10 @@ import {
20
  usePaymentMethodDataContext,
21
  PaymentMethodDataProvider,
22
  } from '../payment-method-data-context';
23
- import {
24
- CheckoutExpressPayment,
25
- SavedPaymentMethodOptions,
26
- } from '../../../../../../blocks/cart-checkout/payment-methods';
27
- import { defaultCartState } from '../../../../../../data/default-states';
28
 
29
  jest.mock( '@woocommerce/settings', () => {
30
  const originalModule = jest.requireActual( '@woocommerce/settings' );
31
-
32
  return {
33
  // @ts-ignore We know @woocommerce/settings is an object.
34
  ...originalModule,
@@ -56,60 +53,60 @@ jest.mock( '@woocommerce/settings', () => {
56
 
57
  const registerMockPaymentMethods = () => {
58
  [ 'cheque', 'bacs' ].forEach( ( name ) => {
59
- registerPaymentMethod( {
60
- name,
61
- label: name,
62
- content: <div>A payment method</div>,
63
- edit: <div>A payment method</div>,
64
- icons: null,
65
- canMakePayment: () => true,
66
- supports: {
67
- features: [ 'products' ],
68
- },
69
- ariaLabel: name,
70
- } );
71
  } );
72
  [ 'stripe' ].forEach( ( name ) => {
73
- registerPaymentMethod( {
74
- name,
75
- label: name,
76
- content: <div>A payment method</div>,
77
- edit: <div>A payment method</div>,
78
- icons: null,
79
- canMakePayment: () => true,
80
- supports: {
81
- showSavedCards: true,
82
- showSaveOption: true,
83
- features: [ 'products' ],
84
- },
85
- ariaLabel: name,
86
- } );
 
87
  } );
88
  [ 'express-payment' ].forEach( ( name ) => {
89
- const Content = ( {
90
- onClose = () => void null,
91
- onClick = () => void null,
92
- } ) => {
93
- return (
94
- <>
95
- <button onClick={ onClick }>
96
- { name + ' express payment method' }
97
- </button>
98
- <button onClick={ onClose }>
99
- { name + ' express payment method close' }
100
- </button>
101
- </>
102
- );
103
- };
104
- registerExpressPaymentMethod( {
105
- name,
106
- content: <Content />,
107
- edit: <div>An express payment method</div>,
108
- canMakePayment: () => true,
109
- paymentMethodId: name,
110
- supports: {
111
- features: [ 'products' ],
112
- },
113
  } );
114
  } );
115
  };
@@ -130,11 +127,10 @@ describe( 'Testing Payment Method Data Context Provider', () => {
130
  if ( req.url.match( /wc\/store\/cart/ ) ) {
131
  return Promise.resolve( JSON.stringify( previewCart ) );
132
  }
133
- return Promise.resolve( '' );
134
  } );
135
  // need to clear the store resolution state between tests.
136
  await dispatch( storeKey ).invalidateResolutionForStore();
137
- await dispatch( storeKey ).receiveCart( defaultCartState.cartData );
138
  } );
139
  afterEach( async () => {
140
  resetMockPaymentMethods();
@@ -185,8 +181,6 @@ describe( 'Testing Payment Method Data Context Provider', () => {
185
  );
186
  expect( activePaymentMethod ).not.toBeNull();
187
  } );
188
- // ["`select` control in `@wordpress/data-controls` is deprecated. Please use built-in `resolveSelect` control in `@wordpress/data` instead."]
189
- expect( console ).toHaveWarned();
190
  } );
191
 
192
  it( 'resets saved payment method data after starting and closing an express payment method', async () => {
11
  __experimentalDeRegisterPaymentMethod,
12
  __experimentalDeRegisterExpressPaymentMethod,
13
  } from '@woocommerce/blocks-registry';
14
+ import {
15
+ CheckoutExpressPayment,
16
+ SavedPaymentMethodOptions,
17
+ } from '@woocommerce/base-components/payment-methods';
18
  /**
19
  * Internal dependencies
20
  */
22
  usePaymentMethodDataContext,
23
  PaymentMethodDataProvider,
24
  } from '../payment-method-data-context';
25
+ import { defaultCartState } from '../../../../../data/default-states';
 
 
 
 
26
 
27
  jest.mock( '@woocommerce/settings', () => {
28
  const originalModule = jest.requireActual( '@woocommerce/settings' );
 
29
  return {
30
  // @ts-ignore We know @woocommerce/settings is an object.
31
  ...originalModule,
53
 
54
  const registerMockPaymentMethods = () => {
55
  [ 'cheque', 'bacs' ].forEach( ( name ) => {
56
+ registerPaymentMethod(
57
+ ( Config ) =>
58
+ new Config( {
59
+ name,
60
+ label: name,
61
+ content: <div>A payment method</div>,
62
+ edit: <div>A payment method</div>,
63
+ icons: null,
64
+ canMakePayment: () => true,
65
+ ariaLabel: name,
66
+ } )
67
+ );
68
  } );
69
  [ 'stripe' ].forEach( ( name ) => {
70
+ registerPaymentMethod(
71
+ ( Config ) =>
72
+ new Config( {
73
+ name,
74
+ label: name,
75
+ content: <div>A payment method</div>,
76
+ edit: <div>A payment method</div>,
77
+ icons: null,
78
+ canMakePayment: () => true,
79
+ supports: {
80
+ savePaymentInfo: true,
81
+ },
82
+ ariaLabel: name,
83
+ } )
84
+ );
85
  } );
86
  [ 'express-payment' ].forEach( ( name ) => {
87
+ registerExpressPaymentMethod( ( Config ) => {
88
+ const Content = ( {
89
+ onClose = () => void null,
90
+ onClick = () => void null,
91
+ } ) => {
92
+ return (
93
+ <>
94
+ <button onClick={ onClick }>
95
+ { name + ' express payment method' }
96
+ </button>
97
+ <button onClick={ onClose }>
98
+ { name + ' express payment method close' }
99
+ </button>
100
+ </>
101
+ );
102
+ };
103
+ return new Config( {
104
+ name,
105
+ content: <Content />,
106
+ edit: <div>An express payment method</div>,
107
+ canMakePayment: () => true,
108
+ paymentMethodId: name,
109
+ } );
 
110
  } );
111
  } );
112
  };
127
  if ( req.url.match( /wc\/store\/cart/ ) ) {
128
  return Promise.resolve( JSON.stringify( previewCart ) );
129
  }
 
130
  } );
131
  // need to clear the store resolution state between tests.
132
  await dispatch( storeKey ).invalidateResolutionForStore();
133
+ await dispatch( storeKey ).receiveCart( defaultCartState );
134
  } );
135
  afterEach( async () => {
136
  resetMockPaymentMethods();
181
  );
182
  expect( activePaymentMethod ).not.toBeNull();
183
  } );
 
 
184
  } );
185
 
186
  it( 'resets saved payment method data after starting and closing an express payment method', async () => {
assets/js/base/context/{providers/cart-checkout/payment-methods/use-payment-method-registration.ts → cart-checkout/payment-methods/use-payment-method-registration.js} RENAMED
@@ -7,62 +7,57 @@ import {
7
  getExpressPaymentMethods,
8
  } from '@woocommerce/blocks-registry';
9
  import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
10
- import { useShallowEqual } from '@woocommerce/base-hooks';
11
- import { CURRENT_USER_IS_ADMIN, getSetting } from '@woocommerce/settings';
12
-
13
- /**
14
- * Internal dependencies
15
- */
16
- import { useEditorContext } from '../../editor-context';
17
- import { useShippingDataContext } from '../shipping';
18
- import { useCustomerDataContext } from '../customer';
19
- import type {
20
- PaymentMethodsDispatcherType,
21
- PaymentMethods,
22
- ExpressPaymentMethods,
23
- PaymentMethodConfig,
24
- ExpressPaymentMethodConfig,
25
- } from './types';
26
- import { useStoreCart } from '../../../hooks/cart/use-store-cart';
27
- import { useStoreNotices } from '../../../hooks/use-store-notices';
28
- import { useEmitResponse } from '../../../hooks/use-emit-response';
29
 
30
  /**
31
  * This hook handles initializing registered payment methods and exposing all
32
  * registered payment methods that can be used in the current environment (via
33
  * the payment method's `canMakePayment` property).
34
  *
35
- * @param {function(Object):undefined} dispatcher A dispatcher for setting registered payment methods to an external state.
36
- * @param {Object} registeredPaymentMethods Registered payment methods to process.
37
- * @param {Array} paymentMethodsSortOrder Array of payment method names to sort by. This should match keys of registeredPaymentMethods.
38
- * @param {string} noticeContext Id of the context to append notices to.
 
 
 
 
 
 
39
  *
40
- * @return {boolean} Whether the payment methods have been initialized or not. True when all payment methods have been initialized.
 
41
  */
42
  const usePaymentMethodRegistration = (
43
- dispatcher: PaymentMethodsDispatcherType,
44
- registeredPaymentMethods: PaymentMethods | ExpressPaymentMethods,
45
- paymentMethodsSortOrder: string[],
46
- noticeContext: string
47
  ) => {
48
  const [ isInitialized, setIsInitialized ] = useState( false );
49
  const { isEditor } = useEditorContext();
50
- const { selectedRates } = useShippingDataContext();
51
- const { billingData, shippingAddress } = useCustomerDataContext();
52
  const selectedShippingMethods = useShallowEqual( selectedRates );
53
  const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
54
- const {
55
- cartTotals,
56
- cartNeedsShipping,
57
- paymentRequirements,
58
- } = useStoreCart();
59
  const canPayArgument = useRef( {
60
  cartTotals,
61
  cartNeedsShipping,
62
- billingData,
63
  shippingAddress,
64
  selectedShippingMethods,
65
- paymentRequirements,
66
  } );
67
  const { addErrorNotice } = useStoreNotices();
68
 
@@ -70,26 +65,19 @@ const usePaymentMethodRegistration = (
70
  canPayArgument.current = {
71
  cartTotals,
72
  cartNeedsShipping,
73
- billingData,
74
  shippingAddress,
75
  selectedShippingMethods,
76
- paymentRequirements,
77
  };
78
  }, [
79
  cartTotals,
80
  cartNeedsShipping,
81
- billingData,
82
  shippingAddress,
83
  selectedShippingMethods,
84
- paymentRequirements,
85
  ] );
86
 
87
  const refreshCanMakePayments = useCallback( async () => {
88
  let availablePaymentMethods = {};
89
-
90
- const addAvailablePaymentMethod = (
91
- paymentMethod: PaymentMethodConfig | ExpressPaymentMethodConfig
92
- ) => {
93
  availablePaymentMethods = {
94
  ...availablePaymentMethods,
95
  [ paymentMethod.name ]: paymentMethod,
@@ -103,25 +91,15 @@ const usePaymentMethodRegistration = (
103
  continue;
104
  }
105
 
106
- // See if payment method should be available. This always evaluates to true in the editor context.
107
  try {
108
- const canPay = isEditor
109
- ? true
110
- : await Promise.resolve(
111
- paymentMethod.canMakePayment(
112
- canPayArgument.current
113
- )
114
- );
115
-
116
- if ( !! canPay ) {
117
- if (
118
- typeof canPay === 'object' &&
119
- canPay !== null &&
120
- canPay.error
121
- ) {
122
  throw new Error( canPay.error.message );
123
  }
124
-
125
  addAvailablePaymentMethod( paymentMethod );
126
  }
127
  } catch ( e ) {
@@ -147,7 +125,7 @@ const usePaymentMethodRegistration = (
147
 
148
  // Note: some payment methods use the `canMakePayment` callback to initialize / setup.
149
  // Example: Stripe CC, Stripe Payment Request.
150
- // That's why we track "is initialized" state here.
151
  setIsInitialized( true );
152
  }, [
153
  addErrorNotice,
@@ -159,16 +137,11 @@ const usePaymentMethodRegistration = (
159
  ] );
160
 
161
  // Determine which payment methods are available initially and whenever
162
- // shipping methods or cart totals change.
163
  // Some payment methods (e.g. COD) can be disabled for specific shipping methods.
164
  useEffect( () => {
165
  refreshCanMakePayments();
166
- }, [
167
- refreshCanMakePayments,
168
- cartTotals,
169
- selectedShippingMethods,
170
- paymentRequirements,
171
- ] );
172
 
173
  return isInitialized;
174
  };
@@ -180,16 +153,14 @@ const usePaymentMethodRegistration = (
180
  *
181
  * @return {boolean} True when standard payment methods have been initialized.
182
  */
183
- export const usePaymentMethods = (
184
- dispatcher: PaymentMethodsDispatcherType
185
- ): boolean => {
186
- const standardMethods: PaymentMethods = getPaymentMethods() as PaymentMethods;
187
  const { noticeContexts } = useEmitResponse();
188
  // Ensure all methods are present in order.
189
- // Some payment methods may not be present in paymentGatewaySortOrder if they
190
  // depend on state, e.g. COD can depend on shipping method.
191
  const displayOrder = new Set( [
192
- ...( getSetting( 'paymentGatewaySortOrder', [] ) as [ ] ),
193
  ...Object.keys( standardMethods ),
194
  ] );
195
  return usePaymentMethodRegistration(
@@ -207,10 +178,8 @@ export const usePaymentMethods = (
207
  *
208
  * @return {boolean} True when express payment methods have been initialized.
209
  */
210
- export const useExpressPaymentMethods = (
211
- dispatcher: PaymentMethodsDispatcherType
212
- ): boolean => {
213
- const expressMethods: ExpressPaymentMethods = getExpressPaymentMethods() as ExpressPaymentMethods;
214
  const { noticeContexts } = useEmitResponse();
215
  return usePaymentMethodRegistration(
216
  dispatcher,
7
  getExpressPaymentMethods,
8
  } from '@woocommerce/blocks-registry';
9
  import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
10
+ import {
11
+ useEditorContext,
12
+ useShippingDataContext,
13
+ } from '@woocommerce/base-context';
14
+ import {
15
+ useEmitResponse,
16
+ useShallowEqual,
17
+ useStoreCart,
18
+ useStoreNotices,
19
+ } from '@woocommerce/base-hooks';
20
+ import {
21
+ CURRENT_USER_IS_ADMIN,
22
+ PAYMENT_GATEWAY_SORT_ORDER,
23
+ } from '@woocommerce/block-settings';
 
 
 
 
 
24
 
25
  /**
26
  * This hook handles initializing registered payment methods and exposing all
27
  * registered payment methods that can be used in the current environment (via
28
  * the payment method's `canMakePayment` property).
29
  *
30
+ * @param {function(Object):undefined} dispatcher A dispatcher for setting registered
31
+ * payment methods to an external
32
+ * state.
33
+ * @param {Object} registeredPaymentMethods Registered payment methods to
34
+ * process.
35
+ * @param {Array} paymentMethodsSortOrder Array of payment method names to
36
+ * sort by. This should match keys of
37
+ * registeredPaymentMethods.
38
+ * @param {string} noticeContext Id of the context to append
39
+ * notices to.
40
  *
41
+ * @return {boolean} Whether the payment methods have been initialized or not. True when all payment
42
+ * methods have been initialized.
43
  */
44
  const usePaymentMethodRegistration = (
45
+ dispatcher,
46
+ registeredPaymentMethods,
47
+ paymentMethodsSortOrder,
48
+ noticeContext
49
  ) => {
50
  const [ isInitialized, setIsInitialized ] = useState( false );
51
  const { isEditor } = useEditorContext();
52
+ const { selectedRates, shippingAddress } = useShippingDataContext();
 
53
  const selectedShippingMethods = useShallowEqual( selectedRates );
54
  const paymentMethodsOrder = useShallowEqual( paymentMethodsSortOrder );
55
+ const { cartTotals, cartNeedsShipping } = useStoreCart();
 
 
 
 
56
  const canPayArgument = useRef( {
57
  cartTotals,
58
  cartNeedsShipping,
 
59
  shippingAddress,
60
  selectedShippingMethods,
 
61
  } );
62
  const { addErrorNotice } = useStoreNotices();
63
 
65
  canPayArgument.current = {
66
  cartTotals,
67
  cartNeedsShipping,
 
68
  shippingAddress,
69
  selectedShippingMethods,
 
70
  };
71
  }, [
72
  cartTotals,
73
  cartNeedsShipping,
 
74
  shippingAddress,
75
  selectedShippingMethods,
 
76
  ] );
77
 
78
  const refreshCanMakePayments = useCallback( async () => {
79
  let availablePaymentMethods = {};
80
+ const addAvailablePaymentMethod = ( paymentMethod ) => {
 
 
 
81
  availablePaymentMethods = {
82
  ...availablePaymentMethods,
83
  [ paymentMethod.name ]: paymentMethod,
91
  continue;
92
  }
93
 
94
+ // In front end, ask payment method if it should be available.
95
  try {
96
+ const canPay = await Promise.resolve(
97
+ paymentMethod.canMakePayment( canPayArgument.current )
98
+ );
99
+ if ( canPay ) {
100
+ if ( canPay.error ) {
 
 
 
 
 
 
 
 
 
101
  throw new Error( canPay.error.message );
102
  }
 
103
  addAvailablePaymentMethod( paymentMethod );
104
  }
105
  } catch ( e ) {
125
 
126
  // Note: some payment methods use the `canMakePayment` callback to initialize / setup.
127
  // Example: Stripe CC, Stripe Payment Request.
128
+ // That's why we track "is initialised" state here.
129
  setIsInitialized( true );
130
  }, [
131
  addErrorNotice,
137
  ] );
138
 
139
  // Determine which payment methods are available initially and whenever
140
+ // shipping methods change.
141
  // Some payment methods (e.g. COD) can be disabled for specific shipping methods.
142
  useEffect( () => {
143
  refreshCanMakePayments();
144
+ }, [ refreshCanMakePayments, selectedShippingMethods ] );
 
 
 
 
 
145
 
146
  return isInitialized;
147
  };
153
  *
154
  * @return {boolean} True when standard payment methods have been initialized.
155
  */
156
+ export const usePaymentMethods = ( dispatcher ) => {
157
+ const standardMethods = getPaymentMethods();
 
 
158
  const { noticeContexts } = useEmitResponse();
159
  // Ensure all methods are present in order.
160
+ // Some payment methods may not be present in PAYMENT_GATEWAY_SORT_ORDER if they
161
  // depend on state, e.g. COD can depend on shipping method.
162
  const displayOrder = new Set( [
163
+ ...PAYMENT_GATEWAY_SORT_ORDER,
164
  ...Object.keys( standardMethods ),
165
  ] );
166
  return usePaymentMethodRegistration(
178
  *
179
  * @return {boolean} True when express payment methods have been initialized.
180
  */
181
+ export const useExpressPaymentMethods = ( dispatcher ) => {
182
+ const expressMethods = getExpressPaymentMethods();
 
 
183
  const { noticeContexts } = useEmitResponse();
184
  return usePaymentMethodRegistration(
185
  dispatcher,
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/constants.js RENAMED
@@ -1,6 +1,6 @@
1
  /**
2
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingErrorTypes} ShippingErrorTypes
3
- * @typedef {import('@woocommerce/type-defs/shipping').ShippingAddress} ShippingAddress
4
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
5
  */
6
 
@@ -20,7 +20,7 @@ export const shippingErrorCodes = {
20
  };
21
 
22
  /**
23
- * @type {ShippingAddress}
24
  */
25
  export const DEFAULT_SHIPPING_ADDRESS = {
26
  first_name: '',
@@ -47,6 +47,7 @@ export const DEFAULT_SHIPPING_CONTEXT_DATA = {
47
  dispatchErrorStatus: () => null,
48
  shippingErrorTypes: ERROR_TYPES,
49
  shippingRates: [],
 
50
  shippingRatesLoading: false,
51
  selectedRates: [],
52
  setSelectedRates: () => null,
1
  /**
2
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingErrorTypes} ShippingErrorTypes
3
+ * @typedef {import('@woocommerce/type-defs/cart').CartShippingAddress} CartShippingAddress
4
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
5
  */
6
 
20
  };
21
 
22
  /**
23
+ * @type {CartShippingAddress}
24
  */
25
  export const DEFAULT_SHIPPING_ADDRESS = {
26
  first_name: '',
47
  dispatchErrorStatus: () => null,
48
  shippingErrorTypes: ERROR_TYPES,
49
  shippingRates: [],
50
+ setShippingRates: () => null,
51
  shippingRatesLoading: false,
52
  selectedRates: [],
53
  setSelectedRates: () => null,
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/event-emit.js RENAMED
@@ -1,7 +1,7 @@
1
  /**
2
  * Internal dependencies
3
  */
4
- import { emitterCallback, reducer, emitEvent } from '../../../event-emit';
5
 
6
  const EMIT_TYPES = {
7
  SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
@@ -21,7 +21,7 @@ const EMIT_TYPES = {
21
  * @param {Function} dispatcher A reducer dispatcher
22
  * @return {Object} An object with `onSuccess` and `onFail` emitter registration.
23
  */
24
- const emitterObservers = ( dispatcher ) => ( {
25
  onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
26
  onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
27
  onSelectSuccess: emitterCallback(
@@ -34,4 +34,4 @@ const emitterObservers = ( dispatcher ) => ( {
34
  ),
35
  } );
36
 
37
- export { EMIT_TYPES, emitterObservers, reducer, emitEvent };
1
  /**
2
  * Internal dependencies
3
  */
4
+ import { emitterCallback, reducer, emitEvent } from '../../shared/event-emit';
5
 
6
  const EMIT_TYPES = {
7
  SHIPPING_RATES_SUCCESS: 'shipping_rates_success',
21
  * @param {Function} dispatcher A reducer dispatcher
22
  * @return {Object} An object with `onSuccess` and `onFail` emitter registration.
23
  */
24
+ const emitterSubscribers = ( dispatcher ) => ( {
25
  onSuccess: emitterCallback( EMIT_TYPES.SHIPPING_RATES_SUCCESS, dispatcher ),
26
  onFail: emitterCallback( EMIT_TYPES.SHIPPING_RATES_FAIL, dispatcher ),
27
  onSelectSuccess: emitterCallback(
34
  ),
35
  } );
36
 
37
+ export { EMIT_TYPES, emitterSubscribers, reducer, emitEvent };
assets/js/base/context/{providers/cart-checkout → cart-checkout}/shipping/index.js RENAMED
@@ -9,25 +9,27 @@ import {
9
  useMemo,
10
  useRef,
11
  } from '@wordpress/element';
12
- import isShallowEqual from '@wordpress/is-shallow-equal';
13
- import { deriveSelectedShippingRates } from '@woocommerce/base-utils';
 
 
 
 
14
 
15
  /**
16
  * Internal dependencies
17
  */
18
- import { ERROR_TYPES, DEFAULT_SHIPPING_CONTEXT_DATA } from './constants';
19
- import { hasInvalidShippingAddress } from './utils';
20
- import { errorStatusReducer } from './reducers';
 
 
21
  import {
22
  EMIT_TYPES,
23
- emitterObservers,
24
  reducer as emitReducer,
25
  emitEvent,
26
  } from './event-emit';
27
- import { useCheckoutContext } from '../checkout-state';
28
- import { useCustomerDataContext } from '../customer';
29
- import { useStoreCart } from '../../../hooks/cart/use-store-cart';
30
- import { useSelectShippingRates } from '../../../hooks/shipping/use-select-shipping-rates';
31
 
32
  /**
33
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
@@ -35,49 +37,80 @@ import { useSelectShippingRates } from '../../../hooks/shipping/use-select-shipp
35
  */
36
 
37
  const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
39
 
40
  /**
41
- * @return {ShippingDataContext} Returns data and functions related to shipping methods.
 
42
  */
43
  export const useShippingDataContext = () => {
44
  return useContext( ShippingDataContext );
45
  };
46
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  /**
48
- * The shipping data provider exposes the interface for shipping in the checkout/cart.
 
49
  *
50
  * @param {Object} props Incoming props for provider
51
  * @param {React.ReactElement} props.children
52
  */
53
  export const ShippingDataProvider = ( { children } ) => {
54
  const { dispatchActions } = useCheckoutContext();
55
- const { shippingAddress, setShippingAddress } = useCustomerDataContext();
56
  const {
57
  cartNeedsShipping: needsShipping,
58
- cartHasCalculatedShipping: hasCalculatedShipping,
59
  shippingRates,
60
  shippingRatesLoading,
61
  cartErrors,
62
  } = useStoreCart();
63
- const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
64
  const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
65
  errorStatusReducer,
66
  NONE
67
  );
68
- const [ observers, observerDispatch ] = useReducer( emitReducer, {} );
 
69
  const currentObservers = useRef( observers );
70
- const eventObservers = useMemo(
 
 
 
 
 
71
  () => ( {
72
- onShippingRateSuccess: emitterObservers( observerDispatch )
73
- .onSuccess,
74
- onShippingRateFail: emitterObservers( observerDispatch ).onFail,
75
- onShippingRateSelectSuccess: emitterObservers( observerDispatch )
76
  .onSelectSuccess,
77
- onShippingRateSelectFail: emitterObservers( observerDispatch )
78
  .onSelectFail,
79
  } ),
80
- [ observerDispatch ]
81
  );
82
 
83
  // set observers on ref so it's always current.
@@ -85,19 +118,6 @@ export const ShippingDataProvider = ( { children } ) => {
85
  currentObservers.current = observers;
86
  }, [ observers ] );
87
 
88
- // set selected rates on ref so it's always current.
89
- const selectedRates = useRef( () =>
90
- deriveSelectedShippingRates( shippingRates )
91
- );
92
- useEffect( () => {
93
- const derivedSelectedRates = deriveSelectedShippingRates(
94
- shippingRates
95
- );
96
- if ( ! isShallowEqual( selectedRates.current, derivedSelectedRates ) ) {
97
- selectedRates.current = derivedSelectedRates;
98
- }
99
- }, [ shippingRates ] );
100
-
101
  // increment/decrement checkout calculating counts when shipping is loading.
102
  useEffect( () => {
103
  if ( shippingRatesLoading ) {
@@ -107,7 +127,8 @@ export const ShippingDataProvider = ( { children } ) => {
107
  }
108
  }, [ shippingRatesLoading, dispatchActions ] );
109
 
110
- // increment/decrement checkout calculating counts when shipping rates are being selected.
 
111
  useEffect( () => {
112
  if ( isSelectingRate ) {
113
  dispatchActions.incrementCalculating();
@@ -178,10 +199,7 @@ export const ShippingDataProvider = ( { children } ) => {
178
 
179
  // emit shipping rate selection events.
180
  useEffect( () => {
181
- if ( isSelectingRate ) {
182
- return;
183
- }
184
- if ( currentErrorStatus.hasError ) {
185
  emitEvent(
186
  currentObservers.current,
187
  EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
@@ -190,19 +208,28 @@ export const ShippingDataProvider = ( { children } ) => {
190
  hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
191
  }
192
  );
193
- } else {
194
- emitEvent(
195
- currentObservers.current,
196
- EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
197
- selectedRates.current
198
- );
199
  }
200
  }, [
 
201
  isSelectingRate,
202
  currentErrorStatus.hasError,
203
  currentErrorStatus.hasInvalidAddress,
204
  ] );
205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  /**
207
  * @type {ShippingDataContext}
208
  */
@@ -211,17 +238,20 @@ export const ShippingDataProvider = ( { children } ) => {
211
  dispatchErrorStatus,
212
  shippingErrorTypes: ERROR_TYPES,
213
  shippingRates,
 
214
  shippingRatesLoading,
215
- selectedRates: selectedRates.current,
216
- setSelectedRates: selectShippingRate,
217
  isSelectingRate,
218
  shippingAddress,
219
  setShippingAddress,
 
 
 
 
 
220
  needsShipping,
221
- hasCalculatedShipping,
222
- ...eventObservers,
223
  };
224
-
225
  return (
226
  <>
227
  <ShippingDataContext.Provider value={ ShippingData }>
9
  useMemo,
10
  useRef,
11
  } from '@wordpress/element';
12
+ import {
13
+ useShippingAddress,
14
+ useStoreCart,
15
+ useSelectShippingRate,
16
+ } from '@woocommerce/base-hooks';
17
+ import { useCheckoutContext } from '@woocommerce/base-context';
18
 
19
  /**
20
  * Internal dependencies
21
  */
22
+ import {
23
+ ERROR_TYPES,
24
+ DEFAULT_SHIPPING_CONTEXT_DATA,
25
+ shippingErrorCodes,
26
+ } from './constants';
27
  import {
28
  EMIT_TYPES,
29
+ emitterSubscribers,
30
  reducer as emitReducer,
31
  emitEvent,
32
  } from './event-emit';
 
 
 
 
33
 
34
  /**
35
  * @typedef {import('@woocommerce/type-defs/contexts').ShippingDataContext} ShippingDataContext
37
  */
38
 
39
  const { NONE, INVALID_ADDRESS, UNKNOWN } = ERROR_TYPES;
40
+
41
+ /**
42
+ * Reducer for shipping status state
43
+ *
44
+ * @param {string} state The current status.
45
+ * @param {Object} action The incoming action.
46
+ * @param {string} action.type The type of action.
47
+ */
48
+ const errorStatusReducer = ( state, { type } ) => {
49
+ if ( Object.values( ERROR_TYPES ).includes( type ) ) {
50
+ return type;
51
+ }
52
+ return state;
53
+ };
54
+
55
  const ShippingDataContext = createContext( DEFAULT_SHIPPING_CONTEXT_DATA );
56
 
57
  /**
58
+ * @return {ShippingDataContext} Returns data and functions related to
59
+ * shipping methods.
60
  */
61
  export const useShippingDataContext = () => {
62
  return useContext( ShippingDataContext );
63
  };
64
 
65
+ const hasInvalidShippingAddress = ( errors ) => {
66
+ return errors.some( ( error ) => {
67
+ if (
68
+ error.code &&
69
+ Object.values( shippingErrorCodes ).includes( error.code )
70
+ ) {
71
+ return true;
72
+ }
73
+ return false;
74
+ } );
75
+ };
76
+
77
  /**
78
+ * The shipping data provider exposes the interface for shipping in the
79
+ * checkout/cart.
80
  *
81
  * @param {Object} props Incoming props for provider
82
  * @param {React.ReactElement} props.children
83
  */
84
  export const ShippingDataProvider = ( { children } ) => {
85
  const { dispatchActions } = useCheckoutContext();
 
86
  const {
87
  cartNeedsShipping: needsShipping,
 
88
  shippingRates,
89
  shippingRatesLoading,
90
  cartErrors,
91
  } = useStoreCart();
 
92
  const [ shippingErrorStatus, dispatchErrorStatus ] = useReducer(
93
  errorStatusReducer,
94
  NONE
95
  );
96
+ const [ observers, subscriber ] = useReducer( emitReducer, {} );
97
+ const { shippingAddress, setShippingAddress } = useShippingAddress();
98
  const currentObservers = useRef( observers );
99
+ const {
100
+ selectShippingRate: setSelectedRates,
101
+ selectedShippingRates: selectedRates,
102
+ isSelectingRate,
103
+ } = useSelectShippingRate( shippingRates );
104
+ const eventSubscribers = useMemo(
105
  () => ( {
106
+ onShippingRateSuccess: emitterSubscribers( subscriber ).onSuccess,
107
+ onShippingRateFail: emitterSubscribers( subscriber ).onFail,
108
+ onShippingRateSelectSuccess: emitterSubscribers( subscriber )
 
109
  .onSelectSuccess,
110
+ onShippingRateSelectFail: emitterSubscribers( subscriber )
111
  .onSelectFail,
112
  } ),
113
+ [ subscriber ]
114
  );
115
 
116
  // set observers on ref so it's always current.
118
  currentObservers.current = observers;
119
  }, [ observers ] );
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  // increment/decrement checkout calculating counts when shipping is loading.
122
  useEffect( () => {
123
  if ( shippingRatesLoading ) {
127
  }
128
  }, [ shippingRatesLoading, dispatchActions ] );
129
 
130
+ // increment/decrement checkout calculating counts when shipping rates are
131
+ // being selected.
132
  useEffect( () => {
133
  if ( isSelectingRate ) {
134
  dispatchActions.incrementCalculating();
199
 
200
  // emit shipping rate selection events.
201
  useEffect( () => {
202
+ if ( ! isSelectingRate && currentErrorStatus.hasError ) {
 
 
 
203
  emitEvent(
204
  currentObservers.current,
205
  EMIT_TYPES.SHIPPING_RATE_SELECT_FAIL,
208
  hasInvalidAddress: currentErrorStatus.hasInvalidAddress,
209
  }
210
  );
 
 
 
 
 
 
211
  }
212
  }, [
213
+ selectedRates,
214
  isSelectingRate,
215
  currentErrorStatus.hasError,
216
  currentErrorStatus.hasInvalidAddress,
217
  ] );
218
 
219
+ useEffect( () => {
220
+ if (
221
+ ! isSelectingRate &&
222
+ selectedRates &&
223
+ ! currentErrorStatus.hasError
224
+ ) {
225
+ emitEvent(
226
+ currentObservers.current,
227
+ EMIT_TYPES.SHIPPING_RATE_SELECT_SUCCESS,
228
+ selectedRates
229
+ );
230
+ }
231
+ }, [ selectedRates, isSelectingRate, currentErrorStatus.hasError ] );
232
+
233
  /**
234
  * @type {ShippingDataContext}
235
  */
238
  dispatchErrorStatus,
239
  shippingErrorTypes: ERROR_TYPES,
240
  shippingRates,
241
+ setShippingRates: setSelectedRates,
242
  shippingRatesLoading,
243
+ selectedRates,
244
+ setSelectedRates,
245
  isSelectingRate,
246
  shippingAddress,
247
  setShippingAddress,
248
+ onShippingRateSuccess: eventSubscribers.onShippingRateSuccess,
249
+ onShippingRateFail: eventSubscribers.onShippingRateFail,
250
+ onShippingRateSelectSuccess:
251
+ eventSubscribers.onShippingRateSelectSuccess,
252
+ onShippingRateSelectFail: eventSubscribers.onShippingRateSelectFail,
253
  needsShipping,
 
 
254
  };
 
255
  return (
256
  <>
257
  <ShippingDataContext.Provider value={ ShippingData }>
assets/js/base/context/{providers/container-width-context.js → container-width-context.js} RENAMED
File without changes
assets/js/base/context/{providers/editor-context.js → editor/index.js} RENAMED
@@ -1,7 +1,7 @@
1
  /**
2
  * External dependencies
3
  */
4
- import { createContext, useContext, useCallback } from '@wordpress/element';
5
  import { useSelect } from '@wordpress/data';
6
 
7
  /**
@@ -13,7 +13,6 @@ const EditorContext = createContext( {
13
  isEditor: false,
14
  currentPostId: 0,
15
  previewData: {},
16
- getPreviewData: () => void null,
17
  } );
18
 
19
  /**
@@ -50,16 +49,6 @@ export const EditorProvider = ( {
50
  [ currentPostId ]
51
  );
52
 
53
- const getPreviewData = useCallback(
54
- ( name ) => {
55
- if ( name in previewData ) {
56
- return previewData[ name ];
57
- }
58
- return {};
59
- },
60
- [ previewData ]
61
- );
62
-
63
  /**
64
  * @type {EditorDataContext}
65
  */
@@ -67,7 +56,6 @@ export const EditorProvider = ( {
67
  isEditor: true,
68
  currentPostId: editingPostId,
69
  previewData,
70
- getPreviewData,
71
  };
72
 
73
  return (
1
  /**
2
  * External dependencies
3
  */
4
+ import { createContext, useContext } from '@wordpress/element';
5
  import { useSelect } from '@wordpress/data';
6
 
7
  /**
13
  isEditor: false,
14
  currentPostId: 0,
15
  previewData: {},
 
16
  } );
17
 
18
  /**
49
  [ currentPostId ]
50
  );
51
 
 
 
 
 
 
 
 
 
 
 
52
  /**
53
  * @type {EditorDataContext}
54
  */
56
  isEditor: true,
57
  currentPostId: editingPostId,
58
  previewData,
 
59
  };
60
 
61
  return (
assets/js/base/context/event-emit/emitter-callback.ts DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import { actions } from './reducer';
5
- import type { ActionType, ActionCallbackType } from './types';
6
-
7
- export const emitterCallback = (
8
- type: string,
9
- observerDispatch: React.Dispatch< ActionType >
10
- ) => ( callback: ActionCallbackType, priority = 10 ): ( () => void ) => {
11
- const action = actions.addEventCallback( type, callback, priority );
12
- observerDispatch( action );
13
- return () => {
14
- observerDispatch( actions.removeEventCallback( type, action.id ) );
15
- };
16
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/reducer.ts DELETED
@@ -1,65 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { uniqueId } from 'lodash';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import {
10
- ACTION,
11
- ActionType,
12
- ActionCallbackType,
13
- EventObserversType,
14
- } from './types';
15
-
16
- export const actions = {
17
- addEventCallback: (
18
- eventType: string,
19
- callback: ActionCallbackType,
20
- priority = 10
21
- ): ActionType => {
22
- return {
23
- id: uniqueId(),
24
- type: ACTION.ADD_EVENT_CALLBACK,
25
- eventType,
26
- callback,
27
- priority,
28
- };
29
- },
30
- removeEventCallback: ( eventType: string, id: string ): ActionType => {
31
- return {
32
- id,
33
- type: ACTION.REMOVE_EVENT_CALLBACK,
34
- eventType,
35
- };
36
- },
37
- };
38
-
39
- const initialState = {} as EventObserversType;
40
-
41
- /**
42
- * Handles actions for emitters
43
- */
44
- export const reducer = (
45
- state = initialState,
46
- { type, eventType, id, callback, priority }: ActionType
47
- ): typeof initialState => {
48
- const newEvents = state.hasOwnProperty( eventType )
49
- ? new Map( state[ eventType ] )
50
- : new Map();
51
- switch ( type ) {
52
- case ACTION.ADD_EVENT_CALLBACK:
53
- newEvents.set( id, { priority, callback } );
54
- return {
55
- ...state,
56
- [ eventType ]: newEvents,
57
- };
58
- case ACTION.REMOVE_EVENT_CALLBACK:
59
- newEvents.delete( id );
60
- return {
61
- ...state,
62
- [ eventType ]: newEvents,
63
- };
64
- }
65
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/types.ts DELETED
@@ -1,18 +0,0 @@
1
- export enum ACTION {
2
- ADD_EVENT_CALLBACK = 'add_event_callback',
3
- REMOVE_EVENT_CALLBACK = 'remove_event_callback',
4
- }
5
-
6
- export type ActionCallbackType = ( ...args: unknown[] ) => unknown;
7
-
8
- export type ActionType = {
9
- type: ACTION;
10
- eventType: string;
11
- id: string;
12
- callback?: ActionCallbackType;
13
- priority?: number;
14
- };
15
-
16
- export type ObserverType = { priority: number; callback: ActionCallbackType };
17
- export type ObserversType = Map< string, ObserverType >;
18
- export type EventObserversType = Record< string, ObserversType >;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/event-emit/utils.ts DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * Internal dependencies
3
- */
4
- import type { EventObserversType, ObserverType } from './types';
5
-
6
- export const getObserversByPriority = (
7
- observers: EventObserversType,
8
- eventType: string
9
- ): ObserverType[] => {
10
- return observers[ eventType ]
11
- ? Array.from( observers[ eventType ].values() ).sort( ( a, b ) => {
12
- return a.priority - b.priority;
13
- } )
14
- : [];
15
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/cart/use-store-cart-item-quantity.ts DELETED
@@ -1,146 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useSelect, useDispatch } from '@wordpress/data';
5
- import { useState, useEffect } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useDebounce } from 'use-debounce';
8
- import { usePrevious } from '@woocommerce/base-hooks';
9
- import { triggerFragmentRefresh } from '@woocommerce/base-utils';
10
- import {
11
- CartItem,
12
- StoreCartItemQuantity,
13
- isNumber,
14
- isObject,
15
- isString,
16
- objectHasProp,
17
- } from '@woocommerce/types';
18
-
19
- /**
20
- * Internal dependencies
21
- */
22
- import { useStoreCart } from './use-store-cart';
23
- import { useCheckoutContext } from '../../providers/cart-checkout';
24
-
25
- /**
26
- * Ensures the object passed has props key: string and quantity: number
27
- */
28
- const cartItemHasQuantityAndKey = (
29
- cartItem: unknown /* Object that may have quantity and key */
30
- ): cartItem is Partial< CartItem > =>
31
- isObject( cartItem ) &&
32
- objectHasProp( cartItem, 'key' ) &&
33
- objectHasProp( cartItem, 'quantity' ) &&
34
- isString( cartItem.key ) &&
35
- isNumber( cartItem.quantity );
36
-
37
- /**
38
- * This is a custom hook for loading the Store API /cart/ endpoint and actions for removing or changing item quantity.
39
- *
40
- * @see https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/trunk/src/RestApi/StoreApi
41
- *
42
- * @param {CartItem} cartItem The cartItem to get quantity info from and will have quantity updated on.
43
- * @return {StoreCartItemQuantity} An object exposing data and actions relating to cart items.
44
- */
45
- export const useStoreCartItemQuantity = (
46
- cartItem: CartItem | Record< string, unknown >
47
- ): StoreCartItemQuantity => {
48
- const verifiedCartItem = { key: '', quantity: 1 };
49
-
50
- if ( cartItemHasQuantityAndKey( cartItem ) ) {
51
- verifiedCartItem.key = cartItem.key;
52
- verifiedCartItem.quantity = cartItem.quantity;
53
- }
54
- const {
55
- key: cartItemKey = '',
56
- quantity: cartItemQuantity = 1,
57
- } = verifiedCartItem;
58
- const { cartErrors } = useStoreCart();
59
- const { dispatchActions } = useCheckoutContext();
60
-
61
- // Store quantity in hook state. This is used to keep the UI updated while server request is updated.
62
- const [ quantity, setQuantity ] = useState< number >( cartItemQuantity );
63
- const [ debouncedQuantity ] = useDebounce< number >( quantity, 400 );
64
- const previousDebouncedQuantity = usePrevious( debouncedQuantity );
65
- const { removeItemFromCart, changeCartItemQuantity } = useDispatch(
66
- storeKey
67
- );
68
-
69
- // Track when things are already pending updates.
70
- const isPending = useSelect(
71
- ( select ) => {
72
- if ( ! cartItemKey ) {
73
- return {
74
- quantity: false,
75
- delete: false,
76
- };
77
- }
78
- const store = select( storeKey );
79
- return {
80
- quantity: store.isItemPendingQuantity( cartItemKey ),
81
- delete: store.isItemPendingDelete( cartItemKey ),
82
- };
83
- },
84
- [ cartItemKey ]
85
- );
86
-
87
- const removeItem = () => {
88
- return cartItemKey
89
- ? removeItemFromCart( cartItemKey ).then( () => {
90
- triggerFragmentRefresh();
91
- return true;
92
- } )
93
- : Promise.resolve( false );
94
- };
95
-
96
- // Observe debounced quantity value, fire action to update server on change.
97
- useEffect( () => {
98
- if (
99
- cartItemKey &&
100
- isNumber( previousDebouncedQuantity ) &&
101
- Number.isFinite( previousDebouncedQuantity ) &&
102
- previousDebouncedQuantity !== debouncedQuantity
103
- ) {
104
- changeCartItemQuantity( cartItemKey, debouncedQuantity );
105
- }
106
- }, [
107
- cartItemKey,
108
- changeCartItemQuantity,
109
- debouncedQuantity,
110
- previousDebouncedQuantity,
111
- ] );
112
-
113
- useEffect( () => {
114
- if ( isPending.delete ) {
115
- dispatchActions.incrementCalculating();
116
- } else {
117
- dispatchActions.decrementCalculating();
118
- }
119
- return () => {
120
- if ( isPending.delete ) {
121
- dispatchActions.decrementCalculating();
122
- }
123
- };
124
- }, [ dispatchActions, isPending.delete ] );
125
-
126
- useEffect( () => {
127
- if ( isPending.quantity || debouncedQuantity !== quantity ) {
128
- dispatchActions.incrementCalculating();
129
- } else {
130
- dispatchActions.decrementCalculating();
131
- }
132
- return () => {
133
- if ( isPending.quantity || debouncedQuantity !== quantity ) {
134
- dispatchActions.decrementCalculating();
135
- }
136
- };
137
- }, [ dispatchActions, isPending.quantity, debouncedQuantity, quantity ] );
138
-
139
- return {
140
- isPendingDelete: isPending.delete,
141
- quantity,
142
- setItemQuantity: setQuantity,
143
- removeItem,
144
- cartItemQuantityErrors: cartErrors,
145
- };
146
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/cart/use-store-cart.ts DELETED
@@ -1,223 +0,0 @@
1
- /** @typedef { import('@woocommerce/type-defs/hooks').StoreCart } StoreCart */
2
-
3
- /**
4
- * External dependencies
5
- */
6
- import { isEqual } from 'lodash';
7
- import { useRef } from '@wordpress/element';
8
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
9
- import { useSelect } from '@wordpress/data';
10
- import { decodeEntities } from '@wordpress/html-entities';
11
- import type {
12
- StoreCart,
13
- CartResponseTotals,
14
- CartResponseFeeItem,
15
- CartResponseBillingAddress,
16
- CartResponseShippingAddress,
17
- CartResponseCouponItem,
18
- CartResponseCouponItemWithLabel,
19
- } from '@woocommerce/types';
20
- import {
21
- emptyHiddenAddressFields,
22
- fromEntriesPolyfill,
23
- } from '@woocommerce/base-utils';
24
-
25
- /**
26
- * Internal dependencies
27
- */
28
- import { useEditorContext } from '../../providers/editor-context';
29
-
30
- declare module '@wordpress/html-entities' {
31
- // eslint-disable-next-line @typescript-eslint/no-shadow
32
- export function decodeEntities< T >( coupon: T ): T;
33
- }
34
- const defaultShippingAddress: CartResponseShippingAddress = {
35
- first_name: '',
36
- last_name: '',
37
- company: '',
38
- address_1: '',
39
- address_2: '',
40
- city: '',
41
- state: '',
42
- postcode: '',
43
- country: '',
44
- };
45
-
46
- const defaultBillingAddress: CartResponseBillingAddress = {
47
- ...defaultShippingAddress,
48
- email: '',
49
- phone: '',
50
- };
51
-
52
- const defaultCartTotals: CartResponseTotals = {
53
- total_items: '',
54
- total_items_tax: '',
55
- total_fees: '',
56
- total_fees_tax: '',
57
- total_discount: '',
58
- total_discount_tax: '',
59
- total_shipping: '',
60
- total_shipping_tax: '',
61
- total_price: '',
62
- total_tax: '',
63
- tax_lines: [],
64
- currency_code: '',
65
- currency_symbol: '',
66
- currency_minor_unit: 2,
67
- currency_decimal_separator: '',
68
- currency_thousand_separator: '',
69
- currency_prefix: '',
70
- currency_suffix: '',
71
- };
72
-
73
- const decodeValues = (
74
- object: Record< string, unknown >
75
- ): Record< string, unknown > =>
76
- fromEntriesPolyfill(
77
- Object.entries( object ).map( ( [ key, value ] ) => [
78
- key,
79
- decodeEntities( value ),
80
- ] )
81
- );
82
-
83
- /**
84
- * @constant
85
- * @type {StoreCart} Object containing cart data.
86
- */
87
- export const defaultCartData: StoreCart = {
88
- cartCoupons: [],
89
- cartItems: [],
90
- cartFees: [],
91
- cartItemsCount: 0,
92
- cartItemsWeight: 0,
93
- cartNeedsPayment: true,
94
- cartNeedsShipping: true,
95
- cartItemErrors: [],
96
- cartTotals: defaultCartTotals,
97
- cartIsLoading: true,
98
- cartErrors: [],
99
- billingAddress: defaultBillingAddress,
100
- shippingAddress: defaultShippingAddress,
101
- shippingRates: [],
102
- shippingRatesLoading: false,
103
- cartHasCalculatedShipping: false,
104
- paymentRequirements: [],
105
- receiveCart: () => undefined,
106
- extensions: {},
107
- };
108
-
109
- /**
110
- * This is a custom hook that is wired up to the `wc/store/cart` data
111
- * store.
112
- *
113
- * @param {Object} options An object declaring the various
114
- * collection arguments.
115
- * @param {boolean} options.shouldSelect If false, the previous results will be
116
- * returned and internal selects will not
117
- * fire.
118
- *
119
- * @return {StoreCart} Object containing cart data.
120
- */
121
- export const useStoreCart = (
122
- options: { shouldSelect: boolean } = { shouldSelect: true }
123
- ): StoreCart => {
124
- const { isEditor, previewData } = useEditorContext();
125
- const previewCart = previewData?.previewCart || {};
126
- const { shouldSelect } = options;
127
- const currentResults = useRef();
128
-
129
- const results: StoreCart = useSelect(
130
- ( select, { dispatch } ) => {
131
- if ( ! shouldSelect ) {
132
- return defaultCartData;
133
- }
134
-
135
- if ( isEditor ) {
136
- return {
137
- cartCoupons: previewCart.coupons,
138
- cartItems: previewCart.items,
139
- cartFees: previewCart.fees,
140
- cartItemsCount: previewCart.items_count,
141
- cartItemsWeight: previewCart.items_weight,
142
- cartNeedsPayment: previewCart.needs_payment,
143
- cartNeedsShipping: previewCart.needs_shipping,
144
- cartItemErrors: [],
145
- cartTotals: previewCart.totals,
146
- cartIsLoading: false,
147
- cartErrors: [],
148
- billingAddress: defaultBillingAddress,
149
- shippingAddress: defaultShippingAddress,
150
- extensions: {},
151
- shippingRates: previewCart.shipping_rates,
152
- shippingRatesLoading: false,
153
- cartHasCalculatedShipping:
154
- previewCart.has_calculated_shipping,
155
- paymentRequirements: previewCart.paymentRequirements,
156
- receiveCart:
157
- typeof previewCart?.receiveCart === 'function'
158
- ? previewCart.receiveCart
159
- : () => undefined,
160
- };
161
- }
162
-
163
- const store = select( storeKey );
164
- const cartData = store.getCartData();
165
- const cartErrors = store.getCartErrors();
166
- const cartTotals = store.getCartTotals();
167
- const cartIsLoading = ! store.hasFinishedResolution(
168
- 'getCartData'
169
- );
170
- const shippingRatesLoading = store.isCustomerDataUpdating();
171
- const { receiveCart } = dispatch( storeKey );
172
- const billingAddress = decodeValues( cartData.billingAddress );
173
- const shippingAddress = cartData.needsShipping
174
- ? decodeValues( cartData.shippingAddress )
175
- : billingAddress;
176
- const cartFees = cartData.fees.map( ( fee: CartResponseFeeItem ) =>
177
- decodeValues( fee )
178
- );
179
-
180
- // Add a text property to the coupon to allow extensions to modify
181
- // the text used to display the coupon, without affecting the
182
- // functionality when it comes to removing the coupon.
183
- const cartCoupons: CartResponseCouponItemWithLabel[] = cartData.coupons.map(
184
- ( coupon: CartResponseCouponItem ) => ( {
185
- ...coupon,
186
- label: coupon.code,
187
- } )
188
- );
189
-
190
- return {
191
- cartCoupons,
192
- cartItems: cartData.items || [],
193
- cartFees,
194
- cartItemsCount: cartData.itemsCount,
195
- cartItemsWeight: cartData.itemsWeight,
196
- cartNeedsPayment: cartData.needsPayment,
197
- cartNeedsShipping: cartData.needsShipping,
198
- cartItemErrors: cartData.errors || [],
199
- cartTotals,
200
- cartIsLoading,
201
- cartErrors,
202
- billingAddress: emptyHiddenAddressFields( billingAddress ),
203
- shippingAddress: emptyHiddenAddressFields( shippingAddress ),
204
- extensions: cartData.extensions || {},
205
- shippingRates: cartData.shippingRates || [],
206
- shippingRatesLoading,
207
- cartHasCalculatedShipping: cartData.hasCalculatedShipping,
208
- paymentRequirements: cartData.paymentRequirements || [],
209
- receiveCart,
210
- };
211
- },
212
- [ shouldSelect ]
213
- );
214
-
215
- if (
216
- ! currentResults.current ||
217
- ! isEqual( currentResults.current, results )
218
- ) {
219
- currentResults.current = results;
220
- }
221
-
222
- return currentResults.current;
223
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/collections/index.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './use-collection-data';
2
- export * from './use-collection-header';
3
- export * from './use-collection';
 
 
 
assets/js/base/context/hooks/index.js DELETED
@@ -1,14 +0,0 @@
1
- export * from './cart';
2
- export * from './collections';
3
- export * from './shipping';
4
- export * from './payment-methods';
5
- export * from './use-store-notices';
6
- export * from './use-store-events';
7
- export * from './use-query-state';
8
- export * from './use-store-products';
9
- export * from './use-store-add-to-cart';
10
- export * from './use-customer-data';
11
- export * from './use-checkout-address';
12
- export * from './use-checkout-notices';
13
- export * from './use-checkout-submit';
14
- export * from './use-emit-response';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/payment-methods/use-payment-methods.js DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useShallowEqual } from '@woocommerce/base-hooks';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { usePaymentMethodDataContext } from '../../providers/cart-checkout/payment-methods';
10
-
11
- const usePaymentMethodState = ( express = false ) => {
12
- const {
13
- paymentMethods,
14
- expressPaymentMethods,
15
- paymentMethodsInitialized,
16
- expressPaymentMethodsInitialized,
17
- } = usePaymentMethodDataContext();
18
-
19
- const currentPaymentMethods = useShallowEqual( paymentMethods );
20
- const currentExpressPaymentMethods = useShallowEqual(
21
- expressPaymentMethods
22
- );
23
-
24
- return {
25
- paymentMethods: express
26
- ? currentExpressPaymentMethods
27
- : currentPaymentMethods,
28
- isInitialized: express
29
- ? expressPaymentMethodsInitialized
30
- : paymentMethodsInitialized,
31
- };
32
- };
33
-
34
- export const usePaymentMethods = () => usePaymentMethodState();
35
- export const useExpressPaymentMethods = () => usePaymentMethodState( true );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/payment-methods/utils.ts DELETED
@@ -1,85 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
- import {
6
- CartResponseTotals,
7
- objectHasProp,
8
- isString,
9
- } from '@woocommerce/types';
10
-
11
- export interface CartTotalItem {
12
- key: string;
13
- label: string;
14
- value: number;
15
- valueWithTax: number;
16
- }
17
-
18
- /**
19
- * Prepares the total items into a shape usable for display as passed on to
20
- * registered payment methods.
21
- *
22
- * @param {Object} totals Current cart total items
23
- * @param {boolean} needsShipping Whether or not shipping is needed.
24
- */
25
- export const prepareTotalItems = (
26
- totals: CartResponseTotals,
27
- needsShipping: boolean
28
- ): CartTotalItem[] => {
29
- const newTotals = [];
30
-
31
- const factory = ( label: string, property: string ): CartTotalItem => {
32
- const taxProperty = property + '_tax';
33
- const value =
34
- objectHasProp( totals, property ) && isString( totals[ property ] )
35
- ? parseInt( totals[ property ] as string, 10 )
36
- : 0;
37
- const tax =
38
- objectHasProp( totals, taxProperty ) &&
39
- isString( totals[ taxProperty ] )
40
- ? parseInt( totals[ taxProperty ] as string, 10 )
41
- : 0;
42
- return {
43
- key: property,
44
- label,
45
- value,
46
- valueWithTax: value + tax,
47
- };
48
- };
49
-
50
- newTotals.push(
51
- factory(
52
- __( 'Subtotal:', 'woo-gutenberg-products-block' ),
53
- 'total_items'
54
- )
55
- );
56
-
57
- newTotals.push(
58
- factory( __( 'Fees:', 'woo-gutenberg-products-block' ), 'total_fees' )
59
- );
60
-
61
- newTotals.push(
62
- factory(
63
- __( 'Discount:', 'woo-gutenberg-products-block' ),
64
- 'total_discount'
65
- )
66
- );
67
-
68
- newTotals.push( {
69
- key: 'total_tax',
70
- label: __( 'Taxes:', 'woo-gutenberg-products-block' ),
71
- value: parseInt( totals.total_tax, 10 ),
72
- valueWithTax: parseInt( totals.total_tax, 10 ),
73
- } );
74
-
75
- if ( needsShipping ) {
76
- newTotals.push(
77
- factory(
78
- __( 'Shipping:', 'woo-gutenberg-products-block' ),
79
- 'total_shipping'
80
- )
81
- );
82
- }
83
-
84
- return newTotals;
85
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/shipping/index.js DELETED
@@ -1,2 +0,0 @@
1
- export * from './use-select-shipping-rate';
2
- export * from './use-select-shipping-rates';
 
 
assets/js/base/context/hooks/shipping/use-select-shipping-rate.ts DELETED
@@ -1,81 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
5
- import isShallowEqual from '@wordpress/is-shallow-equal';
6
- import { CartShippingPackageShippingRate } from '@woocommerce/type-defs/cart';
7
-
8
- /**
9
- * Internal dependencies
10
- */
11
- import { useSelectShippingRates } from './use-select-shipping-rates';
12
- import { useStoreEvents } from '../use-store-events';
13
-
14
- /**
15
- * Selected rates are derived by looping over the shipping rates.
16
- *
17
- * @param {Array} shippingRates Array of shipping rates.
18
- * @return {string} Selected rate id.
19
- */
20
- // This will find the selected rate ID in an array of shipping rates.
21
- const deriveSelectedRateId = (
22
- shippingRates: CartShippingPackageShippingRate[]
23
- ) => shippingRates.find( ( rate ) => rate.selected )?.rate_id;
24
-
25
- /**
26
- * This is a custom hook for tracking selected shipping rates for a package and selecting a rate. State is used so
27
- * changes are reflected in the UI instantly.
28
- *
29
- * @param {string} packageId Package ID to select rates for.
30
- * @param {Array} shippingRates an array of packages with shipping rates.
31
- * @return {Object} This hook will return an object with these properties:
32
- * - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
33
- * - selectedShippingRate: The selected rate id.
34
- * - isSelectingRate: True when rates are being resolved to the API.
35
- */
36
- export const useSelectShippingRate = (
37
- packageId: string | number,
38
- shippingRates: CartShippingPackageShippingRate[]
39
- ): {
40
- selectShippingRate: ( newShippingRateId: string ) => unknown;
41
- selectedShippingRate: string | undefined;
42
- isSelectingRate: boolean;
43
- } => {
44
- const { dispatchCheckoutEvent } = useStoreEvents();
45
-
46
- // Rates are selected via the shipping data context provider.
47
- const { selectShippingRate, isSelectingRate } = useSelectShippingRates();
48
-
49
- // Selected rates are stored in state. This allows shipping rates changes to be shown in the UI instantly.
50
- // Defaults to the currently selected rate_id.
51
- const [ selectedShippingRate, setSelectedShippingRate ] = useState( () =>
52
- deriveSelectedRateId( shippingRates )
53
- );
54
-
55
- // This ref is used to track when changes come in via the props. When the incoming shipping rates change, update our local state if there are changes to selected methods.
56
- const currentShippingRates = useRef( shippingRates );
57
- useEffect( () => {
58
- if ( ! isShallowEqual( currentShippingRates.current, shippingRates ) ) {
59
- currentShippingRates.current = shippingRates;
60
- setSelectedShippingRate( deriveSelectedRateId( shippingRates ) );
61
- }
62
- }, [ shippingRates ] );
63
-
64
- // Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
65
- const setPackageRateId = useCallback(
66
- ( newShippingRateId ) => {
67
- setSelectedShippingRate( newShippingRateId );
68
- selectShippingRate( newShippingRateId, packageId );
69
- dispatchCheckoutEvent( 'set-selected-shipping-rate', {
70
- shippingRateId: newShippingRateId,
71
- } );
72
- },
73
- [ packageId, selectShippingRate, dispatchCheckoutEvent ]
74
- );
75
-
76
- return {
77
- selectShippingRate: setPackageRateId,
78
- selectedShippingRate,
79
- isSelectingRate,
80
- };
81
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/shipping/use-select-shipping-rates.ts DELETED
@@ -1,55 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useDispatch, useSelect } from '@wordpress/data';
5
- import { useCallback } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useThrowError } from '@woocommerce/base-hooks';
8
-
9
- /**
10
- * This is a custom hook for selecting shipping rates
11
- *
12
- * @return {Object} This hook will return an object with these properties:
13
- * - selectShippingRate: A function that immediately returns the selected rate and dispatches an action generator.
14
- * - isSelectingRate: True when rates are being resolved to the API.
15
- */
16
- export const useSelectShippingRates = (): {
17
- selectShippingRate: (
18
- newShippingRateId: string,
19
- packageId: string | number
20
- ) => unknown;
21
- isSelectingRate: boolean;
22
- } => {
23
- const throwError = useThrowError();
24
- const { selectShippingRate } = ( useDispatch( storeKey ) as {
25
- selectShippingRate: unknown;
26
- } ) as {
27
- selectShippingRate: (
28
- newShippingRateId: string,
29
- packageId: string | number
30
- ) => Promise< unknown >;
31
- };
32
-
33
- // Sets a rate for a package in state (so changes are shown right away to consumers of the hook) and in the stores.
34
- const setRate = useCallback(
35
- ( newShippingRateId, packageId ) => {
36
- selectShippingRate( newShippingRateId, packageId ).catch(
37
- ( error ) => {
38
- // we throw this error because an error on selecting a rate is problematic.
39
- throwError( error );
40
- }
41
- );
42
- },
43
- [ throwError, selectShippingRate ]
44
- );
45
-
46
- // See if rates are being selected.
47
- const isSelectingRate = useSelect< boolean >( ( select ) => {
48
- return select( storeKey ).isShippingRateBeingSelected();
49
- }, [] );
50
-
51
- return {
52
- selectShippingRate: setRate,
53
- isSelectingRate,
54
- };
55
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/test/use-store-snackbar-notices.js DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { render, act } from '@testing-library/react';
5
- import { StoreSnackbarNoticesProvider } from '@woocommerce/base-context/providers';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { useStoreSnackbarNotices } from '../use-store-snackbar-notices';
11
-
12
- describe( 'useStoreNoticesWithSnackbar', () => {
13
- function setup() {
14
- const returnVal = {};
15
-
16
- function TestComponent() {
17
- Object.assign( returnVal, useStoreSnackbarNotices() );
18
-
19
- return null;
20
- }
21
-
22
- render(
23
- <StoreSnackbarNoticesProvider>
24
- <TestComponent />
25
- </StoreSnackbarNoticesProvider>
26
- );
27
-
28
- return returnVal;
29
- }
30
-
31
- test( 'allows adding and removing notices and checking if there are notices of a specific type', () => {
32
- const storeNoticesData = setup();
33
-
34
- // Assert initial state.
35
- expect( storeNoticesData.notices ).toEqual( [] );
36
-
37
- // Add snackbar notice.
38
- act( () => {
39
- storeNoticesData.addSnackbarNotice( 'Snackbar notice' );
40
- } );
41
-
42
- expect( storeNoticesData.notices.length ).toBe( 1 );
43
-
44
- // Remove all remaining notices.
45
- act( () => {
46
- storeNoticesData.removeNotices();
47
- } );
48
-
49
- expect( storeNoticesData.notices.length ).toBe( 0 );
50
- } );
51
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-checkout-address.js DELETED
@@ -1,130 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { defaultAddressFields } from '@woocommerce/settings';
5
- import { useState, useEffect, useCallback, useRef } from '@wordpress/element';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import {
11
- useShippingDataContext,
12
- useCustomerDataContext,
13
- useCheckoutContext,
14
- } from '../providers/cart-checkout';
15
-
16
- /**
17
- * Compare two addresses and see if they are the same.
18
- *
19
- * @param {Object} address1 First address.
20
- * @param {Object} address2 Second address.
21
- */
22
- const isSameAddress = ( address1, address2 ) => {
23
- return Object.keys( defaultAddressFields ).every(
24
- ( field ) => address1[ field ] === address2[ field ]
25
- );
26
- };
27
-
28
- /**
29
- * Custom hook for exposing address related functionality for the checkout address form.
30
- */
31
- export const useCheckoutAddress = () => {
32
- const { customerId } = useCheckoutContext();
33
- const { needsShipping } = useShippingDataContext();
34
- const {
35
- billingData,
36
- setBillingData,
37
- shippingAddress,
38
- setShippingAddress,
39
- } = useCustomerDataContext();
40
-
41
- // This tracks the state of the "shipping as billing" address checkbox. It's
42
- // initial value is true (if shipping is needed), however, if the user is
43
- // logged in and they have a different billing address, we can toggle this off.
44
- const [ shippingAsBilling, setShippingAsBilling ] = useState(
45
- () =>
46
- needsShipping &&
47
- ( ! customerId || isSameAddress( shippingAddress, billingData ) )
48
- );
49
-
50
- const currentShippingAsBilling = useRef( shippingAsBilling );
51
- const previousBillingData = useRef( billingData );
52
-
53
- /**
54
- * Sets shipping address data, and also billing if using the same address.
55
- */
56
- const setShippingFields = useCallback(
57
- ( value ) => {
58
- setShippingAddress( value );
59
-
60
- if ( shippingAsBilling ) {
61
- setBillingData( value );
62
- }
63
- },
64
- [ shippingAsBilling, setShippingAddress, setBillingData ]
65
- );
66
-
67
- /**
68
- * Sets billing address data, and also shipping if shipping is disabled.
69
- */
70
- const setBillingFields = useCallback(
71
- ( value ) => {
72
- setBillingData( value );
73
-
74
- if ( ! needsShipping ) {
75
- setShippingAddress( value );
76
- }
77
- },
78
- [ needsShipping, setShippingAddress, setBillingData ]
79
- );
80
-
81
- // When the "Use same address" checkbox is toggled we need to update the current billing address to reflect this;
82
- // that is either setting the billing address to the shipping address, or restoring the billing address to it's
83
- // previous state.
84
- useEffect( () => {
85
- if ( currentShippingAsBilling.current !== shippingAsBilling ) {
86
- if ( shippingAsBilling ) {
87
- previousBillingData.current = billingData;
88
- setBillingData( shippingAddress );
89
- } else {
90
- const {
91
- // We need to pluck out email and phone from previous billing data because they can be empty, causing the current email and phone to get emptied. See issue #4155
92
- /* eslint-disable no-unused-vars */
93
- email,
94
- phone,
95
- /* eslint-enable no-unused-vars */
96
- ...billingAddress
97
- } = previousBillingData.current;
98
- setBillingData( {
99
- ...billingAddress,
100
- } );
101
- }
102
- currentShippingAsBilling.current = shippingAsBilling;
103
- }
104
- }, [ shippingAsBilling, setBillingData, shippingAddress, billingData ] );
105
-
106
- const setEmail = ( value ) =>
107
- void setBillingData( {
108
- email: value,
109
- } );
110
- const setPhone = ( value ) =>
111
- void setBillingData( {
112
- phone: value,
113
- } );
114
-
115
- // Note that currentShippingAsBilling is returned rather than the current state of shippingAsBilling--this is so that
116
- // the billing fields are not rendered before sync (billing field values are debounced and would be outdated)
117
- return {
118
- defaultAddressFields,
119
- shippingFields: shippingAddress,
120
- setShippingFields,
121
- billingFields: billingData,
122
- setBillingFields,
123
- setEmail,
124
- setPhone,
125
- shippingAsBilling,
126
- setShippingAsBilling,
127
- showBillingFields:
128
- ! needsShipping || ! currentShippingAsBilling.current,
129
- };
130
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-checkout-notices.js DELETED
@@ -1,57 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useSelect } from '@wordpress/data';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { useEmitResponse } from './use-emit-response';
10
-
11
- /**
12
- * @typedef {import('@woocommerce/type-defs/contexts').StoreNoticeObject} StoreNoticeObject
13
- * @typedef {import('@woocommerce/type-defs/hooks').CheckoutNotices} CheckoutNotices
14
- */
15
-
16
- /**
17
- * A hook that returns all notices visible in the Checkout block.
18
- *
19
- * @return {CheckoutNotices} Notices from the checkout form or payment methods.
20
- */
21
- export const useCheckoutNotices = () => {
22
- const { noticeContexts } = useEmitResponse();
23
-
24
- /**
25
- * @type {StoreNoticeObject[]}
26
- */
27
- const checkoutNotices = useSelect(
28
- ( select ) => select( 'core/notices' ).getNotices( 'wc/checkout' ),
29
- []
30
- );
31
-
32
- /**
33
- * @type {StoreNoticeObject[]}
34
- */
35
- const expressPaymentNotices = useSelect(
36
- ( select ) =>
37
- select( 'core/notices' ).getNotices(
38
- noticeContexts.EXPRESS_PAYMENTS
39
- ),
40
- [ noticeContexts.EXPRESS_PAYMENTS ]
41
- );
42
-
43
- /**
44
- * @type {StoreNoticeObject[]}
45
- */
46
- const paymentNotices = useSelect(
47
- ( select ) =>
48
- select( 'core/notices' ).getNotices( noticeContexts.PAYMENTS ),
49
- [ noticeContexts.PAYMENTS ]
50
- );
51
-
52
- return {
53
- checkoutNotices,
54
- expressPaymentNotices,
55
- paymentNotices,
56
- };
57
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-checkout-submit.js DELETED
@@ -1,47 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { __ } from '@wordpress/i18n';
5
-
6
- /**
7
- * Internal dependencies
8
- */
9
- import { useCheckoutContext } from '../providers/cart-checkout/checkout-state';
10
- import { usePaymentMethodDataContext } from '../providers/cart-checkout/payment-methods';
11
- import { usePaymentMethods } from './payment-methods/use-payment-methods';
12
-
13
- /**
14
- * Returns the submitButtonText, onSubmit interface from the checkout context,
15
- * and an indication of submission status.
16
- */
17
- export const useCheckoutSubmit = () => {
18
- const {
19
- onSubmit,
20
- isCalculating,
21
- isBeforeProcessing,
22
- isProcessing,
23
- isAfterProcessing,
24
- isComplete,
25
- hasError,
26
- } = useCheckoutContext();
27
- const { paymentMethods = {} } = usePaymentMethods();
28
- const {
29
- activePaymentMethod,
30
- currentStatus: paymentStatus,
31
- } = usePaymentMethodDataContext();
32
- const paymentMethod = paymentMethods[ activePaymentMethod ] || {};
33
- const waitingForProcessing =
34
- isProcessing || isAfterProcessing || isBeforeProcessing;
35
- const waitingForRedirect = isComplete && ! hasError;
36
-
37
- return {
38
- submitButtonText:
39
- paymentMethod?.placeOrderButtonLabel ||
40
- __( 'Place Order', 'woo-gutenberg-products-block' ),
41
- onSubmit,
42
- isCalculating,
43
- isDisabled: isProcessing || paymentStatus.isDoingExpressPayment,
44
- waitingForProcessing,
45
- waitingForRedirect,
46
- };
47
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-customer-data.ts DELETED
@@ -1,181 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { useDispatch } from '@wordpress/data';
5
- import { useEffect, useState, useCallback, useRef } from '@wordpress/element';
6
- import { CART_STORE_KEY as storeKey } from '@woocommerce/block-data';
7
- import { useDebounce } from 'use-debounce';
8
- import isShallowEqual from '@wordpress/is-shallow-equal';
9
- import {
10
- formatStoreApiErrorMessage,
11
- pluckAddress,
12
- pluckEmail,
13
- } from '@woocommerce/base-utils';
14
- import type {
15
- CartResponseBillingAddress,
16
- CartResponseShippingAddress,
17
- } from '@woocommerce/types';
18
-
19
- declare type CustomerData = {
20
- billingData: CartResponseBillingAddress;
21
- shippingAddress: CartResponseShippingAddress;
22
- };
23
-
24
- /**
25
- * Internal dependencies
26
- */
27
- import { useStoreCart } from './cart/use-store-cart';
28
- import { useStoreNotices } from './use-store-notices';
29
-
30
- function instanceOfCartResponseBillingAddress(
31
- address: CartResponseBillingAddress | CartResponseShippingAddress
32
- ): address is CartResponseBillingAddress {
33
- return 'email' in address;
34
- }
35
-
36
- /**
37
- * Does a shallow compare of important address data to determine if the cart needs updating on the server.
38
- *
39
- * This takes the current and previous address into account, as well as the billing email field.
40
- *
41
- * @param {Object} previousAddress An object containing all previous address information
42
- * @param {Object} address An object containing all address information
43
- *
44
- * @return {boolean} True if the store needs updating due to changed data.
45
- */
46
- const shouldUpdateAddressStore = <
47
- T extends CartResponseBillingAddress | CartResponseShippingAddress
48
- >(
49
- previousAddress: T,
50
- address: T
51
- ): boolean => {
52
- if (
53
- instanceOfCartResponseBillingAddress( address ) &&
54
- pluckEmail( address ) !==
55
- pluckEmail( previousAddress as CartResponseBillingAddress )
56
- ) {
57
- return true;
58
- }
59
-
60
- return (
61
- !! address.country &&
62
- ! isShallowEqual(
63
- pluckAddress( previousAddress ),
64
- pluckAddress( address )
65
- )
66
- );
67
- };
68
-
69
- /**
70
- * This is a custom hook for syncing customer address data (billing and shipping) with the server.
71
- */
72
- export const useCustomerData = (): {
73
- billingData: CartResponseBillingAddress;
74
- shippingAddress: CartResponseShippingAddress;
75
- setBillingData: ( data: CartResponseBillingAddress ) => void;
76
- setShippingAddress: ( data: CartResponseShippingAddress ) => void;
77
- } => {
78
- const { updateCustomerData } = useDispatch( storeKey );
79
- const { addErrorNotice, removeNotice } = useStoreNotices();
80
-
81
- // Grab the initial values from the store cart hook.
82
- const {
83
- billingAddress: initialBillingAddress,
84
- shippingAddress: initialShippingAddress,
85
- }: Omit< CustomerData, 'billingData' > & {
86
- billingAddress: CartResponseBillingAddress;
87
- } = useStoreCart();
88
-
89
- // State of customer data is tracked here from this point, using the initial values from the useStoreCart hook.
90
- const [ customerData, setCustomerData ] = useState< CustomerData >( {
91
- billingData: initialBillingAddress,
92
- shippingAddress: initialShippingAddress,
93
- } );
94
-
95
- // Store values last sent to the server in a ref to avoid requests unless important fields are changed.
96
- const previousCustomerData = useRef< CustomerData >( customerData );
97
-
98
- // Debounce updates to the customerData state so it's not triggered excessively.
99
- const [ debouncedCustomerData ] = useDebounce( customerData, 1000, {
100
- // Default equalityFn is prevData === newData.
101
- equalityFn: ( prevData, newData ) => {
102
- return (
103
- isShallowEqual( prevData.billingData, newData.billingData ) &&
104
- isShallowEqual(
105
- prevData.shippingAddress,
106
- newData.shippingAddress
107
- )
108
- );
109
- },
110
- } );
111
-
112
- /**
113
- * Set billing data.
114
- *
115
- * Contains special handling for email and phone so those fields are not overwritten if simply updating address.
116
- */
117
- const setBillingData = useCallback( ( newData ) => {
118
- setCustomerData( ( prevState ) => {
119
- return {
120
- ...prevState,
121
- billingData: {
122
- ...prevState.billingData,
123
- ...newData,
124
- },
125
- };
126
- } );
127
- }, [] );
128
-
129
- /**
130
- * Set shipping data.
131
- */
132
- const setShippingAddress = useCallback( ( newData ) => {
133
- setCustomerData( ( prevState ) => ( {
134
- ...prevState,
135
- shippingAddress: newData,
136
- } ) );
137
- }, [] );
138
-
139
- /**
140
- * This pushes changes to the API when the local state differs from the address in the cart.
141
- */
142
- useEffect( () => {
143
- // Only push updates when enough fields are populated.
144
- if (
145
- ! shouldUpdateAddressStore(
146
- previousCustomerData.current.billingData,
147
- debouncedCustomerData.billingData
148
- ) &&
149
- ! shouldUpdateAddressStore(
150
- previousCustomerData.current.shippingAddress,
151
- debouncedCustomerData.shippingAddress
152
- )
153
- ) {
154
- return;
155
- }
156
- previousCustomerData.current = debouncedCustomerData;
157
- updateCustomerData( {
158
- billing_address: debouncedCustomerData.billingData,
159
- shipping_address: debouncedCustomerData.shippingAddress,
160
- } )
161
- .then( () => {
162
- removeNotice( 'checkout' );
163
- } )
164
- .catch( ( response ) => {
165
- addErrorNotice( formatStoreApiErrorMessage( response ), {
166
- id: 'checkout',
167
- } );
168
- } );
169
- }, [
170
- debouncedCustomerData,
171
- addErrorNotice,
172
- removeNotice,
173
- updateCustomerData,
174
- ] );
175
- return {
176
- billingData: customerData.billingData,
177
- shippingAddress: customerData.shippingAddress,
178
- setBillingData,
179
- setShippingAddress,
180
- };
181
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-emit-response.ts DELETED
@@ -1,66 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { isObject } from '@woocommerce/types';
5
-
6
- export enum responseTypes {
7
- SUCCESS = 'success',
8
- FAIL = 'failure',
9
- ERROR = 'error',
10
- }
11
-
12
- export enum noticeContexts {
13
- PAYMENTS = 'wc/payment-area',
14
- EXPRESS_PAYMENTS = 'wc/express-payment-area',
15
- }
16
-
17
- export interface ResponseType extends Record< string, unknown > {
18
- type: responseTypes;
19
- retry?: boolean;
20
- }
21
-
22
- const isResponseOf = (
23
- response: unknown,
24
- type: string
25
- ): response is ResponseType => {
26
- return isObject( response ) && 'type' in response && response.type === type;
27
- };
28
-
29
- export const isSuccessResponse = (
30
- response: unknown
31
- ): response is ResponseType => {
32
- return isResponseOf( response, responseTypes.SUCCESS );
33
- };
34
-
35
- export const isErrorResponse = (
36
- response: unknown
37
- ): response is ResponseType => {
38
- return isResponseOf( response, responseTypes.ERROR );
39
- };
40
-
41
- export const isFailResponse = (
42
- response: unknown
43
- ): response is ResponseType => {
44
- return isResponseOf( response, responseTypes.FAIL );
45
- };
46
-
47
- export const shouldRetry = ( response: unknown ): boolean => {
48
- return (
49
- ! isObject( response ) ||
50
- typeof response.retry === 'undefined' ||
51
- response.retry === true
52
- );
53
- };
54
-
55
- /**
56
- * A custom hook exposing response utilities for emitters.
57
- */
58
- export const useEmitResponse = () =>
59
- ( {
60
- responseTypes,
61
- noticeContexts,
62
- shouldRetry,
63
- isSuccessResponse,
64
- isErrorResponse,
65
- isFailResponse,
66
- } as const );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/base/context/hooks/use-store-events.ts DELETED
@@ -1,66 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { doAction } from '@wordpress/hooks';
5
- import { useCallback, useRef, useEffect } from '@wordpress/element';
6
-
7
- /**
8
- * Internal dependencies
9
- */
10
- import { useStoreCart } from './cart/use-store-cart';
11
-
12
- type StoreEvent = (
13
- eventName: string,
14
- eventParams?: Partial< Record< string, unknown > >
15
- ) => void;
16
-
17
- /**
18
- * Abstraction on top of @wordpress/hooks for dispatching events via doAction for 3rd parties to hook into.
19
- */
20
- export const useStoreEvents = (): {
21
- dispatchStoreEvent: StoreEvent;
22
- dispatchCheckoutEvent: StoreEvent;
23
- } => {
24
- const storeCart = useStoreCart();
25
- const currentStoreCart = useRef( storeCart );
26
-
27
- // Track the latest version of the cart so we can use the current value in our callback function below without triggering
28
- // other useEffect hooks using dispatchCheckoutEvent as a dependency.
29
- useEffect( () => {
30
- currentStoreCart.current = storeCart;
31
- }, [ storeCart ] );
32
-
33
- const dispatchStoreEvent = useCallback( ( eventName, eventParams = {} ) => {
34
- try {
35
- doAction(
36
- `experimental__woocommerce_blocks-${ eventName }`,
37
- eventParams
38
- );
39
- } catch ( e ) {
40
- // We don't handle thrown errors but just console.log for troubleshooting.
41
- // eslint-disable-next-line no-console
42
- console.error( e );
43
- }
44
- }, [] );
45
-
46
- const dispatchCheckoutEvent = useCallback(
47
- ( eventName, eventParams = {} ) => {
48
- try {
49
- doAction(
50
- `experimental__woocommerce_blocks-checkout-${ eventName }`,
51
- {
52
- ...eventParams,
53
- storeCart: currentStoreCart.current,
54
- }
55
- );
56
- } catch ( e ) {
57
- // We don't handle thrown errors but just console.log for troubleshooting.
58
- // eslint-disable-next-line no-console
59
- console.error( e );
60
- }
61
- },
62
- []
63
- );
64
-
65
- return { dispatchStoreEvent, dispatchCheckoutEvent };
66
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/js/{base/context/hooks/use-store-snackbar-notices.js → b} RENAMED
File without changes