Authored by htoooth

fix

@@ -3,18 +3,15 @@ var reporter = require('./reporter'); @@ -3,18 +3,15 @@ var reporter = require('./reporter');
3 3
4 var perfKey = '_perfLog'; 4 var perfKey = '_perfLog';
5 5
6 -var navigatorPerf = require('./perf/navigator'),  
7 - resourcePerf = require('./perf/resource'),  
8 - screenPerf = require('./perf/screen'), 6 +var resourcePerf = require('./perf/resource'),
9 timingPerf = require('./perf/timing'); 7 timingPerf = require('./perf/timing');
10 8
11 var perfReporter = { 9 var perfReporter = {
12 init: function(debug) { 10 init: function(debug) {
13 this.debug = debug; 11 this.debug = debug;
  12 + this.dataList = [];
14 13
15 - navigatorPerf.init(this.debug);  
16 resourcePerf.init(this.debug); 14 resourcePerf.init(this.debug);
17 - screenPerf.init(this.debug);  
18 timingPerf.init(this.debug); 15 timingPerf.init(this.debug);
19 16
20 this.report(); 17 this.report();
@@ -22,27 +19,53 @@ var perfReporter = { @@ -22,27 +19,53 @@ var perfReporter = {
22 var self = this; 19 var self = this;
23 20
24 window.addEventListener && window.addEventListener('load', function() { 21 window.addEventListener && window.addEventListener('load', function() {
25 - self.collect(); 22 + setTimeout(function() {
  23 + self.collect();
  24 + }, 0);
26 }); 25 });
27 }, 26 },
28 27
29 collect: function() { 28 collect: function() {
30 - var navPerfData = navigatorPerf.collect();  
31 - var screenPerfData = screenPerf.collect();  
32 - var timingPerfData = timingPerf.collect();  
33 - var resourcePerfData = resourcePerf.collect();  
34 -  
35 - this.write(navPerfData);  
36 - this.write(screenPerfData);  
37 - this.write(timingPerfData);  
38 - this.write(resourcePerfData); 29 + try {
  30 + var timingPerfData = timingPerf.collect();
  31 + var resourcePerfData = resourcePerf.collect();
  32 +
  33 + this.chunk(timingPerfData);
  34 +
  35 + for (var i = 0; i < resourcePerfData.length; i++) {
  36 + this.chunk(resourcePerfData[i]);
  37 + }
  38 + } catch(e) {
  39 + if (this.debug) {
  40 + console.log(e);
  41 + }
  42 + }
  43 + },
  44 +
  45 + getMeta: function() {
  46 + return {
  47 + pt: encodeURIComponent(window.location.href), // url
  48 + ua: encodeURIComponent(navigator.userAgent), // useragent
  49 + u: reporter.getUid(), // uid
  50 + ud: reporter.getUdid(), // udid
  51 + rid: reporter.getReqId(), // reqId
  52 + r: reporter.getRoute() // server route
  53 + }
  54 + },
  55 +
  56 + jsonConcat: function(object1, object2) {
  57 + for (var key in object2) {
  58 + object1[key] = object2[key];
  59 + }
  60 + return object1;
39 }, 61 },
40 62
41 write: function(item) { 63 write: function(item) {
42 var perfList = JSON.parse(cookies(perfKey) || '[]'); 64 var perfList = JSON.parse(cookies(perfKey) || '[]');
43 65
44 - perfList.push(item); 66 + this.jsonConcat(item, this.getMeta());
45 67
  68 + perfList.push(item);
46 cookies(perfKey, JSON.stringify(perfList)); 69 cookies(perfKey, JSON.stringify(perfList));
47 70
48 if (perfList.length >= 5) { 71 if (perfList.length >= 5) {
@@ -64,8 +87,25 @@ var perfReporter = { @@ -64,8 +87,25 @@ var perfReporter = {
64 cookies(perfKey, '[]'); 87 cookies(perfKey, '[]');
65 }, 88 },
66 89
67 - chunk: function(array, process) {  
68 - 90 + chunk: function(item) {
  91 + var self = this;
  92 + this.dataList.push(item);
  93 +
  94 + function _write() {
  95 + if (self.dataList.length === 0) {
  96 + return
  97 + }
  98 +
  99 + var data = self.dataList.shift();
  100 +
  101 + self.write(data);
  102 +
  103 + setTimeout(_write, 10)
  104 + }
  105 +
  106 + setTimeout(function() {
  107 + _write();
  108 + }, 10)
69 } 109 }
70 }; 110 };
71 111
1 -  
2 -var navigatorReporter = {  
3 - init: function(debug) {  
4 - this.enable = true;  
5 - this.debug = debug;  
6 -  
7 - if ( !('navigator' in window)) {  
8 - this.enable = false;  
9 - return;  
10 - }  
11 - },  
12 -  
13 - collect: function() {  
14 - if (!this.enable) {  
15 - return;  
16 - }  
17 -  
18 - if (this.debug) {  
19 - this.print();  
20 - }  
21 -  
22 - return this.getData();  
23 - },  
24 -  
25 - getData: function() {  
26 - return {  
27 - tp: 'navigator',  
28 - pf: navigator.platform || 'unknown',  
29 - ua: navigator.userAgent || 'unknown'  
30 - }  
31 - },  
32 -  
33 - print: function() {  
34 - var debug = document.getElementById("debug");  
35 - var output = this.formatDebugInfo();  
36 -  
37 - if (!debug) {  
38 - var divTag = document.createElement("div");  
39 - divTag.id = "debug";  
40 - divTag.innerHTML = output;  
41 - document.body.appendChild(divTag);  
42 - } else {  
43 - debug.innerHTML += output;  
44 - }  
45 - },  
46 -  
47 - formatDebugInfo: function() {  
48 - var debuginfo = "<p>";  
49 - debuginfo += "navigator object : " + JSON.stringify(this.getData(), null, 2) + "<br/>";  
50 - debuginfo += "</p>";  
51 - return debuginfo  
52 - },  
53 -};  
54 -  
55 -module.exports = navigatorReporter;  
@@ -10,6 +10,8 @@ var resourceReporter = { @@ -10,6 +10,8 @@ var resourceReporter = {
10 this.enable = false; 10 this.enable = false;
11 return; 11 return;
12 } 12 }
  13 +
  14 + this.whiteList = [/^https:\/\/img\d*.static.yhbimg.com/, /^https:\/\/cdn.yoho.cn/];
13 }, 15 },
14 16
15 print: function() { 17 print: function() {
@@ -30,13 +32,23 @@ var resourceReporter = { @@ -30,13 +32,23 @@ var resourceReporter = {
30 var debuginfo = "<p>resource object: <br/>"; 32 var debuginfo = "<p>resource object: <br/>";
31 var data = this.getData(); 33 var data = this.getData();
32 34
33 - for(var i = 0; i < data.length; i++) { 35 + for (var i = 0; i < data.length; i++) {
34 debuginfo += JSON.stringify(data[i], null, 2) + "<br/>"; 36 debuginfo += JSON.stringify(data[i], null, 2) + "<br/>";
35 } 37 }
36 debuginfo += "</p>"; 38 debuginfo += "</p>";
37 return debuginfo 39 return debuginfo
38 }, 40 },
39 41
  42 + filter: function(url) {
  43 + for (var i = 0; i < this.whiteList.length; i++) {
  44 + if (this.whiteList[i].test(url)) {
  45 + return true;
  46 + }
  47 + }
  48 +
  49 + return false;
  50 + },
  51 +
40 getData: function() { 52 getData: function() {
41 var resources = window.performance.getEntriesByType('resource'); 53 var resources = window.performance.getEntriesByType('resource');
42 var resourceList = []; 54 var resourceList = [];
@@ -44,14 +56,19 @@ var resourceReporter = { @@ -44,14 +56,19 @@ var resourceReporter = {
44 for (var obj in resources) { 56 for (var obj in resources) {
45 var domObj = resources[obj]; 57 var domObj = resources[obj];
46 58
  59 + if (!this.filter(domObj.name)) {
  60 + continue;
  61 + }
  62 +
47 resourceList.push({ 63 resourceList.push({
48 - tp: 'timing',  
49 - dtp: domObj.initiatorType || 'unknown',  
50 - redirectTime: domObj.redirectEnd - domObj.redirectStart || 0,  
51 - cacheTime: domObj.domainLookupStart - domObj.fetchStart || 0,  
52 - dnsTime: domObj.domainLookupEnd - domObj.domainLookupStart || 0,  
53 - tcpTime: domObj.connectEnd - domObj.connectStart || 0,  
54 - roundtripTime: domObj.responseEnd - domObj.connectStart || 0 64 + tp: 'resource', // 资源
  65 + dtp: domObj.entryType, // 资源
  66 + id: domObj.name || 'unknown',  // 资源 url
  67 + rtp: domObj.initiatorType || 'unknown', // 资源类型 img script
  68 + dt: Math.floor(domObj.domainLookupEnd - domObj.domainLookupStart || 0), // DNS 时间
  69 + tt: Math.floor(domObj.connectEnd - domObj.connectStart || 0), // tcp 时间
  70 + rt: Math.floor(domObj.responseEnd - domObj.responseStart || 0), // 下载 时间
  71 + rrt: Math.floor(domObj.responseEnd - domObj.fetchStart || 0) // 总时间
55 }) 72 })
56 } 73 }
57 74
1 -var screenReporter = {  
2 - init: function(debug) {  
3 - this.enable = true;  
4 - this.debug = debug;  
5 -  
6 - if (!('screen' in window)) {  
7 - this.enable = false;  
8 - return;  
9 - }  
10 - },  
11 - collect: function() {  
12 - if (!this.enable) {  
13 - return;  
14 - }  
15 -  
16 - if (this.debug) {  
17 - this.print();  
18 - }  
19 -  
20 - return this.getData();  
21 - },  
22 -  
23 - print: function() {  
24 - var debug = document.getElementById("debug");  
25 - var output = this.formatDebugInfo();  
26 -  
27 - if (!debug) {  
28 - var divTag = document.createElement("div");  
29 - divTag.id = "debug";  
30 - divTag.innerHTML = output;  
31 - document.body.appendChild(divTag);  
32 - } else {  
33 - debug.innerHTML += output;  
34 - }  
35 - },  
36 -  
37 - formatDebugInfo: function() {  
38 - var debuginfo = "<p>";  
39 - debuginfo += "screen object : " + JSON.stringify(this.getData(), null, 2) + "<br/>";  
40 - debuginfo += "</p>";  
41 - return debuginfo  
42 - },  
43 -  
44 - getData: function() {  
45 - return {  
46 - tp: 'screen',  
47 - wd: screen.width || 1,  
48 - hg: screen.height || 1  
49 - };  
50 - }  
51 -};  
52 -  
53 -module.exports = screenReporter;  
1 var timingReporter = function() { 1 var timingReporter = function() {
2 - var _pTime = Date.now() - performance.timing.navigationStart || 0,  
3 - _redirTime = performance.timing.redirectEnd - performance.timing.redirectStart || 0,  
4 - _cacheTime = performance.timing.domainLookupStart - performance.timing.fetchStart || 0,  
5 - _dnsTime = performance.timing.domainLookupEnd - performance.timing.domainLookupStart || 0,  
6 - _tcpTime = performance.timing.connectEnd - performance.timing.connectStart || 0,  
7 - _roundtripTime = performance.timing.responseEnd - performance.timing.connectStart || 0,  
8 - _renderTime = Date.now() - performance.timing.domLoading || 0; 2 + var _dnsTime = performance.timing.domainLookupEnd - (performance.timing.domainLookupStart || 0),
  3 + _tcpTime = performance.timing.connectEnd - (performance.timing.connectStart || 0),
  4 + _responseTime = performance.timing.responseEnd - (performance.timing.responseStart || 0),
  5 + _emptyScreenTime = performance.timing.responseStart - (performance.timing.navigationStart || 0),
  6 + _parseDomTime = performance.timing.domContentLoadedEventEnd - (performance.timing.domLoading || 0),
  7 + _domReadyTime = performance.timing.domContentLoadedEventEnd - (performance.timing.navigationStart || 0),
  8 + _roundtripTime = (performance.timing.loadEventEnd || performance.timing.domComplete) - (performance.timing.navigationStart || 0);
9 9
10 function getResults() { 10 function getResults() {
11 return { 11 return {
12 tp: 'timing', 12 tp: 'timing',
13 dtp: 'html', 13 dtp: 'html',
14 - perceivedTime: _pTime,  
15 - redirectTime: _redirTime,  
16 - cacheTime: _cacheTime,  
17 - dnsLookupTime: _dnsTime,  
18 - tcpConnectionTime: _tcpTime,  
19 - roundTripTime: _roundtripTime,  
20 - pageRenderTime: _renderTime 14 + dt: Math.floor(_dnsTime), // DNS 时间
  15 + tt: Math.floor(_tcpTime), // TCP 建立时间
  16 + rt: Math.floor(_responseTime), // request 建立时间 // 下载时间
  17 + domt: Math.floor(_parseDomTime), // 解析 dom 树时间
  18 + et: Math.floor(_emptyScreenTime), // 白屏时间,用户可见, start render
  19 + ot: Math.floor(_domReadyTime), // 用户可交互时间, start interact
  20 + rtt: Math.floor(_roundtripTime), // 总时间, start page load
  21 + wd: screen.width || 1, // 屏幕宽
  22 + hg: screen.height || 1, // 屏幕高
  23 + pf: navigator.platform || 'unknown' // 系统
21 }; 24 };
22 } 25 }
23 26
@@ -19,6 +19,322 @@ @@ -19,6 +19,322 @@
19 <a > 19 <a >
20 <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;"> 20 <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
21 </a> 21 </a>
  22 +
  23 +<a >
  24 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  25 +</a>
  26 +<a >
  27 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  28 +</a>
  29 +<a >
  30 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  31 +</a>
  32 +<a >
  33 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  34 +</a>
  35 +<a >
  36 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  37 +</a>
  38 +<a >
  39 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  40 +</a>
  41 +<a >
  42 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  43 +</a>
  44 +<a >
  45 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  46 +</a>
  47 +<a >
  48 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  49 +</a>
  50 +<a >
  51 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  52 +</a>
  53 +<a >
  54 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  55 +</a>
  56 +<a >
  57 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  58 +</a>
  59 +<a >
  60 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  61 +</a>
  62 +<a >
  63 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  64 +</a>
  65 +<a >
  66 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  67 +</a>
  68 +<a >
  69 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  70 +</a>
  71 +<a >
  72 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  73 +</a>
  74 +<a >
  75 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  76 +</a>
  77 +<a >
  78 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  79 +</a>
  80 +<a >
  81 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  82 +</a>
  83 +<a >
  84 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  85 +</a>
  86 +<a >
  87 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  88 +</a>
  89 +<a >
  90 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  91 +</a>
  92 +<a >
  93 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  94 +</a>
  95 +<a >
  96 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  97 +</a>
  98 +<a >
  99 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  100 +</a>
  101 +<a >
  102 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  103 +</a>
  104 +<a >
  105 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  106 +</a>
  107 +<a >
  108 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  109 +</a>
  110 +<a >
  111 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  112 +</a>
  113 +<a >
  114 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  115 +</a>
  116 +<a >
  117 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  118 +</a>
  119 +<a >
  120 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  121 +</a>
  122 +<a >
  123 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  124 +</a>
  125 +<a >
  126 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  127 +</a>
  128 +<a >
  129 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  130 +</a>
  131 +<a >
  132 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  133 +</a>
  134 +<a >
  135 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  136 +</a>
  137 +<a >
  138 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  139 +</a>
  140 +<a >
  141 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  142 +</a>
  143 +<a >
  144 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  145 +</a>
  146 +<a >
  147 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  148 +</a>
  149 +<a >
  150 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  151 +</a>
  152 +<a >
  153 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  154 +</a>
  155 +<a >
  156 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  157 +</a>
  158 +<a >
  159 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  160 +</a>
  161 +<a >
  162 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  163 +</a>
  164 +<a >
  165 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  166 +</a>
  167 +<a >
  168 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  169 +</a>
  170 +<a >
  171 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  172 +</a>
  173 +<a >
  174 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  175 +</a>
  176 +<a >
  177 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  178 +</a>
  179 +<a >
  180 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  181 +</a>
  182 +<a >
  183 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  184 +</a>
  185 +<a >
  186 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  187 +</a>
  188 +<a >
  189 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  190 +</a>
  191 +<a >
  192 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  193 +</a>
  194 +<a >
  195 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  196 +</a>
  197 +<a >
  198 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  199 +</a>
  200 +<a >
  201 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  202 +</a>
  203 +<a >
  204 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  205 +</a>
  206 +<a >
  207 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  208 +</a>
  209 +<a >
  210 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  211 +</a>
  212 +<a >
  213 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  214 +</a>
  215 +<a >
  216 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  217 +</a>
  218 +<a >
  219 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  220 +</a>
  221 +<a >
  222 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  223 +</a>
  224 +<a >
  225 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  226 +</a>
  227 +<a >
  228 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  229 +</a>
  230 +<a >
  231 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  232 +</a>
  233 +<a >
  234 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  235 +</a>
  236 +<a >
  237 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  238 +</a>
  239 +<a >
  240 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  241 +</a>
  242 +<a >
  243 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  244 +</a>
  245 +<a >
  246 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  247 +</a>
  248 +<a >
  249 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  250 +</a>
  251 +<a >
  252 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  253 +</a>
  254 +<a >
  255 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  256 +</a>
  257 +<a >
  258 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  259 +</a>
  260 +<a >
  261 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  262 +</a>
  263 +<a >
  264 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  265 +</a>
  266 +<a >
  267 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  268 +</a>
  269 +<a >
  270 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  271 +</a>
  272 +<a >
  273 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  274 +</a>
  275 +<a >
  276 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  277 +</a>
  278 +<a >
  279 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  280 +</a>
  281 +<a >
  282 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  283 +</a>
  284 +<a >
  285 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  286 +</a>
  287 +<a >
  288 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  289 +</a>
  290 +<a >
  291 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  292 +</a>
  293 +<a >
  294 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  295 +</a>
  296 +<a >
  297 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  298 +</a>
  299 +<a >
  300 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  301 +</a>
  302 +<a >
  303 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  304 +</a>
  305 +<a >
  306 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  307 +</a>
  308 +<a >
  309 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  310 +</a>
  311 +<a >
  312 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  313 +</a>
  314 +<a >
  315 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  316 +</a>
  317 +<a >
  318 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  319 +</a>
  320 +<a >
  321 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  322 +</a>
  323 +<a >
  324 + <img src="https://img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  325 +</a>
  326 +<a >
  327 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  328 +</a>
  329 +<a >
  330 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  331 +</a>
  332 +<a >
  333 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  334 +</a>
  335 +<a >
  336 + <img src="//img13.static.yhbimg.com/goodsimg/2016/04/23/07/02096525430e4340f60f23eb386ed54e90.jpg?imageView/2/w/235/h/314" style="display: block;">
  337 +</a>
22 </body> 338 </body>
23 339
24 <script> 340 <script>