| 
					
				 | 
			
			
				@@ -10,7 +10,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <div ref="wrapper" class="camera wrapper"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <!-- 视频元素容器 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           <video 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-show="!takeOver && first" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            v-show="!takeOver" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             id="video" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ref="videoEl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             class="camera" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -30,6 +30,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <span v-if="takeOver && !lose" class="text">扫描中...</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <span v-if="!takeOver && !first && !lose" class="text">人脸识别成功</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <span v-if="!first && lose" class="text loseFont">人脸识别失败</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       <div v-if="takeOver && !lose" class="loading"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         <div 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           v-for="item in 16" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -39,12 +40,12 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ></div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <div v-if="noface" class="noface err"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <img src="../../assets/img/close.png" @click="closeErr" alt="" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <div v-if="badface" class="badface err"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <img src="../../assets/img/close.png" @click="closeErr" alt="" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <!-- <div v-if="noface" class="noface err"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <img src="../../assets/img/close.png" @click="closeErr" alt="" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div v-if="badface" class="badface err"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <img src="../../assets/img/close.png" @click="closeErr" alt="" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </div> --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -73,7 +74,7 @@ const noface = ref(false); //未检测到脸 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const badface = ref(false); //未注册的脸 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 存储拍摄后的图片路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const imageUrl = ref(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const errNum = ref(0); //错误次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// const errNum = ref(0); //错误次数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const lose = ref(false); // 识别失败 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const video = ref(null); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -81,6 +82,8 @@ let mediaStreamTrack = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let trackerTask = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const screenshotCanvas = ref(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const uploadLock = ref(true); // 上传锁 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let backTimer = null; // 返回计时器 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const canUpload = ref(true); // 是否可以上传 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let tracker; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 检查摄像头并设置视频流 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 async function checkCamera() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -117,41 +120,41 @@ async function checkCamera() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function shoot() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log(111); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // 上锁避免重复发送请求 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  uploadLock.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 检查视频元素和页面容器是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!videoEl.value || !wrapper.value) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  takeOver.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // uploadLock.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 检查视频元素和页面容器是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // if (!videoEl.value || !wrapper.value) return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // takeOver.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   first.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 创建一个画布元素,设置画布尺寸为视频流的尺寸 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const canvas = document.createElement("canvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  console.log(canvas, "canvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  canvas.width = videoEl.value.videoWidth; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  canvas.height = videoEl.value.videoHeight; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 创建一个画布元素,设置画布尺寸为视频流的尺寸 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // const canvas = document.createElement("canvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // console.log(canvas, "canvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // canvas.width = videoEl.value.videoWidth; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // canvas.height = videoEl.value.videoHeight; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 获取画布上下文对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const ctx = canvas.getContext("2d"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 获取画布上下文对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // const ctx = canvas.getContext("2d"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 绘制当前视频帧到画布上 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ctx?.drawImage(videoEl.value, 0, 0, canvas.width, canvas.height); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log(222); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 绘制当前视频帧到画布上 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // ctx?.drawImage(videoEl.value, 0, 0, canvas.width, canvas.height); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // console.log(222); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // 将画布内容转为 Base64 数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const imageDataUrl = canvas.toDataURL("image/png"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log(333); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 存储图片路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  imageUrl.value = imageDataUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log(imageDataUrl, "imageDataUrl"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 存储图片路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // imageUrl.value = imageDataUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // console.log(imageDataUrl, "imageDataUrl"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 创建一个图片元素 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const imageElement = new Image(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  imageElement.style.borderRadius = "50%"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 创建一个图片元素 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // const imageElement = new Image(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // imageElement.style.borderRadius = "50%"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 将 Base64 数据设置为图片的 src 属性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  imageElement.src = imageDataUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 将 Base64 数据设置为图片的 src 属性 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // imageElement.src = imageDataUrl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 将图片元素添加到页面容器中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  wrapper.value.appendChild(imageElement); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // 将图片元素添加到页面容器中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // wrapper.value.appendChild(imageElement); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log(444); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   timer = setInterval(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (loadingNum.value <= 16) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -170,28 +173,22 @@ function shoot() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // }, 4000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 关闭错误提示 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const closeErr = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (errNum.value >= 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    router.push("/"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  console.log(errNum.value, "errNum"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  noface.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  badface.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const errfn = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // console.log(errNum.value, "errNum"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   loadingNum.value = ref(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  errNum.value += 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  lose.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // errNum.value += 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   takeOver.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  first.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // first.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   uploadLock.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  var box = document.querySelectorAll("img")[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log(box, "box"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // var box = document.querySelectorAll("img")[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // // console.log(box, "box"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  box.remove(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // box?.remove(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log(mediaStreamTrack.srcObject, "mediaStreamTrack"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // console.log(trackerTask, "trackerTask"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // mediaStreamTrack.srcObject.getTracks()[0].stop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  trackerTask.stop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  checkCamera(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // trackerTask.stop(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // checkCamera(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 初始化 PAG 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -246,7 +243,7 @@ const successInit = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // tracjking初始化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const init = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  console.log("init"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 识别失败一直识别 失败提示字体闪烁,30s未识别到人脸就返回主页 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   video.value = mediaStreamTrack = document.getElementById("video"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   screenshotCanvas.value = document.getElementById("screenshotCanvas"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -294,23 +291,34 @@ const init = () => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 //调接口把图片传到后端 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const uploadImgFn = (imageDataUrl) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // 发送原生axios请求地址为192.168.101.13/face-login 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // console.log("imageDataUrl", imageDataUrl); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(!canUpload.value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    uploadImgFn() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  canUpload.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  setTimeout(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    canUpload.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }, 500); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   axios 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     .post("/dev-api/face-login-base64", { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       img: imageDataUrl, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     .then((response) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      console.log(response.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // console.log(response.data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (response.data.code === 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 识别成功 进入扫描入口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         clearInterval(timer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        clearTimeout(backTimer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         takeOver.value = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         successInit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 识别失败 失败3次返回主页 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        badface.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log("lose"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 识别失败 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // badface.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // lose.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // takeOver.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         lose.value = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        errfn(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     .catch((error) => { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -346,6 +354,9 @@ onMounted(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // }, 3000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   pagInit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  backTimer = setTimeout(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    router.push("/"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }, 30000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -451,4 +462,66 @@ onMounted(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     height: 450px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.loseFont { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  animation: blink 2s linear infinite; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  -webkit-animation: blink 2s linear infinite; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  -moz-animation: blink 2s linear infinite; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  -ms-animation: blink 2s linear infinite; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  -o-animation: blink 2s linear infinite; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@keyframes blink { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  50% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@-webkit-keyframes blink { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  50% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@-moz-keyframes blink { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  50% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@-ms-keyframes blink { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  50% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@-o-keyframes blink { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  0% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  50% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  100% { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0.8; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </style> 
			 |