Authored by ccbikai

Merge branch 'feature/sale' into release/1.0

Showing 62 changed files with 677 additions and 1585 deletions
1 'use strict'; 1 'use strict';
2 2
3 const mRoot = '../models'; 3 const mRoot = '../models';
4 -const library = '../../../library';  
5 4
6 const couponModel = require(`${mRoot}/coupon`); // 领取优惠券 model 5 const couponModel = require(`${mRoot}/coupon`); // 领取优惠券 model
7 -const log = require(`${library}/logger`);  
8 6
9 exports.index = (req, res, next) => { 7 exports.index = (req, res, next) => {
10 var renderData = { 8 var renderData = {
1 -var API = require('../../../library/api').API;  
2 -var api = new API(); 1 +var api = global.yoho.API;
3 2
4 /** 3 /**
5 * 分享页面基础参数 4 * 分享页面基础参数
@@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
8 const request = require('request-promise'); 8 const request = require('request-promise');
9 const Promise = require('bluebird'); 9 const Promise = require('bluebird');
10 const crypto = require('crypto'); 10 const crypto = require('crypto');
11 -const logger = require('../../../library/logger');  
12 -const cache = require('../../../library/cache'); 11 +const logger = global.yoho.logger;
  12 +const cache = global.yoho.cache;
13 13
14 // 此处请勿使用有货公众号的 appId, 此处使用的是 女生志 的appId 14 // 此处请勿使用有货公众号的 appId, 此处使用的是 女生志 的appId
15 const appId = 'wxb52ec6a352f0b090'; 15 const appId = 'wxb52ec6a352f0b090';
@@ -27,24 +27,22 @@ const saleModel = require(`${mRoot}/sale`); @@ -27,24 +27,22 @@ const saleModel = require(`${mRoot}/sale`);
27 * @param {[string]} page js文件page名称 27 * @param {[string]} page js文件page名称
28 * @return {[type]} 28 * @return {[type]}
29 */ 29 */
30 -const _processPublicData = (req, title, page) => {  
31 - let data = {};  
32 - let headerData = headerModel.setNav({  
33 - navTitle: title  
34 - });  
35 -  
36 - data = { 30 +const _processPublicData = (req, title, page, backUrl) => {
  31 + return {
37 channel: req.yoho.channel, 32 channel: req.yoho.channel,
38 renderData: { 33 renderData: {
39 module: 'product', 34 module: 'product',
40 page: page, 35 page: page,
41 title: title, 36 title: title,
42 - pageHeader: headerData, 37 + saleNav: true,
  38 + pageHeader: headerModel.setNav({
  39 + navTitle: title,
  40 + navBtn: false,
  41 + backUrl: backUrl || ''
  42 + }),
43 pageFooter: true 43 pageFooter: true
44 } 44 }
45 }; 45 };
46 -  
47 - return data;  
48 }; 46 };
49 47
50 /** 48 /**
@@ -54,9 +52,31 @@ const _processPublicData = (req, title, page) => { @@ -54,9 +52,31 @@ const _processPublicData = (req, title, page) => {
54 * @return {[type]} 52 * @return {[type]}
55 */ 53 */
56 let index = (req, res, next) => { 54 let index = (req, res, next) => {
57 - let params = _processPublicData(req, 'SALE', 'sale'); 55 + let refer = req.get('Referer') || '';
  56 + let reqPath = req.baseUrl + req.path;
  57 + let backUrl = refer.indexOf(reqPath) === -1 ? refer : '';
  58 +
  59 + if (['boys', 'girls', 'kids', 'lifestyle'].indexOf(req.yoho.channel) === -1) {
  60 + return next();
  61 + }
  62 +
  63 + backUrl && res.cookie('saleRefer', backUrl);
  64 + backUrl = backUrl || req.cookies.saleRefer;
  65 +
  66 + let params = _processPublicData(req, 'SALE', 'sale', backUrl);
58 67
59 saleModel.getSaleData(params.channel).then((result) => { 68 saleModel.getSaleData(params.channel).then((result) => {
  69 +
  70 + // 扩展头部频道选择数据
  71 + Object.assign(params.renderData.pageHeader, {
  72 + saleNav: saleModel.saleNav(req.yoho.channel)
  73 + });
  74 +
  75 + // 此处 channel 需要读取 cookies 的 channel
  76 + if (req.cookies._Channel) {
  77 + res.locals.pageChannel = {};
  78 + res.locals.pageChannel[req.cookies._Channel] = true;
  79 + }
60 res.render('sale/index', Object.assign(params.renderData, { 80 res.render('sale/index', Object.assign(params.renderData, {
61 content: result, 81 content: result,
62 floorHeader: { 82 floorHeader: {
@@ -94,7 +114,9 @@ let discount = (req, res, next) => { @@ -94,7 +114,9 @@ let discount = (req, res, next) => {
94 let params = _processPublicData(req, '折扣专场', 'discount'); 114 let params = _processPublicData(req, '折扣专场', 'discount');
95 115
96 saleModel.getDiscountData(params.channel).then((result) => { 116 saleModel.getDiscountData(params.channel).then((result) => {
97 - res.render('sale/discount', Object.assign(params.renderData, result)); 117 + res.render('sale/discount', Object.assign(params.renderData, {
  118 + data: result
  119 + }));
98 }).catch(next); 120 }).catch(next);
99 }; 121 };
100 122
@@ -109,7 +131,7 @@ let discountDetail = (req, res, next) => { @@ -109,7 +131,7 @@ let discountDetail = (req, res, next) => {
109 let id = req.query.id; 131 let id = req.query.id;
110 let params = _processPublicData(req, '', 'discount-detail'); 132 let params = _processPublicData(req, '', 'discount-detail');
111 133
112 - saleModel.getDiscountDetailData(id, params.channel).then((result) => { 134 + saleModel.getDiscountDetailData(id, req.yoho.channel).then((result) => {
113 params.renderData.pageHeader.navTitle = result.title; 135 params.renderData.pageHeader.navTitle = result.title;
114 res.render('sale/discount-detail', Object.assign(params.renderData, result)); 136 res.render('sale/discount-detail', Object.assign(params.renderData, result));
115 }).catch(next); 137 }).catch(next);
@@ -158,8 +180,6 @@ let filter = (req, res, next) => { @@ -158,8 +180,6 @@ let filter = (req, res, next) => {
158 */ 180 */
159 let search = (req, res, next) => { 181 let search = (req, res, next) => {
160 let params = Object.assign({}, req.query); 182 let params = Object.assign({}, req.query);
161 -  
162 - // uid = 9239279  
163 let uid = req.user.uid || 0; 183 let uid = req.user.uid || 0;
164 184
165 saleModel.getSearchData(params, uid).then((result) => { 185 saleModel.getSearchData(params, uid).then((result) => {
@@ -15,8 +15,7 @@ const processTime = require(`${utils}/time-process`); @@ -15,8 +15,7 @@ const processTime = require(`${utils}/time-process`);
15 const _ = require('lodash'); 15 const _ = require('lodash');
16 const api = global.yoho.API; 16 const api = global.yoho.API;
17 const serviceAPI = global.yoho.ServiceAPI; 17 const serviceAPI = global.yoho.ServiceAPI;
18 -  
19 - 18 +const helpers = global.yoho.helpers;
20 19
21 /** 20 /**
22 * 排序转换 21 * 排序转换
@@ -37,11 +36,43 @@ const channelType = { @@ -37,11 +36,43 @@ const channelType = {
37 boys: '1', 36 boys: '1',
38 girls: '2', 37 girls: '2',
39 kids: '3', 38 kids: '3',
40 - lifeStyle: '4', 39 + lifestyle: '4',
41 all: '1,2,3,4' 40 all: '1,2,3,4'
42 }; 41 };
43 42
44 /** 43 /**
  44 + * 频道转换
  45 + * 产品要求,SALE的导航显示 Boy,Girl 单数形式
  46 + */
  47 +const channelHash = {
  48 + boys: 'Boy',
  49 + girls: 'Girl',
  50 + kids: 'Kid',
  51 + lifestyle: 'Lifestyle'
  52 +};
  53 +
  54 +const saleNav = (channel) => {
  55 + return {
  56 + channel: channelHash[channel],
  57 + list: [
  58 + {
  59 + title: 'Boy',
  60 + url: helpers.urlFormat('/product/sale', {channel: 'boys'})
  61 + }, {
  62 + title: 'Girl',
  63 + url: helpers.urlFormat('/product/sale', {channel: 'girls'})
  64 + }, {
  65 + title: 'Kid',
  66 + url: helpers.urlFormat('/product/sale', {channel: 'kids'})
  67 + }, {
  68 + title: 'Lifestyle',
  69 + url: helpers.urlFormat('/product/sale', {channel: 'lifestyle'})
  70 + }
  71 + ]
  72 + };
  73 +};
  74 +
  75 +/**
45 * 资源位code码 76 * 资源位code码
46 */ 77 */
47 const contentCode = contentCodeConfig.sale; 78 const contentCode = contentCodeConfig.sale;
@@ -51,7 +82,7 @@ const contentCode = contentCodeConfig.sale; @@ -51,7 +82,7 @@ const contentCode = contentCodeConfig.sale;
51 * @param {[array]} list 82 * @param {[array]} list
52 * @return {[array]} 83 * @return {[array]}
53 */ 84 */
54 -const _processDiscount = (list, channel) => { 85 +const _processDiscount = (list) => {
55 const formatData = []; 86 const formatData = [];
56 let flag = true; 87 let flag = true;
57 88
@@ -65,7 +96,6 @@ const _processDiscount = (list, channel) => { @@ -65,7 +96,6 @@ const _processDiscount = (list, channel) => {
65 96
66 _.forEach(list, (data) => { 97 _.forEach(list, (data) => {
67 if (flag === true) { 98 if (flag === true) {
68 - data.specialUrl = `/product/sale/discount/detail?id=${data.id}&channel=${channel}`;  
69 Object.assign(data, processTime(data.leftTime)); 99 Object.assign(data, processTime(data.leftTime));
70 } 100 }
71 101
@@ -87,7 +117,9 @@ const _discount = (params) => { @@ -87,7 +117,9 @@ const _discount = (params) => {
87 method: 'app.activity.get', 117 method: 'app.activity.get',
88 sort: 2, 118 sort: 2,
89 plateform: 3 119 plateform: 3
90 - }, params)); 120 + }, params), {
  121 + cache: true
  122 + });
91 }; 123 };
92 124
93 /** 125 /**
@@ -158,7 +190,9 @@ const _searchSales = (params) => { @@ -158,7 +190,9 @@ const _searchSales = (params) => {
158 190
159 return api.get('', Object.assign({ 191 return api.get('', Object.assign({
160 method: method 192 method: method
161 - }, params), true); 193 + }, params), {
  194 + cache: true
  195 + });
162 }; 196 };
163 197
164 /** 198 /**
@@ -176,7 +210,9 @@ const _getUserProfile = (uid) => { @@ -176,7 +210,9 @@ const _getUserProfile = (uid) => {
176 return api.get('', { 210 return api.get('', {
177 method: 'app.passport.profile', 211 method: 'app.passport.profile',
178 uid: uid 212 uid: uid
179 - }, true); 213 + }, {
  214 + cache: true
  215 + });
180 }; 216 };
181 217
182 /** 218 /**
@@ -187,6 +223,8 @@ const _getUserProfile = (uid) => { @@ -187,6 +223,8 @@ const _getUserProfile = (uid) => {
187 const _getResources = (page, channel) => { 223 const _getResources = (page, channel) => {
188 return serviceAPI.get('operations/api/v5/resource/get', { 224 return serviceAPI.get('operations/api/v5/resource/get', {
189 content_code: contentCode[channel][page] 225 content_code: contentCode[channel][page]
  226 + }, {
  227 + cache: true
190 }).then((result) => { 228 }).then((result) => {
191 if (result && result.code === 200) { 229 if (result && result.code === 200) {
192 return resourcesProcess(result.data); 230 return resourcesProcess(result.data);
@@ -206,6 +244,8 @@ const _getBreakingSort = (yhChannel) => { @@ -206,6 +244,8 @@ const _getBreakingSort = (yhChannel) => {
206 return api.get('', { 244 return api.get('', {
207 method: 'app.sale.getBreakingSort', 245 method: 'app.sale.getBreakingSort',
208 yh_channel: channelType[yhChannel] || '1' 246 yh_channel: channelType[yhChannel] || '1'
  247 + }, {
  248 + cache: true
209 }).then((result) => { 249 }).then((result) => {
210 if (result && result.code === 200) { 250 if (result && result.code === 200) {
211 return _processBreakingSort(result.data); 251 return _processBreakingSort(result.data);
@@ -302,14 +342,13 @@ const getBreakCodeData = (params) => { @@ -302,14 +342,13 @@ const getBreakCodeData = (params) => {
302 * @return {[object]} 342 * @return {[object]}
303 */ 343 */
304 const getDiscountData = (yhChannel) => { 344 const getDiscountData = (yhChannel) => {
305 - const discountData = {};  
306 -  
307 return _discount({ 345 return _discount({
308 yh_channel: channelType[yhChannel] || '1' 346 yh_channel: channelType[yhChannel] || '1'
309 }).then((result) => { 347 }).then((result) => {
310 if (result && result.code === 200) { 348 if (result && result.code === 200) {
311 - discountData.data = _processDiscount(result.data, yhChannel);  
312 - return discountData; 349 + return {
  350 + list: _processDiscount(result.data)
  351 + };
313 } else { 352 } else {
314 logger.error('折扣专场专题列表返回 code 不是 200'); 353 logger.error('折扣专场专题列表返回 code 不是 200');
315 return {}; 354 return {};
@@ -332,7 +371,9 @@ const getDiscountDetailData = (id, yhChannel) => { @@ -332,7 +371,9 @@ const getDiscountDetailData = (id, yhChannel) => {
332 return _discount(param).then((result) => { 371 return _discount(param).then((result) => {
333 if (result && result.code === 200) { 372 if (result && result.code === 200) {
334 res = _processDiscount(result.data); 373 res = _processDiscount(result.data);
335 - 374 + if (res[0] && res[0].coverUrl) {
  375 + res[0].coverUrl = res[0].coverUrl.replace('/extent/{width}x{height}', '');
  376 + }
336 return { 377 return {
337 title: res[0] && res[0].title, 378 title: res[0] && res[0].title,
338 productPool: res[0] && res[0].productPool, 379 productPool: res[0] && res[0].productPool,
@@ -355,5 +396,6 @@ module.exports = { @@ -355,5 +396,6 @@ module.exports = {
355 getDiscountDetailData, 396 getDiscountDetailData,
356 getVipData, 397 getVipData,
357 getFilterData, 398 getFilterData,
358 - getSearchData 399 + getSearchData,
  400 + saleNav
359 }; 401 };
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 <ul id="list-nav" class="list-nav clearfix"> 9 <ul id="list-nav" class="list-nav clearfix">
10 10
11 {{# sortData}} 11 {{# sortData}}
12 - <li {{#if @first}} class="active" {{/if}} data-id="{{sortId}}" data-allSub="{{allSub}}"> 12 + <li data-id="{{sortId}}" data-allSub="{{allSub}}">
13 <a href="javascript:void(0);"> 13 <a href="javascript:void(0);">
14 <span class="span-test">{{sortName}}</span> 14 <span class="span-test">{{sortName}}</span>
15 </a> 15 </a>
@@ -35,7 +35,7 @@ @@ -35,7 +35,7 @@
35 </div> 35 </div>
36 </div> 36 </div>
37 {{/ sub}} 37 {{/ sub}}
38 - </div> 38 + </div>
39 {{/ nav}} 39 {{/ nav}}
40 40
41 <div id="goods-container" class="goods-container"> 41 <div id="goods-container" class="goods-container">
1 <div class="discount-page yoho-page"> 1 <div class="discount-page yoho-page">
2 - <ul class="special-list">  
3 - {{#each data}}  
4 - <li>  
5 - <a href="{{specialUrl}}">  
6 - <img class="lazy" data-original="{{image coverUrl 640 250}}" />  
7 - <p class="special-cont">  
8 - <span class="special-title">{{title}}</span>  
9 - <span class="special-time {{#if warnColor}}red-color{{/if}}">{{time}}</span>  
10 - </p>  
11 - </a>  
12 - </li>  
13 - {{/each}}  
14 - </ul>  
15 -</div>  
  2 + {{> resources/discount-activity}}
  3 +</div>
@@ -10,14 +10,40 @@ @@ -10,14 +10,40 @@
10 {{#if smallPic}} 10 {{#if smallPic}}
11 {{> resources/thumb-row}} 11 {{> resources/thumb-row}}
12 {{/if}} 12 {{/if}}
  13 +
  14 + {{! 中间banner}}
  15 + {{#if singleImage}}
  16 + {{> resources/banner}}
  17 + {{/if}}
  18 +
  19 + {{!-- 折扣专场 --}}
  20 + {{#if discountActivity}}
  21 + {{> resources/discount-activity}}
  22 + {{/if}}
  23 +
  24 + {{!-- 会员专享 --}}
  25 + {{#if vipFloor}}
  26 + {{> resources/vip-floor}}
  27 + {{/if}}
  28 +
  29 + {{!-- 断码区 --}}
  30 + {{#if offCodeArea}}
  31 + {{> resources/off-code-area}}
  32 + {{/if}}
  33 +
  34 + {{!-- OUTLETS --}}
  35 + {{#if titleImage}}
  36 + {{> resources/goods-category}}
  37 + {{/if}}
13 {{/content}} 38 {{/content}}
14 39
15 {{#floorHeader}} 40 {{#floorHeader}}
16 {{> common/floor-header}} 41 {{> common/floor-header}}
17 {{/floorHeader}} 42 {{/floorHeader}}
18 43
19 - {{> common/filter-nav}}  
20 - 44 + <div class="sale-nav-wrap">
  45 + {{> common/filter-nav}}
  46 + </div>
21 {{> product/sale/common}} 47 {{> product/sale/common}}
22 48
23 </div> 49 </div>
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 7
8 {{# activity}} 8 {{# activity}}
9 <img src="{{image coverUrl 640 200}}"/> 9 <img src="{{image coverUrl 640 200}}"/>
10 - <p class="activity-time" data-time-ms="{{leftTime}}"><i class="iconfont time-ico">&#xe603;</i><span></span></p> 10 + <p class="activity-time" data-time-s="{{leftTime}}"><i class="iconfont time-ico">&#xe603;</i><span></span></p>
11 {{/ activity}} 11 {{/ activity}}
12 12
13 </div> 13 </div>
@@ -14,5 +14,3 @@ @@ -14,5 +14,3 @@
14 </div> 14 </div>
15 15
16 {{> common/query-param}} 16 {{> common/query-param}}
17 -  
18 -{{> common/suspend-cart}}  
@@ -22,7 +22,7 @@ const saleContentCode = { @@ -22,7 +22,7 @@ const saleContentCode = {
22 breakCode: '3f0898f1089b7bef5f3e071725c7a608', 22 breakCode: '3f0898f1089b7bef5f3e071725c7a608',
23 vip: '664935745012db6e2a96a7d57f75512f' 23 vip: '664935745012db6e2a96a7d57f75512f'
24 }, 24 },
25 - lifeStyle: { 25 + lifestyle: {
26 sale: '01269e498ff5b07756e0733ec0e88c75', 26 sale: '01269e498ff5b07756e0733ec0e88c75',
27 breakCode: '0020a5762771aa16902a666c9491394e', 27 breakCode: '0020a5762771aa16902a666c9491394e',
28 vip: '647f1154d30b323ff46c787fc78aef65' 28 vip: '647f1154d30b323ff46c787fc78aef65'
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 * @return {[type]} 3 * @return {[type]}
4 */ 4 */
5 const headerModel = require('../models/header'); 5 const headerModel = require('../models/header');
6 -const logger = require('../../library/logger'); 6 +const logger = global.yoho.logger;
7 7
8 exports.notFound = () => { 8 exports.notFound = () => {
9 return (req, res) => { 9 return (req, res) => {
@@ -21,7 +21,6 @@ exports.setNav = (opt) => { @@ -21,7 +21,6 @@ exports.setNav = (opt) => {
21 navBtn: true // 顶部下拉菜单选项 21 navBtn: true // 顶部下拉菜单选项
22 }; 22 };
23 23
24 -  
25 Object.assign(defaultOpt, opt || {}); 24 Object.assign(defaultOpt, opt || {});
26 25
27 if (defaultOpt.navBtn || _.isNull(defaultOpt.navBtn)) { 26 if (defaultOpt.navBtn || _.isNull(defaultOpt.navBtn)) {
@@ -47,6 +47,8 @@ @@ -47,6 +47,8 @@
47 <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/libs.js"></script> 47 <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/libs.js"></script>
48 <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script> 48 <script src="//cdn.yoho.cn/m-yohobuy-node/{{version}}/{{module}}.{{page}}.js"></script>
49 {{/if}} 49 {{/if}}
  50 + {{#unless devEnv}}
50 {{> analysis}} 51 {{> analysis}}
  52 + {{/unless}}
51 </body> 53 </body>
52 </html> 54 </html>
1 {{# title}} 1 {{# title}}
2 <div class="floor-header-more"> 2 <div class="floor-header-more">
3 - <h2>{{title}}</h2> 3 + <h2>{{#if title}}{{title}}{{else}}{{name}}{{/if}}</h2>
4 {{#if moreUrl}} 4 {{#if moreUrl}}
5 <a class="more-btn iconfont" href="{{moreUrl}}">&#xe618;</a> 5 <a class="more-btn iconfont" href="{{moreUrl}}">&#xe618;</a>
6 {{/if}} 6 {{/if}}
7 </div> 7 </div>
8 -{{/ title}}  
  8 +{{/ title}}
1 {{#pageHeader}} 1 {{#pageHeader}}
2 -{{# ../pageChannel}} 2 +{{# @root.pageChannel}}
3 <header id="yoho-header" class="yoho-header{{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}{{#if lifestyle}} life-style{{/if}}"> 3 <header id="yoho-header" class="yoho-header{{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}{{#if lifestyle}} life-style{{/if}}">
4 -{{/ ../pageChannel}} 4 +{{^}}
  5 +<header id="yoho-header" class="yoho-header">
  6 +{{/ @root.pageChannel}}
5 {{#navBack}} 7 {{#navBack}}
6 <a href="{{#if backUrl}}{{backUrl}}{{^}}javascript:history.go(-1);{{/if}}" class="iconfont nav-back">&#xe610;</a> 8 <a href="{{#if backUrl}}{{backUrl}}{{^}}javascript:history.go(-1);{{/if}}" class="iconfont nav-back">&#xe610;</a>
7 {{/navBack}} 9 {{/navBack}}
@@ -20,11 +22,26 @@ @@ -20,11 +22,26 @@
20 {{#navTitle}} 22 {{#navTitle}}
21 <p class="nav-title">{{.}}</p> 23 <p class="nav-title">{{.}}</p>
22 {{/navTitle}} 24 {{/navTitle}}
  25 + {{#saleNav}}
  26 + <span class="sale-nav nav-home">
  27 + {{channel}} <span class="iconfont">&#xe616;</span>
  28 + </span>
  29 + {{/saleNav}}
23 </header> 30 </header>
  31 +{{#if saleNav.list}}
  32 +<div class="sale-nav-select">
  33 + <span class="arrow"></span>
  34 + {{#each saleNav.list}}
  35 + <a href="{{url}}">{{title}}</a>
  36 + {{/each}}
  37 +</div>
  38 +{{/if}}
24 {{#navBtn}} 39 {{#navBtn}}
25 -{{# ../../pageChannel}} 40 +{{# @root.pageChannel}}
26 <div class="homebuttom hide {{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}{{#if lifestyle}} life-style{{/if}}"> 41 <div class="homebuttom hide {{#if boys}} boys{{/if}}{{#if girls}} girls{{/if}}{{#if kids}} kids{{/if}}{{#if lifeStyle}} life-style{{/if}}{{#if lifestyle}} life-style{{/if}}">
27 -{{/ ../../pageChannel}} 42 +{{^}}
  43 +<div class="homebuttom hide">
  44 +{{/ @root.pageChannel}}
28 <ul> 45 <ul>
29 <li> 46 <li>
30 <a href="{{ indexUrl }}"> 47 <a href="{{ indexUrl }}">
  1 +{{#data}}
  2 +{{#if ../discountActivity}}
  3 + {{> common/floor-header-more}}
  4 +{{/if}}
  5 +<ul class="discount-list">
  6 + {{#list}}
  7 + <li>
  8 + <a href="/product/sale/discount/detail?id={{id}}&channel={{@root.channel}}">
  9 + <img class="lazy" data-original="{{image coverUrl 640 250}}" />
  10 + <p class="discount-cont">
  11 + <span class="discount-title">{{title}}</span>
  12 + <span class="discount-time {{#if warnColor}}red-color{{/if}}">{{time}}</span>
  13 + </p>
  14 + </a>
  15 + </li>
  16 + {{/list}}
  17 +</ul>
  18 +{{/data}}
@@ -26,6 +26,7 @@ @@ -26,6 +26,7 @@
26 </div> 26 </div>
27 {{/if}} 27 {{/if}}
28 {{/ bigImage}} 28 {{/ bigImage}}
  29 + {{#if list}}
29 <ul class="category-list clearfix"> 30 <ul class="category-list clearfix">
30 {{# list}} 31 {{# list}}
31 <li> 32 <li>
@@ -42,5 +43,6 @@ @@ -42,5 +43,6 @@
42 </li> 43 </li>
43 {{/ list}} 44 {{/ list}}
44 </ul> 45 </ul>
  46 + {{/if}}
45 </div> 47 </div>
46 {{/data}} 48 {{/data}}
  1 +{{#data}}
  2 + {{> common/floor-header-more}}
  3 + {{> resources/banner-top}}
  4 +{{/data}}
  5 +{{> resources/left-right}}
1 -<div id="thumb-row"> 1 +<div class="thumb-row">
2 {{# data}} 2 {{# data}}
3 <a href="{{url}}"> 3 <a href="{{url}}">
4 <div class="thumb-row-box" style="background-image:url({{image src 275 160}})"></div> 4 <div class="thumb-row-box" style="background-image:url({{image src 275 160}})"></div>
  1 +{{#data}}
  2 + {{> common/floor-header-more}}
  3 + {{> resources/banner-top}}
  4 +{{/data}}
  5 +<div class="vip-floor clearfix" data-id={{data.title.productPoolId}}>
  6 +</div>
1 -/**  
2 - * 接口公共方法  
3 - * @author: xuqi<qi.xu@yoho.cn>  
4 - * @date: 2016/4/25  
5 - */  
6 -  
7 -'use strict';  
8 -const rp = require('request-promise');  
9 -const qs = require('querystring');  
10 -const md5 = require('md5');  
11 -const _ = require('lodash');  
12 -const log = require('./logger');  
13 -const cache = require('./cache');  
14 -const Timer = require('./timer');  
15 -const sign = require('./sign');  
16 -const config = require('../config/common');  
17 -const api = config.domains.api;  
18 -const serviceApi = config.domains.service;  
19 -const searchApi = config.domains.search;  
20 -  
21 -// 错误返回  
22 -const API_BAD_RETSULT = {  
23 - code: 500,  
24 - message: 'API result is not JSON string or null.'  
25 -};  
26 -  
27 -// 调用失败  
28 -const API_CALL_FAIL = {  
29 - code: 500,  
30 - message: 'Call API failed.'  
31 -};  
32 -  
33 -// all 方法错误的传参  
34 -const API_ALL_METHOD_ERROR = 'the parameters of api all method should be Array!';  
35 -  
36 -// 获取缓存数据失败  
37 -const SLAVE_CACHE_FAIL = 'get slave cache fail';  
38 -const MASTER_CACHE_FAIL = 'get master cache fail';  
39 -  
40 -// 获取缓存数据成功  
41 -const SLAVE_CACHE_SUCCESS = 'get slave cache success';  
42 -const MASTER_CACHE_SUCCESS = 'get master cache success';  
43 -  
44 -class Http {  
45 -  
46 - constructor(baseUrl) {  
47 - this.ApiUrl = baseUrl;  
48 - }  
49 -  
50 - /**  
51 - * 获取请求 ID  
52 - */  
53 - _getReqId(options) {  
54 - return md5(`${options.url}?${qs.stringify(options.qs || options.form)}`);  
55 - }  
56 -  
57 - /**  
58 - * 调用接口  
59 - */  
60 - _requestFromAPI(options, cacheOption, reqId) {  
61 - const timer = new Timer();  
62 - const method = options.method || 'get';  
63 -  
64 - timer.put('getApi');// 统计时间开始  
65 - return rp(options).then((result) => {  
66 - const duration = timer.put('getApi');// 统计时间结束  
67 -  
68 - // 数据校验  
69 - if (!result) {  
70 - log.error(`error: ${API_BAD_RETSULT.message}`);  
71 - return Promise.reject(API_BAD_RETSULT);  
72 - }  
73 -  
74 - // 写缓存, 否则返回 Slave 缓存服务器的数据  
75 - if (config.useCache && cacheOption) {  
76 - const cacheTime = _.isNumber(cacheOption) ? cacheOption : 60;  
77 - const catchErr = (err) => {  
78 - log.error(`cache: ${err.toString()}`);  
79 - };  
80 -  
81 - reqId = reqId || this._getReqId(options);  
82 - cache.set(`apiCache:${reqId}`, result, cacheTime).catch(catchErr);  
83 - cache.setSlave(`apiCache:${reqId}`, result, 86400).catch(catchErr); // 二级缓存存储一天  
84 - }  
85 -  
86 - let reqData = options.qs || options.form;  
87 -  
88 - log.info(`use: ${duration}ms for ${method} api: ${options.url}?${qs.stringify(reqData)} `);  
89 - return result;  
90 - }).catch((err)=> {  
91 - const duration = timer.put('getApi');// 统计时间结束  
92 -  
93 - log.error(`${method} api fail: use: ${duration}ms, code:${err.statusCode}, error: ${err.message}`);  
94 - log.error(`API: ${options.url}?${qs.stringify(options.qs)}`);  
95 -  
96 - // 使用缓存的时候,读取二级缓存  
97 - if (config.useCache && cacheOption) {  
98 - return this._requestFromCache(options, true);  
99 - }  
100 - return Promise.resolve(API_CALL_FAIL);  
101 - });  
102 - }  
103 -  
104 - /**  
105 - * 读取缓存  
106 - * @param {[object]} options  
107 - * @param {[boolean]} slave true: 读取二级缓存  
108 - * @return {[type]}  
109 - */  
110 - _requestFromCache(options, slave) {  
111 - const reqId = this._getReqId(options);  
112 - const getCache = slave ? cache.getFromSlave : cache.get;  
113 -  
114 - log.info(`get ${slave ? 'slave' : 'master'} cache: ${reqId}, url: ${options.url}?${qs.stringify(options.qs)}`);  
115 - return getCache(`apiCache:${reqId}`).then((result) => {  
116 - if (!_.isNil(result)) {  
117 - try {  
118 - result = JSON.parse(result);  
119 - } finally {  
120 - log.info(slave ? SLAVE_CACHE_SUCCESS : MASTER_CACHE_SUCCESS);  
121 - return result;  
122 - }  
123 - }  
124 -  
125 - // 读取缓存失败,并且不是二级缓存的时候,调用 API  
126 - if (!slave) {  
127 - return this._requestFromAPI(options, true, reqId);  
128 - }  
129 - }).catch(() => {  
130 - log.error(slave ? SLAVE_CACHE_FAIL : MASTER_CACHE_FAIL);  
131 -  
132 - // 读取缓存失败,并且不是二级缓存的时候,调用 API  
133 - if (!slave) {  
134 - return this._requestFromAPI(options, true, reqId);  
135 - }  
136 -  
137 - return Promise.resolve(API_CALL_FAIL);  
138 - });  
139 - }  
140 -  
141 - /**  
142 - * 使用 get 请求获取接口  
143 - * @param {[string]} url  
144 - * @param {[object]} data  
145 - * @param {[bool or number]} cacheOption 使用数字时,数字表示缓存时间  
146 - * @return {[type]}  
147 - */  
148 - get(url, data, cacheOption) {  
149 - const options = {  
150 - url: `${this.ApiUrl}${url}`,  
151 - qs: data.client_secret ? data : sign.apiSign(data),  
152 - json: true,  
153 - gzip: true,  
154 - timeout: 3000  
155 - };  
156 -  
157 - // 从缓存获取数据  
158 - if (config.useCache && cacheOption) {  
159 - return this._requestFromCache(options);  
160 - }  
161 -  
162 - return this._requestFromAPI(options, cacheOption);  
163 - }  
164 -  
165 - /**  
166 - * post  
167 - * @param url String  
168 - * @param data Obejct  
169 - */  
170 - post(url, data) {  
171 - const options = {  
172 - url: `${this.ApiUrl}${url}`,  
173 - form: data.client_secret ? data : sign.apiSign(data),  
174 - method: 'post',  
175 - json: true,  
176 - timeout: 3000  
177 - };  
178 -  
179 - return this._requestFromAPI(options);  
180 - }  
181 -  
182 - all(list) {  
183 - if (_.isArray(list)) {  
184 - return Promise.all(list);  
185 - } else {  
186 - return Promise.reject(Error(API_ALL_METHOD_ERROR));  
187 - }  
188 - }  
189 -}  
190 -  
191 -class API extends Http {  
192 - constructor() {  
193 - super(api);  
194 - }  
195 -}  
196 -  
197 -class ServiceAPI extends Http {  
198 - constructor() {  
199 - super(serviceApi);  
200 - }  
201 -}  
202 -  
203 -class SearchAPI extends Http {  
204 - constructor() {  
205 - super(searchApi);  
206 - }  
207 -}  
208 -  
209 -exports.API = API;  
210 -exports.ServiceAPI = ServiceAPI;  
211 -exports.SearchAPI = SearchAPI;  
1 -/**  
2 - * 缓存封装  
3 - * 前期使用 memcache, 写方法的时候考虑一下如何转换为 redis  
4 - * @author bikai kai.bi@yoho.cn  
5 - * @date 2016/05/16  
6 - */  
7 -'use strict';  
8 -const Promise = require('bluebird');  
9 -const Memcached = require('memcached');  
10 -const _ = require('lodash');  
11 -const config = require('../config/common');  
12 -  
13 -let master = new Memcached(config.memcache.master, config.memcache);  
14 -let slave = new Memcached(config.memcache.slave, config.memcache);  
15 -  
16 -master = Promise.promisifyAll(master);  
17 -slave = Promise.promisifyAll(slave);  
18 -  
19 -/**  
20 - * 获取缓存  
21 - * @param {[string]} key 键  
22 - * @return {[type]}  
23 - */  
24 -exports.get = (key) => {  
25 - if (_.isString(key)) {  
26 - return master.getAsync(key);  
27 - }  
28 -  
29 - return Promise.resolve();  
30 -};  
31 -  
32 -/**  
33 - * 批量获取缓存  
34 - * @param {[array]} list 字符串数组  
35 - * @return {[type]}  
36 - */  
37 -exports.getMulti = (list) => {  
38 - if (_.isArray(list)) {  
39 - return master.getMultiAsync(list);  
40 - }  
41 - return Promise.resolve();  
42 -};  
43 -  
44 -/**  
45 - * 获取缓存(从 Slave 服务器)  
46 - * @param {[string]} key 键  
47 - * @return {[type]}  
48 - */  
49 -exports.getFromSlave = (key) => {  
50 - if (_.isString(key)) {  
51 - return slave.getAsync(key);  
52 - }  
53 - return Promise.resolve();  
54 -};  
55 -  
56 -/**  
57 - * 批量获取缓存(从 Slave 服务器)  
58 - * @param {[array]} list 字符串数组  
59 - * @return {[type]}  
60 - */  
61 -exports.getMultiFromSlave = (list) => {  
62 - if (_.isArray(list)) {  
63 - return slave.getMultiAsync(list);  
64 - }  
65 - return Promise.resolve();  
66 -};  
67 -  
68 -/**  
69 - * 写缓存  
70 - * @param {[type]} key 键  
71 - * @param {[type]} value 值  
72 - * @param {[type]} lifetime 生命周期  
73 - * @return {[type]}  
74 - */  
75 -exports.set = (key, value, lifetime) => {  
76 - lifetime = lifetime || 86400;  
77 -  
78 - if (_.isObject(value)) {  
79 - value = JSON.stringify(value);  
80 - }  
81 -  
82 - if (_.isString(key)) {  
83 - return master.setAsync(key, value, lifetime);  
84 - }  
85 - return Promise.resolve();  
86 -};  
87 -  
88 -/**  
89 - * 写缓存(到 Slave 服务器)  
90 - * @param {[type]} key 键  
91 - * @param {[type]} value 值  
92 - * @param {[type]} lifetime 生命周期  
93 - * @return {[type]}  
94 - */  
95 -exports.setSlave = (key, value, lifetime) => {  
96 - lifetime = lifetime || 86400;  
97 -  
98 - if (_.isObject(value)) {  
99 - value = JSON.stringify(value);  
100 - }  
101 -  
102 - if (_.isString(key)) {  
103 - return slave.setAsync(key, value, lifetime);  
104 - }  
105 - return Promise.resolve();  
106 -};  
107 -  
108 -/**  
109 - * 删除缓存  
110 - * @param {[string]} key 键  
111 - * @return {[type]}  
112 - */  
113 -exports.del = (key) => {  
114 - if (_.isString(key)) {  
115 - return master.delAsync(key);  
116 - }  
117 - return Promise.resolve();  
118 -};  
1 -/**  
2 - * 对象键名驼峰化  
3 - * @author: Bi Kai<kai.bi@yoho.cn>  
4 - * @date: 2016/05/09  
5 - */  
6 -'use strict';  
7 -const _ = require('lodash');  
8 -  
9 -let camelCase,  
10 - camelCaseObject,  
11 - camelCaseArray;  
12 -  
13 -camelCaseObject = (obj) => {  
14 - _.forEach(Object.keys(obj), (k) => {  
15 - obj[k] = camelCase(obj[k]);  
16 - if (/[_-]/.test(k)) {  
17 - obj[_.camelCase(k)] = obj[k];  
18 - delete obj[k];  
19 - }  
20 - });  
21 - return obj;  
22 -};  
23 -  
24 -camelCaseArray = (list) => {  
25 - _.forEach(list, (k) => {  
26 - k = camelCase(k);  
27 - });  
28 - return list;  
29 -};  
30 -  
31 -camelCase = (data) => {  
32 - if (_.isArray(data)) {  
33 - data = camelCaseArray(data);  
34 - } else if (_.isObject(data)) {  
35 - data = camelCaseObject(data);  
36 - }  
37 -  
38 - return data;  
39 -};  
40 -  
41 -module.exports = camelCase;  
1 -/**  
2 - * 获取 UID  
3 - * @param {[object]} req  
4 - * @return {[string]}  
5 - */  
6 -'use strict';  
7 -const sign = require('./sign');  
8 -  
9 -exports.getUid = (req) => {  
10 - const cookie = req.cookies._UID;  
11 - let _uid = 0;  
12 - let cookieList;  
13 -  
14 - if (req.isApp) {  
15 - return req.query.uid || 0;  
16 - }  
17 -  
18 - if (cookie) {  
19 - cookieList = cookie.split('::');  
20 - if (cookieList[1] && !isNaN(cookieList[1])) {  
21 - _uid = cookieList[1];  
22 - }  
23 - }  
24 -  
25 - // 校验 cookie 的 uid 有没有被修改  
26 - if (req.cookies._TOKEN !== sign.makeToken(_uid)) {  
27 - _uid = 0;  
28 - }  
29 -  
30 - return _uid;  
31 -};  
32 -  
33 -exports.getShoppingKey = (req) => {  
34 - return req.cookies['_SPK'] ? req.cookies['_SPK'] : ''; // eslint-disable-line  
35 -};  
1 -/**  
2 - * Handlebars helpers  
3 - * bikai kai.bi@yoho.cn  
4 - * 2016-05-10  
5 - */  
6 -'use strict';  
7 -const querystring = require('querystring');  
8 -const _ = require('lodash');  
9 -const moment = require('moment');  
10 -const config = require('../config/common');  
11 -  
12 -/**  
13 - * 七牛图片路径处理  
14 - * @param {[string]} url  
15 - * @param {[string]} width  
16 - * @param {[string]} height  
17 - * @param {[string]} mode  
18 - * @return {[string]}  
19 - */  
20 -exports.image = (url, width, height, mode) => {  
21 - mode = _.isNumber(mode) ? mode : 2;  
22 - url = url || '';  
23 - url = url.replace(/{width}/g, width).replace(/{height}/g, height).replace(/{mode}/g, mode);  
24 -  
25 - return url.replace('http:', '');  
26 -};  
27 -  
28 -/**  
29 - * 条件判断  
30 - * @param {[string]} v1  
31 - * @param {[string]} v2  
32 - * @param {[object]} options 上下文环境,一般不手动传  
33 - * @return {[boolen]}  
34 - */  
35 -exports.isEqual = (v1, v2, _options) => {  
36 - if (_.isEqual(v1, v2)) {  
37 - return _options.fn(this); // eslint-disable-line  
38 - }  
39 -  
40 - return _options.inverse(this); // eslint-disable-line  
41 -};  
42 -  
43 -/**  
44 - * 站内地址格式化  
45 - * @param {[string]} uri 路径  
46 - * @param {[object]} qs 查询字符串  
47 - * @param {[string]} module 模块  
48 - * @return {[string]}  
49 - */  
50 -exports.urlFormat = (uri, qs, module) => {  
51 - const subDomain = '.m.yohobuy.com';  
52 - const subName = {  
53 - default: config.siteUrl,  
54 - guang: `//guang${subDomain}`,  
55 - list: `//list${subDomain}`,  
56 - search: `//search${subDomain}`,  
57 - huodong: `//huodong${subDomain}`,  
58 - activity: '//activity.yohobuy.com',  
59 - index: config.siteUrl  
60 - };  
61 - let url;  
62 -  
63 - module = module || 'default';  
64 - if (subName[module]) {  
65 - url = subName[module];  
66 - } else {  
67 - url = `//${module}${subDomain}`; // 规则没匹配到就把模块当作子域名  
68 - }  
69 -  
70 - url += uri;  
71 - if (qs) {  
72 - url += `?${querystring.stringify(qs)}`;  
73 - }  
74 -  
75 - return url;  
76 -};  
77 -  
78 -/**  
79 - * 大写转小写处理  
80 - * @param {[string]} str 转换字符  
81 - */  
82 -exports.lowerCase = (str) => {  
83 - str = str || '';  
84 - return str.toLowerCase();  
85 -};  
86 -  
87 -/**  
88 - * 小写转大写处理  
89 - * @param {[string]} str 转换字符  
90 - */  
91 -exports.upperCase = (str) => {  
92 - str = str || '';  
93 - return str.toUpperCase();  
94 -};  
95 -  
96 -  
97 -/**  
98 - * 四舍五入  
99 - * @param {[type]} num 数字  
100 - * @param {[type]} precision 精度  
101 - * @return {[type]}  
102 - */  
103 -exports.round = (num, precision) => {  
104 - precision = _.isNumber(precision) ? precision : 2;  
105 - num = _.isInteger(num) ? (+num).toFixed(precision) : _.round(num, precision);  
106 - return num;  
107 -};  
108 -  
109 -/**  
110 - * 链接改成自适应链接  
111 - * @return {[type]}  
112 - */  
113 -exports.https = (url) => {  
114 - return url.replace('http:', '');  
115 -};  
116 -  
117 -/**  
118 - * 时间格式化  
119 - * @param format 格式化token @see{http://momentjs.cn/docs/#/displaying/format/}  
120 - * @param date 日期或者数字  
121 - * @return string  
122 - *  
123 - */  
124 -exports.dateFormat = (format, date) => {  
125 - if (typeof format !== 'string' || typeof date === 'undefined') {  
126 - return '';  
127 - } else {  
128 - if (date instanceof Date) {  
129 - return moment(date).format(format);  
130 - } else {  
131 - const d = moment.unix(date);  
132 -  
133 - return moment(d).utc().format(format);  
134 - }  
135 - }  
136 -};  
137 -  
138 -/**  
139 - * 时间差格式化  
140 - * @param {[string]} format 格式化字符串  
141 - * @param {[number]} diff 相差值  
142 - * @param {[string]} type diff时间类型 默认ms  
143 - *  
144 - * Key Shorthand  
145 - * years y  
146 - * quarters Q  
147 - * months M  
148 - * weeks w  
149 - * days d  
150 - * hours h  
151 - * minutes m  
152 - * seconds s  
153 - * milliseconds ms  
154 - *  
155 - * @example  
156 - * let diff = 60 * 60 * 24 * (1.3) + 2;  
157 - *  
158 - * let s = helpers.dateDiffFormat('{d}天{h}小时', diff, 's');  
159 - * >>> 1天7小时  
160 - */  
161 -exports.dateDiffFormat = (format, diff, type) => {  
162 - if (typeof format !== 'string' || typeof diff === 'undefined') {  
163 - return '';  
164 - } else {  
165 - type = type || 'ms';  
166 - const m = moment.duration(diff, type);  
167 -  
168 - format.match(/(\{.*?\})/g).forEach((s) => {  
169 - format = format.replace(s, m.get(s.substring(1, s.length - 1)));  
170 - });  
171 -  
172 - return format;  
173 - }  
174 -};  
175 -  
176 -/**  
177 - * 验证邮箱是否合法  
178 - *  
179 - * @param string email  
180 - * @return boolean  
181 - */  
182 -exports.verifyEmail = (email) => {  
183 - if (!email) {  
184 - return false;  
185 - }  
186 -  
187 - const emailRegExp = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;  
188 -  
189 - return emailRegExp.test(email);  
190 -};  
191 -  
192 -/**  
193 - * 各国手机号规则  
194 - */  
195 -function areaMobileVerify(phone, area) {  
196 - area = area || '86';  
197 - phone = phone.trim();  
198 -  
199 - let verify = {  
200 - 86: {  
201 - name: '中国',  
202 - match: /^1[3|4|5|8|7][0-9]{9}$/.test(phone)  
203 - },  
204 - 852: {  
205 - name: '中国香港',  
206 - match: /^[9|6|5][0-9]{7}$/.test(phone)  
207 - },  
208 - 853: {  
209 - name: '中国澳门',  
210 - match: /^[0-9]{8}$/.test(phone)  
211 - },  
212 - 886: {  
213 - name: '中国台湾',  
214 - match: /^[0-9]{10}$/.test(phone)  
215 - },  
216 - 65: {  
217 - name: '新加坡',  
218 - match: /^[9|8][0-9]{7}$/.test(phone)  
219 - },  
220 - 60: {  
221 - name: '马来西亚',  
222 - match: /^1[1|2|3|4|6|7|9][0-9]{8}$/.test(phone)  
223 - },  
224 - 1: {  
225 - name: '加拿大&美国',  
226 - match: /^[0-9]{10}$/.test(phone)  
227 - },  
228 - 82: {  
229 - name: '韩国',  
230 - match: /^01[0-9]{9}$/.test(phone)  
231 - },  
232 - 44: {  
233 - name: '英国',  
234 - match: /^7[7|8|9][0-9]{8}$/.test(phone)  
235 - },  
236 - 81: {  
237 - name: '日本',  
238 - match: /^0[9|8|7][0-9]{9}$/.test(phone)  
239 - },  
240 - 61: {  
241 - name: '澳大利亚',  
242 - match: /^[0-9]{11}$/.test(phone)  
243 - }  
244 - };  
245 -  
246 - if (verify[area]) {  
247 - return verify[area].match;  
248 - } else {  
249 - return false;  
250 - }  
251 -}  
252 -  
253 -/**  
254 - * 验证国际手机号是否合法  
255 - */  
256 -exports.verifyAreaMobile = (areaMobile) => {  
257 - if (!areaMobile) {  
258 - return false;  
259 - }  
260 -  
261 - let mobile = {  
262 - area: '86',  
263 - phone: ''  
264 - };  
265 -  
266 - let splitMobile = areaMobile.split('-');  
267 -  
268 - if (splitMobile.length === 2) {  
269 - mobile.area = splitMobile[0];  
270 - mobile.phone = splitMobile[1];  
271 - } else {  
272 - mobile.phone = splitMobile[0];  
273 - }  
274 -  
275 - return areaMobileVerify(mobile.phone, mobile.area);  
276 -};  
277 -  
278 -/**  
279 - * 验证手机是否合法  
280 - */  
281 -exports.verifyMobile = (phone) => {  
282 - if (!phone) {  
283 - return false;  
284 - }  
285 -  
286 - return /^1[3|4|5|8|7][0-9]{9}$/.test(phone);  
287 -};  
288 -  
289 -/**  
290 - * 验证密码规则  
291 - */  
292 -exports.verifyPassword = (password) => {  
293 - if (!password) {  
294 - return false;  
295 - }  
296 -  
297 - return /^([a-zA-Z0-9\-\+_!@\#$%\^&\*\(\)\:\;\.=\[\]\\\',\?]){6,20}$/.test(password);  
298 -};  
1 -/**  
2 - * 日志工具类  
3 - * @author: hbomb<qiqi.zhou@yoho.cn>  
4 - * @date: 2016/05/06  
5 - */  
6 -'use strict';  
7 -  
8 -const winston = require('winston');  
9 -const config = require('../config/common');  
10 -const FileTransport = require('winston-daily-rotate-file');  
11 -  
12 -require('influxdb-winston');  
13 -  
14 -const logger = new(winston.Logger)({  
15 - transports: [  
16 - new(FileTransport)(config.loggers.infoFile),  
17 - new(FileTransport)(config.loggers.errorFile),  
18 - new(winston.transports.UdpTransport)(config.loggers.udp),  
19 - new(winston.transports.Console)(config.loggers.console)  
20 - ],  
21 - exitOnError: false  
22 -});  
23 -  
24 -module.exports = logger;  
1 -/**  
2 - * 签名  
3 - * @author: bikai  
4 - * @date: 2016/5/6  
5 - */  
6 -  
7 -'use strict';  
8 -const _ = require('lodash');  
9 -const md5 = require('md5');  
10 -  
11 -const privateKey = {  
12 - android: 'fd4ad5fcfa0de589ef238c0e7331b585',  
13 - iphone: 'a85bb0674e08986c6b115d5e3a4884fa',  
14 - ipad: 'ad9fcda2e679cf9229e37feae2cdcf80',  
15 - web: '0ed29744ed318fd28d2c07985d3ba633',  
16 - yoho: 'fd4ad5fcsa0de589af23234ks1923ks',  
17 - h5: 'fd4ad5fcfa0de589ef238c0e7331b585'  
18 -};  
19 -  
20 -/**  
21 - * 排序参数  
22 - * @param {Object} argument 需要排序的参数对象  
23 - * @return {Object} 排序之后的参数对象  
24 - */  
25 -const packageSort = argument => {  
26 - const newObj = {};  
27 -  
28 - for (const k of Object.keys(argument).sort()) {  
29 - newObj[k] = argument[k];  
30 - }  
31 -  
32 - return newObj;  
33 -};  
34 -  
35 -/**  
36 - * 生成签名  
37 - * @param {Object} argument 需要签名的数据  
38 - * @return {string} 生成的签名字符串  
39 - */  
40 -const makeSign = argument => {  
41 - const qs = [];  
42 -  
43 - _.forEach(argument, (value, key) => {  
44 - qs.push(`${key}=${_.trim(value)}`);  
45 - });  
46 -  
47 - return md5(qs.join('&')).toLowerCase();  
48 -};  
49 -  
50 -// 生成API签名,调用后端接口的时候有私钥校验  
51 -exports.apiSign = (params) => {  
52 - const clientType = params.client_type || 'h5';  
53 -  
54 - /* eslint-disable */  
55 - let sign = packageSort(Object.assign({  
56 - client_type: clientType,  
57 - private_key: privateKey[clientType],  
58 - app_version: '4.6.0',  
59 - os_version: 'yohobuy:h5',  
60 - screen_size: '720x1280',  
61 - v: '7'  
62 - }, params));  
63 - /* eslint-enable */  
64 -  
65 - sign = Object.assign(sign, {  
66 - client_secret: makeSign(sign) // eslint-disable-line camelcase  
67 - });  
68 - delete sign.private_key;  
69 - return sign;  
70 -};  
71 -  
72 -// 检查签名,APP 访问 H5 页面的时候需要检查  
73 -exports.checkSign = (params) => {  
74 - const // eslint-disable-line camelcase  
75 - clientSecret = params.client_secret;  
76 -  
77 - let sortedParams;  
78 -  
79 - // 忽略部分参数  
80 - delete params.client_secret;  
81 - delete params.q;  
82 - delete params.debug_data;  
83 - delete params['/api'];  
84 -  
85 - params.private_key = privateKey[params.client_type]; // eslint-disable-line camelcase  
86 - sortedParams = packageSort(params);  
87 -  
88 - return clientSecret === makeSign(sortedParams);  
89 -};  
90 -  
91 -// 检查签名,APP 访问 H5 页面的时候需要检查, 有可能不同于上边的签名方式  
92 -exports.webSign = (params) => {  
93 - const webPrivateKey = 'yohobuyapp';  
94 -  
95 - return params.key === md5(md5(webPrivateKey) + params.uid);  
96 -};  
97 -  
98 -// 生成 token  
99 -exports.makeToken = (string) => {  
100 - return md5(md5(string + '#@!@#'));  
101 -};  
102 -  
103 -// 校验 token  
104 -exports.verifyToken = (string, token) => {  
105 - return exports.makeToken(string) === token;  
106 -};  
1 -/**  
2 - * 计时类  
3 - * @example  
4 - * let timer = new Timer();  
5 - * timer.put('profile');  
6 - * timer.put('proflie'); // console output: 12.14  
7 - *  
8 - * @author: hbomb<qiqi.zhou@yoho.cn>  
9 - * @date: 2016/05/07  
10 - */  
11 -'use strict';  
12 -class Timer {  
13 - constructor() {  
14 - this.timers = {};  
15 - }  
16 -  
17 - /**  
18 - * 打点计时  
19 - */  
20 - put(label) {  
21 - const labelTime = this.timers[label];  
22 -  
23 - if (labelTime) {  
24 - const duration = process.hrtime(labelTime);  
25 -  
26 - return this._round(duration[0], duration[1]);  
27 - } else {  
28 - this.timers[label] = process.hrtime();  
29 - }  
30 - }  
31 -  
32 - /**  
33 - * 格式化成毫秒  
34 - * @param {Number} value 纳秒  
35 - */  
36 - _round(seconds, nanoseconds) {  
37 - return Math.round((seconds * 1e9 + nanoseconds) / 10000) / 100;  
38 - }  
39 -  
40 -}  
41 -  
42 -module.exports = Timer;  
1 -webpackJsonp([19],[function(e,n,o){var t,i,s=o(1),a=s("#orderCode").html(),d=s("#oldUserCouponPic").html(),r=s("#newUserCouponPic").html(),l=s("#tipMessage").html(),c=s("#activityID").html(),h="//m.yohobuy.com/life/getSignPackage",u=s("#shareTitle").val(),m=s("#shareImg").val(),p=s("#shareDesc").val(),g=s("#shareLink").val(),v=window.wx;o(3),s("#phone").bind("input propertychange",function(){11===s(this).val().length?s(".input-content div").eq("0").addClass("verification-code"):(s(".input-content div").eq("0").removeClass(),s(this).val().length>=1?s(".input-content i").eq("0").removeClass("hidden"):s(".input-content i").eq("0").addClass("hidden"))}),s("#verification").bind("input propertychange",function(){4===s(this).val().length?s(".input-content div").eq("1").addClass("get"):(s(".input-content div").eq("1").removeClass(),s(this).val().length>=1?s(".input-content i").eq("1").removeClass("hidden"):s(".input-content i").eq("1").addClass("hidden"))}),s("#activityEnded").html()&&(s(".tip-wrap").removeClass("hidden"),s(".tip-wrap .title").html(l)),s("#newUser").html()||s(".gain-coupon-centent .coupon img").attr("src",d),"undefined"!=typeof v&&(s.getJSON(h+"?pageurl="+encodeURIComponent(location.href.split("#")[0])+"&callback=?",function(e){var n,o,t,i;e&&(n=e.appId.toString(),o=e.timestamp,t=e.nonceStr.toString(),i=e.signature.toString(),v.config({debug:!1,appId:n,timestamp:o,nonceStr:t,signature:i,jsApiList:["checkJsApi","onMenuShareTimeline","onMenuShareAppMessage","onMenuShareQQ","onMenuShareWeibo","hideMenuItems","showMenuItems","hideAllNonBaseMenuItem","showAllNonBaseMenuItem","translateVoice","startRecord","stopRecord","onRecordEnd","playVoice","pauseVoice","stopVoice","uploadVoice","downloadVoice","chooseImage","previewImage","uploadImage","downloadImage","getNetworkType","openLocation","getLocation","hideOptionMenu","showOptionMenu","closeWindow","scanQRCode","chooseWXPay","openProductSpecificView","addCard","chooseCard","openCard"]}))}),v.ready(function(){var e={title:u,desc:p,imgUrl:m,link:g};v.onMenuShareAppMessage(e),v.onMenuShareTimeline(e),v.onMenuShareQQ(e),v.onMenuShareWeibo(e)})),s(".phone-input-content div").on("click",function(){return t=s(this).siblings("input").val(),i=/[0-9]{11}/,i.test(t)?void s.ajax({url:"/activity/coupon/phone",data:{mobile:s("#phone").val(),ordercode:a},success:function(e){if(200===e.result.code)if(window._yas&&window._yas.sendCustomInfo&&window._yas.sendCustomInfo({activityID:c,returnCode:e.result.returnCode},!0),e.result.newUser?s(".gain-coupon-centent .coupon img").attr("src",r):s(".gain-coupon-centent .coupon img").attr("src",d),e.result.ended)s(".tip-wrap").removeClass("hidden"),s(".tip-wrap .title").html(e.result.message);else if(e.result.geted)s(".page .gain-coupon-centent").removeClass("hidden"),s(".page .coupon-centent").addClass("hidden"),s("#mobile").html("优惠券已放至账户"+e.result.mobile);else if(e.result.newUser)s(".coupon-centent .phone-input-content").addClass("hidden"),s(".coupon-centent .vertify-input-content").removeClass("hidden");else{if(e.result.wrongNumb)return s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">手机号错误,请重新输入。<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400);if(e.result.oldUserAskCouponOnceMore)return s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">您今天已经领过咯,速度去有货购潮流!<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" "),s(".page .gain-coupon-centent").removeClass("hidden"),s(".page .coupon-centent").addClass("hidden"),s("#mobile").html("优惠券已放至账户"+e.result.mobile)},2500)}else s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">网络错误<p>'),setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400)},error:function(){s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">网络错误,稍后再试!<p>'),setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400)}}):(s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">手机号错误,请重新输入。<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400))}),s(".vertify-input-content").on("click",".get",function(){s(".input-content div").eq("1").removeClass("get"),4===s(this).siblings("input").val().length?s.ajax({url:"/activity/coupon/verify",data:{identifycode:s("#verification").val(),mobile:s("#phone").val(),ordercode:a},dataType:"json",success:function(e){if(200===e.result.code)if(window._yas&&window._yas.sendCustomInfo&&window._yas.sendCustomInfo({activityID:c,returnCode:e.result.returnCode},!0),e.result.newUser?s(".gain-coupon-centent .coupon img").attr("src",r):s(".gain-coupon-centent .coupon img").attr("src",d),e.result.ended)s(".tip-wrap").removeClass("hidden"),s(".tip-wrap .title").html(e.result.message);else if(e.result.geted)s(".page .gain-coupon-centent").removeClass("hidden"),s(".page .coupon-centent").addClass("hidden"),s("#mobile").html("优惠券已放至账户"+e.result.mobile);else if(e.result.newUser)s(".coupon-centent .phone-input-content").addClass("hidden"),s(".coupon-centent .vertify-input-content").removeClass("hidden");else{if(e.result.wrongNumb)return s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">手机号错误,请重新输入。<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400);if(e.result.vertifyWrong)return s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">验证码错误,请重新输入。<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400);if(e.result.oldUserAskCouponOnceMore)return s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">您今天已经领过咯,速度去有货购潮流!<p>'),void setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" "),s(".page .gain-coupon-centent").removeClass("hidden"),s(".page .coupon-centent").addClass("hidden"),s("#mobile").html("优惠券已放至账户"+e.result.mobile)},2500)}else s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">'+e.result.message+"<p>"),setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400)},error:function(){s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">网络错误,稍后再试!<p>'),setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400)}}):(s("#dialog").removeClass("hidden"),s(".mask").removeClass("hidden"),s("#dialog .content").html('<p class="phone-error">验证码错误,请重新输入。<p>'),setTimeout(function(){s(".messages").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")},1400))}),s(".close").on("click",function(){s(".dialog").addClass("hidden"),s(".mask").addClass("hidden"),s("#dialog .content").html(" ")}),s(".coupon-description span").on("click",function(){s("#message").removeClass("hidden"),s(".mask").removeClass("hidden")}),s(".description").on("click",function(){s("#message").removeClass("hidden"),s(".mask").removeClass("hidden")}),s(".use-coupon-btn").on("click",function(){window._yas&&window._yas.sendCustomInfo&&window._yas.sendCustomInfo({activityID:c},!1)}),s(".input-content .clear-mobile").on("click",function(){s(".input-content input").eq("0").val(""),s(this).addClass("hidden"),s(".input-content div").eq("0").removeClass()}),s(".input-content .clear-verify").on("click",function(){s(".input-content input").eq("1").val(""),s(this).addClass("hidden"),s(".input-content div").eq("1").removeClass()})},,,function(e,n,o){function t(e){var n,o,t=document.cookie;return document.cookie&&""!==document.cookie&&(o=t.indexOf(e+"="),o>-1&&(o+=e.length+1,n=decodeURIComponent(m.trim(t.substring(o,t.indexOf(";",o)))))),n}function i(e,n,o){var t,i,s,a,d="";"undefined"!=typeof n&&(o=o||{},null===n&&(n="",o.expires=-1),o.expires&&("number"==typeof o.expires||o.expires.toUTCString)&&("number"==typeof o.expires?(a=new Date,a.setTime(a.getTime()+24*o.expires*60*60*1e3)):a=o.expires,d="; expires="+a.toUTCString()),t=o.path?"; path="+o.path:"",i=o.domain?"; domain="+o.domain:"",s=o.secure?"; secure":"",document.cookie=[e,"=",encodeURIComponent(n),d,t,i,s].join(""))}function s(){var e=!!navigator.cookieEnabled;return"undefined"!=typeof navigator.cookieEnabled||e||(document.cookie="testcookie",e=-1!==document.cookie.indexOf("testcookie")),e}function a(){var e,n=t("_UID");return"undefined"==typeof n?0:(e=n.split("::"),"undefined"==typeof e||e.length<4?0:e)}function d(){var e=a();return 0===e?0:e[1]}function r(){var e=t("_g");return"undefined"==typeof e?"":JSON.parse(e).k}function l(){var e;0!==g.length&&(e=Math.min(m(window).height(),window.screen.availHeight),m("body").height()<=e-parseInt(g.css("height"),0)?g.addClass("bottom"):g.removeClass("bottom"))}function c(e){var n=m(e).outerHeight();e&&g.css("margin-bottom",n+"px")}function h(){var e,n,o=[],t=window.location.search.slice(1).split("&");for(n=0;n<t.length;n++)e=t[n].split("="),o.push(e[0]),o[e[0]]=e[1];return o}function u(e){return e.replace(/(\d{3})\d{4}(\d{4})/,"$1****$2")}var m=o(1),p=o(4),g=m("#yoho-footer"),v=m(".yoho-page"),f=m(".yoho-header");!function(){var e,n=g.children(".op-row"),o=m(".back-to-top"),t=a();l(),0===t?n.prepend('<a href="http://m.yohobuy.com/signin.html?refer='+location.href+'">登录</a><span class="sep-line">|</span><a href="http://m.yohobuy.com/reg.html">注册</a>'):n.prepend('<span>Hi,</span><a class="user-name" href="http://m.yohobuy.com/home?tmp='+Math.random()+'">'+t[0]+'</a><a href="http://m.yohobuy.com/passport/signout/index">退出</a>'),o.length>0&&(e=new p(o[0]),e.on("tap",function(e){return m(window).scrollTop(0),e.srcEvent.preventDefault(),!1})),g.removeClass("hide")}(),function(e,n,o,t,i){var s=n.createElement(o),a=n.getElementsByTagName(o)[0];e.YohoAcquisitionObject=i,e[i]=function(){e[i].p=arguments},s.async=1,s.src=t,a.parentNode.insertBefore(s,a)}(window,document,"script",("https:"===document.location.protocol?"https":"http")+"://cdn.yoho.cn/yas-jssdk/1.0.17/yas.js","_yas"),function(){var e=d();e=0===e?"":e,window._ozuid=e,window._yas&&window._yas(1*new Date,"1.0.17","yohobuy_m",e,"","")}(),f.on("touchstart","a",function(){f.find("a").removeClass("highlight"),m(this).addClass("highlight")}).on("touchend touchcancel","a",function(){m(this).removeClass("highlight")}),v.on("touchstart",".tap-hightlight",function(){m(this).siblings(".tap-hightlight").removeClass("highlight"),m(this).addClass("highlight")}).on("touchend touchcancel",".tap-hightlight",function(){m(this).removeClass("highlight")}),m(".nav-home").on("touchstart",function(){m(".homebuttom").toggleClass("hide")}),function(){var e,n,o=0,t="webkit moz ms o".split(" "),i=window.requestAnimationFrame,s=window.cancelAnimationFrame;for(n=0;n<t.length&&(!i||!s);n++)e=t[n],i=i||window[e+"RequestAnimationFrame"],s=s||window[e+"CancelAnimationFrame"]||window[e+"CancelRequestAnimationFrame"];i&&s||(i=function(e){var n=(new Date).getTime(),t=Math.max(0,16-(n-o)),i=window.setTimeout(function(){e(n+t)},t);return o=n+t,i},s=function(e){window.clearTimeout(e)}),window.requestAnimationFrame=i,window.cancelAnimationFrame=s}(),m.extend({queryString:h}),11===g.find(".user-name").text().length&&g.find(".user-name").html(u(g.find(".user-name").text())),window.cookie=t,window.setCookie=i,window.isCookiesEnabled=s,window.getUser=a,window.getUid=d,window.getShoppingKey=r,window.rePosFooter=l,window.reMarginFooter=c,window.queryString=h()}]);  
No preview for this file type
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > 2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3 <svg xmlns="http://www.w3.org/2000/svg"> 3 <svg xmlns="http://www.w3.org/2000/svg">
4 <metadata> 4 <metadata>
5 -Created by FontForge 20120731 at Fri Apr 15 10:26:51 2016 5 +Created by FontForge 20120731 at Wed Jun 29 15:45:02 2016
6 By admin 6 By admin
7 </metadata> 7 </metadata>
8 <defs> 8 <defs>
@@ -16,10 +16,10 @@ Created by FontForge 20120731 at Fri Apr 15 10:26:51 2016 @@ -16,10 +16,10 @@ Created by FontForge 20120731 at Fri Apr 15 10:26:51 2016
16 ascent="896" 16 ascent="896"
17 descent="-128" 17 descent="-128"
18 x-height="792" 18 x-height="792"
19 - bbox="-0.75 -224 3943 896" 19 + bbox="-0.75 -128 3943 896.75"
20 underline-thickness="50" 20 underline-thickness="50"
21 underline-position="-100" 21 underline-position="-100"
22 - unicode-range="U+0078-E648" 22 + unicode-range="U+0078-E64C"
23 /> 23 />
24 <missing-glyph horiz-adv-x="374" 24 <missing-glyph horiz-adv-x="374"
25 d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" /> 25 d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" />
@@ -34,207 +34,211 @@ d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h91 @@ -34,207 +34,211 @@ d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h91
34 t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 34 t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
35 t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> 35 t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
36 <glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1463" 36 <glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1463"
37 -d="M798 -160q0 -46 25 -58t61 16l537 420q36 28 36 68t-36 68l-537 424q-36 29 -61 16.5t-25 -57.5v-238q-138 0 -252.5 -24.5t-192 -63t-137.5 -94t-94.5 -109.5t-57.5 -117t-31.5 -109.5t-11 -94t-1.5 -63.5t2 -25q47 62 87 104t90 78t103.5 57.5t127 36.5t161.5 21t207 6  
38 -v-262z" /> 37 +d="M798 -64q0 -46 25 -58t61 16l537 420q36 28 36 68t-36 68l-537 424q-36 29 -61 16.5t-25 -57.5v-238q-486 0 -676 -290q-102 -157 -102 -361q0 -49 2 -49q47 62 87 104t90 78t103.5 57.5t127 36.5t161.5 21t207 6v-262z" />
39 <glyph glyph-name="uniE601" unicode="&#xe601;" 38 <glyph glyph-name="uniE601" unicode="&#xe601;"
40 -d="M281 372q-14 -9 -23 -23t-9 -28v-7v-483h1q5 -24 24 -39.5t44 -15.5h582q28 0 48.5 20t20.5 49t-20.5 49t-48.5 20h41q35 0 59 24.5t24 58.5t-24 58.5t-59 24.5q35 0 59 24t24 58.5t-24 58.5t-59 24h-48q31 0 53.5 22.5t22.5 53.5v-13q0 31 -22.5 54t-53.5 24  
41 -q-125 6 -259 9q40 148 16 278q-8 44 -30.5 70.5t-49.5 31t-53 -4t-43 -35t-17 -62.5q-5 -34 -6.5 -64t-2.5 -42t-5 -30.5t-14 -42.5q-24 -60 -133 -115q-7 -2 -13 -6zM60 356q-25 0 -42.5 -17.5t-17.5 -42.5v-405q0 -25 17.5 -42.5t42.5 -17.5h134v525h-134z" /> 39 +d="M281 468q-14 -9 -23 -23t-9 -28v-7v-19v-464h1q5 -24 24 -39.5t44 -15.5h582q28 0 48.5 20t20.5 49t-20.5 49t-48.5 20h-215h256q35 0 59 24.5t24 58.5t-24 58.5t-59 24.5h-235h235q35 0 59 24t24 58.5t-24 58.5t-59 24h-259h211q31 0 53.5 22.5t22.5 53.5v-13
  40 +q0 31 -22.5 54t-53.5 24q-125 6 -259 9q40 148 16 278q-8 44 -30.5 70.5t-49.5 31t-53 -4t-43 -35t-17 -62.5q-5 -34 -6.5 -64t-2.5 -42t-5 -30.5t-14 -42.5q-24 -60 -133 -115q-7 -2 -13 -6zM60 452q-25 0 -42.5 -17.5t-17.5 -42.5v-405q0 -25 17.5 -42.5t42.5 -17.5h134
  41 +v525h-134z" />
42 <glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1323" 42 <glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1323"
43 -d="M643 472q0 -68 -47.5 -116t-113.5 -48q0 -68 47 -116t113.5 -48t113.5 48t47 116t-47 116t-113 48zM643 800q-79 0 -162 -28.5t-152 -74.5t-131 -102t-105 -110.5t-68 -101.5t-25 -75t25 -75t68 -102t105 -111t131 -101.5t152 -74.5t161.5 -29t161.5 29t152 74.5  
44 -t131 101.5t105 111t68 102t25 75t-25 75t-68 101.5t-105 110.5t-131 102t-152 74.5t-161 28.5zM643 -21q-88 0 -162 44t-117 120t-43 165t43 164.5t117 119.5t161.5 44t161.5 -44t117 -119.5t43 -164.5t-43 -165t-117 -120t-161 -44z" /> 43 +d="M643 568q0 -68 -47.5 -116t-113.5 -48q0 -68 47 -116t113.5 -48t113.5 48t47 116t-47 116t-113 48zM643 896q-79 0 -162 -28.5t-152 -74.5t-131 -102t-105 -110.5t-68 -101.5t-25 -75t25 -75t68 -102t105 -111t131 -101.5t152 -74.5t161.5 -29t161.5 29t152 74.5
  44 +t131 101.5t105 111t68 102t25 75t-25 75t-68 101.5t-105 110.5t-131 102t-152 74.5t-161 28.5zM643 75q-88 0 -162 44t-117 120t-43 165t43 164.5t117 119.5t161.5 44t161.5 -44t117 -119.5t43 -164.5t-43 -165t-117 -120t-161 -44z" />
45 <glyph glyph-name="uniE603" unicode="&#xe603;" 45 <glyph glyph-name="uniE603" unicode="&#xe603;"
46 -d="M512 286v343h85v-426h-81v-2h-256v85h252zM512 -224q139 0 257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5t-257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5z" /> 46 +d="M512 382v343h85v-426h-81v-2h-256v85h252zM512 -128q139 0 257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5t-257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5z" />
47 <glyph glyph-name="uniE604" unicode="&#xe604;" 47 <glyph glyph-name="uniE604" unicode="&#xe604;"
48 -d="M774 324q13 -17 11.5 -39.5t-17.5 -38.5q0 -1 -1 -1l-427 -428q-18 -17 -42.5 -17t-42 17.5t-17.5 42t17 41.5l387 387l-387 387q-17 17 -17 41.5t17.5 42t42 17.5t42.5 -17l427 -428q1 0 1 -1z" /> 48 +d="M774 420q13 -17 11.5 -39.5t-17.5 -38.5q0 -1 -1 -1l-427 -428q-18 -17 -42.5 -17t-42 17.5t-17.5 42t17 41.5l387 387l-387 387q-17 17 -17 41.5t17.5 42t42 17.5t42.5 -17l427 -428q1 0 1 -1z" />
49 <glyph glyph-name="uniE605" unicode="&#xe605;" 49 <glyph glyph-name="uniE605" unicode="&#xe605;"
50 -d="M707 748q-112 0 -195 -77q-83 77 -195 77q-121 0 -207 -88t-86 -212q0 -110 69 -194l2 -2l344 -391q30 -33 73 -33t73 33l344 391l2 2q69 84 69 194q0 124 -86 212t-207 88z" /> 50 +d="M707 844q-112 0 -195 -77q-83 77 -195 77q-121 0 -207 -88t-86 -212q0 -110 69 -194l2 -2l344 -391q30 -33 73 -33t73 33l344 391l2 2q69 84 69 194q0 124 -86 212t-207 88z" />
51 <glyph glyph-name="uniE606" unicode="&#xe606;" horiz-adv-x="1000" 51 <glyph glyph-name="uniE606" unicode="&#xe606;" horiz-adv-x="1000"
52 -d="M109.5 415q37.5 0 64 -26.5t26.5 -63.5t-26.5 -63.5t-64 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM515.5 415q37.5 0 63.5 -26.5t26 -63.5t-26 -63.5t-63.5 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM921 415q37 0 63.5 -26.5t26.5 -63.5t-26.5 -63.5 52 +d="M109.5 511q37.5 0 64 -26.5t26.5 -63.5t-26.5 -63.5t-64 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM515.5 511q37.5 0 63.5 -26.5t26 -63.5t-26 -63.5t-63.5 -26.5t-64 26.5t-26.5 63.5t26.5 63.5t64 26.5zM921 511q37 0 63.5 -26.5t26.5 -63.5t-26.5 -63.5
53 t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5z" /> 53 t-63.5 -26.5t-63.5 26.5t-26.5 63.5t26.5 63.5t63.5 26.5z" />
54 <glyph glyph-name="uniE607" unicode="&#xe607;" horiz-adv-x="1643" 54 <glyph glyph-name="uniE607" unicode="&#xe607;" horiz-adv-x="1643"
55 -d="M547 190h-1l45 -46l248 239l-45 46l-201 -194l-195 201l-46 -44z" /> 55 +d="M547 286h-1l45 -46l248 239l-45 46l-201 -194l-195 201l-46 -44z" />
56 <glyph glyph-name="uniE608" unicode="&#xe608;" horiz-adv-x="1821" 56 <glyph glyph-name="uniE608" unicode="&#xe608;" horiz-adv-x="1821"
57 -d="M930 135q-14 -13 -33.5 -13t-33.5 13l-252 242q-14 13 -14 32t14 32t34 13t34 -13l251 -242q14 -13 14 -32t-14 -32zM360 135q-14 13 -14 32t14 32l251 242q14 13 34 13t33.5 -13t13.5 -32t-13 -32l-252 -242q-14 -13 -33.5 -13t-33.5 13z" /> 57 +d="M930 231q-14 -13 -33.5 -13t-33.5 13l-252 242q-14 13 -14 32t14 32t34 13t34 -13l251 -242q14 -13 14 -32t-14 -32zM360 231q-14 13 -14 32t14 32l251 242q14 13 34 13t33.5 -13t13.5 -32t-13 -32l-252 -242q-14 -13 -33.5 -13t-33.5 13z" />
58 <glyph glyph-name="uniE609" unicode="&#xe609;" horiz-adv-x="1821" 58 <glyph glyph-name="uniE609" unicode="&#xe609;" horiz-adv-x="1821"
59 -d="M930 377l-251 -242q-14 -13 -34 -13t-34 13t-14 32t14 32l252 242q14 13 33.5 13t33.5 -13t14 -32t-14 -32zM427 441l252 -242q13 -13 13 -32t-13.5 -32t-33.5 -13t-34 13l-251 242q-14 13 -14 32t14 32t33.5 13t33.5 -13z" /> 59 +d="M930 473l-251 -242q-14 -13 -34 -13t-34 13t-14 32t14 32l252 242q14 13 33.5 13t33.5 -13t14 -32t-14 -32zM427 537l252 -242q13 -13 13 -32t-13.5 -32t-33.5 -13t-34 13l-251 242q-14 13 -14 32t14 32t33.5 13t33.5 -13z" />
60 <glyph glyph-name="uniE60A" unicode="&#xe60a;" 60 <glyph glyph-name="uniE60A" unicode="&#xe60a;"
61 -d="M1024 288q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257zM801 498l-365 -366l-156 156l-37 -37l193 -193l403 403z" /> 61 +d="M1024 384q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257zM801 594l-365 -366l-156 156l-37 -37l193 -193l403 403z" />
62 <glyph glyph-name="uniE60B" unicode="&#xe60b;" horiz-adv-x="1344" 62 <glyph glyph-name="uniE60B" unicode="&#xe60b;" horiz-adv-x="1344"
63 -d="M1280 236h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 -212h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 684 63 +d="M1280 320h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 -128h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM1280 768
64 h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" /> 64 h-1216q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5h1216q27 0 45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" />
65 <glyph glyph-name="uniE60C" unicode="&#xe60c;" 65 <glyph glyph-name="uniE60C" unicode="&#xe60c;"
66 -d="M1024 300q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257z" /> 66 +d="M1024 384q0 -139 -68.5 -257t-186.5 -186.5t-257 -68.5t-257 68.5t-186.5 186.5t-68.5 257t68.5 257t186.5 186.5t257 68.5t257 -68.5t186.5 -186.5t68.5 -257z" />
67 <glyph glyph-name="uniE60D" unicode="&#xe60d;" horiz-adv-x="1685" 67 <glyph glyph-name="uniE60D" unicode="&#xe60d;" horiz-adv-x="1685"
68 -d="M1229 -77l289 -135l58 124l-281 131q-21 -54 -66 -120zM944 475v-134h137v258q42 47 62 81l-118 69q-2 -4 -8 -12t-24.5 -30.5t-41 -45.5t-60.5 -54.5t-81 -59.5l75 -114q30 20 59 42zM1524 19v304h-605v-304h137v167h332v-167h136zM1283 169h-137v-66q0 -31 -20 -57.5  
69 -t-49.5 -45t-70.5 -34.5t-76.5 -25t-73.5 -17l74 -124q55 14 103 30.5t95.5 43t80.5 58t53.5 75.5t20.5 96v66zM1088 570l31 -133q42 9 85 21q19 -49 59 -78q49 -36 120 -36q45 0 92 14q69 21 133 78l-67 125q-17 -19 -46 -40.5t-60 -31.5q-63 -19 -91 1q-4 3 -8 9  
70 -q147 51 240 103l-81 111q-74 -38 -173 -74v85h-137v-129q-50 -14 -97 -25zM755 477v137h-348q11 42 19 84l-134 26q-11 -56 -28 -110h-200v-137h142q-79 -149 -206 -260l90 -103q43 38 85 83v-389h137v165h260v-24h-124l48 -137h83q54 0 92 38t38 92v490h-373q11 22 21 45  
71 -h398zM312 134h260v-24h-260v24zM312 295h260v-24h-260v24zM1683 732q0 -33 -22.5 -56t-55.5 -23t-56 23t-23 56t23 55.5t56 22.5t55.5 -22.5t22.5 -55.5zM1545 732q0 -26 17.5 -44.5t42.5 -18.5t41.5 18t16.5 44q0 27 -16.5 45.5t-42.5 18.5q-25 0 -42 -18.5t-17 -44.5z  
72 -M1592 691h-17v79q17 2 29 2q18 0 26 -6t8 -17q0 -13 -16 -19v-1q10 -3 14 -19q2 -13 6 -19h-19q-2 3 -6 19q-2 12 -16 12h-9v-31zM1593 735h8q18 0 18 12t-16 12q-6 0 -10 -1v-23z" /> 68 +d="M1229 7l289 -135l58 124l-281 131q-21 -54 -66 -120zM944 559v-134h137v258q42 47 62 81l-118 69q-2 -4 -8 -12t-24.5 -30.5t-41 -45.5t-60.5 -54.5t-81 -59.5l75 -114q30 20 59 42zM1524 103v304h-605v-304h137v167h332v-167h136zM1283 253h-137v-66q0 -31 -20 -57.5
  69 +t-49.5 -45t-70.5 -34.5t-76.5 -25t-73.5 -17l74 -124q55 14 103 30.5t95.5 43t80.5 58t53.5 75.5t20.5 96v66zM1088 654l31 -133q42 9 85 21q19 -49 59 -78q49 -36 120 -36q45 0 92 14q69 21 133 78l-67 125q-17 -19 -46 -40.5t-60 -31.5q-63 -19 -91 1q-4 3 -8 9
  70 +q147 51 240 103l-81 111q-74 -38 -173 -74v85h-137v-129q-50 -14 -97 -25zM755 561v137h-348q11 42 19 84l-134 26q-11 -56 -28 -110h-200v-137h142q-79 -149 -206 -260l90 -103q43 38 85 83v-389h137v165h260v-24h-124l48 -137h83q54 0 92 38t38 92v490h-373q11 22 21 45
  71 +h398zM312 218h260v-24h-260v24zM312 379h260v-24h-260v24zM1683 816q0 -33 -22.5 -56t-55.5 -23t-56 23t-23 56t23 55.5t56 22.5t55.5 -22.5t22.5 -55.5zM1545 816q0 -26 17.5 -44.5t42.5 -18.5t41.5 18t16.5 44q0 27 -16.5 45.5t-42.5 18.5q-25 0 -42 -18.5t-17 -44.5z
  72 +M1592 775h-17v79q17 2 29 2q18 0 26 -6t8 -17q0 -13 -16 -19v-1q10 -3 14 -19q2 -13 6 -19h-19q-2 3 -6 19q-2 12 -16 12h-9v-31zM1593 819h8q18 0 18 12t-16 12q-6 0 -10 -1v-23z" />
73 <glyph glyph-name="uniE60E" unicode="&#xe60e;" horiz-adv-x="3958" 73 <glyph glyph-name="uniE60E" unicode="&#xe60e;" horiz-adv-x="3958"
74 -d="M611 639h-177l-150 -222l-95 222h-178l168 -395v-2l-31 -243h156l30 231zM699 481q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM759 233q-5 -41 -35.5 -70.5t-68.5 -29.5  
75 -q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 59 -27q27 -30 21 -75zM1656 481q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM1717 233q-6 -41 -36.5 -70.5t-68.5 -29.5  
76 -q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 60 -27q26 -30 21 -75zM1332 418q-44 50 -114 50q-51 0 -97 -27l-10 -6l26 204h-156l-80 -640h155l37 288q3 24 22 41t43 17q25 0 40.5 -17.5t11.5 -41.5l-36 -287h156l37 298q10 71 -35 121zM2949 460l-37 -288  
77 -q-3 -24 -22 -41t-44 -17q-24 0 -39.5 17.5t-12.5 41.5l37 287h-156l-38 -298q-9 -71 36 -121q43 -50 114 -50q51 0 97 27l9 6l-3 -25h156l58 461h-155zM1951 639l-55 -432h156l55 432h-156zM1970 168q-37 0 -67 -26.5t-34.5 -63.5t18.5 -63q22 -26 59 -26t67 26.5t34 63.5  
78 -q5 37 -18 63t-59 26zM2608 178q6 51 -14.5 93.5t-62.5 65.5l-8 5l8 5q39 21 64 57t30 78q8 63 -30 108q-37 44 -97 48l-6 1h-314l-81 -640h317q72 3 128.5 55t65.5 124zM2451 200q-3 -27 -25 -46.5t-50 -19.5h-106l17 134h107q27 -1 43.5 -20.5t13.5 -47.5zM2483 447  
79 -q-3 -25 -23 -43t-45 -18h-113l15 124h112q25 0 41.5 -18.5t12.5 -44.5zM3132 -211q65 0 124 37.5t89 99.5l264 534h-156l-127 -258l-63 258h-156l113 -471l-7 -14q-8 -18 -25 -29t-36 -11q-10 0 -20 4l-29 11l-67 -139l29 -10q31 -12 67 -12zM3943 646q0 -65 -45 -110.5  
80 -t-110.5 -45.5t-111 45.5t-45.5 111t45.5 110.5t111.5 45q65 0 110 -45t45 -111zM3670 646q0 -52 34 -88t84 -36q49 -1 82.5 35.5t33.5 87.5q0 53 -33.5 89.5t-84.5 36.5q-49 0 -82.5 -36.5t-33.5 -88.5zM3763 566h-35v155q35 5 58 5q36 0 52 -12t16 -34q0 -26 -32 -37v-2  
81 -q20 -6 27 -37q5 -26 11 -38h-37q-4 5 -12 38q-4 23 -31 23h-17v-61zM3764 653h17q35 0 35 23t-32 23q-13 0 -20 -1v-45z" /> 74 +d="M611 723h-177l-150 -222l-95 222h-178l168 -395v-2l-31 -243h156l30 231zM699 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM759 317q-5 -41 -35.5 -70.5t-68.5 -29.5
  75 +q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 59 -27q27 -30 21 -75zM1656 565q-100 0 -179.5 -72.5t-92.5 -175.5q-13 -105 51 -178q61 -68 157 -68q99 0 178.5 72.5t92.5 175.5q13 104 -51 177q-60 69 -156 69zM1717 317q-6 -41 -36.5 -70.5t-68.5 -29.5
  76 +q-37 0 -60 27q-27 30 -21 75q5 41 36 70.5t69 29.5q36 0 60 -27q26 -30 21 -75zM1332 502q-44 50 -114 50q-51 0 -97 -27l-10 -6l26 204h-156l-80 -640h155l37 288q3 24 22 41t43 17q25 0 40.5 -17.5t11.5 -41.5l-36 -287h156l37 298q10 71 -35 121zM2949 544l-37 -288
  77 +q-3 -24 -22 -41t-44 -17q-24 0 -39.5 17.5t-12.5 41.5l37 287h-156l-38 -298q-9 -71 36 -121q43 -50 114 -50q51 0 97 27l9 6l-3 -25h156l58 461h-155zM1951 723l-55 -432h156l55 432h-156zM1970 252q-37 0 -67 -26.5t-34.5 -63.5t18.5 -63q22 -26 59 -26t67 26.5t34 63.5
  78 +q5 37 -18 63t-59 26zM2608 262q6 51 -14.5 93.5t-62.5 65.5l-8 5l8 5q39 21 64 57t30 78q8 63 -30 108q-37 44 -97 48l-6 1h-314l-81 -640h317q72 3 128.5 55t65.5 124zM2451 284q-3 -27 -25 -46.5t-50 -19.5h-106l17 134h107q27 -1 43.5 -20.5t13.5 -47.5zM2483 531
  79 +q-3 -25 -23 -43t-45 -18h-113l15 124h112q25 0 41.5 -18.5t12.5 -44.5zM3132 -127q65 0 124 37.5t89 99.5l264 534h-156l-127 -258l-63 258h-156l113 -471l-7 -14q-8 -18 -25 -29t-36 -11q-10 0 -20 4l-29 11l-67 -139l29 -10q31 -12 67 -12zM3943 730q0 -65 -45 -110.5
  80 +t-110.5 -45.5t-111 45.5t-45.5 111t45.5 110.5t111.5 45q65 0 110 -45t45 -111zM3670 730q0 -52 34 -88t84 -36q49 -1 82.5 35.5t33.5 87.5q0 53 -33.5 89.5t-84.5 36.5q-49 0 -82.5 -36.5t-33.5 -88.5zM3763 650h-35v155q35 5 58 5q36 0 52 -12t16 -34q0 -26 -32 -37v-2
  81 +q20 -6 27 -37q5 -26 11 -38h-37q-4 5 -12 38q-4 23 -31 23h-17v-61zM3764 737h17q35 0 35 23t-32 23q-13 0 -20 -1v-45z" />
82 <glyph glyph-name="uniE60F" unicode="&#xe60f;" 82 <glyph glyph-name="uniE60F" unicode="&#xe60f;"
83 -d="M682 74q-108 -89 -249 -89q-107 0 -197.5 53t-143.5 143.5t-53 197.5t53 197.5t143.5 143.5t197.5 53t197.5 -53t143.5 -143.5t53 -197.5q0 -141 -89 -249l286 -286l-56 -56zM433.5 64q130.5 0 222.5 92t92 222.5t-92 223t-222.5 92.5t-223 -92.5t-92.5 -223t92.5 -222.5  
84 -t223 -92z" /> 83 +d="M682 158q-108 -89 -249 -89q-107 0 -197.5 53t-143.5 143.5t-53 197.5t53 197.5t143.5 143.5t197.5 53t197.5 -53t143.5 -143.5t53 -197.5q0 -141 -89 -249l286 -286l-56 -56zM433.5 148q130.5 0 222.5 92t92 222.5t-92 223t-222.5 92.5t-223 -92.5t-92.5 -223
  84 +t92.5 -222.5t223 -92z" />
85 <glyph glyph-name="uniE610" unicode="&#xe610;" 85 <glyph glyph-name="uniE610" unicode="&#xe610;"
86 -d="M245 300l-9 9l472 472l80 -80l-400 -401l400 -401l-80 -80l-472 472z" /> 86 +d="M245 384l-9 9l472 472l80 -80l-400 -401l400 -401l-80 -80l-472 472z" />
87 <glyph glyph-name="uniE611" unicode="&#xe611;" 87 <glyph glyph-name="uniE611" unicode="&#xe611;"
88 -d="M509 780q-4 -2 -245 -245q-176 -179 -208.5 -213.5t-32.5 -46.5q0 -35 42 -33q7 0 233 227l225 228l226 -228q225 -227 232 -227q21 -1 31.5 7.5t10.5 25.5q0 12 -31.5 46.5t-206.5 211.5q-241 243 -246 246q-15 8 -30 1zM171 245q-12 -8 -14 -38.5t-2 -188t2 -188  
89 -t14 -38.5q7 -6 352.5 -6t352.5 6q11 8 13 38.5t2 188t-2 188t-13 38.5q-8 7 -21.5 5.5t-21.5 -10.5l-10 -9v-381h-600v381l-10 9q-8 9 -21 10.5t-21 -5.5zM398 202l-11 -12v-215l11 -12q10 -13 25.5 -13t25.5 13l10 12v175h128v-175l11 -12q11 -13 25.5 -13t25.5 13l10 12  
90 -v215l-20 24h-231z" /> 88 +d="M509 876q-4 -2 -245 -245q-176 -179 -208.5 -213.5t-32.5 -46.5q0 -35 42 -33q7 0 233 227l225 228l226 -228q225 -227 232 -227q21 -1 31.5 7.5t10.5 25.5q0 12 -31.5 46t-206.5 212q-241 243 -246 246q-15 8 -30 1zM171 341q-12 -8 -14 -38.5t-2 -188t2 -188t14 -38.5
  89 +q7 -6 352.5 -6t352.5 6q11 8 13 38.5t2 188t-2 188t-13 38.5q-8 7 -21.5 5.5t-21.5 -10.5l-10 -9v-381h-600v381l-10 9q-8 9 -21 10.5t-21 -5.5zM398 298l-11 -12v-215l11 -12q10 -13 25.5 -13t25.5 13l10 12v175h128v-175l11 -12q11 -13 25.5 -13t25.5 13l10 12v215l-20 24
  90 +h-231z" />
91 <glyph glyph-name="uniE612" unicode="&#xe612;" 91 <glyph glyph-name="uniE612" unicode="&#xe612;"
92 -d="M951 -7h-878l439 614z" /> 92 +d="M951 77h-878l439 614z" />
93 <glyph glyph-name="uniE613" unicode="&#xe613;" 93 <glyph glyph-name="uniE613" unicode="&#xe613;"
94 -d="M512 -7l-439 614h878z" /> 94 +d="M512 77l-439 614h878z" />
95 <glyph glyph-name="uniE614" unicode="&#xe614;" 95 <glyph glyph-name="uniE614" unicode="&#xe614;"
96 -d="M313 -49l349 349l-349 349q-7 7 -7 16.5t6.5 16t16 6.5t16.5 -6l345 -345q16 -15 21 -20q7 -7 7 -17t-7 -17q-44 -44 -48 -47l-318 -318q-7 -6 -16.5 -6t-16 6.5t-6.5 16t7 16.5z" /> 96 +d="M313 35l349 349l-349 349q-7 7 -7 16.5t6.5 16t16 6.5t16.5 -6l345 -345q16 -15 21 -20q7 -7 7 -17t-7 -17q-44 -44 -48 -47l-318 -318q-7 -6 -16.5 -6t-16 6.5t-6.5 16t7 16.5z" />
97 <glyph glyph-name="uniE615" unicode="&#xe615;" 97 <glyph glyph-name="uniE615" unicode="&#xe615;"
98 -d="M527 475q8 0 14 -6l293 -288q6 -6 6.5 -14.5t-5.5 -14.5t-14.5 -6t-14.5 6l-279 273l-278 -273q-7 -6 -15 -6t-14 6t-6 14.5t6 14.5l293 288q6 6 14 6z" /> 98 +d="M527 559q8 0 14 -6l293 -288q6 -6 6.5 -14.5t-5.5 -14.5t-14.5 -6t-14.5 6l-279 273l-278 -273q-7 -6 -15 -6t-14 6t-6 14.5t6 14.5l293 288q6 6 14 6z" />
99 <glyph glyph-name="uniE616" unicode="&#xe616;" 99 <glyph glyph-name="uniE616" unicode="&#xe616;"
100 -d="M527.5 146q-8.5 0 -14.5 6l-293 288q-6 6 -6 14t6 14.5t14 6.5t15 -6l278 -274l279 274q6 6 14.5 6t14.5 -6.5t5.5 -14.5t-6.5 -14l-293 -288q-5 -6 -13.5 -6z" /> 100 +d="M527.5 230q-8.5 0 -14.5 6l-293 288q-6 6 -6 14t6 14.5t14 6.5t15 -6l278 -274l279 274q6 6 14.5 6t14.5 -6.5t5.5 -14.5t-6.5 -14l-293 -288q-5 -6 -13.5 -6z" />
101 <glyph glyph-name="uniE617" unicode="&#xe617;" horiz-adv-x="1030" 101 <glyph glyph-name="uniE617" unicode="&#xe617;" horiz-adv-x="1030"
102 -d="M-195 162zM520 770q-98 0 -187.5 -38t-154 -102.5t-102.5 -154t-38 -187.5t38 -187.5t102.5 -154t154 -102.5t187.5 -38t187.5 38t154 102.5t102.5 154t38 187.5t-38 187.5t-102.5 154t-154 102.5t-187.5 38zM857 485l-339 -451l-328 238q-12 9 -14 23.5t6.5 26.5t23 14 102 +d="M-195 258zM520 866q-98 0 -187.5 -38t-154 -102.5t-102.5 -154t-38 -187.5t38 -187.5t102.5 -154t154 -102.5t187.5 -38t187.5 38t154 102.5t102.5 154t38 187.5t-38 187.5t-102.5 154t-154 102.5t-187.5 38zM857 581l-339 -451l-328 238q-12 9 -14 23.5t6.5 26.5t23 14
103 t26.5 -6l271 -198l297 396q9 12 23.5 14t26.5 -7t14 -23.5t-7 -26.5z" /> 103 t26.5 -6l271 -198l297 396q9 12 23.5 14t26.5 -7t14 -23.5t-7 -26.5z" />
104 <glyph glyph-name="uniE618" unicode="&#xe618;" 104 <glyph glyph-name="uniE618" unicode="&#xe618;"
105 -d="M224 192q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM512 192q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM800 192q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28z" /> 105 +d="M224 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM512 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28zM800 288q-40 0 -68 28t-28 68t28 68t68 28t68 -28t28 -68t-28 -68t-68 -28z" />
106 <glyph glyph-name="uniE619" unicode="&#xe619;" 106 <glyph glyph-name="uniE619" unicode="&#xe619;"
107 -d="M125.5 225q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM512.5 225q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM899.5 225q30.5 0 51 21.5 107 +d="M125.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM512.5 309q30.5 0 51 21.5t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5zM899.5 309q30.5 0 51 21.5
108 t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5z" /> 108 t20.5 52.5q0 33 -20.5 54.5t-51 21.5t-51.5 -21.5t-21 -54.5q0 -31 21 -52.5t51.5 -21.5z" />
109 <glyph glyph-name="uniE61A" unicode="&#xe61a;" 109 <glyph glyph-name="uniE61A" unicode="&#xe61a;"
110 -d="M512 -146q-91 0 -173.5 35.5t-142 95t-95 142t-35.5 173.5t35.5 173.5t95 142t142 95t173.5 35.5t173.5 -35.5t142 -95t95 -142t35.5 -173.5t-35.5 -173.5t-95 -142t-142 -95t-173.5 -35.5zM512 682q-104 0 -192 -51t-139 -139t-51 -192t51 -192t139 -139t192 -51t192 51  
111 -t139 139t51 192t-51 192t-139 139t-192 51zM512 508zM464 508q0 20 14 34t34 14t34 -14t14 -34t-14 -34t-34 -14t-34 14t-14 34zM512 44q-13 0 -22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-288q0 -13 -9.5 -22.5t-22.5 -9.5z" /> 110 +d="M512 -62q-91 0 -173.5 35.5t-142 95t-95 142t-35.5 173.5t35.5 173.5t95 142t142 95t173.5 35.5t173.5 -35.5t142 -95t95 -142t35.5 -173.5t-35.5 -173.5t-95 -142t-142 -95t-173.5 -35.5zM512 766q-104 0 -192 -51t-139 -139t-51 -192t51 -192t139 -139t192 -51t192 51
  111 +t139 139t51 192t-51 192t-139 139t-192 51zM512 592zM464 592q0 20 14 34t34 14t34 -14t14 -34t-14 -34t-34 -14t-34 14t-14 34zM512 128q-13 0 -22.5 9.5t-9.5 22.5v288q0 13 9.5 22.5t22.5 9.5t22.5 -9.5t9.5 -22.5v-288q0 -13 -9.5 -22.5t-22.5 -9.5z" />
112 <glyph glyph-name="uniE61B" unicode="&#xe61b;" 112 <glyph glyph-name="uniE61B" unicode="&#xe61b;"
113 -d="M437 41h-193q-27 2 -41.5 22.5t-17.5 45.5q3 25 17.5 41t41.5 18h193v63l-193 1q-27 2 -41.5 19t-17.5 43q3 25 17.5 41t41.5 18h144l-134 236q-10 12 -19 30.5t-8 40.5q5 28 20 45.5t56 22.5q24 -2 43 -16.5t31 -31.5l152 -278l167 280q12 17 31 30t43 16q15 -1 27.5 -4  
114 -t22 -10t16 -20t9.5 -34q0 -29 -20 -55l-155 -252h147q26 -2 41 -18t17 -41q-2 -26 -17.5 -44t-41.5 -20l-191 -1v-61h192q26 -2 41 -20t17 -43q-2 -26 -17 -43.5t-41 -19.5l-192 1v-106q-4 -85 -93 -85q-44 0 -68.5 21t-26.5 64v104z" /> 113 +d="M437 137h-193q-27 2 -41.5 22.5t-17.5 45.5q3 25 17.5 41t41.5 18h193v63l-193 1q-27 2 -41.5 19t-17.5 43q3 25 17.5 41t41.5 18h144l-134 236q-10 12 -19 30.5t-8 40.5q5 28 20 45.5t56 22.5q24 -2 43 -16.5t31 -31.5l152 -278l167 280q12 17 31 30t43 16
  114 +q15 -1 27.5 -4t22 -10t16 -20t9.5 -34q0 -29 -20 -55l-155 -252h147q26 -2 41 -18t17 -41q-2 -26 -17.5 -44t-41.5 -20l-191 -1v-61h192q26 -2 41 -20t17 -43q-2 -26 -17 -43.5t-41 -19.5l-192 1v-106q-4 -85 -93 -85q-44 0 -68.5 21t-26.5 64v104z" />
115 <glyph glyph-name="uniE61C" unicode="&#xe61c;" 115 <glyph glyph-name="uniE61C" unicode="&#xe61c;"
116 -d="M946 -196h-868q-26 0 -44 18t-18 44v868q0 26 18 44t44 18h868q26 0 44 -18t18 -44v-868q0 -26 -18 -44t-44 -18zM946 703q0 13 -9 22t-22 9h-806q-13 0 -22 -9t-9 -22v-806q0 -13 9 -22t22 -9h806q13 0 22 9t9 22v806z" /> 116 +d="M946 -112h-868q-26 0 -44 18t-18 44v868q0 26 18 44t44 18h868q26 0 44 -18t18 -44v-868q0 -26 -18 -44t-44 -18zM946 787q0 13 -9 22t-22 9h-806q-13 0 -22 -9t-9 -22v-806q0 -13 9 -22t22 -9h806q13 0 22 9t9 22v806z" />
117 <glyph glyph-name="uniE61D" unicode="&#xe61d;" 117 <glyph glyph-name="uniE61D" unicode="&#xe61d;"
118 -d="M939 -202h-876q-26 0 -44.5 18.5t-18.5 44.5v876q0 26 18.5 44.5t44.5 18.5h876q26 0 44.5 -18.5t18.5 -44.5v-876q0 -26 -18.5 -44.5t-44.5 -18.5zM814 612l-376 -438l-250 188l-63 -126l313 -250l439 501z" /> 118 +d="M939 -106h-876q-26 0 -44.5 18.5t-18.5 44.5v876q0 26 18.5 44.5t44.5 18.5h876q26 0 44.5 -18.5t18.5 -44.5v-876q0 -26 -18.5 -44.5t-44.5 -18.5zM814 708l-376 -438l-250 188l-63 -126l313 -250l439 501z" />
119 <glyph glyph-name="uniE61E" unicode="&#xe61e;" 119 <glyph glyph-name="uniE61E" unicode="&#xe61e;"
120 -d="M224 211l416 410l179 -179l-416 -410zM659 525l-19 19l-333 -333l19 -19zM698 486l-20 20l-332 -333l19 -19zM736 448l-19 19l-333 -333l19 -19zM717 704q14 14 38 14t39 -14l102 -102q14 -15 14 -39t-14 -38l-64 -58l-173 173zM211 186l167 -167l-148 -51l-70 70z  
121 -M205 -45l-83 -32l32 83z" /> 120 +d="M224 307l416 410l179 -179l-416 -410zM659 621l-19 19l-333 -333l19 -19zM698 582l-20 20l-332 -333l19 -19zM736 544l-19 19l-333 -333l19 -19zM717 800q14 14 38 14t39 -14l102 -102q14 -15 14 -39t-14 -38l-64 -58l-173 173zM211 282l167 -167l-148 -51l-70 70z
  121 +M205 51l-83 -32l32 83z" />
122 <glyph glyph-name="uniE61F" unicode="&#xe61f;" 122 <glyph glyph-name="uniE61F" unicode="&#xe61f;"
123 -d="M512 812q-138 0 -256 -69t-187 -187t-69 -256t69 -256t187 -187t256 -69t256 69t187 187t69 256t-69 256t-187 187t-256 69zM563 44h-102v307h102v-307zM563 454h-102v102h102v-102z" /> 123 +d="M512 896q-138 0 -256 -69t-187 -187t-69 -256t69 -256t187 -187t256 -69t256 69t187 187t69 256t-69 256t-187 187t-256 69zM563 128h-102v307h102v-307zM563 538h-102v102h102v-102z" />
124 <glyph glyph-name="uniE620" unicode="&#xe620;" 124 <glyph glyph-name="uniE620" unicode="&#xe620;"
125 -d="M938 276h-400v274h-50v-274h-399q-31 0 -53 21.5t-22 52.5v175q0 31 22 53t53 22h90q-40 47 -40 100q0 27 10 47.5t25 30t29.5 15t24.5 6.5l11 1q53 0 100 -15.5t81 -42t56 -50t39 -50.5q17 27 39.5 51t56 50t79.5 41.5t98 15.5q4 0 11 -1t24 -7t30 -15.5t24 -30.5  
126 -t11 -49q0 -51 -35 -97h85q31 0 53 -22t22 -53v-175q0 -31 -22 -52.5t-53 -21.5zM264 725q-15 0 -26 -2.5t-15.5 -6t-6.5 -7.5t-2 -6v-3q0 -49 66 -100h173q-14 30 -30 52.5t-34 35.5t-33 21t-34.5 11.5t-30 4t-27.5 0.5zM763 723q-17 0 -27.5 -1t-29.5 -4t-33.5 -11  
127 -t-32 -20.5t-33.5 -34.5t-30 -52h177q59 50 59 97v3q0 2 -2 6.5t-7 7.5t-15.5 6t-25.5 3zM488 -224h-349q-31 0 -53 22t-22 53v375h424v-450zM538 226h400v-375q0 -31 -22 -53t-53 -22h-325v450z" /> 125 +d="M938 372h-30h-370v274h-50v-274h-395h-4q-31 0 -53 21.5t-22 52.5v175q0 31 22 53t53 22h90q-40 47 -40 100q0 27 10 47.5t25 30t29.5 15t24.5 6.5l11 1q53 0 100 -15.5t81 -42t56 -50t39 -50.5q17 27 39.5 51t56 50t79.5 41.5t98 15.5q4 0 11 -1t24 -7t30 -15.5
  126 +t24 -30.5t11 -49q0 -51 -35 -97h85q31 0 53 -22t22 -53v-175q0 -31 -22 -52.5t-53 -21.5zM264 821q-15 0 -26 -2.5t-15.5 -6t-6.5 -7.5t-2 -6v-3q0 -49 66 -100h173q-14 30 -30 52.5t-34 35.5t-33 21t-34.5 11.5t-30 4t-27.5 0.5zM763 819q-17 0 -27.5 -1t-29.5 -4
  127 +t-33.5 -11t-32 -20.5t-33.5 -34.5t-30 -52h177q59 50 59 97q2 0 0 6.5t-14 13t-36 6.5zM488 -128h-349q-31 0 -53 22t-22 53v375h424v-450zM538 322h400v-375q0 -31 -22 -53t-53 -22h-325v450z" />
128 <glyph glyph-name="uniE621" unicode="&#xe621;" 128 <glyph glyph-name="uniE621" unicode="&#xe621;"
129 -d="M160 492v-640q0 -26 19 -45t45 -19h576q26 0 45 19t19 45v640h-704zM352 -84h-64v448h64v-448zM480 -84h-64v448h64v-448zM608 -84h-64v448h64v-448zM736 -84h-64v448h64v-448zM880 684h-208v80q0 20 -14 34t-34 14h-224q-20 0 -34 -14t-14 -34v-80h-208q-20 0 -34 -14  
130 -t-14 -34v-80h832v80q0 20 -14 34t-34 14zM608 684h-192v63h192v-63z" /> 129 +d="M160 576v-640q0 -26 19 -45t45 -19h576q26 0 45 19t19 45v640h-704zM352 0h-64v448h64v-448zM480 0h-64v448h64v-448zM608 0h-64v448h64v-448zM736 0h-64v448h64v-448zM880 768h-208v80q0 20 -14 34t-34 14h-224q-20 0 -34 -14t-14 -34v-80h-208q-20 0 -34 -14t-14 -34
  130 +v-80h832v80q0 20 -14 34t-34 14zM608 768h-192v63h192v-63z" />
131 <glyph glyph-name="uniE622" unicode="&#xe622;" horiz-adv-x="1173" 131 <glyph glyph-name="uniE622" unicode="&#xe622;" horiz-adv-x="1173"
132 -d="M586 588q-28 65 -69 113t-86.5 73.5t-96 34t-97.5 -2t-90 -39.5t-75.5 -73t-51.5 -107.5t-20 -138.5q0 -41 9 -78.5t24 -66.5t39 -57.5t47 -48.5t55.5 -43t56.5 -38t58.5 -35.5t53.5 -33.5q93 -61 162 -138.5t82 -120.5q10 39 81.5 118.5t160.5 142.5q24 17 71.5 47 132 +d="M586 672q-28 65 -69 113t-86.5 73.5t-96 34t-97.5 -2t-90 -39.5t-75.5 -73t-51.5 -107.5t-20 -138.5q0 -41 9 -78.5t24 -66.5t39 -57.5t47 -48.5t55.5 -43t56.5 -38t58.5 -35.5t53.5 -33.5q93 -61 162 -138.5t82 -120.5q10 39 81.5 118.5t160.5 142.5q24 17 71.5 47
133 t79 50.5t71.5 54.5t64 67t41 81t16 102q0 75 -19.5 138t-52.5 105.5t-76.5 70.5t-91 37.5t-98 1t-96 -34.5t-85.5 -72.5t-67 -108.5z" /> 133 t79 50.5t71.5 54.5t64 67t41 81t16 102q0 75 -19.5 138t-52.5 105.5t-76.5 70.5t-91 37.5t-98 1t-96 -34.5t-85.5 -72.5t-67 -108.5z" />
134 <glyph glyph-name="uniE623" unicode="&#xe623;" 134 <glyph glyph-name="uniE623" unicode="&#xe623;"
135 -d="M835 576l-60 63l-263 -275v0l-263 275l-60 -63l262 -276l-262 -276l60 -63l263 275v0l263 -275l60 63l-262 276z" /> 135 +d="M835 660l-60 63l-263 -275v0l-263 275l-60 -63l262 -276l-262 -276l60 -63l263 275v0l263 -275l60 63l-262 276z" />
136 <glyph glyph-name="uniE624" unicode="&#xe624;" horiz-adv-x="1000" 136 <glyph glyph-name="uniE624" unicode="&#xe624;" horiz-adv-x="1000"
137 -d="M459 754h55h54v-382h191h191v-109h-191h-191v-191v-190h-109v190v191h-191h-190q-1 37 -1 109h191h191v382z" /> 137 +d="M459 850h55h54v-120v-142v-120h191h191v-109h-191h-191v-191v-190h-109v190v191h-191h-190q-1 37 -1 109h191h191v382z" />
138 <glyph glyph-name="uniE625" unicode="&#xe625;" horiz-adv-x="1000" 138 <glyph glyph-name="uniE625" unicode="&#xe625;" horiz-adv-x="1000"
139 -d="M77 372h873v-109h-873v109z" /> 139 +d="M77 468h873v-109h-873v109z" />
140 <glyph glyph-name="uniE626" unicode="&#xe626;" 140 <glyph glyph-name="uniE626" unicode="&#xe626;"
141 -d="M866.5 663.5q-97.5 97.5 -228 132t-261.5 0t-228.5 -132t-132 -228.5t0 -261.5t132 -228t228.5 -132t261.5 0t228 132t132 228t0 261.5t-132 228.5zM798 115l-101 -101l-187 186l-186 -186l-101 101l186 186l-186 187l101 101l186 -186l187 186l101 -101l-186 -187z" /> 141 +d="M866.5 747.5q-97.5 97.5 -228 132t-261.5 0t-228.5 -132t-132 -228.5t0 -261.5t132 -228t228.5 -132t261.5 0t228 132t132 228t0 261.5t-132 228.5zM798 199l-101 -101l-187 186l-186 -186l-101 101l186 186l-186 187l101 101l186 -186l187 186l101 -101l-186 -187z" />
142 <glyph glyph-name="uniE627" unicode="&#xe627;" 142 <glyph glyph-name="uniE627" unicode="&#xe627;"
143 -d="M741 258q-23 9 -22 34q6 114 -8 186q-13 68 -37.5 125.5t-48 89.5t-50.5 57t-38 32t-18 10l-7 3l-7 -3q-7 -3 -18 -10t-38 -32t-50.5 -57t-48 -89.5t-37.5 -125.5q-14 -72 -8 -186q1 -25 -22 -34q-25 -11 -47.5 -26t-47 -40.5t-39 -65t-14.5 -87.5v-16h198  
144 -q2 -22 17.5 -36.5t37.5 -14.5h248q22 0 37.5 14.5t17.5 36.5h198v16q0 48 -14.5 87.5t-39 65t-47 40.5t-47.5 26zM512 442q-31 0 -53 22t-22 53t22 53t53 22t53 -22t22 -53t-22 -53t-53 -22zM453 -61q-14 0 -23.5 -10t-9.5 -24v-83q0 -14 9.5 -24t23.5 -10t24 10t10 24v83  
145 -q0 14 -10 24t-24 10zM571 -61q-14 0 -24 -10t-10 -24v-83q0 -14 10 -24t24 -10t23.5 10t9.5 24v83q0 14 -9.5 24t-23.5 10z" /> 143 +d="M741 342q-23 9 -22 34q6 114 -8 186q-13 68 -37.5 125.5t-48 89.5t-50.5 57t-38 32t-18 10l-7 3l-7 -3q-7 -3 -18 -10t-38 -32t-50.5 -57t-48 -89.5t-37.5 -125.5q-14 -72 -8 -186q1 -25 -22 -34q-25 -11 -47.5 -26t-47 -40.5t-39 -65t-14.5 -87.5v-16h198
  144 +q2 -22 17.5 -36.5t37.5 -14.5h248q22 0 37.5 14.5t17.5 36.5h198v16q0 48 -14.5 87.5t-39 65t-47 40.5t-47.5 26zM512 526q-31 0 -53 22t-22 53t22 53t53 22t53 -22t22 -53t-22 -53t-53 -22zM453 23q-14 0 -23.5 -10t-9.5 -24v-83q0 -14 9.5 -24t23.5 -10t24 10t10 24v83
  145 +q0 14 -10 24t-24 10zM571 23q-14 0 -24 -10t-10 -24v-83q0 -14 10 -24t24 -10t23.5 10t9.5 24v83q0 14 -9.5 24t-23.5 10z" />
146 <glyph glyph-name="uniE628" unicode="&#xe628;" 146 <glyph glyph-name="uniE628" unicode="&#xe628;"
147 -d="M505 776q95 0 182 -37t150 -100t100.5 -150t37.5 -182t-37.5 -182t-100.5 -150t-150 -100.5t-182 -37.5t-182 37.5t-150 100.5t-100 150t-37 182t37 182t100 150t150 100t182 37zM505 -104q112 0 206.5 55t149.5 149.5t55 206t-55 206t-149.5 149.5t-206 55t-206 -55  
148 -t-149.5 -149.5t-55 -206t55 -206t149.5 -149.5t205.5 -55zM528 138v-59h-58v59h58zM470 564h58v-349h-58v349z" /> 147 +d="M505 860q95 0 182 -37t150 -100t100.5 -150t37.5 -182t-37.5 -182t-100.5 -150t-150 -100.5t-182 -37.5t-182 37.5t-150 100.5t-100 150t-37 182t37 182t100 150t150 100t182 37zM505 -20q112 0 206.5 55t149.5 149.5t55 206t-55 206t-149.5 149.5t-206 55t-206 -55
  148 +t-149.5 -149.5t-55 -206t55 -206t149.5 -149.5t205.5 -55zM528 222v-59h-58v59h58zM470 648h58v-349h-58v349z" />
149 <glyph glyph-name="uniE629" unicode="&#xe629;" 149 <glyph glyph-name="uniE629" unicode="&#xe629;"
150 -d="M512 809v0q-58 0 -112.5 -12t-105.5 -38t-80.5 -44t-77.5 -51v-450q0 -57 19.5 -110.5t49 -93.5t69 -76t75.5 -59.5t73.5 -43t57 -28t32.5 -12.5q13 4 32.5 12.5t57 28t73.5 43t75.5 59.5t69 76t49 93.5t19.5 110.5v450q-48 33 -77.5 51t-80.5 44t-105.5 38t-112.5 12z  
151 -M808 214q0 -76 -36.5 -138t-112.5 -117q-73 -53 -147 -82q-74 29 -147 82q-76 55 -112.5 117t-36.5 138v421q87 53 146.5 75t149.5 23q90 -1 149.5 -23t146.5 -75v-421zM512 671q-67 0 -112.5 -12.5t-119.5 -49.5v-399q0 -35 12.5 -68.5t30 -57.5t44 -46t47 -35.5t46 -26  
152 -t34 -16t18.5 -6.5q10 3 18.5 6.5t34 16t46 26t47 35.5t44 46t30 57.5t12.5 68.5v399q-74 37 -119.5 49.5t-112.5 12.5v0zM667 515v-47h-105v-67h92v-61h-92v-77h116v-57h-332v57h42v168h64v-168h46v205h-138v61h307v-14z" /> 150 +d="M512 893v0q-58 0 -112.5 -12t-105.5 -38t-80.5 -44t-77.5 -51v-450q0 -57 19.5 -110.5t49 -93.5t69 -76t75.5 -59.5t73.5 -43t57 -28t32.5 -12.5q13 4 32.5 12.5t57 28t73.5 43t75.5 59.5t69 76t49 93.5t19.5 110.5v450q-48 33 -77.5 51t-80.5 44t-105.5 38t-112.5 12z
  151 +M808 298q0 -76 -36.5 -138t-112.5 -117q-73 -53 -147 -82q-74 29 -147 82q-76 55 -112.5 117t-36.5 138v421q87 53 146.5 75t149.5 23q90 -1 149.5 -23t146.5 -75v-421zM512 755q-67 0 -112.5 -12.5t-119.5 -49.5v-399q0 -35 12.5 -68.5t30 -57.5t44 -46t47 -35.5t46 -26
  152 +t34 -16t18.5 -6.5q10 3 18.5 6.5t34 16t46 26t47 35.5t44 46t30 57.5t12.5 68.5v399q-74 37 -119.5 49.5t-112.5 12.5v0zM667 599v-47h-105v-67h92v-61h-92v-77h116v-57h-332v57h42v168h64v-168h46v205h-138v61h307v-14z" />
153 <glyph glyph-name="uniE62A" unicode="&#xe62a;" 153 <glyph glyph-name="uniE62A" unicode="&#xe62a;"
154 -d="M497 806l-451 -386q-20 -18 -20 -45v-500q0 -32 22.5 -54.5t53.5 -22.5h256v333h308v-333h256q31 0 53.5 22.5t22.5 54.5v500q0 27 -20 45l-451 386q-15 13 -30 0z" /> 154 +d="M497 890l-451 -386q-20 -18 -20 -45v-500q0 -32 22.5 -54.5t53.5 -22.5h256v333h308v-333h256q31 0 53.5 22.5t22.5 54.5v500q0 27 -20 45l-451 386q-15 13 -30 0z" />
155 <glyph glyph-name="uniE62B" unicode="&#xe62b;" 155 <glyph glyph-name="uniE62B" unicode="&#xe62b;"
156 -d="M761 539q0 -104 -73 -177t-176.5 -73t-177 73t-73.5 177t73.5 177t177 73t176.5 -73t73 -177zM888 -164q11 22 9 48q-7 99 -60 181.5t-139 130t-186.5 47.5t-187 -47.5t-139.5 -130t-60 -181.5q-1 -26 10 -48q12 -25 40 -25h673q27 0 40 25z" /> 156 +d="M761 623q0 -104 -73 -177t-176.5 -73t-177 73t-73.5 177t73.5 177t177 73t176.5 -73t73 -177zM888 -80q11 22 9 48q-7 99 -60 181.5t-139 130t-186.5 47.5t-187 -47.5t-139.5 -130t-60 -181.5q-1 -26 10 -48q12 -25 40 -25h673q27 0 40 25z" />
157 <glyph glyph-name="uniE62C" unicode="&#xe62c;" horiz-adv-x="1048" 157 <glyph glyph-name="uniE62C" unicode="&#xe62c;" horiz-adv-x="1048"
158 -d="M832 -126.5q0 -35.5 -25 -60.5t-60.5 -25t-60.5 25t-25 60.5t25 60.5t60.5 25t60.5 -25t25 -60.5zM533 -126.5q0 -35.5 -25 -60.5t-60 -25t-60 25t-25 60.5t25 60.5t60 25t60 -25t25 -60.5zM277 620l-35 159q-3 14 -15 23.5t-27 9.5h-147q-22 0 -37.5 -15.5t-15.5 -37.5 158 +d="M832 -42.5q0 -35.5 -25 -60.5t-60.5 -25t-60.5 25t-25 60.5t25 60.5t60.5 25t60.5 -25t25 -60.5zM533 -42.5q0 -35.5 -25 -60.5t-60 -25t-60 25t-25 60.5t25 60.5t60 25t60 -25t25 -60.5zM277 704l-35 159q-3 14 -15 23.5t-27 9.5h-147q-22 0 -37.5 -15.5t-15.5 -37.5
159 t15.5 -38t37.5 -16h54l157 -627q6 -25 25.5 -40t44.5 -15h527q25 0 44.5 15t25.5 40l113 452q9 34 -13 62t-57 28h-697z" /> 159 t15.5 -38t37.5 -16h54l157 -627q6 -25 25.5 -40t44.5 -15h527q25 0 44.5 15t25.5 40l113 452q9 34 -13 62t-57 28h-697z" />
160 <glyph glyph-name="uniE62D" unicode="&#xe62d;" 160 <glyph glyph-name="uniE62D" unicode="&#xe62d;"
161 -d="M442 274h-84v-76h-230v76h-81q-20 0 -33.5 -12.5t-13.5 -31.5v-395q0 -20 13.5 -33.5t33.5 -13.5h395q19 0 31.5 13.5t12.5 33.5v395q0 19 -12.5 31.5t-31.5 12.5zM977 812h-81v-77h-230v77h-84q-19 0 -31.5 -13.5t-12.5 -33.5v-395q0 -19 12.5 -31.5t31.5 -12.5h395  
162 -q20 0 33.5 12.5t13.5 31.5v395q0 20 -13.5 33.5t-33.5 13.5zM977 274h-81v-76h-230v76h-84q-19 0 -31.5 -12.5t-12.5 -31.5v-395q0 -20 12.5 -33.5t31.5 -13.5h395q20 0 33.5 13.5t13.5 33.5v395q0 19 -13.5 31.5t-33.5 12.5z" /> 161 +d="M442 358h-84v-76h-230v76h-81q-20 0 -33.5 -12.5t-13.5 -31.5v-395q0 -20 13.5 -33.5t33.5 -13.5h395q19 0 31.5 13.5t12.5 33.5v395q0 19 -12.5 31.5t-31.5 12.5zM977 896h-81v-77h-230v77h-84q-19 0 -31.5 -13.5t-12.5 -33.5v-395q0 -19 12.5 -31.5t31.5 -12.5h395
  162 +q20 0 33.5 12.5t13.5 31.5v395q0 20 -13.5 33.5t-33.5 13.5zM977 358h-81v-76h-230v76h-84q-19 0 -31.5 -12.5t-12.5 -31.5v-395q0 -20 12.5 -33.5t31.5 -13.5h395q20 0 33.5 13.5t13.5 33.5v395q0 19 -13.5 31.5t-33.5 12.5z" />
163 <glyph glyph-name="uniE62E" unicode="&#xe62e;" horiz-adv-x="1639" 163 <glyph glyph-name="uniE62E" unicode="&#xe62e;" horiz-adv-x="1639"
164 -d="M1 783h1045v-625h-1045v625zM1424 783h-337v-625l61 -33q33 14 70 14q66 0 116 -42t61 -105l7 -4h205v398zM1178 411v290h164l121 -290h-285zM235 125h-235v-163h111q2 57 36.5 101.5t87.5 61.5zM452 -46q0 66 -47 112.5t-113.5 46.5t-114 -46.5t-47.5 -112.5  
165 -t47.5 -112.5t114 -46.5t113.5 46.5t47 112.5zM1067 125h-721q54 -17 88.5 -61.5t36.5 -101.5h570q0 50 26 92v71zM1380 -44q0 66 -47 112.5t-113.5 46.5t-113.5 -46.5t-47 -112.5t47 -112.5t113.5 -46.5t113.5 46.5t47 112.5z" /> 164 +d="M1 867h1045v-625h-1045v625zM1424 867h-337v-625l61 -33q33 14 70 14q66 0 116 -42t61 -105l7 -4h205v398zM1178 495v290h164l121 -290h-285zM235 209h-235v-163h111q2 57 36.5 101.5t87.5 61.5zM452 38q0 66 -47 112.5t-113.5 46.5t-114 -46.5t-47.5 -112.5t47.5 -112.5
  165 +t114 -46.5t113.5 46.5t47 112.5zM1067 209h-721q54 -17 88.5 -61.5t36.5 -101.5h570q0 50 26 92v71zM1380 40q0 66 -47 112.5t-113.5 46.5t-113.5 -46.5t-47 -112.5t47 -112.5t113.5 -46.5t113.5 46.5t47 112.5z" />
166 <glyph glyph-name="uniE62F" unicode="&#xe62f;" 166 <glyph glyph-name="uniE62F" unicode="&#xe62f;"
167 -d="M474 28v161h-167v50h167v74h-167v49h134l-168 265h87l152 -257v386q-35 0 -70.5 2t-64 6t-55 8.5t-46.5 8.5t-34.5 8t-22.5 6t-7 2q-2 -43 -16.5 -74t-34 -44t-38.5 -20t-33 -7h-13q0 -40 1.5 -78t3.5 -69t5.5 -59.5t7 -51t6.5 -41.5t6.5 -32.5t5.5 -23t3 -13.5l2 -5  
168 -q15 -61 45 -120.5t65.5 -105.5t75 -87t76.5 -70.5t67 -50.5t47.5 -32t17.5 -10v225h-38zM550 28v161h167v50h-167v74h167v49h-134l168 265h-87l-152 -257v386q76 0 151 10.5t112 20.5l37 10q2 -43 16.5 -74t34 -44t38.5 -20t33 -7h13q0 -234 -40 -368l-1 -5 167 +d="M474 112v161h-167v50h167v74h-167v49h134l-168 265h87l152 -257v386q-35 0 -70.5 2t-64 6t-55 8.5t-46.5 8.5t-34.5 8t-22.5 6t-7 2q-2 -43 -16.5 -74t-34 -44t-38.5 -20t-33 -7h-13q0 -40 1.5 -78t3.5 -69t5.5 -59.5t7 -51t6.5 -41.5t6.5 -32.5t5.5 -23t3 -13.5l2 -5
  168 +q15 -61 45 -120.5t65.5 -105.5t75 -87t76.5 -70.5t67 -50.5t47.5 -32t17.5 -10v225h-38zM550 112v161h167v50h-167v74h167v49h-134l168 265h-87l-152 -257v386q76 0 151 10.5t112 20.5l37 10q2 -43 16.5 -74t34 -44t38.5 -20t33 -7h13q0 -234 -40 -368l-1 -5
169 q-15 -61 -44.5 -120.5t-65.5 -105.5t-75.5 -87t-76.5 -70.5t-66.5 -50.5t-47.5 -32t-18 -10v225h38z" /> 169 q-15 -61 -44.5 -120.5t-65.5 -105.5t-75.5 -87t-76.5 -70.5t-66.5 -50.5t-47.5 -32t-18 -10v225h38z" />
170 <glyph glyph-name="uniE630" unicode="&#xe630;" 170 <glyph glyph-name="uniE630" unicode="&#xe630;"
171 -d="M629 -71h-268v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-174v609h590v-609zM400 -30h188v527h-508v-527h94q7 41 39 68t74 27t74 -27t39 -68zM989 -71h-136v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-117v476h210q22 0 57 -34q27 -26 58 -67  
172 -q31 -40 52 -75q24 -41 24 -62v-238zM892 -30h56v197q0 9 -18 40t-46 68t-53 63q-23 23 -34 26h-168v-394h37q7 41 39 68t74 27t74 -27t39 -68zM989 137h-287v193h191l6 -8q35 -43 61 -84q29 -48 29 -71v-30zM743 178h202q-6 15 -21 39q-21 34 -50 72h-131v-111zM779.5 -166  
173 -q-47.5 0 -81.5 34t-34 81.5t34 81.5t81.5 34t81 -34t33.5 -81.5t-33.5 -81.5t-81 -34zM779 24q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22zM287 -166q-48 0 -81.5 34t-33.5 81.5t33.5 81.5t81.5 34t81.5 -34t33.5 -81.5  
174 -t-33.5 -81.5t-81.5 -34zM287 24q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22z" /> 171 +d="M629 25h-268v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-174v609h590v-609zM400 66h188v527h-508v-527h94q7 41 39 68t74 27t74 -27t39 -68zM989 25h-136v20q0 31 -21.5 53t-52.5 22t-52.5 -22t-21.5 -53v-20h-117v476h210q22 0 57 -34q27 -26 58 -67
  172 +q31 -40 52 -75q24 -41 24 -62v-238zM892 66h56v197q0 9 -18 40t-46 68t-53 63q-23 23 -34 26h-168v-394h37q7 41 39 68t74 27t74 -27t39 -68zM989 233h-287v193h191l6 -8q35 -43 61 -84q29 -48 29 -71v-30zM743 274h202q-6 15 -21 39q-21 34 -50 72h-131v-111zM779.5 -70
  173 +q-47.5 0 -81.5 34t-34 81.5t34 81.5t81.5 34t81 -34t33.5 -81.5t-33.5 -81.5t-81 -34zM779 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22zM287 -70q-48 0 -81.5 34t-33.5 81.5t33.5 81.5t81.5 34t81.5 -34t33.5 -81.5
  174 +t-33.5 -81.5t-81.5 -34zM287 120q-31 0 -52.5 -22t-21.5 -52.5t21.5 -52.5t52.5 -22t52.5 22t21.5 52.5t-21.5 52.5t-52.5 22z" />
175 <glyph glyph-name="uniE631" unicode="&#xe631;" 175 <glyph glyph-name="uniE631" unicode="&#xe631;"
176 -d="M24 799zM47 799zM70 799zM94 799zM117 799zM140 799zM163 799zM187 799zM210 799zM233 799zM256 799zM280 799zM303 799zM326 799zM349 799zM373 799zM396 799zM419 799zM442 799zM466 799zM489 799zM512 799zM535 799zM558 799zM582 799zM605 799zM628 799zM651 799z  
177 -M675 799zM698 799zM721 799zM744 799zM768 799zM791 799zM814 799zM837 799zM861 799zM884 799zM907 799zM930 799zM954 799zM977 799zM1000 799zM1 776zM1 753zM1 730zM1 706zM1 683zM1 660zM1 637zM1 613zM1 590zM1 567zM1 544zM1 520zM1 497zM1 474zM1 451zM1 427zM1 404  
178 -zM1 381zM1 358zM1 334zM1 311zM1 288zM1 265zM1 242zM1 218zM1 195zM1 172zM1 149zM1 125zM1 102zM1 79zM1 56zM1 32zM1 9zM1 -14zM1 -37zM1 -61zM1 -84zM1 -107zM1 -130zM1 -154zM1 -177zM1 -200zM512 -223q-7 8 -18.5 22t-45.5 59t-64.5 91t-68 113.5t-64.5 131.5  
179 -t-45.5 139t-18.5 141q0 52 11 96.5t30 75.5t43 56.5t51 41t54 27t51.5 17t43.5 8.5t30 3h11q7 0 18.5 -0.5t45.5 -7t64.5 -17.5t68 -35.5t64.5 -57.5t45.5 -87t18.5 -120q0 -237 -215 -552q-60 -88 -110 -145zM740 517q-16 85 -86 140q-1 1 -4 3.5t-5 3.5q-5 4 -22 13  
180 -t-19 10q-1 0 -20 7q-21 7 -24 7q-24 5 -48 5v0q-24 0 -47 -5q-44 -8 -82 -34h-1q-12 -9 -27 -23q-2 -1 -5 -4l-3 -3q-4 -4 -16 -19.5t-13 -16.5q-2 -3 -4.5 -7.5t-3.5 -5.5q-10 -19 -13 -27q-1 -2 -2 -6t-2 -5q-7 -21 -9 -32q-4 -22 -4 -44q0 -183 175 -470l57 -88  
181 -q9 13 25 36.5t56 92t70.5 133.5t55.5 148t25 148q0 22 -4 43zM373 474q0 58 40.5 98.5t98.5 40.5t98.5 -40.5t40.5 -98.5t-40.5 -99t-98.5 -41t-98.5 41t-40.5 99z" /> 176 +d="M24 895v-1022v1022zM47 895v-1022v1022zM70 895v-1022v1022zM94 895v-1022v1022zM117 895v-1022v1022zM140 895v-1022v1022zM163 895v-1022v1022zM187 895v-1022v1022zM210 895v-1022v1022zM233 895v-1022v1022zM256 895v-1022v1022zM280 895v-1022v1022zM303 895v-1022
  177 +v1022zM326 895v-1022v1022zM349 895v-1022v1022zM373 895v-1022v1022zM396 895v-1022v1022zM419 895v-1022v1022zM442 895v-1022v1022zM466 895v-1022v1022zM489 895v-1022v1022zM512 895v-1022v1022zM535 895v-1022v1022zM558 895v-1022v1022zM582 895v-1022v1022zM605 895
  178 +v-1022v1022zM628 895v-1022v1022zM651 895v-1022v1022zM675 895v-1022v1022zM698 895v-1022v1022zM721 895v-1022v1022zM744 895v-1022v1022zM768 895v-1022v1022zM791 895v-1022v1022zM814 895v-1022v1022zM837 895v-1022v1022zM861 895v-1022v1022zM884 895v-1022v1022z
  179 +M907 895v-1022v1022zM930 895v-1022v1022zM954 895v-1022v1022zM977 895v-1022v1022zM1000 895v-1022v1022zM1 872h1022h-1022zM1 849h1022h-1022zM1 826h1022h-1022zM1 802h1022h-1022zM1 779h1022h-1022zM1 756h1022h-1022zM1 733h1022h-1022zM1 709h1022h-1022zM1 686
  180 +h1022h-1022zM1 663h1022h-1022zM1 640h1022h-1022zM1 616h1022h-1022zM1 593h1022h-1022zM1 570h1022h-1022zM1 547h1022h-1022zM1 523h1022h-1022zM1 500h1022h-1022zM1 477h1022h-1022zM1 454h1022h-1022zM1 430h1022h-1022zM1 407h1022h-1022zM1 384h1022h-1022zM1 361
  181 +h1022h-1022zM1 338h1022h-1022zM1 314h1022h-1022zM1 291h1022h-1022zM1 268h1022h-1022zM1 245h1022h-1022zM1 221h1022h-1022zM1 198h1022h-1022zM1 175h1022h-1022zM1 152h1022h-1022zM1 128h1022h-1022zM1 105h1022h-1022zM1 82h1022h-1022zM1 59h1022h-1022zM1 35h1022
  182 +h-1022zM1 12h1022h-1022zM1 -11h1022h-1022zM1 -34h1022h-1022zM1 -58h1022h-1022zM1 -81h1022h-1022zM1 -104h1022h-1022zM512 -127q-7 8 -18.5 22t-45.5 59t-64.5 91t-68 113.5t-64.5 131.5t-45.5 139t-18.5 141q0 52 11 96.5t30 75.5t43 56.5t51 41t54 27t51.5 17
  183 +t43.5 8.5t30 3h11q7 0 18.5 -0.5t45.5 -7t64.5 -17.5t68 -35.5t64.5 -57.5t45.5 -87t18.5 -120q0 -237 -215 -552q-60 -88 -110 -145zM740 613q-16 85 -86 140q-1 1 -4 3.5t-5 3.5q-5 4 -22 13t-19 10q-1 0 -20 7q-21 7 -24 7q-24 5 -48 5v0q-24 0 -47 -5q-44 -8 -82 -34h-1
  184 +q-12 -9 -27 -23q-2 -1 -5 -4l-3 -3q-4 -4 -16 -19.5t-13 -16.5q-2 -3 -4.5 -7.5t-3.5 -5.5q-10 -19 -13 -27q-1 -2 -2 -6t-2 -5q-7 -21 -9 -32q-4 -22 -4 -44q0 -65 23.5 -146.5t58 -151.5t68.5 -129.5t58 -95.5t24 -35q9 13 25 36.5t56 92t70.5 133.5t55.5 148t25 148
  185 +q0 22 -4 43zM373 570q0 58 40.5 98.5t98.5 40.5t98.5 -40.5t40.5 -98.5t-40.5 -99t-98.5 -41t-98.5 41t-40.5 99z" />
182 <glyph glyph-name="uniE632" unicode="&#xe632;" 186 <glyph glyph-name="uniE632" unicode="&#xe632;"
183 -d="M313 163h397v69h-397v-69zM313 26h397v68h-397v-68zM611 747h-430q-14 0 -23.5 -10t-9.5 -24v-825q0 -14 9.5 -24t23.5 -10h661q14 0 24 10t10 24v619zM644 626l131 -119h-131v119zM809 -77h-595v755h364v-206q0 -14 9.5 -24t23.5 -10h198v-515zM313 300h397v69h-397v-69  
184 -z" /> 187 +d="M313 247h397v69h-397v-69zM313 110h397v68h-397v-68zM611 831h-430q-14 0 -23.5 -10t-9.5 -24v-825q0 -14 9.5 -24t23.5 -10h661q14 0 24 10t10 24v619zM644 710l131 -119h-131v119zM809 7h-595v755h364v-206q0 -14 9.5 -24t23.5 -10h198v-515zM313 384h397v69h-397v-69z
  188 +" />
185 <glyph glyph-name="uniE633" unicode="&#xe633;" horiz-adv-x="1304" 189 <glyph glyph-name="uniE633" unicode="&#xe633;" horiz-adv-x="1304"
186 -d="M1303 454l-161 242h-304v-443h233q19 0 32.5 14t13.5 33t-13.5 33t-32.5 14h-140v256h161l118 -177v-242h-442v577q0 21 -15 36t-36 15h-666q-21 0 -36 -15t-15 -36v-620q0 -21 15 -35.5t36 -14.5h142q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140  
187 -q0 56 -31 105h363q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140q0 56 -31 105h77v363zM93 719h582v-535h-582v535zM465 -14q0 -43 -30.5 -74t-74 -31t-74 31t-30.5 74t30.5 74t74 31t74 -31t30.5 -74zM1164 -14q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31 190 +d="M1303 538l-161 242h-304v-443h233q19 0 32.5 14t13.5 33t-13.5 33t-32.5 14h-140v256h161l118 -177v-242h-442v577q0 21 -15 36t-36 15h-666q-21 0 -36 -15t-15 -36v-620q0 -21 15 -35.5t36 -14.5h142q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140
  191 +q0 56 -31 105h363q-30 -49 -30 -105q0 -82 58 -140t140 -58t140 58t58 140q0 56 -31 105h77v363zM93 803h582v-535h-582v535zM465 70q0 -43 -30.5 -74t-74 -31t-74 31t-30.5 74t30.5 74t74 31t74 -31t30.5 -74zM1164 70q0 -43 -31 -74t-74 -31t-74 31t-31 74t31 74t74 31
188 t74 -31t31 -74z" /> 192 t74 -31t31 -74z" />
189 <glyph glyph-name="uniE634" unicode="&#xe634;" horiz-adv-x="1476" 193 <glyph glyph-name="uniE634" unicode="&#xe634;" horiz-adv-x="1476"
190 -d="M1403 812h-1331q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h1331q30 0 51.5 21t21.5 51v880q0 30 -21.5 51t-51.5 21zM120 692h1235v-151h-1235v151zM120 330h1235v-422h-1235v422zM211 210h572v-61h-572v61zM211 89h331v-60h-331v60z" /> 194 +d="M1403 896h-1331q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h1331q30 0 51.5 21t21.5 51v880q0 30 -21.5 51t-51.5 21zM120 776h1235v-151h-1235v151zM120 414h1235v-422h-1235v422zM211 294h572v-61h-572v61zM211 173h331v-60h-331v60z" />
191 <glyph glyph-name="uniE635" unicode="&#xe635;" 195 <glyph glyph-name="uniE635" unicode="&#xe635;"
192 -d="M512 797q-102 0 -194.5 -39.5t-160 -106.5t-107 -160t-39.5 -194.5t39.5 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t39.5 194.5t-39.5 194.5t-107 160t-160 106.5t-194.5 39.5zM512 -118q-112 0 -207.5 55.5t-151 151t-55.5 208t55.5 207.5  
193 -t151 150.5t207.5 55.5t207.5 -55.5t151 -150.5t55.5 -207.5t-55.5 -208t-151 -151t-207.5 -55.5zM512 471q25 0 43 -18t18 -44h87q0 50 -29 89t-75 53v50q0 9 -6.5 15.5t-15.5 6.5h-44q-9 0 -15.5 -6.5t-6.5 -15.5v-50q-46 -14 -75 -53t-29 -89q0 -104 133 -154  
194 -q27 -9 44 -20t23 -22t7.5 -16.5t1.5 -13.5q0 -25 -18 -43t-43 -18t-43 18t-18 43h-87q0 -49 29 -88t75 -54v-50q0 -9 6.5 -15t15.5 -6h44q9 0 15.5 6t6.5 15v50q46 15 75 54t29 88q0 105 -133 154q-27 10 -44 21t-23 22t-7.5 16.5t-1.5 12.5q0 26 18 44t43 18z" /> 196 +d="M512 881q-102 0 -194.5 -39.5t-160 -106.5t-107 -160t-39.5 -194.5t39.5 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t39.5 194.5t-39.5 194.5t-107 160t-160 106.5t-194.5 39.5zM512 -34q-112 0 -207.5 55.5t-151 151t-55.5 208t55.5 207.5t151 150.5
  197 +t207.5 55.5t207.5 -55.5t151 -150.5t55.5 -207.5t-55.5 -208t-151 -151t-207.5 -55.5zM512 555q25 0 43 -18t18 -44h87q0 50 -29 89t-75 53v50q0 9 -6.5 15.5t-15.5 6.5h-44q-9 0 -15.5 -6.5t-6.5 -15.5v-50q-46 -14 -75 -53t-29 -89q0 -104 133 -154q27 -9 44 -20t23 -22
  198 +t7.5 -16.5t1.5 -13.5q0 -25 -18 -43t-43 -18t-43 18t-18 43h-87q0 -49 29 -88t75 -54v-50q0 -9 6.5 -15t15.5 -6h44q9 0 15.5 6t6.5 15v50q46 15 75 54t29 88q0 105 -133 154q-27 10 -44 21t-23 22t-7.5 16.5t-1.5 12.5q0 26 18 44t43 18z" />
195 <glyph glyph-name="uniE636" unicode="&#xe636;" 199 <glyph glyph-name="uniE636" unicode="&#xe636;"
196 -d="M947 675h-892q-23 0 -39 -16t-16 -38v-642q0 -23 16 -39t39 -16h892q22 0 38 16t16 39v642q0 22 -16 38t-38 16zM836 584l-335 -260l-336 260h671zM91 16v511l376 -293q15 -11 33.5 -11t33.5 11l376 293v-511h-819z" /> 200 +d="M947 759h-892q-23 0 -39 -16t-16 -38v-642q0 -23 16 -39t39 -16h892q22 0 38 16t16 39v642q0 22 -16 38t-38 16zM836 668l-335 -260l-336 260h671zM91 100v511l376 -293q15 -11 33.5 -11t33.5 11l376 293v-511h-819z" />
197 <glyph glyph-name="uniE637" unicode="&#xe637;" 201 <glyph glyph-name="uniE637" unicode="&#xe637;"
198 -d="M512 572q-63 0 -107.5 -44.5t-44.5 -107.5t44.5 -107.5t107.5 -44.5t107.5 44.5t44.5 107.5t-44.5 107.5t-107.5 44.5zM512 796q-102 0 -188.5 -50.5t-136.5 -137t-50 -188.5q0 -56 36 -137.5t81 -151t104 -146.5t85 -107t44 -50l25 -28l25 28q18 20 44 50t85 107  
199 -t104 146.5t81 151t36 137.5q0 102 -50 188.5t-136.5 137t-188.5 50.5zM512 -97q-46 54 -93.5 115.5t-98.5 137t-83 147t-32 117.5q0 127 90 217t217 90t217 -90t90 -217q0 -46 -32 -117.5t-83 -147t-98.5 -137t-93.5 -115.5z" /> 202 +d="M512 656q-63 0 -107.5 -44.5t-44.5 -107.5t44.5 -107.5t107.5 -44.5t107.5 44.5t44.5 107.5t-44.5 107.5t-107.5 44.5zM512 880q-102 0 -188.5 -50.5t-136.5 -137t-50 -188.5q0 -56 36 -137.5t81 -151t104 -146.5t85 -107t44 -50l25 -28l25 28q18 20 44 50t85 107
  203 +t104 146.5t81 151t36 137.5q0 102 -50 188.5t-136.5 137t-188.5 50.5zM512 -13q-46 54 -93.5 115.5t-98.5 137t-83 147t-32 117.5q0 127 90 217t217 90t217 -90t90 -217q0 -46 -32 -117.5t-83 -147t-98.5 -137t-93.5 -115.5z" />
200 <glyph glyph-name="uniE638" unicode="&#xe638;" horiz-adv-x="1335" 204 <glyph glyph-name="uniE638" unicode="&#xe638;" horiz-adv-x="1335"
201 -d="M1273 -88h-1179q-26 0 -44 -18t-18 -44t18 -44t44 -18h1179q26 0 44 18t18 44t-18 44t-44 18zM841 657h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44t46 -18zM841 230h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44  
202 -t46 -18zM85 230h434q26 0 44 18t18 44v435q0 25 -18 43.5t-44 18.5h-434q-26 0 -44 -18.5t-18 -43.5v-435q0 -25 18 -43.5t44 -18.5zM147 665h310v-311h-310v311z" /> 205 +d="M1273 -4h-1179q-26 0 -44 -18t-18 -44t18 -44t44 -18h1179q26 0 44 18t18 44t-18 44t-44 18zM841 741h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44t46 -18zM841 314h429q27 0 46 18t19 44t-19 44t-46 18h-429q-27 0 -46 -18t-19 -44t19 -44
  206 +t46 -18zM85 314h434q26 0 44 18t18 44v435q0 25 -18 43.5t-44 18.5h-434q-26 0 -44 -18.5t-18 -43.5v-435q0 -25 18 -43.5t44 -18.5zM147 749h310v-311h-310v311z" />
203 <glyph glyph-name="uniE639" unicode="&#xe639;" 207 <glyph glyph-name="uniE639" unicode="&#xe639;"
204 -d="M507 811q-101 0 -194 -40t-160 -107t-107 -160t-40 -194.5t40 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t40 194.5t-40 194.5t-107 160t-160 107t-195 40zM507 -104q-112 0 -207.5 55.5t-150.5 150.5t-55 207.5t55 208t150.5 151t208 55.5  
205 -t207.5 -55.5t150.5 -151t55.5 -208t-55.5 -207.5t-150.5 -150.5t-208 -55.5zM506 605h-1h-1q-67 0 -115 -47q-48 -48 -48 -116q0 -18 12.5 -31t30.5 -13t31 13t13 31q0 32 22 54q22 21 55 22q30 -1 52.5 -23t22.5 -52q1 -24 -12 -43t-34 -29q-34 -14 -54 -44.5t-20 -68.5  
206 -v-36q0 -18 13 -30.5t31 -12.5t31 12.5t13 30.5v36q0 24 20 33q46 20 73 61.5t26 91.5q-1 66 -48 113t-113 48zM504 135q-23 0 -39 -16t-16 -38.5t16 -38.5t39 -16t38.5 16t15.5 38.5t-15.5 38.5t-38.5 16z" /> 208 +d="M507 895q-101 0 -194 -40t-160 -107t-107 -160t-40 -194.5t40 -194.5t107 -160t160 -107t194.5 -40t194.5 40t160 107t107 160t40 194.5t-40 194.5t-107 160t-160 107t-195 40zM507 -20q-112 0 -207.5 55.5t-150.5 150.5t-55 207.5t55 208t150.5 151t208 55.5
  209 +t207.5 -55.5t150.5 -151t55.5 -208t-55.5 -207.5t-150.5 -150.5t-208 -55.5zM506 689h-1h-1q-67 0 -115 -47q-48 -48 -48 -116q0 -18 12.5 -31t30.5 -13t31 13t13 31q0 32 22 54q22 21 55 22q30 -1 52.5 -23t22.5 -52q1 -24 -12 -43t-34 -29q-34 -14 -54 -44.5t-20 -68.5
  210 +v-36q0 -18 13 -30.5t31 -12.5t31 12.5t13 30.5v36q0 24 20 33q46 20 73 61.5t26 91.5q-1 66 -48 113t-113 48zM504 219q-23 0 -39 -16t-16 -38.5t16 -38.5t39 -16t38.5 16t15.5 38.5t-15.5 38.5t-38.5 16z" />
207 <glyph glyph-name="uniE63A" unicode="&#xe63a;" 211 <glyph glyph-name="uniE63A" unicode="&#xe63a;"
208 -d="M964 376q21 1 35 16t14 36v147q0 21 -15.5 36.5t-36.5 15.5h-898q-21 0 -36.5 -15.5t-15.5 -36.5v-147q0 -21 14 -36t35 -16q29 -2 49.5 -24t20.5 -52t-20.5 -52t-49.5 -24q-21 -1 -35 -16t-14 -36v-147q0 -21 15.5 -36.5t36.5 -15.5h898q21 0 36.5 15.5t15.5 36.5v147  
209 -q0 21 -14 36t-35 16q-29 2 -49.5 24t-20.5 52t20.5 52t49.5 24zM926 143v-83h-828v83q52 15 85.5 58.5t33.5 98.5t-33.5 98.5t-85.5 58.5v83h283v-66h66v66h479v-83q-52 -15 -85.5 -58.5t-33.5 -98.5t33.5 -98.5t85.5 -58.5zM381 278h66v-109h-66v109zM381 431h66v-109h-66  
210 -v109zM381 126h66v-66h-66v66z" /> 212 +d="M964 460q21 1 35 16t14 36v147q0 21 -15.5 36.5t-36.5 15.5h-898q-21 0 -36.5 -15.5t-15.5 -36.5v-147q0 -21 14 -36t35 -16q29 -2 49.5 -24t20.5 -52t-20.5 -52t-49.5 -24q-21 -1 -35 -16t-14 -36v-147q0 -21 15.5 -36.5t36.5 -15.5h898q21 0 36.5 15.5t15.5 36.5v147
  213 +q0 21 -14 36t-35 16q-29 2 -49.5 24t-20.5 52t20.5 52t49.5 24zM926 227v-83h-828v83q52 15 85.5 58.5t33.5 98.5t-33.5 98.5t-85.5 58.5v83h283v-66h66v66h479v-83q-52 -15 -85.5 -58.5t-33.5 -98.5t33.5 -98.5t85.5 -58.5zM381 362h66v-109h-66v109zM381 515h66v-109h-66
  214 +v109zM381 210h66v-66h-66v66z" />
211 <glyph glyph-name="uniE63B" unicode="&#xe63b;" horiz-adv-x="1199" 215 <glyph glyph-name="uniE63B" unicode="&#xe63b;" horiz-adv-x="1199"
212 -d="M1149 812h-1099q-21 0 -35.5 -14.5t-14.5 -35.5v-350q0 -20 14.5 -35t35.5 -15h1099q21 0 35.5 15t14.5 35v350q0 21 -14.5 35.5t-35.5 14.5zM100 712h999v-250h-999v250zM1024 312q-21 0 -35.5 -14.5t-14.5 -34.5v-375h-749v375q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5  
213 -t-14.5 -34.5v-425q0 -21 14.5 -35.5t35.5 -14.5h849q21 0 35.5 14.5t14.5 35.5v425q0 20 -14.5 34.5t-35.5 14.5zM325 312q-21 0 -35.5 -14.5t-14.5 -34.5v-200q0 -21 14.5 -35.5t35.5 -14.5h549q21 0 35.5 14.5t14.5 35.5v200q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5 216 +d="M1149 896h-1099q-21 0 -35.5 -14.5t-14.5 -35.5v-350q0 -20 14.5 -35t35.5 -15h1099q21 0 35.5 15t14.5 35v350q0 21 -14.5 35.5t-35.5 14.5zM100 796h999v-250h-999v250zM1024 396q-21 0 -35.5 -14.5t-14.5 -34.5v-375h-749v375q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5
  217 +t-14.5 -34.5v-425q0 -21 14.5 -35.5t35.5 -14.5h849q21 0 35.5 14.5t14.5 35.5v425q0 20 -14.5 34.5t-35.5 14.5zM325 396q-21 0 -35.5 -14.5t-14.5 -34.5v-200q0 -21 14.5 -35.5t35.5 -14.5h549q21 0 35.5 14.5t14.5 35.5v200q0 20 -14.5 34.5t-35.5 14.5t-35.5 -14.5
214 t-14.5 -34.5v-150h-449v150q0 20 -15 34.5t-35 14.5z" /> 218 t-14.5 -34.5v-150h-449v150q0 20 -15 34.5t-35 14.5z" />
215 <glyph glyph-name="uniE63C" unicode="&#xe63c;" horiz-adv-x="1048" 219 <glyph glyph-name="uniE63C" unicode="&#xe63c;" horiz-adv-x="1048"
216 -d="M297.5 437q-20.5 0 -35 -14.5t-14.5 -35.5t14.5 -35.5t35 -14.5t35.5 14.5t15 35.5t-15 35.5t-35.5 14.5zM953 -55q95 93 95 215t-94 214q2 20 2 23q0 111 -64 205t-174.5 148.5t-240 54.5t-239.5 -54.5t-174 -148.5t-64 -205q0 -78 33 -148.5t93 -125.5l-77 -123  
217 -q-8 -12 -6.5 -26t10.5 -25q13 -15 32 -15q9 0 18 4l180 80q4 2 7 4q20 -7 39 -12q48 -80 138.5 -128t199.5 -48q75 0 145 25q1 -1 2 -1l140 -62q8 -4 17 -4q20 0 32 15q10 10 11 24t-7 26zM286 160q0 -17 2 -35v1q-88 42 -140.5 114t-52.5 157t51.5 157t139.5 114t192 42  
218 -q142 0 249.5 -76.5t128.5 -189.5q-88 43 -189 43q-104 0 -191.5 -43.5t-138.5 -119t-51 -164.5zM381 160q0 96 84 164t202 68t202 -68t84 -163.5t-84 -163.5t-202 -68t-202 68t-84 163zM527 191q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5  
219 -t-11.5 27t-27.5 11zM667 191q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM806 191q-16 0 -27 -11t-11 -27t11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11z" /> 220 +d="M297.5 521q-20.5 0 -35 -14.5t-14.5 -35.5t14.5 -35.5t35 -14.5t35.5 14.5t15 35.5t-15 35.5t-35.5 14.5zM953 29q95 93 95 215t-94 214q2 20 2 23q0 111 -64 205t-174.5 148.5t-240 54.5t-239.5 -54.5t-174 -148.5t-64 -205q0 -78 33 -148.5t93 -125.5l-77 -123
  221 +q-8 -12 -6.5 -26t10.5 -25q13 -15 32 -15q9 0 18 4l180 80q4 2 7 4q20 -7 39 -12q48 -80 138.5 -128t199.5 -48q75 0 145 25q1 -1 2 -1l140 -62q8 -4 17 -4q20 0 32 15q10 10 11 24t-7 26zM286 244q0 -17 2 -35v1q-88 42 -140.5 114t-52.5 157t51.5 157t139.5 114t192 42
  222 +q142 0 249.5 -76.5t128.5 -189.5q-88 43 -189 43q-104 0 -191.5 -43.5t-138.5 -119t-51 -164.5zM381 244q0 96 84 164t202 68t202 -68t84 -163.5t-84 -163.5t-202 -68t-202 68t-84 163zM527 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5
  223 +t-11.5 27t-27.5 11zM667 275q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11zM806 275q-16 0 -27 -11t-11 -27t11 -27.5t27 -11.5t27.5 11.5t11.5 27.5t-11.5 27t-27.5 11z" />
220 <glyph glyph-name="uniE63D" unicode="&#xe63d;" 224 <glyph glyph-name="uniE63D" unicode="&#xe63d;"
221 d="M512 13q-131 0 -241.5 55t-175 149.5t-64.5 205.5t64.5 205.5t175 149.5t241.5 55t241.5 -55t175 -149.5t64.5 -205.5t-64.5 -205.5t-175 -149.5t-241.5 -55zM512 751q-108 0 -200 -44t-145.5 -119.5t-53.5 -164.5t53.5 -164.5t145.5 -119.5t200 -44t200 44t145.5 119.5 225 d="M512 13q-131 0 -241.5 55t-175 149.5t-64.5 205.5t64.5 205.5t175 149.5t241.5 55t241.5 -55t175 -149.5t64.5 -205.5t-64.5 -205.5t-175 -149.5t-241.5 -55zM512 751q-108 0 -200 -44t-145.5 -119.5t-53.5 -164.5t53.5 -164.5t145.5 -119.5t200 -44t200 44t145.5 119.5
222 t53.5 164.5t-53.5 164.5t-145.5 119.5t-200 44zM730 75l184 -82l-102 164zM914 -44q-8 0 -15 3l-184 82q-14 6 -19.5 20.5t0.5 28.5t20.5 19.5t28.5 -1.5l74 -33l-39 62q-8 13 -4.5 28t16.5 23t28 4.5t23 -16.5l102 -164q15 -23 -3 -43q-11 -13 -28 -13zM379 412.5 226 t53.5 164.5t-53.5 164.5t-145.5 119.5t-200 44zM730 75l184 -82l-102 164zM914 -44q-8 0 -15 3l-184 82q-14 6 -19.5 20.5t0.5 28.5t20.5 19.5t28.5 -1.5l74 -33l-39 62q-8 13 -4.5 28t16.5 23t28 4.5t23 -16.5l102 -164q15 -23 -3 -43q-11 -13 -28 -13zM379 412.5
223 q0 -21.5 -15 -36.5t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36.5zM563 412.5q0 -21.5 -15 -36.5t-36 -15t-36 15t-15 36.5t15 36.5t36 15t36 -15t15 -36.5zM748 413q0 -22 -15 -37t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36z" /> 227 q0 -21.5 -15 -36.5t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36.5zM563 412.5q0 -21.5 -15 -36.5t-36 -15t-36 15t-15 36.5t15 36.5t36 15t36 -15t15 -36.5zM748 413q0 -22 -15 -37t-36.5 -15t-36.5 15t-15 36.5t15 36.5t36.5 15t36.5 -15t15 -36z" />
224 <glyph glyph-name="uniE63E" unicode="&#xe63e;" 228 <glyph glyph-name="uniE63E" unicode="&#xe63e;"
225 -d="M521 317zM768 -178q-94 0 -205 56q-145 72 -277 204.5t-205 277.5q-55 113 -56.5 201t52.5 140q13 13 30 13t29.5 -13t12.5 -30t-12 -30q-32 -32 -26.5 -98t47.5 -149q68 -137 187.5 -256.5t256.5 -187.5q83 -42 149 -47.5t98 26.5q13 13 30 13t30 -13t13 -30t-13 -30  
226 -q-54 -47 -141 -47zM333 355q-26 0 -39 26q-9 16 -4 32.5t21 23.5l99 46q15 8 26 23t8 33q0 13 -17 30l-141 145q-20 20 -56 13q-12 -7 -25 -13l-68 -73q-13 -12 -30 -12t-30 12.5t-13 29.5t13 30l68 68q28 28 60 34q80 20 141 -34l140 -140q32 -32 39 -82q6 -41 -16.5 -81.5  
227 -t-64.5 -63.5l-98 -47h-13zM875 -139q-17 0 -30 12.5t-13 29.5t13 30l68 68q13 13 13 26q7 35 -13 55l-141 141q-4 4 -30 17q-18 3 -33 -7t-22 -27l-47 -98q-6 -16 -22.5 -21.5t-32.5 4.5q-17 6 -22 22.5t4 32.5l47 99q23 42 62 64.5t83 16.5q45 -7 77 -39l141 -141  
228 -q29 -28 38 -65t-4 -75q-17 -43 -34 -60l-72 -73q-13 -12 -30 -12zM602 87q-9 0 -26 8q-77 58 -154 128q-76 77 -128 154q-9 12 -6 29.5t19 30.5q16 9 33 6.5t27 -15.5q69 -95 119 -141q94 -85 141 -119q16 -10 18.5 -27t-9.5 -33q-6 -21 -34 -21z" /> 229 +d="M521 401zM768 -94q-94 0 -205 56q-145 72 -277 204.5t-205 277.5q-55 113 -56.5 201t52.5 140q13 13 30 13t29.5 -13t12.5 -30t-12 -30q-32 -32 -26.5 -98t47.5 -149q68 -137 187.5 -256.5t256.5 -187.5q83 -42 149 -47.5t98 26.5q13 13 30 13t30 -13t13 -30t-13 -30
  230 +q-54 -47 -141 -47zM333 439q-26 0 -39 26q-9 16 -4 32.5t21 23.5l99 46q15 8 26 23t8 33q0 13 -17 30l-141 145q-20 20 -56 13q-12 -7 -25 -13l-68 -73q-13 -12 -30 -12t-30 12.5t-13 29.5t13 30l68 68q28 28 60 34q80 20 141 -34l140 -140q32 -32 39 -82q6 -41 -16.5 -81.5
  231 +t-64.5 -63.5l-98 -47h-13zM875 -55q-17 0 -30 12.5t-13 29.5t13 30l68 68q5 6 7.5 8.5t4 7t1.5 10.5q7 35 -13 55l-141 141q-4 4 -30 17q-18 3 -33 -7t-22 -27l-47 -98q-6 -16 -22.5 -21.5t-32.5 4.5q-17 6 -22 22.5t4 32.5l47 99q23 42 62 64.5t83 16.5q45 -7 77 -39
  232 +l141 -141q29 -28 38 -65t-4 -75q-17 -43 -34 -60l-72 -73q-13 -12 -30 -12zM602 171q-9 0 -26 8q-77 58 -154 128q-76 77 -128 154q-9 12 -6 29.5t19 30.5q16 9 33 6.5t27 -15.5q69 -95 119 -141q94 -85 141 -119q16 -10 18.5 -27t-9.5 -33q-6 -21 -34 -21z" />
229 <glyph glyph-name="uniE63F" unicode="&#xe63f;" horiz-adv-x="1025" 233 <glyph glyph-name="uniE63F" unicode="&#xe63f;" horiz-adv-x="1025"
230 -d="M512 -66q-11 0 -31 -1t-36.5 -1t-30.5 2l-222 -146q0 227 5 243q-91 65 -144 152.5t-53 189.5q0 122 68.5 223t186 158.5t257.5 57.5t257.5 -57.5t186 -158.5t68.5 -222.5t-68.5 -223t-186 -159t-257.5 -57.5zM512 763q-122 0 -229 -52.5t-170.5 -143t-63.5 -194.5  
231 -q0 -95 53 -179t142 -138v-170l146 97q16 -3 35.5 -4t49 0t37.5 1q122 0 229 53.5t170.5 144.5t63.5 195t-63.5 194.5t-170.5 143t-229 52.5zM768 300q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM512 300  
232 -q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM256 300q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" /> 234 +d="M512 18q-11 0 -31 -1t-36.5 -1t-30.5 2l-222 -146q0 227 5 243q-91 65 -144 152.5t-53 189.5q0 122 68.5 223t186 158.5t257.5 57.5t257.5 -57.5t186 -158.5t68.5 -222.5t-68.5 -223t-186 -159t-257.5 -57.5zM512 847q-122 0 -229 -52.5t-170.5 -143t-63.5 -194.5
  235 +q0 -95 53 -179t142 -138v-170l146 97q16 -3 35.5 -4t49 0t37.5 1q122 0 229 53.5t170.5 144.5t63.5 195t-63.5 194.5t-170.5 143t-229 52.5zM768 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM512 384
  236 +q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5zM256 384q-27 0 -45.5 18.5t-18.5 45.5t18.5 45.5t45.5 18.5t45.5 -18.5t18.5 -45.5t-18.5 -45.5t-45.5 -18.5z" />
233 <glyph glyph-name="uniE640" unicode="&#xe640;" 237 <glyph glyph-name="uniE640" unicode="&#xe640;"
234 -d="M957 510q-12 19 -38 19h-598l-29 62q-3 7 -8 14q-3 4 -8 8q-4 3 -7 6l-2 1l-8 4h-2q-5 2 -9 2l-4 1h-5h-118q-23 0 -40 -16.5t-17 -40t17 -40.5t40 -17h81l33 -71q3 -10 8 -21t8 -17l3 -5l81 -181q0 -2 2 -5l15 -32q9 -30 39 -38v-3h392l18 1v2q30 9 39 38l98 217  
235 -q40 77 19 112zM909 413l-93 -207l-3 1l-4 -15q-5 -19 -25 -19l-19 1v-1h-340h-18q-19 0 -24 19l-4 15l-3 -1l-93 208q-10 17 -18 40l-42 92h-102q-10 0 -17 7t-7 17t7 17.5t17 7.5h119l3 -1q1 0 4 -1q2 0 4 -2q2 -1 4 -3q2 -1 3 -3l4 -6l38 -83h619q8 0 10 -3  
236 -q5 -8 -1.5 -32.5t-18.5 -47.5zM470 107q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM470 -23q-21 0 -36 15t-15 36t15 36t36 15t36 -15t15 -36.5t-15 -36t-36 -14.5zM747 107q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5  
237 -t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM747 -23q-21 0 -36 14.5t-15 36t15 36.5t36 15t36 -15t15 -36t-15 -36t-36 -15z" /> 238 +d="M957 594q-12 19 -38 19h-598l-29 62q-3 7 -8 14q-3 4 -8 8q-4 3 -7 6l-2 1l-8 4h-2q-5 2 -9 2l-4 1h-5h-118q-23 0 -40 -16.5t-17 -40t17 -40.5t40 -17h81l33 -71q2 -6 5 -13t5 -12t4.5 -9.5t3.5 -6.5l1 -2l81 -181q0 -2 2 -5l15 -32q9 -30 39 -38v-3h392l18 1v2
  239 +q30 9 39 38l98 217q40 77 19 112zM909 497l-93 -207l-3 1l-4 -15q-5 -19 -25 -19l-19 1v-1h-340h-18q-19 0 -24 19l-4 15l-3 -1l-93 208q-10 17 -18 40l-42 92h-102q-10 0 -17 7t-7 17t7 17.5t17 7.5h119l3 -1q1 0 4 -1q2 0 4 -2q2 -1 4 -3q2 -1 3 -3l4 -6l38 -83h619
  240 +q8 0 10 -3q5 -8 -1.5 -32.5t-18.5 -47.5zM470 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM470 61q-21 0 -36 15t-15 36t15 36t36 15t36 -15t15 -36.5t-15 -36t-36 -14.5zM747 191q-33 0 -56.5 -23t-23.5 -56t23.5 -56.5
  241 +t56.5 -23.5t56.5 23.5t23.5 56.5t-23.5 56t-56.5 23zM747 61q-21 0 -36 14.5t-15 36t15 36.5t36 15t36 -15t15 -36t-15 -36t-36 -15z" />
238 <glyph glyph-name="uniE641" unicode="&#xe641;" horiz-adv-x="1045" 242 <glyph glyph-name="uniE641" unicode="&#xe641;" horiz-adv-x="1045"
239 d="M522 893q-103 0 -197 -40t-162 -108t-108.5 -162t-40.5 -197.5t40.5 -197.5t108.5 -162t162 -108t197.5 -40t197.5 40t162 108t108 162t40 197.5t-40 197.5t-108 162t-162 108t-198 40zM522 -49q-88 0 -168.5 34.5t-138.5 93t-92.5 138.5t-34.5 168.5t34.5 169 243 d="M522 893q-103 0 -197 -40t-162 -108t-108.5 -162t-40.5 -197.5t40.5 -197.5t108.5 -162t162 -108t197.5 -40t197.5 40t162 108t108 162t40 197.5t-40 197.5t-108 162t-162 108t-198 40zM522 -49q-88 0 -168.5 34.5t-138.5 93t-92.5 138.5t-34.5 168.5t34.5 169
240 t92.5 138.5t138.5 92.5t169 34.5t168.5 -34.5t138.5 -92.5t93 -138.5t34.5 -169t-34.5 -168.5t-93 -138.5t-138.5 -93t-169 -34.5zM775 268l-105 61q-11 4 -21 6.5t-18 2.5t-15 -0.5t-13 -4t-10 -5.5t-9 -6l-6 -7q-2 -2 -6 -7l-3 -4l-6 -10q-34 -4 -59 21l-51 50 244 t92.5 138.5t138.5 92.5t169 34.5t168.5 -34.5t138.5 -92.5t93 -138.5t34.5 -169t-34.5 -168.5t-93 -138.5t-138.5 -93t-169 -34.5zM775 268l-105 61q-11 4 -21 6.5t-18 2.5t-15 -0.5t-13 -4t-10 -5.5t-9 -6l-6 -7q-2 -2 -6 -7l-3 -4l-6 -10q-34 -4 -59 21l-51 50
@@ -250,18 +254,34 @@ d="M523 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105 @@ -250,18 +254,34 @@ d="M523 881q-101 0 -192.5 -39.5t-158 -105.5t-105.5 -158t-39 -192.5t39 -192.5t105
250 q-7 -7 -17 -7t-18 7l-34 34q-59 -42 -131 -42q-94 0 -160.5 66.5t-66.5 160.5t67 160.5t160.5 66.5t160 -66.5t66.5 -160.5q0 -75 -45 -135zM592 337q8 7 18 6.5t17 -7.5l27 -27q25 39 25 84q0 64 -45.5 109.5t-110 45.5t-110 -45.5t-45.5 -109.5t45.5 -109.5t109.5 -45.5 254 q-7 -7 -17 -7t-18 7l-34 34q-59 -42 -131 -42q-94 0 -160.5 66.5t-66.5 160.5t67 160.5t160.5 66.5t160 -66.5t66.5 -160.5q0 -75 -45 -135zM592 337q8 7 18 6.5t17 -7.5l27 -27q25 39 25 84q0 64 -45.5 109.5t-110 45.5t-110 -45.5t-45.5 -109.5t45.5 -109.5t109.5 -45.5
251 q44 0 80 21l-27 28q-8 7 -7.5 18t7.5 18z" /> 255 q44 0 80 21l-27 28q-8 7 -7.5 18t7.5 18z" />
252 <glyph glyph-name="uniE645" unicode="&#xe645;" 256 <glyph glyph-name="uniE645" unicode="&#xe645;"
253 -d="M512 798q-104 0 -198 -40.5t-162.5 -109t-109 -162.5t-40.5 -198t40.5 -198t109 -162.5t162.5 -109t198 -40.5t198 40.5t162.5 109t109 162.5t40.5 198t-40.5 198t-109 162.5t-162.5 109t-198 40.5zM512 -149q-89 0 -170 34.5t-139.5 93t-93 139.5t-34.5 170t34.5 170  
254 -t93 139.5t139.5 93t170 34.5t170 -34.5t139.5 -93t93 -139.5t34.5 -170t-34.5 -170t-93 -139.5t-139.5 -93t-170 -34.5zM659 288q15 0 25.5 10.5t10.5 25.5t-10.5 26t-25.5 11h-111v17l135 141q11 11 10.5 26t-11 25.5t-25.5 10t-26 -11.5l-115 -121l-123 122 257 +d="M512 894q-104 0 -198 -40.5t-162.5 -109t-109 -162.5t-40.5 -198t40.5 -198t109 -162.5t162.5 -109t198 -40.5t198 40.5t162.5 109t109 162.5t40.5 198t-40.5 198t-109 162.5t-162.5 109t-198 40.5zM512 -53q-89 0 -170 34.5t-139.5 93t-93 139.5t-34.5 170t34.5 170
  258 +t93 139.5t139.5 93t170 34.5t170 -34.5t139.5 -93t93 -139.5t34.5 -170t-34.5 -170t-93 -139.5t-139.5 -93t-170 -34.5zM659 384q15 0 25.5 10.5t10.5 25.5t-10.5 26t-25.5 11h-111v17l135 141q11 11 10.5 26t-11 25.5t-25.5 10t-26 -11.5l-115 -121l-123 122
255 q-11 11 -26 10.5t-25.5 -11t-11 -25.5t10.5 -26l135 -135v-22h-108q-15 0 -26 -11t-11 -26t11 -25.5t26 -10.5h108v-73h-108q-15 0 -26 -10.5t-11 -25.5t11 -26t26 -11h108v-108q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v108h111q15 0 25.5 11t10.5 26t-10.5 25.5 259 q-11 11 -26 10.5t-25.5 -11t-11 -25.5t10.5 -26l135 -135v-22h-108q-15 0 -26 -11t-11 -26t11 -25.5t26 -10.5h108v-73h-108q-15 0 -26 -10.5t-11 -25.5t11 -26t26 -11h108v-108q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v108h111q15 0 25.5 11t10.5 26t-10.5 25.5
256 t-25.5 10.5h-111v73h111z" /> 260 t-25.5 10.5h-111v73h111z" />
257 <glyph glyph-name="uniE646" unicode="&#xe646;" 261 <glyph glyph-name="uniE646" unicode="&#xe646;"
258 -d="M708 469l-257 -267l-135 141q-12 13 -28.5 13t-28 -12.5t-11.5 -29.5t11 -29l164 -170q4 -4 8 -7q12 -7 25.5 -5.5t23.5 12.5l284 295q12 13 12 30t-12 29q-41 16 -56 0zM512 300zM17 300q0 101 39 192.5t105.5 158t158 105.5t192.5 39t192.5 -39t158 -105.5t105.5 -158 262 +d="M708 553l-257 -267l-135 141q-12 13 -28.5 13t-28 -12.5t-11.5 -29.5t11 -29l164 -170q4 -4 8 -7q12 -7 25.5 -5.5t23.5 12.5l284 295q12 13 12 30t-12 29q-41 16 -56 0zM512 384zM17 384q0 101 39 192.5t105.5 158t158 105.5t192.5 39t192.5 -39t158 -105.5t105.5 -158
259 t39 -192.5t-39 -192.5t-105.5 -158t-158 -105.5t-192.5 -39t-192.5 39t-158 105.5t-105.5 158t-39 192.5z" /> 263 t39 -192.5t-39 -192.5t-105.5 -158t-158 -105.5t-192.5 -39t-192.5 39t-158 105.5t-105.5 158t-39 192.5z" />
260 <glyph glyph-name="uniE647" unicode="&#xe647;" 264 <glyph glyph-name="uniE647" unicode="&#xe647;"
261 d="M512 -92q-97 0 -185 37.5t-152 101.5t-101.5 152t-37.5 185t37.5 185t101.5 152t152 101.5t185 37.5t185 -37.5t152 -101.5t101.5 -152t37.5 -185t-37.5 -185t-101.5 -152t-152 -101.5t-185 -37.5zM512 828q-90 0 -172.5 -35t-142 -94.5t-94.5 -142t-35 -172.5t35 -172.5 265 d="M512 -92q-97 0 -185 37.5t-152 101.5t-101.5 152t-37.5 185t37.5 185t101.5 152t152 101.5t185 37.5t185 -37.5t152 -101.5t101.5 -152t37.5 -185t-37.5 -185t-101.5 -152t-152 -101.5t-185 -37.5zM512 828q-90 0 -172.5 -35t-142 -94.5t-94.5 -142t-35 -172.5t35 -172.5
262 t94.5 -142t142 -94.5t172.5 -35t172.5 35t142 94.5t94.5 142t35 172.5t-35 172.5t-94.5 142t-142 94.5t-172.5 35z" /> 266 t94.5 -142t142 -94.5t172.5 -35t172.5 35t142 94.5t94.5 142t35 172.5t-35 172.5t-94.5 142t-142 94.5t-172.5 35z" />
263 <glyph glyph-name="uniE648" unicode="&#xe648;" 267 <glyph glyph-name="uniE648" unicode="&#xe648;"
264 -d="M512 798q-101 0 -193.5 -39.5t-159 -106t-106 -159t-39.5 -193.5t39.5 -193.5t106 -159t159 -106t193.5 -39.5t193.5 39.5t159 106t106 159t39.5 193.5t-39.5 193.5t-106 159t-159 106t-193.5 39.5zM512 -166q-95 0 -181 37t-148.5 99.5t-99.5 148.5t-37 181t37 181  
265 -t99.5 148.5t148.5 99.5t181 37t181 -37t148.5 -99.5t99.5 -148.5t37 -181t-37 -181t-99.5 -148.5t-148.5 -99.5t-181 -37zM420 133l-156 155l-22 -22l178 -179l361 361l-23 23z" /> 268 +d="M512 882q-101 0 -193.5 -39.5t-159 -106t-106 -159t-39.5 -193.5t39.5 -193.5t106 -159t159 -106t193.5 -39.5t193.5 39.5t159 106t106 159t39.5 193.5t-39.5 193.5t-106 159t-159 106t-193.5 39.5zM512 -82q-95 0 -181 37t-148.5 99.5t-99.5 148.5t-37 181t37 181
  269 +t99.5 148.5t148.5 99.5t181 37t181 -37t148.5 -99.5t99.5 -148.5t37 -181t-37 -181t-99.5 -148.5t-148.5 -99.5t-181 -37zM420 217l-156 155l-22 -22l178 -179l361 361l-23 23z" />
  270 + <glyph glyph-name="uniE649" unicode="&#xe649;"
  271 +d="M875 126l-363 -164l-363 164v610q247 75 363 75t363 -75v-610zM930 808q-34 11 -84.5 26t-159.5 38.5t-174 23.5t-174 -23.5t-159.5 -38.5t-84.5 -26q-14 -4 -22 -15.5t-8 -25.5v-669q0 -27 25 -39l405 -183q9 -3 18 -3t18 3l405 183q25 12 25 39v669q0 14 -8 25.5
  272 +t-22 15.5zM751 552v83h-473v-83h206v-298h-72v237h-87v-237h-66v-84h506v84h-193v119h151v83h-151v96h179z" />
  273 + <glyph glyph-name="uniE64A" unicode="&#xe64a;"
  274 +d="M510.5 -61q-90.5 0 -173.5 35.5t-142.5 95t-95 142.5t-35.5 173.5t35.5 173.5t95 142.5t142.5 95t173.5 35.5t173.5 -35.5t142.5 -95t95 -142.5t35.5 -173.5t-35.5 -173.5t-95 -142.5t-142.5 -95t-173.5 -35.5zM510.5 793q-110.5 0 -204.5 -54.5t-148.5 -148.5
  275 +t-54.5 -204.5t54.5 -204.5t148.5 -148.5t204.5 -54.5t204.5 54.5t148.5 148.5t54.5 204.5t-54.5 204.5t-148.5 148.5t-204.5 54.5zM491 347q-8 0 -13.5 5.5t-5.5 13.5v330q0 8 5.5 14t13.5 6t14 -6t6 -14v-330q0 -8 -6 -13.5t-14 -5.5zM763 347h-272q-8 0 -13.5 5.5
  276 +t-5.5 13.5t5.5 13.5t13.5 5.5h272q8 0 13.5 -5.5t5.5 -13.5t-5.5 -13.5t-13.5 -5.5z" />
  277 + <glyph glyph-name="uniE64B" unicode="&#xe64b;"
  278 +d="M379 -128q-57 0 -122 51.5t-97 132.5q-26 71 -27 149.5t24 151.5q11 33 32.5 70.5t37 58.5t46.5 62q17 20 51 68l11 14l23 34q9 14 21 35t18.5 38.5t11.5 38t4 42.5t-7 44q-6 11 7 24q7 7 20 7q149 -50 216 -284q27 50 58 69q12 6 23 0t11 -21q-3 -59 11.5 -126.5
  279 +t42.5 -126.5q4 -5 9 -17t8 -17q51 -89 55 -157q4 -63 -14.5 -126.5t-65.5 -120t-115 -80.5q-30 -11 -61 -11q-18 0 -30.5 5t-18 12.5t-7.5 13t-2 10.5q0 7 2 13t4 10t7.5 9.5t7.5 7t9 6.5t8 6l3 3q36 26 54 75.5t7 95.5q-4 28 -27 75q-2 6 -7.5 20t-8.5 22t-6.5 20t-4.5 23
  280 +q0 -2 -2 -5t-2 -5q-15 -42 -20 -75q0 -45 7 -58q7 -5 7.5 -14.5t-4.5 -16.5q-5 -8 -14 -10t-17 3v0q-67 44 -85 120q7 34 7 78v21v24q0 68 -10 92q-14 -53 -28 -72q-22 -39 -37 -58q-6 -6 -15.5 -20t-12.5 -18q-13 -22 -24 -46.5t-21.5 -61.5t-5.5 -78t28 -76
  281 +q3 -7 7.5 -12.5t8 -10t8.5 -10t7.5 -8t8 -7t7.5 -6.5t7.5 -6.5t6.5 -4.5q11 -9 16.5 -14.5t10 -14.5t0.5 -19q-5 -18 -21.5 -29.5t-39.5 -11.5z" />
  282 + <glyph glyph-name="uniE64C" unicode="&#xe64c;"
  283 +d="M911 725h-242v123q0 21 -13.5 34.5t-34.5 13.5h-246q-20 0 -33.5 -13.5t-13.5 -34.5v-123h-246q-21 0 -34.5 -13.5t-13.5 -34t13.5 -34t34.5 -13.5h293h243h293q21 0 34.5 13.5t13.5 34t-13.5 34t-34.5 13.5zM423 725v72h147v-72h-147zM765 579q-21 0 -34.5 -14
  284 +t-13.5 -34v-560h-441v560q0 20 -13.5 34t-34 14t-34 -14t-13.5 -34v-611q0 -21 13.5 -34.5t34.5 -13.5h536q20 0 33.5 13.5t13.5 34.5v611q3 20 -11.5 34t-35.5 14zM447 67v389q0 20 -13.5 33.5t-34 13.5t-34 -13.5t-13.5 -33.5v-389q0 -21 13.5 -34.5t34 -13.5t34 13.5
  285 +t13.5 34.5zM645 67v389q0 20 -13.5 33.5t-34.5 13.5q-20 0 -35.5 -13.5t-15.5 -33.5v-389q0 -21 13.5 -34.5t34.5 -13.5t36 13.5t15 34.5z" />
266 </font> 286 </font>
267 </defs></svg> 287 </defs></svg>
No preview for this file type
No preview for this file type
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 var $ = require('yoho-jquery'); 7 var $ = require('yoho-jquery');
8 8
9 var $activityTime = $('.activity-time'), 9 var $activityTime = $('.activity-time'),
10 - endTime = $activityTime ? $activityTime.data('time-ms') : ''; 10 + endTime = $activityTime ? $activityTime.data('time-s') : '';
11 11
12 var params = { 12 var params = {
13 anHour: 3600, // 1小时=?秒 13 anHour: 3600, // 1小时=?秒
@@ -515,13 +515,25 @@ $(window).scroll(function() { @@ -515,13 +515,25 @@ $(window).scroll(function() {
515 }); 515 });
516 516
517 // 初始请求最新第一页数据 517 // 初始请求最新第一页数据
518 -search([{  
519 - type: 'breakSort',  
520 - id: $('.coat').data('id')  
521 -}, {  
522 - type: 'breakSize',  
523 - id: $('.coat').data('allsub')  
524 -}]); 518 +$(function() {
  519 + var type = window.queryString.type;
  520 + var selector;
  521 +
  522 + // type 1: 上装, 3:下装, 6: 鞋装
  523 + if (type && type !== '1') {
  524 + selector = type === '3' ? '.trouser' : '.shoes';
  525 + } else {
  526 + selector = '.coat';
  527 + }
  528 + $('#list-nav').find(selector).addClass('active').siblings().removeClass('active');
  529 + search([{
  530 + type: 'breakSort',
  531 + id: $(selector).data('id')
  532 + }, {
  533 + type: 'breakSize',
  534 + id: $(selector).data('allsub')
  535 + }]);
  536 +});
525 537
526 $listNav.on('touchstart', 'li', function() { 538 $listNav.on('touchstart', 'li', function() {
527 $(this).addClass('bytouch'); 539 $(this).addClass('bytouch');
@@ -14,5 +14,3 @@ search.start(); @@ -14,5 +14,3 @@ search.start();
14 lazyLoad($('img.lazy')); 14 lazyLoad($('img.lazy'));
15 15
16 countDown(); 16 countDown();
17 -  
18 -  
@@ -5,22 +5,83 @@ @@ -5,22 +5,83 @@
5 */ 5 */
6 6
7 var $ = require('yoho-jquery'), 7 var $ = require('yoho-jquery'),
8 - Swiper = require('yoho-swiper'); 8 + Swiper = require('yoho-swiper'),
  9 + ellipsis = require('yoho-mlellipsis'),
  10 + lazyload = require('yoho-jquery-lazyload');
9 11
10 var search = require('./sale/search'); 12 var search = require('./sale/search');
11 13
12 require('../common'); 14 require('../common');
13 15
14 search.start(); 16 search.start();
  17 +lazyload($('img.lazy'));
  18 +ellipsis.init();
15 19
16 -if ($('.swiper-container .swiper-slide').length > 1) {  
17 - new Swiper('.swiper-container', {  
18 - lazyLoading: true,  
19 - lazyLoadingInPrevNext: true,  
20 - loop: true,  
21 - autoplay: 3000,  
22 - autoplayDisableOnInteraction: true,  
23 - paginationClickable: true,  
24 - pagination: '.banner-top .pagination-inner' 20 +$('.swiper-container').each(function() {
  21 + if ($(this).find('.swiper-slide').length > 1) {
  22 + new Swiper($(this).get(0), {
  23 + lazyLoading: true,
  24 + lazyLoadingInPrevNext: true,
  25 + loop: true,
  26 + autoplay: 3000,
  27 + autoplayDisableOnInteraction: true,
  28 + paginationClickable: true,
  29 + pagination: $(this).closest('.banner-top').find('.pagination-inner').get(0)
  30 + });
  31 + }
  32 +});
  33 +
  34 +$(function() {
  35 + var $body = $('body');
  36 + var $saleNavSelect = $('.sale-nav-select');
  37 + var $vipFloor = $('.vip-floor');
  38 + var $saleNavWrap = $('.sale-nav-wrap');
  39 + var $listNav = $saleNavWrap.find('#list-nav');
  40 + var $filterMask = $('.filter-mask');
  41 +
  42 + $('.sale-nav').on('click', function() {
  43 + $saleNavSelect.toggleClass('show');
  44 + });
  45 +
  46 + // 读取会员专享商品
  47 + $.ajax({
  48 + url: '/product/sale/search',
  49 + data: {
  50 + yh_channel: window.queryString.channel || 'boys',
  51 + saleType: '2',
  52 + productPool: $vipFloor.data('id'),
  53 + order: '0',
  54 + limit: '4'
  55 + }
  56 + }).then(function(res) {
  57 + if (/good-info/.test(res)) {
  58 + $vipFloor.html(res).addClass('goods-container');
  59 + lazyload($vipFloor.find('img.lazy'));
  60 +
  61 + $('.good-detail-text .name').each(function() {
  62 + var $this = $(this),
  63 + $title = $this.find('a');
  64 +
  65 + $title[0].mlellipsis(2);
  66 + });
  67 + }
  68 + });
  69 +
  70 + $saleNavWrap.css({
  71 + height: $saleNavWrap.height()
25 }); 72 });
26 -} 73 +
  74 + $(window).on('scroll', function() {
  75 + if (!$filterMask.length) {
  76 + $filterMask = $('.filter-mask');
  77 + }
  78 +
  79 + if ($body.scrollTop() > $saleNavWrap.offset().top) {
  80 + $listNav.addClass('fixed');
  81 + $filterMask.addClass('fixed');
  82 + } else {
  83 + $listNav.removeClass('fixed');
  84 + $filterMask.removeClass('fixed');
  85 + }
  86 + }).trigger('scroll');
  87 +});
@@ -71,7 +71,6 @@ var $listNav = $('#list-nav'), @@ -71,7 +71,6 @@ var $listNav = $('#list-nav'),
71 $pre = $listNav.find('.active'), // 纪录进入筛选前的active项,初始为选中项 71 $pre = $listNav.find('.active'), // 纪录进入筛选前的active项,初始为选中项
72 searching; 72 searching;
73 73
74 -require('../../common/suspend-cart'); // 悬浮购物车  
75 require('../../common'); 74 require('../../common');
76 75
77 ellipsis.init(); 76 ellipsis.init();
@@ -32,12 +32,12 @@ @@ -32,12 +32,12 @@
32 32
33 .banner-swiper { 33 .banner-swiper {
34 position: relative; 34 position: relative;
35 - height: 310.303px; 35 + max-height: 310.303px;
36 overflow: hidden; 36 overflow: hidden;
37 37
38 ul { 38 ul {
39 position: relative; 39 position: relative;
40 - height: 310.303px; 40 + max-height: 310.303px;
41 41
42 li { 42 li {
43 float: left; 43 float: left;
  1 +.discount-list {
  2 + li {
  3 + margin-bottom: 30px;
  4 + background: #fff;
  5 + }
  6 +
  7 + img {
  8 + width: 100%;
  9 + height: 250px;
  10 + }
  11 +
  12 + .discount-cont {
  13 + box-sizing: border-box;
  14 + padding: 0 20px;
  15 + height: 77px;
  16 + border-bottom: 1px solid #e0e0e0;
  17 + line-height: 77px;
  18 + }
  19 +
  20 + .discount-title {
  21 + float: left;
  22 + overflow: hidden;
  23 + width: 450px;
  24 + height: 77px;
  25 + text-overflow: ellipsis;
  26 + white-space: nowrap;
  27 + font-size: 24px;
  28 + }
  29 +
  30 + .discount-time {
  31 + float: right;
  32 + font-size: 22px;
  33 + }
  34 +
  35 + .red-color {
  36 + color: #d0021b;
  37 + }
  38 +}
@@ -21,6 +21,8 @@ @@ -21,6 +21,8 @@
21 @import "notice"; 21 @import "notice";
22 @import "fresh-only"; 22 @import "fresh-only";
23 @import "coupon"; 23 @import "coupon";
  24 +@import "discount-list";
  25 +@import "left-right";
24 26
25 .mobile-container { 27 .mobile-container {
26 margin-left: auto; 28 margin-left: auto;
  1 +.left-right-thumb-row {
  2 + background-color: #fff;
  3 + text-align: center;
  4 + margin-bottom: 30px;
  5 + padding: 30px 0;
  6 + border-bottom: 1px solid #e0e0e0;
  7 +
  8 + .thumb-row-box {
  9 + display: inline-block;
  10 + width: 275px;
  11 + height: 132px;
  12 + border-radius: 0;
  13 + background-size: 100% 100%;
  14 + background-repeat: no-repeat;
  15 + background-position: center;
  16 + margin: 0 14.4px;
  17 +
  18 + &.first {
  19 + margin: 0 !important;
  20 + }
  21 + }
  22 +
  23 + .left-thumb-row-box {
  24 + height: 308px;
  25 + }
  26 +
  27 + .right-container {
  28 + display: inline-block;
  29 + width: 275px;
  30 + height: 280px;
  31 + border-radius: 4px;
  32 + margin: 0 14.4px;
  33 +
  34 + .right-thumb-row-box {
  35 + margin: 32px 0 0;
  36 + }
  37 + }
  38 +}
1 -#thumb-row { 1 +.thumb-row {
2 background-color: #f0f0f0; 2 background-color: #f0f0f0;
3 text-align: center; 3 text-align: center;
4 padding: 32px 0 0; 4 padding: 32px 0 0;
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 @import "common/index"; 10 @import "common/index";
11 @import "outlet/index"; 11 @import "outlet/index";
12 @import "activity/index"; 12 @import "activity/index";
13 -  
14 /* @import "passport/index"; */ 13 /* @import "passport/index"; */
15 @import "guang/index"; 14 @import "guang/index";
  15 +
16 @import "cart/chose-panel"; 16 @import "cart/chose-panel";
@@ -53,6 +53,7 @@ a { @@ -53,6 +53,7 @@ a {
53 } 53 }
54 54
55 .main-wrap { 55 .main-wrap {
  56 + position: relative;
56 margin-right: auto; 57 margin-right: auto;
57 margin-left: auto; 58 margin-left: auto;
58 max-width: 640px; 59 max-width: 640px;
@@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
18 width: 100%; 18 width: 100%;
19 height: 90px; 19 height: 90px;
20 background-color: #000; 20 background-color: #000;
  21 + background-image: linear-gradient(#323232, #414141);
21 color: #fff; 22 color: #fff;
22 line-height: 90px; 23 line-height: 90px;
23 24
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 bottom: 0; 22 bottom: 0;
23 left: 0; 23 left: 0;
24 background: rgba(0, 0, 0, 0.5); 24 background: rgba(0, 0, 0, 0.5);
  25 + z-index: 9;
25 26
26 .loading { 27 .loading {
27 position: absolute; 28 position: absolute;
1 .outlet-page { 1 .outlet-page {
2 - #thumb-row { 2 + .thumb-row {
3 .thumb-row-box { 3 .thumb-row-box {
4 height: 132px; 4 height: 132px;
5 border-radius: 0; 5 border-radius: 0;
@@ -8,39 +8,7 @@ @@ -8,39 +8,7 @@
8 } 8 }
9 9
10 .left-right-thumb-row { 10 .left-right-thumb-row {
11 - background-color: #f0f0f0;  
12 - text-align: center;  
13 - padding: 32px 0;  
14 -  
15 - .thumb-row-box {  
16 - display: inline-block;  
17 - width: 275px;  
18 - height: 132px;  
19 - border-radius: 0;  
20 - background-size: 100% 100%;  
21 - background-repeat: no-repeat;  
22 - background-position: center;  
23 - margin: 0 14.4px;  
24 -  
25 - &.first {  
26 - margin: 0 !important;  
27 - }  
28 - }  
29 -  
30 - .left-thumb-row-box {  
31 - height: 308px;  
32 - }  
33 -  
34 - .right-container {  
35 - display: inline-block;  
36 - width: 275px;  
37 - height: 280px;  
38 - border-radius: 4px;  
39 - margin: 0 14.4px;  
40 -  
41 - .right-thumb-row-box {  
42 - margin: 32px 0 0;  
43 - }  
44 - } 11 + background: #f0f0f0;
  12 + border-bottom: none;
45 } 13 }
46 } 14 }
@@ -2,43 +2,4 @@ @@ -2,43 +2,4 @@
2 overflow: hidden; 2 overflow: hidden;
3 height: auto; 3 height: auto;
4 background: #f0f0f0; 4 background: #f0f0f0;
5 -  
6 - .special-list {  
7 - li {  
8 - margin-bottom: 30px;  
9 - background: #fff;  
10 - }  
11 -  
12 - img {  
13 - width: 100%;  
14 - height: 250px;  
15 - }  
16 -  
17 - .special-cont {  
18 - box-sizing: border-box;  
19 - padding: 0 20px;  
20 - height: 77px;  
21 - border-bottom: 1px solid #e0e0e0;  
22 - line-height: 77px;  
23 - }  
24 -  
25 - .special-title {  
26 - float: left;  
27 - overflow: hidden;  
28 - width: 450px;  
29 - height: 77px;  
30 - text-overflow: ellipsis;  
31 - white-space: nowrap;  
32 - font-size: 24px;  
33 - }  
34 -  
35 - .special-time {  
36 - float: right;  
37 - font-size: 22px;  
38 - }  
39 -  
40 - .red-color {  
41 - color: #d0021b;  
42 - }  
43 - }  
44 } 5 }
1 .goods-page { 1 .goods-page {
2 - .banner-swiper {  
3 - height: 200px;  
4 - max-height: 200px;  
5 -  
6 - ul {  
7 - height: 200px;  
8 - max-height: 200px;  
9 - }  
10 - }  
11 -  
12 .list-nav { 2 .list-nav {
13 border-top: 1px solid #e6e6e6; 3 border-top: 1px solid #e6e6e6;
14 border-bottom: 1px solid #e6e6e6; 4 border-bottom: 1px solid #e6e6e6;
1 -.sale-page {  
2 - overflow: hidden;  
3 - background-color: #f0f0f0; 1 +.yoho-header {
  2 + .sale-nav {
  3 + text-transform: capitalize;
  4 + width: auto;
  5 + right: 20px;
  6 + font-size: 36px;
  7 + }
4 8
5 - #thumb-row {  
6 - overflow: hidden;  
7 - padding-left: 30px;  
8 - height: auto;  
9 - background: #fff;  
10 - text-align: left; 9 + + .sale-nav-select {
  10 + position: absolute;
  11 + top: 90px;
  12 + right: 20px;
  13 + z-index: 2;
  14 + padding: 10px 30px;
  15 + min-width: 246px;
  16 + border-radius: 10px;
  17 + background-color: #000;
  18 + background-image: linear-gradient(to bottom, #000 0%, #333 100%);
  19 + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.6);
  20 + text-align: center;
  21 + font-size: 28px;
  22 + line-height: 80px;
  23 + display: none;
  24 +
  25 + .arrow {
  26 + position: absolute;
  27 + top: -10px;
  28 + right: 30px;
  29 + width: 20px;
  30 + height: 20px;
  31 + background: #000;
  32 + content: "";
  33 + transform: rotate(45deg);
  34 + }
  35 +
  36 + &.show {
  37 + display: block;
  38 + }
11 39
12 a { 40 a {
13 - float: left;  
14 - margin-right: 30px;  
15 - width: 275px;  
16 - height: 130px; 41 + display: block;
  42 + border-bottom: 2px solid #ccc;
  43 + color: #fff;
  44 +
  45 + &:last-child {
  46 + border-bottom: none;
  47 + }
17 } 48 }
  49 + }
  50 +}
  51 +
  52 +.sale-page {
  53 + overflow: hidden;
  54 + background-color: #f0f0f0;
  55 +
  56 + .thumb-row {
  57 + padding-top: 25px;
  58 + padding-bottom: 0;
18 59
19 .thumb-row-box { 60 .thumb-row-box {
20 - margin: 0 auto;  
21 - width: 100%;  
22 - height: 100%;  
23 - border-radius: 20px; 61 + margin-top: 10px;
24 } 62 }
25 } 63 }
26 64
@@ -28,6 +66,36 @@ @@ -28,6 +66,36 @@
28 .goods-container { 66 .goods-container {
29 background: #fff; 67 background: #fff;
30 } 68 }
  69 +
  70 + .category-swiper {
  71 + height: auto;
  72 + }
  73 +
  74 + .vip-floor {
  75 + padding-bottom: 30px;
  76 + border-bottom: 1px solid #e0e0e0;
  77 +
  78 + .good-info {
  79 + margin-bottom: 20px;
  80 + }
  81 + }
  82 +
  83 + .list-nav {
  84 + width: 100%;
  85 + z-index: 1;
  86 + background: #fff;
  87 +
  88 + &.fixed {
  89 + position: fixed;
  90 + top: 0;
  91 + left: 0;
  92 + }
  93 + }
  94 +
  95 + .filter-mask.fixed {
  96 + position: fixed;
  97 + top: 70px;
  98 + }
31 } 99 }
32 100
33 .sale-vip-page { 101 .sale-vip-page {
1 -/**  
2 - * http api 测试  
3 - *  
4 - * @author: jiangfeng<jeff.jiang@yoho.cn>  
5 - * @date: 2016/05/17  
6 - */  
7 -'use strict';  
8 -  
9 -const test = require('ava');  
10 -const sign = require('../../library/sign');  
11 -  
12 -  
13 -const API = require('../../library/api').API;  
14 -const ServiceAPI = require('../../library/api').ServiceAPI;  
15 -const SearchAPI = require('../../library/api').SearchAPI;  
16 -  
17 -const getUrl = 'operations/api/v6/category/getCategory';  
18 -  
19 -test('api constructor test', (t) => {  
20 - let api = new ServiceAPI();  
21 - let api2 = new API();  
22 - let api3 = new SearchAPI();  
23 -  
24 - t.true(api !== null);  
25 - t.true(api2 !== null);  
26 - t.true(api3 !== null);  
27 -});  
28 -  
29 -test('api get test', t => {  
30 - let api = new ServiceAPI();  
31 -  
32 - return api.get(getUrl, sign.apiSign({})).then(result => {  
33 - if (result && result.code) {  
34 - t.pass();  
35 - } else {  
36 - t.fail();  
37 - }  
38 - });  
39 -});  
40 -  
41 -test('api get test, api return an error', t => {  
42 - let api = new ServiceAPI();  
43 -  
44 - return api.get(getUrl + '/error', sign.apiSign({})).catch(err => {  
45 -  
46 - // 故意调用一个错误的接口  
47 - if (err && err.code === 500) {  
48 - t.pass();  
49 - } else {  
50 - t.fail();  
51 - }  
52 - });  
53 -});  
54 -  
55 -test('api get use cache test', t => {  
56 - let api = new ServiceAPI();  
57 -  
58 - return api.get(getUrl, sign.apiSign({}), true).then(result => {  
59 - if (result && result.code) {  
60 - t.pass();  
61 - } else {  
62 - t.fail();  
63 - }  
64 - });  
65 -});  
66 -  
67 -test('api post test', t => {  
68 - let api = new ServiceAPI();  
69 -  
70 - return api.post(getUrl, sign.apiSign({})).then(result => {  
71 - if (result && result.code) {  
72 - t.pass();  
73 - } else {  
74 - t.fail();  
75 - }  
76 - });  
77 -});  
78 -  
79 -test('api multiple call test', (t) => {  
80 - let api = new ServiceAPI();  
81 - let multi = [api.get(getUrl, sign.apiSign({})), api.get(getUrl, sign.apiSign({}))];  
82 -  
83 - return api.all(multi).then(result => {  
84 - if (result.length === 2) {  
85 - t.pass();  
86 - } else {  
87 - t.fail();  
88 - }  
89 - });  
90 -});  
91 -  
92 -test('api multiple fail call test', (t) => {  
93 - let api = new ServiceAPI();  
94 -  
95 - return api.all(1).catch((e) => {  
96 - if (e) {  
97 - t.pass();  
98 - } else {  
99 - t.fail();  
100 - }  
101 - });  
102 -});  
1 -/**  
2 - * cache 测试  
3 - *  
4 - * @author: jf<jeff.jiang@yoho.cn>  
5 - * @date: 2016/5/18  
6 - */  
7 -  
8 -'use strict';  
9 -  
10 -import test from 'ava';  
11 -  
12 -import cache from '../../library/cache';  
13 -  
14 -let testKey = 'test_unit_key:' + (new Date()).getTime();  
15 -let testValue = 'anotherValue';  
16 -let anotherKey = 'test_unit_key2:' + (new Date()).getTime();  
17 -let anotherValue = {a: 1};  
18 -  
19 -let slaveTestKey = 'test_unit_key3:' + (new Date()).getTime();  
20 -let slaveTestValue = 'anotherValue3';  
21 -  
22 -test.before('set test key', (t) => {  
23 - cache.set(testKey, testValue);  
24 - cache.set(anotherKey, anotherValue);  
25 - t.pass();  
26 -});  
27 -  
28 -test.after('del test key', (t) => {  
29 - cache.del(testKey);  
30 - cache.del(anotherKey);  
31 - t.pass();  
32 -});  
33 -  
34 -test('cache get test', (t) => {  
35 - return cache.get(testKey).then((v) => {  
36 - t.is(v, testValue);  
37 - });  
38 -});  
39 -  
40 -test('cache get multi test', (t) => {  
41 - cache.set(anotherKey, anotherValue);  
42 - return cache.getMulti([testKey, anotherKey]).then((values) => {  
43 - t.is(values[testKey], testValue);  
44 - t.is(values[anotherKey], JSON.stringify(anotherValue));  
45 - });  
46 -});  
47 -  
48 -test('cache get from slave test', (t) => {  
49 - return cache.getFromSlave(testKey).then((v) => {  
50 - t.is(v, testValue);  
51 - });  
52 -});  
53 -  
54 -test('cache get multi from slave test', (t) => {  
55 - cache.set(anotherKey, anotherValue);  
56 - return cache.getMultiFromSlave([testKey, anotherKey]).then((values) => {  
57 - t.is(values[testKey], testValue);  
58 - t.is(values[anotherKey], JSON.stringify(anotherValue));  
59 - });  
60 -});  
61 -  
62 -test('cache set to slave', (t) => {  
63 - return cache.setSlave(slaveTestKey, {  
64 - value: slaveTestValue  
65 - }).then(() => {  
66 - return cache.getFromSlave(slaveTestKey);  
67 - }).then((v) => {  
68 - v = JSON.parse(v);  
69 - t.is(v.value, slaveTestValue);  
70 - cache.del(slaveTestKey);  
71 - });  
72 -});  
73 -  
74 -test('cache get test, key is not a string', (t) => {  
75 - return cache.get(123).then((v) => {  
76 - t.notOk(v);  
77 - });  
78 -});  
79 -  
80 -test('cache get multi test, key is not an array', (t) => {  
81 - return cache.getMulti(123).then((v) => {  
82 - t.notOk(v);  
83 - });  
84 -});  
85 -  
86 -test('cache get from slave test, key is not a string', (t) => {  
87 - return cache.getFromSlave(123).then((v) => {  
88 - t.notOk(v);  
89 - });  
90 -});  
91 -  
92 -test('cache get multi from slave test, key is not an array', (t) => {  
93 - return cache.getMultiFromSlave(123).then((v) => {  
94 - t.notOk(v);  
95 - });  
96 -});  
97 -  
98 -test('cache set test, key is not a string', (t) => {  
99 - return cache.set(123).then((v) => {  
100 - t.notOk(v);  
101 - });  
102 -});  
103 -  
104 -test('cache set multi test, key is not an array', (t) => {  
105 - return cache.setSlave(123).then((v) => {  
106 - t.notOk(v);  
107 - });  
108 -});  
109 -  
110 -test('cache del test, key is not a string', (t) => {  
111 - return cache.del(123).then((v) => {  
112 - t.notOk(v);  
113 - });  
114 -});  
1 -/**  
2 - * 对象键名驼峰测试  
3 - *  
4 - * @author: jiangfeng<jeff.jiang@yoho.cn>  
5 - * @date: 2016/05/17  
6 - */  
7 -  
8 -import {test} from 'ava';  
9 -  
10 -const camelCase = require('../../library/camel-case');  
11 -  
12 -test('camel case object', t => {  
13 - let o = {  
14 - A_B: 'ab_cd'  
15 - };  
16 -  
17 - t.is(camelCase(o).aB, 'ab_cd');  
18 -});  
19 -  
20 -test('camel case array', t => {  
21 - let arr = [{  
22 - A_B: 'ab_cd'  
23 - }, {  
24 - A_B: 'ab_cd'  
25 - }];  
26 -  
27 - t.is(camelCase(arr)[1].aB, 'ab_cd');  
28 -});  
1 -/**  
2 - * library helpers 类单元测试  
3 - * @author jeff.jiang<jeff.jiang@yoho.cn>  
4 - * @date 2016/05/17  
5 - */  
6 -  
7 -'use strict';  
8 -  
9 -const test = require('ava');  
10 -const helpers = require('../../library/helpers');  
11 -  
12 -test('qiniu image url handle', t => {  
13 - let url = 'http://img11.static.yhbimg.com/yhb-img01/2016/04/18/03/016d50b20cfdec5a91c614b68546bc9d72.jpg?imageView2/{mode}/w/{width}/h/{height}';  
14 - let expected = 'http://img11.static.yhbimg.com/yhb-img01/2016/04/18/03/016d50b20cfdec5a91c614b68546bc9d72.jpg?imageView2/2/w/400/h/300';  
15 -  
16 - t.is(helpers.image(url, 400, 300), expected);  
17 -});  
18 -  
19 -test('uri format', t => {  
20 - let uri = '/test';  
21 - let qs = { name: 'yoho' };  
22 - let mod = 'list';  
23 - let expected = '//list.m.yohobuy.com/test?name=yoho';  
24 -  
25 - t.is(helpers.urlFormat(uri, qs, mod), expected);  
26 -});  
27 -  
28 -test('upper char to lowercase', t => {  
29 - let str = 'ABc';  
30 - let expected = 'abc';  
31 -  
32 - t.is(helpers.lowerCase(str), expected);  
33 -});  
34 -  
35 -test('lower char to uppercase', t => {  
36 - let str = 'abc!';  
37 - let expected = 'ABC!';  
38 -  
39 - t.is(helpers.upperCase(str), expected);  
40 -});  
41 -  
42 -test('date format test', (t) => {  
43 - let seconds = 60 * 60 * 3 + 2;  
44 - let str = helpers.dateFormat('HH:mm:ss', seconds, 'ss');  
45 - let expected = '03:00:02';  
46 -  
47 - t.is(str, expected);  
48 -});  
49 -  
50 -test('date diff format test', (t) => {  
51 - let seconds = 60 * 60 * 24 * (1.3) + 2;  
52 -  
53 - let str = helpers.dateDiffFormat('{d}天{h}小时', seconds, 's');  
54 -  
55 - console.log(str);  
56 - t.pass();  
57 -});  
1 -/**  
2 - * logger 工具类测试  
3 - */  
4 -  
5 -const test = require('ava');  
6 -const logger = require('../../library/logger');  
7 -  
8 -test('logger error test', t => {  
9 - logger.error('error test', () => {  
10 - t.pass();  
11 - });  
12 -});  
13 -  
14 -test('logger info test', t => {  
15 - logger.info('info test', () => {  
16 - t.pass();  
17 - });  
18 -});  
1 -/**  
2 - * 签名类测试  
3 - *  
4 - * @author: jiangfeng<jeff.jiang@yoho.cn>  
5 - * @date: 2016/05/17  
6 - */  
7 -  
8 -const test = require('ava');  
9 -const sign = require('../../library/sign');  
10 -  
11 -test('app sign test', t => {  
12 - let params = {  
13 - client_type: 'h5', // eslint-disable-line  
14 - a: 1,  
15 - b: 'b'  
16 - };  
17 - let signedParams = sign.apiSign(params);  
18 -  
19 - t.true(sign.checkSign(signedParams));  
20 -});  
21 -  
22 -test('app sign test webSign', t => {  
23 - let params = {  
24 - uid: '123',  
25 - key: '3fc5a9fcea9fea49cce5432202a167ad'  
26 - };  
27 -  
28 - t.true(sign.webSign(params));  
29 -});  
1 -/**  
2 - * Timer 计时类测试  
3 - *  
4 - * @author: jiangfeng<jeff.jiang@yoho.cn>  
5 - * @date: 2016/05/17  
6 - */  
7 -  
8 -const test = require('ava');  
9 -const Timer = require('../../library/timer');  
10 -  
11 -const sleep = (timeout) => {  
12 - return new Promise((resolve) => {  
13 - setTimeout(() => {  
14 - resolve();  
15 - }, timeout);  
16 - });  
17 -};  
18 -  
19 -test.cb('timer class ', t => {  
20 - let timer = new Timer();  
21 -  
22 - timer.put('test');  
23 - sleep(300).then(() => {  
24 - let diff = timer.put('test');  
25 -  
26 - t.true(diff >= 300);  
27 - t.end();  
28 - });  
29 -});  
1 'use strict'; 1 'use strict';
  2 +require('../app');
2 const _ = require('lodash'); 3 const _ = require('lodash');
3 const camelCase = global.yoho.camelCase; 4 const camelCase = global.yoho.camelCase;
4 const helpers = global.yoho.helpers; 5 const helpers = global.yoho.helpers;
@@ -10,7 +11,7 @@ const helpers = global.yoho.helpers; @@ -10,7 +11,7 @@ const helpers = global.yoho.helpers;
10 * 否则优先从cover1 --》 cover2 -- 》 images_url 11 * 否则优先从cover1 --》 cover2 -- 》 images_url
11 * 12 *
12 */ 13 */
13 -const procProductImg = (product, gender, yhChannel) => { 14 +const _procProductImg = (product, gender, yhChannel) => {
14 if (gender === '2,3' || gender === '2' || gender === '3' && yhChannel === '2') { 15 if (gender === '2,3' || gender === '2' || gender === '3' && yhChannel === '2') {
15 return product.cover2 || product.imagesUrl || product.cover1 || ''; 16 return product.cover2 || product.imagesUrl || product.cover1 || '';
16 } 17 }
@@ -18,6 +19,23 @@ const procProductImg = (product, gender, yhChannel) => { @@ -18,6 +19,23 @@ const procProductImg = (product, gender, yhChannel) => {
18 return product.cover1 || product.imagesUrl || product.cover2 || ''; 19 return product.cover1 || product.imagesUrl || product.cover2 || '';
19 }; 20 };
20 21
  22 +/**
  23 + * 按照数组中指定字段排序二维数组
  24 + *
  25 + * @param array list 需要排序的数组
  26 + * @param string key 字段名称
  27 + * @param boolean 有 desc 时候降序排列,默认为false
  28 + */
  29 +const _sortListByField = (list, key, desc) => {
  30 + list = _.toArray(list);
  31 + list = list.sort((a, b) => {
  32 + if (a[key] && b[key]) {
  33 + return (desc ? a[key] > b[key] : a[key] < b[key]) ? -1 : 1;
  34 + }
  35 + return (desc ? a > b : a < b) ? -1 : 1;
  36 + });
  37 + return list;
  38 +};
21 39
22 /** 40 /**
23 * 商品搜索商品数据处理 41 * 商品搜索商品数据处理
@@ -70,7 +88,7 @@ exports.processProductList = (list, options) => { @@ -70,7 +88,7 @@ exports.processProductList = (list, options) => {
70 88
71 // 如果还未赋值,则取第一个skc产品的默认图片 89 // 如果还未赋值,则取第一个skc产品的默认图片
72 if (!flag) { 90 if (!flag) {
73 - product.defaultImages = procProductImg(product.goodsList[0], product.gender, options.yh_channel); 91 + product.defaultImages = _procProductImg(product.goodsList[0], product.gender, options.yh_channel);
74 } 92 }
75 93
76 product.isSoonSoldOut = product.isSoonSoldOut === 'Y'; 94 product.isSoonSoldOut = product.isSoonSoldOut === 'Y';
@@ -219,6 +237,11 @@ exports.processFilter = (list, options) => { @@ -219,6 +237,11 @@ exports.processFilter = (list, options) => {
219 name: filtersType[key].name 237 name: filtersType[key].name
220 }); 238 });
221 239
  240 + // 折扣,价格区间,需要排序
  241 + if (key === 'discount' || key === 'priceRange') {
  242 + item = _sortListByField(item, 'name');
  243 + }
  244 +
222 _.forEach(item, (sub, index) => { 245 _.forEach(item, (sub, index) => {
223 let subs = {}; 246 let subs = {};
224 247
@@ -244,6 +267,5 @@ exports.processFilter = (list, options) => { @@ -244,6 +267,5 @@ exports.processFilter = (list, options) => {
244 267
245 filters.classify[filtersType[key].sortNum] = classify; 268 filters.classify[filtersType[key].sortNum] = classify;
246 }); 269 });
247 -  
248 return filters; 270 return filters;
249 }; 271 };
1 const _ = require('lodash'); 1 const _ = require('lodash');
  2 +const processTime = require('./time-process');
2 const camelCase = global.yoho.camelCase; 3 const camelCase = global.yoho.camelCase;
3 4
4 /** 5 /**
@@ -12,7 +13,6 @@ module.exports = (list) => { @@ -12,7 +13,6 @@ module.exports = (list) => {
12 list = list || []; 13 list = list || [];
13 list = camelCase(list); 14 list = camelCase(list);
14 15
15 -  
16 _.forEach(list, (floor) => { 16 _.forEach(list, (floor) => {
17 floor[_.camelCase(floor.templateName)] = true; 17 floor[_.camelCase(floor.templateName)] = true;
18 18
@@ -33,6 +33,43 @@ module.exports = (list) => { @@ -33,6 +33,43 @@ module.exports = (list) => {
33 } 33 }
34 } 34 }
35 35
  36 + // OUTLETS
  37 + if (floor.titleImage && floor.data) {
  38 + if (floor.data.image) {
  39 + floor.data.bigImage = {
  40 + bigList: [floor.data.image]
  41 + };
  42 + }
  43 +
  44 + floor.data.title = {
  45 + moreName: floor.data.moreName,
  46 + moreUrl: floor.data.moreUrl,
  47 + title: floor.data.title
  48 + };
  49 + }
  50 +
  51 + // 折扣专场
  52 + if (floor.discountActivity && floor.data && floor.data.list.length) {
  53 + _.map(floor.data.list, (item) => {
  54 + Object.assign(item, processTime(item.leftTime));
  55 + });
  56 + }
  57 +
  58 + // 断码区 , 此资源位数据结构比较坑
  59 + if (floor.offCodeArea && floor.data && floor.data.list.length) {
  60 + floor.data = {
  61 + title: floor.data.title,
  62 + data: [floor.data.list[0]],
  63 + left: [floor.data.list[1]],
  64 + right: floor.data.list.slice(2)
  65 + };
  66 + }
  67 +
  68 + // 会员专享
  69 + if (floor.vipFloor && floor.data) {
  70 + floor.data.data = floor.data.image;
  71 + }
  72 +
36 formatData.push(floor); 73 formatData.push(floor);
37 }); 74 });
38 75
@@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
7 const helpers = global.yoho.helpers; 7 const helpers = global.yoho.helpers;
8 8
9 const timeFormat = { 9 const timeFormat = {
  10 + y: '剩{y}年{M}月{d}天',
  11 + M: '剩{M}月{d}天',
10 d: '剩{d}天', 12 d: '剩{d}天',
11 h: '剩{h}小时', 13 h: '剩{h}小时',
12 m: '剩{m}分钟', 14 m: '剩{m}分钟',
@@ -19,9 +21,11 @@ const timeFormat = { @@ -19,9 +21,11 @@ const timeFormat = {
19 21
20 const anHour = 3600; 22 const anHour = 3600;
21 const aDay = anHour * 24; 23 const aDay = anHour * 24;
  24 +const aMonth = aDay * 30;
  25 +const aYear = aMonth * 12;
22 26
23 /** 27 /**
24 - * 折扣专场专题列表过期时间处理 28 + * 折扣专场专题列表过期时间处理 单位:s
25 * @param {[string]} time 29 * @param {[string]} time
26 * @return {[object]} 30 * @return {[object]}
27 */ 31 */
@@ -33,7 +37,11 @@ const processTime = (time) => { @@ -33,7 +37,11 @@ const processTime = (time) => {
33 data.warnColor = true; 37 data.warnColor = true;
34 data.time = '低于1小时'; 38 data.time = '低于1小时';
35 } else { 39 } else {
36 - if (time > aDay) { 40 + if (time > aYear) {
  41 + type = 'y';
  42 + } else if (time > aMonth) {
  43 + type = 'M';
  44 + } else if (time > aDay) {
37 type = 'dh'; 45 type = 'dh';
38 } else { 46 } else {
39 type = 'h'; 47 type = 'h';