精华内容
下载资源
问答
  • js安全验证 万次阅读
    2018-11-14 10:01:30

    以下为js验证代码:

    也可去https://download.csdn.net/download/zlnewcsdn/10783554 此链接下载,引入此插件后可直接调用

    或者这个比较全的https://download.csdn.net/download/zlnewcsdn/10783588

    ;'use strict';
    
    /**
     * @author Rui.Zhang
     * @class 前端开发辅助工具类
     * @date 2016-09-04 22:32:09
     * @description Mtils 是 My Utils 的简写, 本工具提供前台常用的文本处理、 表单处理、 数据校验、 数据安全等函数。<br />
     * @description 除了基本的函数封装外, 本工具还对原生的对象进行一定的扩展, 更方便使用。
     * @site https://github.com/MisterChangRay/Mtils2
     * @since version 2.0.0
     */
    window.Mtils = {
    	/**
    	 * @author Rui.Zhang
    	 * @class 常量类
    	 * @description 提供一些常量
    	 */
    	constant : {
    		/**
    		 * @description 常用键盘控制键常量
    		 */
    		CONTROL_KEY : {
    			BACK_SPACE:8, TAB:9, ENTER:13, SHIFT:16, CTRL:17, ALT:18, CAPS_LOCK:20, ESC:27,
    			SPACE:32, END:35, HOME:36, INSERT:45, PAGE_UP:33, PAGE_DOWN:34, DELETE:46, CONTEXT_MENU:93,
    			8: "BACK_SPACE", 9 : "TAB", 13 : "ENTER", 16 : "SHIFT", 17 : "CTRL", 18 : "ALT", 20:"CAPS_LOCK", 27:"ESC",
    			32:"SPACE", 35:"END", 36:"HOME", 45:"INSERT", 33:"PAGE_UP", 34:"PAGE_DOWN", 46:"DELETE", 93:"CONTEXT_MENU",
    		},
    		/**
    		 * @description 性别常量女(0)
    		 */
    		WOMAN : 0,
    		/**
    		 * @description 性别常量男(1)
    		 */
    		MAN : 1,
    		/**
    		 * @description 进制转换基础数据
    		 */
    		BASE_DECIMAL : "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@",
    		/**
    		 * @description 拼音转换基础数据
    		 */
    		PY_MAPS : {"a":"\u554a\u963f\u9515","ai":"\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9698\u8bf6\u6371\u55f3\u55cc\u5ad2\u7477\u66a7\u7839\u953f\u972d","an":"\u978d\u6c28\u5b89\u4ffa\u6309\u6697\u5cb8\u80fa\u6848\u8c19\u57ef\u63de\u72b4\u5eb5\u6849\u94f5\u9e4c\u9878\u9eef","ang":"\u80ae\u6602\u76ce","ao":"\u51f9\u6556\u71ac\u7ff1\u8884\u50b2\u5965\u61ca\u6fb3\u5773\u62d7\u55f7\u5662\u5c99\u5ed2\u9068\u5aaa\u9a9c\u8071\u87af\u93ca\u9ccc\u93d6","ba":"\u82ad\u634c\u6252\u53ed\u5427\u7b06\u516b\u75a4\u5df4\u62d4\u8dcb\u9776\u628a\u8019\u575d\u9738\u7f62\u7238\u8307\u83dd\u8406\u636d\u5c9c\u705e\u6777\u94af\u7c91\u9c85\u9b43","bai":"\u767d\u67cf\u767e\u6446\u4f70\u8d25\u62dc\u7a17\u859c\u63b0\u97b4","ban":"\u6591\u73ed\u642c\u6273\u822c\u9881\u677f\u7248\u626e\u62cc\u4f34\u74e3\u534a\u529e\u7eca\u962a\u5742\u8c73\u94a3\u7622\u764d\u8228","bang":"\u90a6\u5e2e\u6886\u699c\u8180\u7ed1\u68d2\u78c5\u868c\u9551\u508d\u8c24\u84a1\u8783","bao":"\u82de\u80de\u5305\u8912\u96f9\u4fdd\u5821\u9971\u5b9d\u62b1\u62a5\u66b4\u8c79\u9c8d\u7206\u52f9\u8446\u5b80\u5b62\u7172\u9e28\u8913\u8db5\u9f85","bo":"\u5265\u8584\u73bb\u83e0\u64ad\u62e8\u94b5\u6ce2\u535a\u52c3\u640f\u94c2\u7b94\u4f2f\u5e1b\u8236\u8116\u818a\u6e24\u6cca\u9a73\u4eb3\u8543\u5575\u997d\u6a97\u64d8\u7934\u94b9\u9e41\u7c38\u8ddb","bei":"\u676f\u7891\u60b2\u5351\u5317\u8f88\u80cc\u8d1d\u94a1\u500d\u72c8\u5907\u60eb\u7119\u88ab\u5b5b\u9642\u90b6\u57e4\u84d3\u5457\u602b\u6096\u789a\u9e4e\u8919\u943e","ben":"\u5954\u82ef\u672c\u7b28\u755a\u574c\u951b","beng":"\u5d29\u7ef7\u752d\u6cf5\u8e66\u8ff8\u552a\u5623\u750f","bi":"\u903c\u9f3b\u6bd4\u9119\u7b14\u5f7c\u78a7\u84d6\u853d\u6bd5\u6bd9\u6bd6\u5e01\u5e87\u75f9\u95ed\u655d\u5f0a\u5fc5\u8f9f\u58c1\u81c2\u907f\u965b\u5315\u4ef3\u4ffe\u8298\u835c\u8378\u5421\u54d4\u72f4\u5eb3\u610e\u6ed7\u6fde\u5f3c\u59a3\u5a62\u5b16\u74a7\u8d32\u7540\u94cb\u79d5\u88e8\u7b5a\u7b85\u7be6\u822d\u895e\u8df8\u9ac0","bian":"\u97ad\u8fb9\u7f16\u8d2c\u6241\u4fbf\u53d8\u535e\u8fa8\u8fa9\u8fab\u904d\u533e\u5f01\u82c4\u5fed\u6c74\u7f0f\u7178\u782d\u78a5\u7a39\u7a86\u8759\u7b3e\u9cca","biao":"\u6807\u5f6a\u8198\u8868\u5a4a\u9aa0\u98d1\u98d9\u98da\u706c\u9556\u9573\u762d\u88f1\u9cd4","bie":"\u9cd6\u618b\u522b\u762a\u8e69\u9cd8","bin":"\u5f6c\u658c\u6fd2\u6ee8\u5bbe\u6448\u50a7\u6d5c\u7f24\u73a2\u6ba1\u8191\u9554\u9acc\u9b13","bing":"\u5175\u51b0\u67c4\u4e19\u79c9\u997c\u70b3\u75c5\u5e76\u7980\u90b4\u6452\u7ee0\u678b\u69df\u71f9","bu":"\u6355\u535c\u54fa\u8865\u57e0\u4e0d\u5e03\u6b65\u7c3f\u90e8\u6016\u62ca\u535f\u900b\u74ff\u6661\u949a\u91ad","ca":"\u64e6\u5693\u7924","cai":"\u731c\u88c1\u6750\u624d\u8d22\u776c\u8e29\u91c7\u5f69\u83dc\u8521","can":"\u9910\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u74a8\u7cb2\u9eea","cang":"\u82cd\u8231\u4ed3\u6ca7\u85cf\u4f27","cao":"\u64cd\u7cd9\u69fd\u66f9\u8349\u8279\u5608\u6f15\u87ac\u825a","ce":"\u5395\u7b56\u4fa7\u518c\u6d4b\u5202\u5e3b\u607b","ceng":"\u5c42\u8e6d\u564c","cha":"\u63d2\u53c9\u832c\u8336\u67e5\u78b4\u643d\u5bdf\u5c94\u5dee\u8be7\u7339\u9987\u6c4a\u59f9\u6748\u6942\u69ce\u6aab\u9497\u9538\u9572\u8869","chai":"\u62c6\u67f4\u8c7a\u4faa\u8308\u7625\u867f\u9f87","chan":"\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5edb\u5fcf\u6f7a\u6fb6\u5b71\u7fbc\u5a75\u5b17\u9aa3\u89c7\u7985\u9561\u88e3\u87fe\u8e94","chang":"\u660c\u7316\u573a\u5c1d\u5e38\u957f\u507f\u80a0\u5382\u655e\u7545\u5531\u5021\u4f25\u9b2f\u82cc\u83d6\u5f9c\u6005\u60dd\u960a\u5a3c\u5ae6\u6636\u6c05\u9cb3","chao":"\u8d85\u6284\u949e\u671d\u5632\u6f6e\u5de2\u5435\u7092\u600a\u7ec9\u6641\u8016","che":"\u8f66\u626f\u64a4\u63a3\u5f7b\u6f88\u577c\u5c6e\u7817","chen":"\u90f4\u81e3\u8fb0\u5c18\u6668\u5ff1\u6c89\u9648\u8d81\u886c\u79f0\u8c0c\u62bb\u55d4\u5bb8\u741b\u6987\u809c\u80c2\u789c\u9f80","cheng":"\u6491\u57ce\u6a59\u6210\u5448\u4e58\u7a0b\u60e9\u6f84\u8bda\u627f\u901e\u9a8b\u79e4\u57d5\u5d4a\u5fb5\u6d48\u67a8\u67fd\u6a18\u665f\u584d\u77a0\u94d6\u88ce\u86cf\u9172","chi":"\u5403\u75f4\u6301\u5319\u6c60\u8fdf\u5f1b\u9a70\u803b\u9f7f\u4f88\u5c3a\u8d64\u7fc5\u65a5\u70bd\u50ba\u5880\u82aa\u830c\u640b\u53f1\u54e7\u557b\u55e4\u5f73\u996c\u6cb2\u5ab8\u6555\u80dd\u7719\u7735\u9e31\u761b\u892b\u86a9\u87ad\u7b1e\u7bea\u8c49\u8e05\u8e1f\u9b51","chong":"\u5145\u51b2\u866b\u5d07\u5ba0\u833a\u5fe1\u61a7\u94f3\u825f","chou":"\u62bd\u916c\u7574\u8e0c\u7a20\u6101\u7b79\u4ec7\u7ef8\u7785\u4e11\u4fe6\u5733\u5e31\u60c6\u6eb4\u59af\u7633\u96e0\u9c8b","chu":"\u81ed\u521d\u51fa\u6a71\u53a8\u8e87\u9504\u96cf\u6ec1\u9664\u695a\u7840\u50a8\u77d7\u6410\u89e6\u5904\u4e8d\u520d\u61b7\u7ecc\u6775\u696e\u6a17\u870d\u8e70\u9edc","chuan":"\u63e3\u5ddd\u7a7f\u693d\u4f20\u8239\u5598\u4e32\u63be\u821b\u60f4\u9044\u5ddb\u6c1a\u948f\u9569\u8221","chuang":"\u75ae\u7a97\u5e62\u5e8a\u95ef\u521b\u6006","chui":"\u5439\u708a\u6376\u9524\u5782\u9672\u68f0\u69cc","chun":"\u6625\u693f\u9187\u5507\u6df3\u7eaf\u8822\u4fc3\u83bc\u6c8c\u80ab\u6710\u9e51\u877d","chuo":"\u6233\u7ef0\u851f\u8fb6\u8f8d\u955e\u8e14\u9f8a","ci":"\u75b5\u8328\u78c1\u96cc\u8f9e\u6148\u74f7\u8bcd\u6b64\u523a\u8d50\u6b21\u8360\u5472\u5d6f\u9e5a\u8785\u7ccd\u8d91","cong":"\u806a\u8471\u56f1\u5306\u4ece\u4e1b\u506c\u82c1\u6dd9\u9aa2\u742e\u7481\u679e","cu":"\u51d1\u7c97\u918b\u7c07\u731d\u6b82\u8e59","cuan":"\u8e7f\u7be1\u7a9c\u6c46\u64ba\u6615\u7228","cui":"\u6467\u5d14\u50ac\u8106\u7601\u7cb9\u6dec\u7fe0\u8403\u60b4\u7480\u69b1\u96b9","cun":"\u6751\u5b58\u5bf8\u78cb\u5fd6\u76b4","cuo":"\u64ae\u6413\u63aa\u632b\u9519\u539d\u811e\u9509\u77ec\u75e4\u9e7e\u8e49\u8e9c","da":"\u642d\u8fbe\u7b54\u7629\u6253\u5927\u8037\u54d2\u55d2\u601b\u59b2\u75b8\u8921\u7b2a\u977c\u9791","dai":"\u5446\u6b79\u50a3\u6234\u5e26\u6b86\u4ee3\u8d37\u888b\u5f85\u902e\u6020\u57ed\u7519\u5454\u5cb1\u8fe8\u902f\u9a80\u7ed0\u73b3\u9edb","dan":"\u803d\u62c5\u4e39\u5355\u90f8\u63b8\u80c6\u65e6\u6c2e\u4f46\u60ee\u6de1\u8bde\u5f39\u86cb\u4ebb\u510b\u5369\u840f\u5556\u6fb9\u6a90\u6b9a\u8d55\u7708\u7605\u8043\u7baa","dang":"\u5f53\u6321\u515a\u8361\u6863\u8c20\u51fc\u83ea\u5b95\u7800\u94db\u88c6","dao":"\u5200\u6363\u8e48\u5012\u5c9b\u7977\u5bfc\u5230\u7a3b\u60bc\u9053\u76d7\u53e8\u5541\u5fc9\u6d2e\u6c18\u7118\u5fd1\u7e9b","de":"\u5fb7\u5f97\u7684\u951d","deng":"\u8e6c\u706f\u767b\u7b49\u77aa\u51f3\u9093\u5654\u5d9d\u6225\u78f4\u956b\u7c26","di":"\u5824\u4f4e\u6ef4\u8fea\u654c\u7b1b\u72c4\u6da4\u7fdf\u5ae1\u62b5\u5e95\u5730\u8482\u7b2c\u5e1d\u5f1f\u9012\u7f14\u6c10\u7c74\u8bcb\u8c1b\u90b8\u577b\u839c\u837b\u5600\u5a23\u67e2\u68e3\u89cc\u7825\u78b2\u7747\u955d\u7f9d\u9ab6","dian":"\u98a0\u6382\u6ec7\u7898\u70b9\u5178\u975b\u57ab\u7535\u4f43\u7538\u5e97\u60e6\u5960\u6dc0\u6bbf\u4e36\u963d\u576b\u57dd\u5dc5\u73b7\u765c\u766b\u7c1f\u8e2e","diao":"\u7889\u53fc\u96d5\u51cb\u5201\u6389\u540a\u9493\u8c03\u8f7a\u94de\u8729\u7c9c\u8c82","die":"\u8dcc\u7239\u789f\u8776\u8fed\u8c0d\u53e0\u4f5a\u57a4\u581e\u63f2\u558b\u6e2b\u8f76\u7252\u74de\u8936\u800b\u8e40\u9cbd\u9cce","ding":"\u4e01\u76ef\u53ee\u9489\u9876\u9f0e\u952d\u5b9a\u8ba2\u4e22\u4ec3\u5576\u738e\u815a\u7887\u753a\u94e4\u7594\u8035\u914a","dong":"\u4e1c\u51ac\u8463\u61c2\u52a8\u680b\u4f97\u606b\u51bb\u6d1e\u578c\u549a\u5cbd\u5cd2\u5902\u6c21\u80e8\u80f4\u7850\u9e2b","dou":"\u515c\u6296\u6597\u9661\u8c46\u9017\u75d8\u8538\u94ad\u7aa6\u7aac\u86aa\u7bfc\u9161","du":"\u90fd\u7763\u6bd2\u728a\u72ec\u8bfb\u5835\u7779\u8d4c\u675c\u9540\u809a\u5ea6\u6e21\u5992\u828f\u561f\u6e0e\u691f\u6a50\u724d\u8839\u7b03\u9ad1\u9ee9","duan":"\u7aef\u77ed\u953b\u6bb5\u65ad\u7f0e\u5f56\u6934\u7145\u7c16","dui":"\u5806\u5151\u961f\u5bf9\u603c\u619d\u7893","dun":"\u58a9\u5428\u8e72\u6566\u987f\u56e4\u949d\u76fe\u9041\u7096\u7818\u7905\u76f9\u9566\u8db8","duo":"\u6387\u54c6\u591a\u593a\u579b\u8eb2\u6735\u8dfa\u8235\u5241\u60f0\u5815\u5484\u54da\u7f0d\u67c1\u94ce\u88f0\u8e31","e":"\u86fe\u5ce8\u9e45\u4fc4\u989d\u8bb9\u5a25\u6076\u5384\u627c\u904f\u9102\u997f\u5669\u8c14\u57a9\u57ad\u82ca\u83aa\u843c\u5443\u6115\u5c59\u5a40\u8f6d\u66f7\u816d\u786a\u9507\u9537\u9e57\u989a\u9cc4","en":"\u6069\u84bd\u6441\u5514\u55ef","er":"\u800c\u513f\u8033\u5c14\u9975\u6d31\u4e8c\u8d30\u8fe9\u73e5\u94d2\u9e38\u9c95","fa":"\u53d1\u7f5a\u7b4f\u4f10\u4e4f\u9600\u6cd5\u73d0\u57a1\u781d","fan":"\u85e9\u5e06\u756a\u7ffb\u6a0a\u77fe\u9492\u7e41\u51e1\u70e6\u53cd\u8fd4\u8303\u8d29\u72af\u996d\u6cdb\u8629\u5e61\u72ad\u68b5\u6535\u71d4\u7548\u8e6f","fang":"\u574a\u82b3\u65b9\u80aa\u623f\u9632\u59a8\u4eff\u8bbf\u7eba\u653e\u531a\u90a1\u5f77\u94ab\u822b\u9c82","fei":"\u83f2\u975e\u5561\u98de\u80a5\u532a\u8bfd\u5420\u80ba\u5e9f\u6cb8\u8d39\u82be\u72d2\u60b1\u6ddd\u5983\u7ecb\u7eef\u69a7\u8153\u6590\u6249\u7953\u7829\u9544\u75f1\u871a\u7bda\u7fe1\u970f\u9cb1","fen":"\u82ac\u915a\u5429\u6c1b\u5206\u7eb7\u575f\u711a\u6c7e\u7c89\u594b\u4efd\u5fff\u6124\u7caa\u507e\u7035\u68fc\u610d\u9cbc\u9f22","feng":"\u4e30\u5c01\u67ab\u8702\u5cf0\u950b\u98ce\u75af\u70fd\u9022\u51af\u7f1d\u8bbd\u5949\u51e4\u4ff8\u9146\u8451\u6ca3\u781c","fu":"\u4f5b\u5426\u592b\u6577\u80a4\u5b75\u6276\u62c2\u8f90\u5e45\u6c1f\u7b26\u4f0f\u4fd8\u670d\u6d6e\u6daa\u798f\u88b1\u5f17\u752b\u629a\u8f85\u4fef\u91dc\u65a7\u812f\u8151\u5e9c\u8150\u8d74\u526f\u8986\u8d4b\u590d\u5085\u4ed8\u961c\u7236\u8179\u8d1f\u5bcc\u8ba3\u9644\u5987\u7f1a\u5490\u5310\u51eb\u90db\u8299\u82fb\u832f\u83a9\u83d4\u544b\u5e5e\u6ecf\u8274\u5b5a\u9a78\u7ec2\u6874\u8d59\u9efb\u9efc\u7f58\u7a03\u99a5\u864d\u86a8\u8709\u8760\u876e\u9eb8\u8dba\u8dd7\u9cc6","ga":"\u5676\u560e\u86e4\u5c2c\u5477\u5c15\u5c1c\u65ee\u9486","gai":"\u8be5\u6539\u6982\u9499\u76d6\u6e89\u4e10\u9654\u5793\u6224\u8d45\u80f2","gan":"\u5e72\u7518\u6746\u67d1\u7aff\u809d\u8d76\u611f\u79c6\u6562\u8d63\u5769\u82f7\u5c34\u64c0\u6cd4\u6de6\u6f89\u7ec0\u6a44\u65f0\u77f8\u75b3\u9150","gang":"\u5188\u521a\u94a2\u7f38\u809b\u7eb2\u5c97\u6e2f\u6206\u7f61\u9883\u7b7b","gong":"\u6760\u5de5\u653b\u529f\u606d\u9f9a\u4f9b\u8eac\u516c\u5bab\u5f13\u5de9\u6c5e\u62f1\u8d21\u5171\u857b\u5efe\u54a3\u73d9\u80b1\u86a3\u86e9\u89e5","gao":"\u7bd9\u768b\u9ad8\u818f\u7f94\u7cd5\u641e\u9550\u7a3f\u544a\u777e\u8bf0\u90dc\u84bf\u85c1\u7f1f\u69d4\u69c1\u6772\u9506","ge":"\u54e5\u6b4c\u6401\u6208\u9e3d\u80f3\u7599\u5272\u9769\u845b\u683c\u9601\u9694\u94ec\u4e2a\u5404\u9b32\u4ee1\u54ff\u5865\u55dd\u7ea5\u643f\u8188\u784c\u94ea\u9549\u88bc\u988c\u867c\u8238\u9abc\u9ac2","gei":"\u7ed9","gen":"\u6839\u8ddf\u4e98\u831b\u54cf\u826e","geng":"\u8015\u66f4\u5e9a\u7fb9\u57c2\u803f\u6897\u54fd\u8d53\u9ca0","gou":"\u94a9\u52fe\u6c9f\u82df\u72d7\u57a2\u6784\u8d2d\u591f\u4f5d\u8bdf\u5ca3\u9058\u5abe\u7f11\u89cf\u5f40\u9e32\u7b31\u7bdd\u97b2","gu":"\u8f9c\u83c7\u5495\u7b8d\u4f30\u6cbd\u5b64\u59d1\u9f13\u53e4\u86ca\u9aa8\u8c37\u80a1\u6545\u987e\u56fa\u96c7\u560f\u8bc2\u83f0\u54cc\u5d2e\u6c69\u688f\u8f71\u726f\u727f\u80cd\u81cc\u6bc2\u77bd\u7f5f\u94b4\u9522\u74e0\u9e2a\u9e44\u75fc\u86c4\u9164\u89da\u9cb4\u9ab0\u9e58","gua":"\u522e\u74dc\u5250\u5be1\u6302\u8902\u5366\u8bd6\u5471\u681d\u9e39","guai":"\u4e56\u62d0\u602a\u54d9","guan":"\u68fa\u5173\u5b98\u51a0\u89c2\u7ba1\u9986\u7f50\u60ef\u704c\u8d2f\u500c\u839e\u63bc\u6dab\u76e5\u9e73\u9ccf","guang":"\u5149\u5e7f\u901b\u72b7\u6844\u80f1\u7592","gui":"\u7470\u89c4\u572d\u7845\u5f52\u9f9f\u95fa\u8f68\u9b3c\u8be1\u7678\u6842\u67dc\u8dea\u8d35\u523d\u5326\u523f\u5e8b\u5b84\u59ab\u6867\u7085\u6677\u7688\u7c0b\u9c91\u9cdc","gun":"\u8f8a\u6eda\u68cd\u4e28\u886e\u7ef2\u78d9\u9ca7","guo":"\u9505\u90ed\u56fd\u679c\u88f9\u8fc7\u9998\u8803\u57da\u63b4\u5459\u56d7\u5e3c\u5d1e\u7313\u6901\u8662\u951e\u8052\u872e\u873e\u8748","ha":"\u54c8","hai":"\u9ab8\u5b69\u6d77\u6c26\u4ea5\u5bb3\u9a87\u54b4\u55e8\u988f\u91a2","han":"\u9163\u61a8\u90af\u97e9\u542b\u6db5\u5bd2\u51fd\u558a\u7f55\u7ff0\u64bc\u634d\u65f1\u61be\u608d\u710a\u6c57\u6c49\u9097\u83e1\u6496\u961a\u701a\u6657\u7113\u9894\u86b6\u9f3e","hen":"\u592f\u75d5\u5f88\u72e0\u6068","hang":"\u676d\u822a\u6c86\u7ed7\u73e9\u6841","hao":"\u58d5\u568e\u8c6a\u6beb\u90dd\u597d\u8017\u53f7\u6d69\u8585\u55e5\u5686\u6fe0\u704f\u660a\u7693\u98a2\u869d","he":"\u5475\u559d\u8377\u83cf\u6838\u79be\u548c\u4f55\u5408\u76d2\u8c89\u9602\u6cb3\u6db8\u8d6b\u8910\u9e64\u8d3a\u8bc3\u52be\u58d1\u85ff\u55d1\u55ec\u9616\u76cd\u86b5\u7fee","hei":"\u563f\u9ed1","heng":"\u54fc\u4ea8\u6a2a\u8861\u6052\u8a07\u8605","hong":"\u8f70\u54c4\u70d8\u8679\u9e3f\u6d2a\u5b8f\u5f18\u7ea2\u9ec9\u8ba7\u836d\u85a8\u95f3\u6cd3","hou":"\u5589\u4faf\u7334\u543c\u539a\u5019\u540e\u5820\u5f8c\u9005\u760a\u7bcc\u7cc7\u9c8e\u9aba","hu":"\u547c\u4e4e\u5ffd\u745a\u58f6\u846b\u80e1\u8774\u72d0\u7cca\u6e56\u5f27\u864e\u552c\u62a4\u4e92\u6caa\u6237\u51b1\u553f\u56eb\u5cb5\u7322\u6019\u60da\u6d52\u6ef9\u7425\u69f2\u8f77\u89f3\u70c0\u7173\u623d\u6248\u795c\u9e55\u9e71\u7b0f\u9190\u659b","hua":"\u82b1\u54d7\u534e\u733e\u6ed1\u753b\u5212\u5316\u8bdd\u5290\u6d4d\u9a85\u6866\u94e7\u7a1e","huai":"\u69d0\u5f8a\u6000\u6dee\u574f\u8fd8\u8e1d","huan":"\u6b22\u73af\u6853\u7f13\u6362\u60a3\u5524\u75ea\u8c62\u7115\u6da3\u5ba6\u5e7b\u90c7\u5942\u57b8\u64d0\u571c\u6d39\u6d63\u6f36\u5bf0\u902d\u7f33\u953e\u9ca9\u9b1f","huang":"\u8352\u614c\u9ec4\u78fa\u8757\u7c27\u7687\u51f0\u60f6\u714c\u6643\u5e4c\u604d\u8c0e\u968d\u5fa8\u6e5f\u6f62\u9051\u749c\u8093\u7640\u87e5\u7bc1\u9cc7","hui":"\u7070\u6325\u8f89\u5fbd\u6062\u86d4\u56de\u6bc1\u6094\u6167\u5349\u60e0\u6666\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u8334\u835f\u8559\u54d5\u5599\u96b3\u6d04\u5f57\u7f0b\u73f2\u6656\u605a\u867a\u87ea\u9ebe","hun":"\u8364\u660f\u5a5a\u9b42\u6d51\u6df7\u8be8\u9984\u960d\u6eb7\u7f17","huo":"\u8c41\u6d3b\u4f19\u706b\u83b7\u6216\u60d1\u970d\u8d27\u7978\u6509\u56af\u5925\u94ac\u952a\u956c\u8020\u8816","ji":"\u51fb\u573e\u57fa\u673a\u7578\u7a3d\u79ef\u7b95\u808c\u9965\u8ff9\u6fc0\u8ba5\u9e21\u59ec\u7ee9\u7f09\u5409\u6781\u68d8\u8f91\u7c4d\u96c6\u53ca\u6025\u75be\u6c72\u5373\u5ac9\u7ea7\u6324\u51e0\u810a\u5df1\u84df\u6280\u5180\u5b63\u4f0e\u796d\u5242\u60b8\u6d4e\u5bc4\u5bc2\u8ba1\u8bb0\u65e2\u5fcc\u9645\u5993\u7ee7\u7eaa\u5c45\u4e0c\u4e69\u525e\u4f76\u4f74\u8114\u58bc\u82a8\u82b0\u8401\u84ba\u857a\u638e\u53fd\u54ad\u54dc\u5527\u5c8c\u5d74\u6d0e\u5f50\u5c50\u9aa5\u757f\u7391\u696b\u6b9b\u621f\u6222\u8d4d\u89ca\u7284\u9f51\u77f6\u7f81\u5d47\u7a37\u7620\u7635\u866e\u7b08\u7b04\u66a8\u8dfb\u8dfd\u9701\u9c9a\u9cab\u9afb\u9e82","jia":"\u5609\u67b7\u5939\u4f73\u5bb6\u52a0\u835a\u988a\u8d3e\u7532\u94be\u5047\u7a3c\u4ef7\u67b6\u9a7e\u5ac1\u4f3d\u90cf\u62ee\u5cac\u6d43\u8fe6\u73c8\u621b\u80db\u605d\u94d7\u9553\u75c2\u86f1\u7b33\u8888\u8dcf","jian":"\u6b7c\u76d1\u575a\u5c16\u7b3a\u95f4\u714e\u517c\u80a9\u8270\u5978\u7f04\u8327\u68c0\u67ec\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u526a\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u7bad\u4ef6\u5065\u8230\u5251\u996f\u6e10\u6e85\u6da7\u5efa\u50ed\u8c0f\u8c2b\u83c5\u84b9\u641b\u56dd\u6e54\u8e47\u8b07\u7f23\u67a7\u67d9\u6957\u620b\u622c\u726e\u728d\u6bfd\u8171\u7751\u950f\u9e63\u88e5\u7b15\u7bb4\u7fe6\u8dbc\u8e3a\u9ca3\u97af","jiang":"\u50f5\u59dc\u5c06\u6d46\u6c5f\u7586\u848b\u6868\u5956\u8bb2\u5320\u9171\u964d\u8333\u6d1a\u7edb\u7f30\u729f\u7913\u8029\u7ce8\u8c47","jiao":"\u8549\u6912\u7901\u7126\u80f6\u4ea4\u90ca\u6d47\u9a84\u5a07\u56bc\u6405\u94f0\u77eb\u4fa5\u811a\u72e1\u89d2\u997a\u7f34\u7ede\u527f\u6559\u9175\u8f7f\u8f83\u53eb\u4f7c\u50ec\u832d\u6322\u564d\u5ce4\u5fbc\u59e3\u7e9f\u656b\u768e\u9e6a\u86df\u91ae\u8de4\u9c9b","jie":"\u7a96\u63ed\u63a5\u7686\u79f8\u8857\u9636\u622a\u52ab\u8282\u6854\u6770\u6377\u776b\u7aed\u6d01\u7ed3\u89e3\u59d0\u6212\u85c9\u82a5\u754c\u501f\u4ecb\u75a5\u8beb\u5c4a\u5048\u8ba6\u8bd8\u5588\u55df\u736c\u5a55\u5b51\u6840\u7352\u78a3\u9534\u7596\u88b7\u9889\u86a7\u7faf\u9c92\u9ab1\u9aeb","jin":"\u5dfe\u7b4b\u65a4\u91d1\u4eca\u6d25\u895f\u7d27\u9526\u4ec5\u8c28\u8fdb\u9773\u664b\u7981\u8fd1\u70ec\u6d78\u5c3d\u537a\u8369\u5807\u5664\u9991\u5ed1\u5997\u7f19\u747e\u69ff\u8d46\u89d0\u9485\u9513\u887f\u77dc","jing":"\u52b2\u8346\u5162\u830e\u775b\u6676\u9cb8\u4eac\u60ca\u7cbe\u7cb3\u7ecf\u4e95\u8b66\u666f\u9888\u9759\u5883\u656c\u955c\u5f84\u75c9\u9756\u7adf\u7ade\u51c0\u522d\u5106\u9631\u83c1\u734d\u61ac\u6cfe\u8ff3\u5f2a\u5a67\u80bc\u80eb\u8148\u65cc","jiong":"\u70af\u7a98\u5182\u8fe5\u6243","jiu":"\u63ea\u7a76\u7ea0\u7396\u97ed\u4e45\u7078\u4e5d\u9152\u53a9\u6551\u65e7\u81fc\u8205\u548e\u5c31\u759a\u50e6\u557e\u9604\u67e9\u6855\u9e6b\u8d73\u9b0f","ju":"\u97a0\u62d8\u72d9\u75bd\u9a79\u83ca\u5c40\u5480\u77e9\u4e3e\u6cae\u805a\u62d2\u636e\u5de8\u5177\u8ddd\u8e1e\u952f\u4ff1\u53e5\u60e7\u70ac\u5267\u5028\u8bb5\u82e3\u82f4\u8392\u63ac\u907d\u5c66\u741a\u67b8\u6910\u6998\u6989\u6a58\u728b\u98d3\u949c\u9514\u7aad\u88fe\u8d84\u91b5\u8e3d\u9f83\u96ce\u97ab","juan":"\u6350\u9e43\u5a1f\u5026\u7737\u5377\u7ee2\u9104\u72f7\u6d93\u684a\u8832\u9529\u954c\u96bd","jue":"\u6485\u652b\u6289\u6398\u5014\u7235\u89c9\u51b3\u8bc0\u7edd\u53a5\u5282\u8c32\u77cd\u8568\u5658\u5d1b\u7357\u5b53\u73cf\u6877\u6a5b\u721d\u9562\u8e76\u89d6","jun":"\u5747\u83cc\u94a7\u519b\u541b\u5cfb\u4fca\u7ae3\u6d5a\u90e1\u9a8f\u6343\u72fb\u76b2\u7b60\u9e87","ka":"\u5580\u5496\u5361\u4f67\u5494\u80e9","ke":"\u54af\u5777\u82db\u67ef\u68f5\u78d5\u9897\u79d1\u58f3\u54b3\u53ef\u6e34\u514b\u523b\u5ba2\u8bfe\u5ca2\u606a\u6e98\u9a92\u7f02\u73c2\u8f72\u6c2a\u778c\u94b6\u75b4\u7aa0\u874c\u9ac1","kai":"\u5f00\u63e9\u6977\u51ef\u6168\u5240\u57b2\u8488\u5ffe\u607a\u94e0\u950e","kan":"\u520a\u582a\u52d8\u574e\u780d\u770b\u4f83\u51f5\u83b0\u83b6\u6221\u9f9b\u77b0","kang":"\u5eb7\u6177\u7ce0\u625b\u6297\u4ea2\u7095\u5751\u4f09\u95f6\u94aa","kao":"\u8003\u62f7\u70e4\u9760\u5c3b\u6832\u7292\u94d0","ken":"\u80af\u5543\u57a6\u6073\u57a0\u88c9\u9880","keng":"\u542d\u5fd0\u94ff","kong":"\u7a7a\u6050\u5b54\u63a7\u5025\u5d06\u7b9c","kou":"\u62a0\u53e3\u6263\u5bc7\u82a4\u853b\u53e9\u770d\u7b58","ku":"\u67af\u54ed\u7a9f\u82e6\u9177\u5e93\u88e4\u5233\u5800\u55be\u7ed4\u9ab7","kua":"\u5938\u57ae\u630e\u8de8\u80ef\u4f89","kuai":"\u5757\u7b77\u4fa9\u5feb\u84af\u90d0\u8489\u72ef\u810d","kuan":"\u5bbd\u6b3e\u9acb","kuang":"\u5321\u7b50\u72c2\u6846\u77ff\u7736\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u593c\u54d0\u7ea9\u8d36","kui":"\u4e8f\u76d4\u5cbf\u7aa5\u8475\u594e\u9b41\u5080\u9988\u6127\u6e83\u9997\u532e\u5914\u9697\u63c6\u55b9\u559f\u609d\u6126\u9615\u9035\u668c\u777d\u8069\u8770\u7bd1\u81fe\u8dec","kun":"\u5764\u6606\u6346\u56f0\u6083\u9603\u7428\u951f\u918c\u9cb2\u9ae1","kuo":"\u62ec\u6269\u5ed3\u9614\u86de","la":"\u5783\u62c9\u5587\u8721\u814a\u8fa3\u5566\u524c\u647a\u908b\u65ef\u782c\u760c","lai":"\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41","lan":"\u84dd\u5a6a\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5549\u5c9a\u61d4\u6f24\u6984\u6593\u7f71\u9567\u8934","lang":"\u7405\u6994\u72fc\u5eca\u90ce\u6717\u6d6a\u83a8\u8497\u5577\u9606\u9512\u7a02\u8782","lao":"\u635e\u52b3\u7262\u8001\u4f6c\u59e5\u916a\u70d9\u6d9d\u5520\u5d02\u6833\u94d1\u94f9\u75e8\u91aa","le":"\u52d2\u4e50\u808b\u4ec2\u53fb\u561e\u6cd0\u9cd3","lei":"\u96f7\u956d\u857e\u78ca\u7d2f\u5121\u5792\u64c2\u7c7b\u6cea\u7fb8\u8bd4\u837d\u54a7\u6f2f\u5ad8\u7f27\u6a91\u8012\u9179","ling":"\u68f1\u51b7\u62ce\u73b2\u83f1\u96f6\u9f84\u94c3\u4f36\u7f9a\u51cc\u7075\u9675\u5cad\u9886\u53e6\u4ee4\u9143\u5844\u82d3\u5464\u56f9\u6ce0\u7eeb\u67c3\u68c2\u74f4\u8046\u86c9\u7fce\u9cae","leng":"\u695e\u6123","li":"\u5398\u68a8\u7281\u9ece\u7bf1\u72f8\u79bb\u6f13\u7406\u674e\u91cc\u9ca4\u793c\u8389\u8354\u540f\u6817\u4e3d\u5389\u52b1\u783e\u5386\u5229\u5088\u4f8b\u4fd0\u75e2\u7acb\u7c92\u6ca5\u96b6\u529b\u7483\u54e9\u4fea\u4fda\u90e6\u575c\u82c8\u8385\u84e0\u85dc\u6369\u5456\u5533\u55b1\u7301\u6ea7\u6fa7\u9026\u5a0c\u5ae0\u9a8a\u7f21\u73de\u67a5\u680e\u8f79\u623e\u783a\u8a48\u7f79\u9502\u9e42\u75a0\u75ac\u86ce\u870a\u8821\u7b20\u7be5\u7c9d\u91b4\u8dde\u96f3\u9ca1\u9ce2\u9ee7","lian":"\u4fe9\u8054\u83b2\u8fde\u9570\u5ec9\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u631b\u8539\u5941\u6f4b\u6fc2\u5a08\u740f\u695d\u6b93\u81c1\u81a6\u88e2\u880a\u9ca2","liang":"\u7cae\u51c9\u6881\u7cb1\u826f\u4e24\u8f86\u91cf\u667e\u4eae\u8c05\u589a\u690b\u8e09\u9753\u9b49","liao":"\u64a9\u804a\u50da\u7597\u71ce\u5be5\u8fbd\u6f66\u4e86\u6482\u9563\u5ed6\u6599\u84fc\u5c25\u5639\u7360\u5bee\u7f2d\u948c\u9e69\u8022","lie":"\u5217\u88c2\u70c8\u52a3\u730e\u51bd\u57d2\u6d0c\u8d94\u8e90\u9b23","lin":"\u7433\u6797\u78f7\u9716\u4e34\u90bb\u9cde\u6dcb\u51db\u8d41\u541d\u853a\u5d99\u5eea\u9074\u6aa9\u8f9a\u77b5\u7cbc\u8e8f\u9e9f","liu":"\u6e9c\u7409\u69b4\u786b\u998f\u7559\u5218\u7624\u6d41\u67f3\u516d\u62a1\u507b\u848c\u6cd6\u6d4f\u905b\u9a9d\u7efa\u65d2\u7198\u950d\u954f\u9e68\u938f","long":"\u9f99\u804b\u5499\u7b3c\u7abf\u9686\u5784\u62e2\u9647\u5f04\u5785\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u7643","lou":"\u697c\u5a04\u6402\u7bd3\u6f0f\u964b\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5","lu":"\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u9e93\u788c\u9732\u8def\u8d42\u9e7f\u6f5e\u7984\u5f55\u9646\u622e\u5786\u6445\u64b8\u565c\u6cf8\u6e0c\u6f09\u7490\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9565\u9e2c\u9e6d\u7c0f\u823b\u9c88","lv":"\u9a74\u5415\u94dd\u4fa3\u65c5\u5c65\u5c61\u7f15\u8651\u6c2f\u5f8b\u7387\u6ee4\u7eff\u634b\u95fe\u6988\u8182\u7a06\u891b","luan":"\u5ce6\u5b6a\u6ee6\u5375\u4e71\u683e\u9e3e\u92ae","lue":"\u63a0\u7565\u950a","lun":"\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5","luo":"\u841d\u87ba\u7f57\u903b\u9523\u7ba9\u9aa1\u88f8\u843d\u6d1b\u9a86\u7edc\u502e\u8366\u645e\u7321\u6cfa\u6924\u8136\u9559\u7630\u96d2","ma":"\u5988\u9ebb\u739b\u7801\u8682\u9a6c\u9a82\u561b\u5417\u551b\u72b8\u5b37\u6769\u9ebd","mai":"\u57cb\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u836c\u54aa\u973e","man":"\u7792\u9992\u86ee\u6ee1\u8513\u66fc\u6162\u6f2b\u8c29\u5881\u5e54\u7f26\u71b3\u9558\u989f\u87a8\u9cd7\u9794","mang":"\u8292\u832b\u76f2\u5fd9\u83bd\u9099\u6f2d\u6726\u786d\u87d2","meng":"\u6c13\u840c\u8499\u6aac\u76df\u9530\u731b\u68a6\u5b5f\u52d0\u750d\u77a2\u61f5\u791e\u867b\u8722\u8813\u824b\u8268\u9efe","miao":"\u732b\u82d7\u63cf\u7784\u85d0\u79d2\u6e3a\u5e99\u5999\u55b5\u9088\u7f08\u7f2a\u676a\u6dfc\u7707\u9e4b\u8731","mao":"\u8305\u951a\u6bdb\u77db\u94c6\u536f\u8302\u5192\u5e3d\u8c8c\u8d38\u4f94\u88a4\u52d6\u8306\u5cc1\u7441\u6634\u7266\u8004\u65c4\u61cb\u7780\u86d1\u8765\u87ca\u9ae6","me":"\u4e48","mei":"\u73ab\u679a\u6885\u9176\u9709\u7164\u6ca1\u7709\u5a92\u9541\u6bcf\u7f8e\u6627\u5bd0\u59b9\u5a9a\u5776\u8393\u5d4b\u7338\u6d7c\u6e44\u6963\u9545\u9e5b\u8882\u9b45","men":"\u95e8\u95f7\u4eec\u626a\u739f\u7116\u61d1\u9494","mi":"\u772f\u919a\u9761\u7cdc\u8ff7\u8c1c\u5f25\u7c73\u79d8\u89c5\u6ccc\u871c\u5bc6\u5e42\u8288\u5196\u8c27\u863c\u5627\u7315\u736f\u6c68\u5b93\u5f2d\u8112\u6549\u7cf8\u7e3b\u9e8b","mian":"\u68c9\u7720\u7ef5\u5195\u514d\u52c9\u5a29\u7f05\u9762\u6c94\u6e4e\u817c\u7704","mie":"\u8511\u706d\u54a9\u881b\u7bfe","min":"\u6c11\u62bf\u76bf\u654f\u60af\u95fd\u82e0\u5cb7\u95f5\u6cef\u73c9","ming":"\u660e\u879f\u9e23\u94ed\u540d\u547d\u51a5\u8317\u6e9f\u669d\u7791\u9169","miu":"\u8c2c","mo":"\u6478\u6479\u8611\u6a21\u819c\u78e8\u6469\u9b54\u62b9\u672b\u83ab\u58a8\u9ed8\u6cab\u6f20\u5bde\u964c\u8c1f\u8309\u84e6\u998d\u5aeb\u9546\u79e3\u763c\u8031\u87c6\u8c8a\u8c98","mou":"\u8c0b\u725f\u67d0\u53b6\u54de\u5a7a\u7738\u936a","mu":"\u62c7\u7261\u4ea9\u59c6\u6bcd\u5893\u66ae\u5e55\u52df\u6155\u6728\u76ee\u7766\u7267\u7a46\u4eeb\u82dc\u5452\u6c90\u6bea\u94bc","na":"\u62ff\u54ea\u5450\u94a0\u90a3\u5a1c\u7eb3\u5185\u637a\u80ad\u954e\u8872\u7bac","nai":"\u6c16\u4e43\u5976\u8010\u5948\u9f10\u827f\u8418\u67f0","nan":"\u5357\u7537\u96be\u56ca\u5583\u56e1\u6960\u8169\u877b\u8d67","nao":"\u6320\u8111\u607c\u95f9\u5b6c\u57b4\u7331\u7459\u7847\u94d9\u86f2","ne":"\u6dd6\u5462\u8bb7","nei":"\u9981","nen":"\u5ae9\u80fd\u6798\u6041","ni":"\u59ae\u9713\u502a\u6ce5\u5c3c\u62df\u4f60\u533f\u817b\u9006\u6eba\u4f32\u576d\u730a\u6029\u6ee0\u6635\u65ce\u7962\u615d\u7768\u94cc\u9cb5","nian":"\u852b\u62c8\u5e74\u78be\u64b5\u637b\u5ff5\u5eff\u8f87\u9ecf\u9c87\u9cb6","niang":"\u5a18\u917f","niao":"\u9e1f\u5c3f\u8311\u5b32\u8132\u8885","nie":"\u634f\u8042\u5b7d\u556e\u954a\u954d\u6d85\u4e5c\u9667\u8616\u55eb\u8080\u989e\u81ec\u8e51","nin":"\u60a8\u67e0","ning":"\u72de\u51dd\u5b81\u62e7\u6cde\u4f5e\u84e5\u549b\u752f\u804d","niu":"\u725b\u626d\u94ae\u7ebd\u72c3\u5ff8\u599e\u86b4","nong":"\u8113\u6d53\u519c\u4fac","nu":"\u5974\u52aa\u6012\u5476\u5e11\u5f29\u80ec\u5b65\u9a7d","nv":"\u5973\u6067\u9495\u8844","nuan":"\u6696","nuenue":"\u8650","nue":"\u759f\u8c11","nuo":"\u632a\u61e6\u7cef\u8bfa\u50a9\u6426\u558f\u9518","ou":"\u54e6\u6b27\u9e25\u6bb4\u85d5\u5455\u5076\u6ca4\u6004\u74ef\u8026","pa":"\u556a\u8db4\u722c\u5e15\u6015\u7436\u8469\u7b62","pai":"\u62cd\u6392\u724c\u5f98\u6e43\u6d3e\u4ff3\u848e","pan":"\u6500\u6f58\u76d8\u78d0\u76fc\u7554\u5224\u53db\u723f\u6cee\u88a2\u897b\u87e0\u8e52","pang":"\u4e53\u5e9e\u65c1\u802a\u80d6\u6ec2\u9004","pao":"\u629b\u5486\u5228\u70ae\u888d\u8dd1\u6ce1\u530f\u72cd\u5e96\u812c\u75b1","pei":"\u5478\u80da\u57f9\u88f4\u8d54\u966a\u914d\u4f69\u6c9b\u638a\u8f94\u5e14\u6de0\u65c6\u952b\u9185\u9708","pen":"\u55b7\u76c6\u6e53","peng":"\u7830\u62a8\u70f9\u6f8e\u5f6d\u84ec\u68da\u787c\u7bf7\u81a8\u670b\u9e4f\u6367\u78b0\u576f\u580b\u562d\u6026\u87db","pi":"\u7812\u9739\u6279\u62ab\u5288\u7435\u6bd7\u5564\u813e\u75b2\u76ae\u5339\u75de\u50fb\u5c41\u8b6c\u4e15\u9674\u90b3\u90eb\u572e\u9f19\u64d7\u567c\u5e80\u5ab2\u7eb0\u6787\u7513\u7765\u7f74\u94cd\u75e6\u7656\u758b\u868d\u8c94","pian":"\u7bc7\u504f\u7247\u9a97\u8c1d\u9a88\u728f\u80fc\u890a\u7fe9\u8e41","piao":"\u98d8\u6f02\u74e2\u7968\u527d\u560c\u5ad6\u7f25\u6b8d\u779f\u87b5","pie":"\u6487\u77a5\u4e3f\u82e4\u6c15","pin":"\u62fc\u9891\u8d2b\u54c1\u8058\u62da\u59d8\u5ad4\u6980\u725d\u98a6","ping":"\u4e52\u576a\u82f9\u840d\u5e73\u51ed\u74f6\u8bc4\u5c4f\u4fdc\u5a09\u67b0\u9c86","po":"\u5761\u6cfc\u9887\u5a46\u7834\u9b44\u8feb\u7c95\u53f5\u9131\u6ea5\u73c0\u948b\u94b7\u76a4\u7b38","pou":"\u5256\u88d2\u8e23","pu":"\u6251\u94fa\u4ec6\u8386\u8461\u83e9\u84b2\u57d4\u6734\u5703\u666e\u6d66\u8c31\u66dd\u7011\u530d\u5657\u6fee\u749e\u6c06\u9564\u9568\u8e7c","qi":"\u671f\u6b3a\u6816\u621a\u59bb\u4e03\u51c4\u6f06\u67d2\u6c8f\u5176\u68cb\u5947\u6b67\u7566\u5d0e\u8110\u9f50\u65d7\u7948\u7941\u9a91\u8d77\u5c82\u4e5e\u4f01\u542f\u5951\u780c\u5668\u6c14\u8fc4\u5f03\u6c7d\u6ce3\u8bab\u4e9f\u4e93\u573b\u8291\u840b\u847a\u5601\u5c7a\u5c90\u6c54\u6dc7\u9a90\u7eee\u742a\u7426\u675e\u6864\u69ed\u6b39\u797a\u61a9\u789b\u86f4\u871e\u7da6\u7dae\u8dbf\u8e4a\u9ccd\u9e92","qia":"\u6390\u6070\u6d3d\u845c","qian":"\u7275\u6266\u948e\u94c5\u5343\u8fc1\u7b7e\u4edf\u8c26\u4e7e\u9ed4\u94b1\u94b3\u524d\u6f5c\u9063\u6d45\u8c34\u5811\u5d4c\u6b20\u6b49\u4f65\u9621\u828a\u82a1\u8368\u63ae\u5c8d\u60ad\u614a\u9a9e\u6434\u8930\u7f31\u6920\u80b7\u6106\u94a4\u8654\u7b9d","qiang":"\u67aa\u545b\u8154\u7f8c\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u8941\u8723\u7f9f\u8deb\u8dc4","qiao":"\u6a47\u9539\u6572\u6084\u6865\u77a7\u4e54\u4fa8\u5de7\u9798\u64ac\u7fd8\u5ced\u4fcf\u7a8d\u5281\u8bee\u8c2f\u835e\u6100\u6194\u7f32\u6a35\u6bf3\u7857\u8df7\u9792","qie":"\u5207\u8304\u4e14\u602f\u7a83\u90c4\u553c\u60ec\u59be\u6308\u9532\u7ba7","qin":"\u94a6\u4fb5\u4eb2\u79e6\u7434\u52e4\u82b9\u64d2\u79bd\u5bdd\u6c81\u82a9\u84c1\u8572\u63ff\u5423\u55ea\u5659\u6eb1\u6a8e\u8793\u887e","qing":"\u9752\u8f7b\u6c22\u503e\u537f\u6e05\u64ce\u6674\u6c30\u60c5\u9877\u8bf7\u5e86\u5029\u82d8\u570a\u6aa0\u78ec\u873b\u7f44\u7b90\u8b26\u9cad\u9ee5","qiong":"\u743c\u7a77\u909b\u8315\u7a79\u7b47\u928e","qiu":"\u79cb\u4e18\u90b1\u7403\u6c42\u56da\u914b\u6cc5\u4fc5\u6c3d\u5def\u827d\u72b0\u6e6b\u9011\u9052\u6978\u8d47\u9e20\u866c\u86af\u8764\u88d8\u7cd7\u9cc5\u9f3d","qu":"\u8d8b\u533a\u86c6\u66f2\u8eaf\u5c48\u9a71\u6e20\u53d6\u5a36\u9f8b\u8da3\u53bb\u8bce\u52ac\u8556\u8627\u5c96\u8862\u9612\u74a9\u89d1\u6c0d\u795b\u78f2\u766f\u86d0\u883c\u9eb4\u77bf\u9ee2","quan":"\u5708\u98a7\u6743\u919b\u6cc9\u5168\u75ca\u62f3\u72ac\u5238\u529d\u8be0\u8343\u737e\u609b\u7efb\u8f81\u754e\u94e8\u8737\u7b4c\u9b08","que":"\u7f3a\u7094\u7638\u5374\u9e4a\u69b7\u786e\u96c0\u9619\u60ab","qun":"\u88d9\u7fa4\u9021","ran":"\u7136\u71c3\u5189\u67d3\u82d2\u9aef","rang":"\u74e4\u58e4\u6518\u56b7\u8ba9\u79b3\u7a70","rao":"\u9976\u6270\u7ed5\u835b\u5a06\u6861","ruo":"\u60f9\u82e5\u5f31","re":"\u70ed\u504c","ren":"\u58ec\u4ec1\u4eba\u5fcd\u97e7\u4efb\u8ba4\u5203\u598a\u7eab\u4ede\u834f\u845a\u996a\u8f6b\u7a14\u887d","reng":"\u6254\u4ecd","ri":"\u65e5","rong":"\u620e\u8338\u84c9\u8363\u878d\u7194\u6eb6\u5bb9\u7ed2\u5197\u5d58\u72e8\u7f1b\u6995\u877e","rou":"\u63c9\u67d4\u8089\u7cc5\u8e42\u97a3","ru":"\u8339\u8815\u5112\u5b7a\u5982\u8fb1\u4e73\u6c5d\u5165\u8925\u84d0\u85b7\u5685\u6d33\u6ebd\u6fe1\u94f7\u8966\u98a5","ruan":"\u8f6f\u962e\u670a","rui":"\u854a\u745e\u9510\u82ae\u8564\u777f\u868b","run":"\u95f0\u6da6","sa":"\u6492\u6d12\u8428\u5345\u4ee8\u6332\u98d2","sai":"\u816e\u9cc3\u585e\u8d5b\u567b","san":"\u4e09\u53c1\u4f1e\u6563\u5f61\u9993\u6c35\u6bf5\u7cc1\u9730","sang":"\u6851\u55d3\u4e27\u6421\u78c9\u98a1","sao":"\u6414\u9a9a\u626b\u5ac2\u57fd\u81ca\u7619\u9ccb","se":"\u745f\u8272\u6da9\u556c\u94e9\u94ef\u7a51","sen":"\u68ee","seng":"\u50e7","sha":"\u838e\u7802\u6740\u5239\u6c99\u7eb1\u50bb\u5565\u715e\u810e\u6b43\u75e7\u88df\u970e\u9ca8","shai":"\u7b5b\u6652\u917e","shan":"\u73ca\u82eb\u6749\u5c71\u5220\u717d\u886b\u95ea\u9655\u64c5\u8d61\u81b3\u5584\u6c55\u6247\u7f2e\u5261\u8baa\u912f\u57cf\u829f\u6f78\u59d7\u9a9f\u81bb\u9490\u759d\u87ee\u8222\u8dda\u9cdd","shang":"\u5892\u4f24\u5546\u8d4f\u664c\u4e0a\u5c1a\u88f3\u57a7\u7ef1\u6b87\u71b5\u89de","shao":"\u68a2\u634e\u7a0d\u70e7\u828d\u52fa\u97f6\u5c11\u54e8\u90b5\u7ecd\u52ad\u82d5\u6f72\u86f8\u7b24\u7b72\u8244","she":"\u5962\u8d4a\u86c7\u820c\u820d\u8d66\u6444\u5c04\u6151\u6d89\u793e\u8bbe\u538d\u4f58\u731e\u7572\u9e9d","shen":"\u7837\u7533\u547b\u4f38\u8eab\u6df1\u5a20\u7ec5\u795e\u6c88\u5ba1\u5a76\u751a\u80be\u614e\u6e17\u8bdc\u8c02\u5432\u54c2\u6e16\u6939\u77e7\u8703","sheng":"\u58f0\u751f\u7525\u7272\u5347\u7ef3\u7701\u76db\u5269\u80dc\u5723\u4e1e\u6e11\u5ab5\u771a\u7b19","shi":"\u5e08\u5931\u72ee\u65bd\u6e7f\u8bd7\u5c38\u8671\u5341\u77f3\u62fe\u65f6\u4ec0\u98df\u8680\u5b9e\u8bc6\u53f2\u77e2\u4f7f\u5c4e\u9a76\u59cb\u5f0f\u793a\u58eb\u4e16\u67ff\u4e8b\u62ed\u8a93\u901d\u52bf\u662f\u55dc\u566c\u9002\u4ed5\u4f8d\u91ca\u9970\u6c0f\u5e02\u6043\u5ba4\u89c6\u8bd5\u8c25\u57d8\u83b3\u84cd\u5f11\u5511\u9963\u8f7c\u8006\u8d33\u70bb\u793b\u94c8\u94ca\u87ab\u8210\u7b6e\u8c55\u9ca5\u9cba","shou":"\u6536\u624b\u9996\u5b88\u5bff\u6388\u552e\u53d7\u7626\u517d\u624c\u72e9\u7ef6\u824f","shu":"\u852c\u67a2\u68b3\u6b8a\u6292\u8f93\u53d4\u8212\u6dd1\u758f\u4e66\u8d4e\u5b70\u719f\u85af\u6691\u66d9\u7f72\u8700\u9ecd\u9f20\u5c5e\u672f\u8ff0\u6811\u675f\u620d\u7ad6\u5885\u5eb6\u6570\u6f31\u6055\u500f\u587e\u83fd\u5fc4\u6cad\u6d91\u6f8d\u59dd\u7ebe\u6bf9\u8167\u6bb3\u956f\u79eb\u9e6c","shua":"\u5237\u800d\u5530\u6dae","shuai":"\u6454\u8870\u7529\u5e05\u87c0","shuan":"\u6813\u62f4\u95e9","shuang":"\u971c\u53cc\u723d\u5b40","shui":"\u8c01\u6c34\u7761\u7a0e","shun":"\u542e\u77ac\u987a\u821c\u6042","shuo":"\u8bf4\u7855\u6714\u70c1\u84b4\u6420\u55cd\u6fef\u5981\u69ca\u94c4","si":"\u65af\u6495\u5636\u601d\u79c1\u53f8\u4e1d\u6b7b\u8086\u5bfa\u55e3\u56db\u4f3a\u4f3c\u9972\u5df3\u53ae\u4fdf\u5155\u83e5\u549d\u6c5c\u6cd7\u6f8c\u59d2\u9a77\u7f0c\u7940\u7960\u9536\u9e36\u801c\u86f3\u7b25","song":"\u677e\u8038\u6002\u9882\u9001\u5b8b\u8bbc\u8bf5\u51c7\u83d8\u5d27\u5d69\u5fea\u609a\u6dde\u7ae6","sou":"\u641c\u8258\u64de\u55fd\u53df\u55d6\u55fe\u998a\u6eb2\u98d5\u778d\u953c\u878b","su":"\u82cf\u9165\u4fd7\u7d20\u901f\u7c9f\u50f3\u5851\u6eaf\u5bbf\u8bc9\u8083\u5919\u8c21\u850c\u55c9\u612b\u7c0c\u89eb\u7a23","suan":"\u9178\u849c\u7b97","sui":"\u867d\u968b\u968f\u7ee5\u9ad3\u788e\u5c81\u7a57\u9042\u96a7\u795f\u84d1\u51ab\u8c07\u6fc9\u9083\u71e7\u772d\u7762","sun":"\u5b59\u635f\u7b0b\u836a\u72f2\u98e7\u69ab\u8de3\u96bc","suo":"\u68ad\u5506\u7f29\u7410\u7d22\u9501\u6240\u5522\u55e6\u5a11\u686b\u7743\u7fa7","ta":"\u584c\u4ed6\u5b83\u5979\u5854\u736d\u631e\u8e4b\u8e0f\u95fc\u6ebb\u9062\u69bb\u6c93","tai":"\u80ce\u82d4\u62ac\u53f0\u6cf0\u915e\u592a\u6001\u6c70\u90b0\u85b9\u80bd\u70b1\u949b\u8dc6\u9c90","tan":"\u574d\u644a\u8d2a\u762b\u6ee9\u575b\u6a80\u75f0\u6f6d\u8c2d\u8c08\u5766\u6bef\u8892\u78b3\u63a2\u53f9\u70ad\u90ef\u8548\u6619\u94bd\u952c\u8983","tang":"\u6c64\u5858\u642a\u5802\u68e0\u819b\u5510\u7cd6\u50a5\u9967\u6e8f\u746d\u94f4\u9557\u8025\u8797\u87b3\u7fb0\u91a3","thang":"\u5018\u8eba\u6dcc","theng":"\u8d9f\u70eb","tao":"\u638f\u6d9b\u6ed4\u7ee6\u8404\u6843\u9003\u6dd8\u9676\u8ba8\u5957\u6311\u9f17\u5555\u97ec\u9955","te":"\u7279","teng":"\u85e4\u817e\u75bc\u8a8a\u6ed5","ti":"\u68af\u5254\u8e22\u9511\u63d0\u9898\u8e44\u557c\u4f53\u66ff\u568f\u60d5\u6d95\u5243\u5c49\u8351\u608c\u9016\u7ee8\u7f07\u9e48\u88fc\u918d","tian":"\u5929\u6dfb\u586b\u7530\u751c\u606c\u8214\u8146\u63ad\u5fdd\u9617\u6b84\u754b\u94bf\u86ba","tiao":"\u6761\u8fe2\u773a\u8df3\u4f7b\u7967\u94eb\u7a95\u9f86\u9ca6","tie":"\u8d34\u94c1\u5e16\u841c\u992e","ting":"\u5385\u542c\u70c3\u6c40\u5ef7\u505c\u4ead\u5ead\u633a\u8247\u839b\u8476\u5a77\u6883\u8713\u9706","tong":"\u901a\u6850\u916e\u77b3\u540c\u94dc\u5f64\u7ae5\u6876\u6345\u7b52\u7edf\u75db\u4f5f\u50ee\u4edd\u833c\u55f5\u6078\u6f7c\u783c","tou":"\u5077\u6295\u5934\u900f\u4ea0","tu":"\u51f8\u79c3\u7a81\u56fe\u5f92\u9014\u6d82\u5c60\u571f\u5410\u5154\u580d\u837c\u83df\u948d\u9174","tuan":"\u6e4d\u56e2\u7583","tui":"\u63a8\u9893\u817f\u8715\u892a\u9000\u5fd2\u717a","tun":"\u541e\u5c6f\u81c0\u9968\u66be\u8c5a\u7a80","tuo":"\u62d6\u6258\u8131\u9e35\u9640\u9a6e\u9a7c\u692d\u59a5\u62d3\u553e\u4e47\u4f57\u5768\u5eb9\u6cb1\u67dd\u7823\u7ba8\u8204\u8dce\u9f0d","wa":"\u6316\u54c7\u86d9\u6d3c\u5a03\u74e6\u889c\u4f64\u5a32\u817d","wai":"\u6b6a\u5916","wan":"\u8c4c\u5f2f\u6e7e\u73a9\u987d\u4e38\u70f7\u5b8c\u7897\u633d\u665a\u7696\u60cb\u5b9b\u5a49\u4e07\u8155\u525c\u8284\u82cb\u83c0\u7ea8\u7efe\u742c\u8118\u7579\u873f\u7ba2","wang":"\u6c6a\u738b\u4ea1\u6789\u7f51\u5f80\u65fa\u671b\u5fd8\u5984\u7f54\u5c22\u60d8\u8f8b\u9b4d","wei":"\u5a01\u5dcd\u5fae\u5371\u97e6\u8fdd\u6845\u56f4\u552f\u60df\u4e3a\u6f4d\u7ef4\u82c7\u840e\u59d4\u4f1f\u4f2a\u5c3e\u7eac\u672a\u851a\u5473\u754f\u80c3\u5582\u9b4f\u4f4d\u6e2d\u8c13\u5c09\u6170\u536b\u502d\u504e\u8bff\u9688\u8473\u8587\u5e0f\u5e37\u5d34\u5d6c\u7325\u732c\u95f1\u6ca9\u6d27\u6da0\u9036\u5a13\u73ae\u97ea\u8ece\u709c\u7168\u71a8\u75ff\u8249\u9c94","wen":"\u761f\u6e29\u868a\u6587\u95fb\u7eb9\u543b\u7a33\u7d0a\u95ee\u520e\u6120\u960c\u6c76\u74ba\u97eb\u6b81\u96ef","weng":"\u55e1\u7fc1\u74ee\u84ca\u8579","wo":"\u631d\u8717\u6da1\u7a9d\u6211\u65a1\u5367\u63e1\u6c83\u83b4\u5e44\u6e25\u674c\u809f\u9f8c","wu":"\u5deb\u545c\u94a8\u4e4c\u6c61\u8bec\u5c4b\u65e0\u829c\u68a7\u543e\u5434\u6bcb\u6b66\u4e94\u6342\u5348\u821e\u4f0d\u4fae\u575e\u620a\u96fe\u6664\u7269\u52ff\u52a1\u609f\u8bef\u5140\u4ef5\u9622\u90ac\u572c\u82b4\u5e91\u6003\u5fe4\u6d6f\u5be4\u8fd5\u59a9\u9a9b\u727e\u7110\u9e49\u9e5c\u8708\u92c8\u9f2f","xi":"\u6614\u7199\u6790\u897f\u7852\u77fd\u6670\u563b\u5438\u9521\u727a\u7a00\u606f\u5e0c\u6089\u819d\u5915\u60dc\u7184\u70ef\u6eaa\u6c50\u7280\u6a84\u88ad\u5e2d\u4e60\u5ab3\u559c\u94e3\u6d17\u7cfb\u9699\u620f\u7ec6\u50d6\u516e\u96b0\u90d7\u831c\u8478\u84f0\u595a\u550f\u5f99\u9969\u960b\u6d60\u6dc5\u5c63\u5b09\u73ba\u6a28\u66e6\u89cb\u6b37\u71b9\u798a\u79a7\u94b8\u7699\u7a78\u8725\u87cb\u823e\u7fb2\u7c9e\u7fd5\u91af\u9f37","xia":"\u778e\u867e\u5323\u971e\u8f96\u6687\u5ce1\u4fa0\u72ed\u4e0b\u53a6\u590f\u5413\u6380\u846d\u55c4\u72ce\u9050\u7455\u7856\u7615\u7f45\u9ee0","xian":"\u9528\u5148\u4ed9\u9c9c\u7ea4\u54b8\u8d24\u8854\u8237\u95f2\u6d8e\u5f26\u5acc\u663e\u9669\u73b0\u732e\u53bf\u817a\u9985\u7fa1\u5baa\u9677\u9650\u7ebf\u51bc\u85d3\u5c98\u7303\u66b9\u5a34\u6c19\u7946\u9e47\u75eb\u86ac\u7b45\u7c7c\u9170\u8df9","xiang":"\u76f8\u53a2\u9576\u9999\u7bb1\u8944\u6e58\u4e61\u7fd4\u7965\u8be6\u60f3\u54cd\u4eab\u9879\u5df7\u6a61\u50cf\u5411\u8c61\u8297\u8459\u9977\u5ea0\u9aa7\u7f03\u87d3\u9c9e\u98e8","xiao":"\u8427\u785d\u9704\u524a\u54ee\u56a3\u9500\u6d88\u5bb5\u6dc6\u6653\u5c0f\u5b5d\u6821\u8096\u5578\u7b11\u6548\u54d3\u54bb\u5d24\u6f47\u900d\u9a81\u7ee1\u67ad\u67b5\u7b71\u7bab\u9b48","xie":"\u6954\u4e9b\u6b47\u874e\u978b\u534f\u631f\u643a\u90aa\u659c\u80c1\u8c10\u5199\u68b0\u5378\u87f9\u61c8\u6cc4\u6cfb\u8c22\u5c51\u5055\u4eb5\u52f0\u71ee\u85a4\u64b7\u5ee8\u7023\u9082\u7ec1\u7f2c\u69ad\u698d\u6b59\u8e9e","xin":"\u85aa\u82af\u950c\u6b23\u8f9b\u65b0\u5ffb\u5fc3\u4fe1\u8845\u56df\u99a8\u8398\u6b46\u94fd\u946b","xing":"\u661f\u8165\u7329\u60fa\u5174\u5211\u578b\u5f62\u90a2\u884c\u9192\u5e78\u674f\u6027\u59d3\u9649\u8347\u8365\u64e4\u60bb\u784e","xiong":"\u5144\u51f6\u80f8\u5308\u6c79\u96c4\u718a\u828e","xiu":"\u4f11\u4fee\u7f9e\u673d\u55c5\u9508\u79c0\u8896\u7ee3\u83a0\u5cab\u9990\u5ea5\u9e3a\u8c85\u9af9","xu":"\u589f\u620c\u9700\u865a\u5618\u987b\u5f90\u8bb8\u84c4\u9157\u53d9\u65ed\u5e8f\u755c\u6064\u7d6e\u5a7f\u7eea\u7eed\u8bb4\u8be9\u5729\u84ff\u6035\u6d2b\u6e86\u987c\u6829\u7166\u7809\u76f1\u80e5\u7cc8\u9191","xuan":"\u8f69\u55a7\u5ba3\u60ac\u65cb\u7384\u9009\u7663\u7729\u7eda\u5107\u8c16\u8431\u63ce\u9994\u6ceb\u6d35\u6e32\u6f29\u7487\u6966\u6684\u70ab\u714a\u78b9\u94c9\u955f\u75c3","xue":"\u9774\u859b\u5b66\u7a74\u96ea\u8840\u5671\u6cf6\u9cd5","xun":"\u52cb\u718f\u5faa\u65ec\u8be2\u5bfb\u9a6f\u5de1\u6b89\u6c5b\u8bad\u8baf\u900a\u8fc5\u5dfd\u57d9\u8340\u85b0\u5ccb\u5f87\u6d54\u66db\u7aa8\u91ba\u9c9f","ya":"\u538b\u62bc\u9e26\u9e2d\u5440\u4e2b\u82bd\u7259\u869c\u5d16\u8859\u6daf\u96c5\u54d1\u4e9a\u8bb6\u4f22\u63e0\u5416\u5c88\u8fd3\u5a05\u740a\u6860\u6c29\u7811\u775a\u75d6","yan":"\u7109\u54bd\u9609\u70df\u6df9\u76d0\u4e25\u7814\u8712\u5ca9\u5ef6\u8a00\u989c\u960e\u708e\u6cbf\u5944\u63a9\u773c\u884d\u6f14\u8273\u5830\u71d5\u538c\u781a\u96c1\u5501\u5f66\u7130\u5bb4\u8c1a\u9a8c\u53a3\u9765\u8d5d\u4fe8\u5043\u5156\u8ba0\u8c33\u90fe\u9122\u82ab\u83f8\u5d26\u6079\u95eb\u960f\u6d07\u6e6e\u6edf\u598d\u5ae3\u7430\u664f\u80ed\u814c\u7131\u7f68\u7b75\u917d\u9b47\u990d\u9f39","yang":"\u6b83\u592e\u9e2f\u79e7\u6768\u626c\u4f6f\u75a1\u7f8a\u6d0b\u9633\u6c27\u4ef0\u75d2\u517b\u6837\u6f3e\u5f89\u600f\u6cf1\u7080\u70ca\u6059\u86d8\u9785","yao":"\u9080\u8170\u5996\u7476\u6447\u5c27\u9065\u7a91\u8c23\u59da\u54ac\u8200\u836f\u8981\u8000\u592d\u723b\u5406\u5d3e\u5fad\u7039\u5e7a\u73e7\u6773\u66dc\u80b4\u9e5e\u7a88\u7e47\u9cd0","ye":"\u6930\u564e\u8036\u7237\u91ce\u51b6\u4e5f\u9875\u6396\u4e1a\u53f6\u66f3\u814b\u591c\u6db2\u8c12\u90ba\u63f6\u9980\u6654\u70e8\u94d8","yi":"\u4e00\u58f9\u533b\u63d6\u94f1\u4f9d\u4f0a\u8863\u9890\u5937\u9057\u79fb\u4eea\u80f0\u7591\u6c82\u5b9c\u59e8\u5f5d\u6905\u8681\u501a\u5df2\u4e59\u77e3\u4ee5\u827a\u6291\u6613\u9091\u5c79\u4ebf\u5f79\u81c6\u9038\u8084\u75ab\u4ea6\u88d4\u610f\u6bc5\u5fc6\u4e49\u76ca\u6ea2\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ffc\u7fcc\u7ece\u5208\u5293\u4f7e\u8bd2\u572a\u572f\u57f8\u61ff\u82e1\u858f\u5f08\u5955\u6339\u5f0b\u5453\u54a6\u54bf\u566b\u5cc4\u5db7\u7317\u9974\u603f\u6021\u6092\u6f2a\u8fe4\u9a7f\u7f22\u6baa\u8d3b\u65d6\u71a0\u9487\u9552\u9571\u75cd\u7617\u7654\u7fca\u8864\u8734\u8223\u7fbf\u7ff3\u914f\u9edf","yin":"\u8335\u836b\u56e0\u6bb7\u97f3\u9634\u59fb\u541f\u94f6\u6deb\u5bc5\u996e\u5c39\u5f15\u9690\u5370\u80e4\u911e\u5819\u831a\u5591\u72fa\u5924\u6c24\u94df\u763e\u8693\u972a\u9f88","ying":"\u82f1\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8fce\u8d62\u76c8\u5f71\u9896\u786c\u6620\u5b34\u90e2\u8314\u83ba\u8426\u6484\u5624\u81ba\u6ee2\u6f46\u701b\u745b\u748e\u6979\u9e66\u763f\u988d\u7f42","yo":"\u54df\u5537","yong":"\u62e5\u4f63\u81c3\u75c8\u5eb8\u96cd\u8e0a\u86f9\u548f\u6cf3\u6d8c\u6c38\u607f\u52c7\u7528\u4fd1\u58c5\u5889\u6175\u9095\u955b\u752c\u9cd9\u9954","you":"\u5e7d\u4f18\u60a0\u5fe7\u5c24\u7531\u90ae\u94c0\u72b9\u6cb9\u6e38\u9149\u6709\u53cb\u53f3\u4f51\u91c9\u8bf1\u53c8\u5e7c\u5363\u6538\u4f91\u83b8\u5466\u56ff\u5ba5\u67da\u7337\u7256\u94d5\u75a3\u8763\u9c7f\u9edd\u9f2c","yu":"\u8fc2\u6de4\u4e8e\u76c2\u6986\u865e\u611a\u8206\u4f59\u4fde\u903e\u9c7c\u6109\u6e1d\u6e14\u9685\u4e88\u5a31\u96e8\u4e0e\u5c7f\u79b9\u5b87\u8bed\u7fbd\u7389\u57df\u828b\u90c1\u5401\u9047\u55bb\u5cea\u5fa1\u6108\u6b32\u72f1\u80b2\u8a89\u6d74\u5bd3\u88d5\u9884\u8c6b\u9a6d\u79ba\u6bd3\u4f1b\u4fe3\u8c00\u8c15\u8438\u84e3\u63c4\u5581\u5704\u5709\u5d5b\u72f3\u996b\u5ebe\u9608\u59aa\u59a4\u7ea1\u745c\u6631\u89ce\u8174\u6b24\u65bc\u715c\u71e0\u807f\u94b0\u9e46\u7610\u7600\u7ab3\u8753\u7afd\u8201\u96e9\u9f89","yuan":"\u9e33\u6e0a\u51a4\u5143\u57a3\u8881\u539f\u63f4\u8f95\u56ed\u5458\u5706\u733f\u6e90\u7f18\u8fdc\u82d1\u613f\u6028\u9662\u586c\u6c85\u5a9b\u7457\u6a7c\u7230\u7722\u9e22\u8788\u9f0b","yue":"\u66f0\u7ea6\u8d8a\u8dc3\u94a5\u5cb3\u7ca4\u6708\u60a6\u9605\u9fa0\u6a3e\u5216\u94ba","yun":"\u8018\u4e91\u90e7\u5300\u9668\u5141\u8fd0\u8574\u915d\u6655\u97f5\u5b55\u90d3\u82b8\u72c1\u607d\u7ead\u6b92\u6600\u6c32","za":"\u531d\u7838\u6742\u62f6\u5482","zai":"\u683d\u54c9\u707e\u5bb0\u8f7d\u518d\u5728\u54b1\u5d3d\u753e","zan":"\u6512\u6682\u8d5e\u74d2\u661d\u7c2a\u7ccc\u8db1\u933e","zang":"\u8d43\u810f\u846c\u5958\u6215\u81e7","zao":"\u906d\u7cdf\u51ff\u85fb\u67a3\u65e9\u6fa1\u86a4\u8e81\u566a\u9020\u7682\u7076\u71e5\u5523\u7f2b","ze":"\u8d23\u62e9\u5219\u6cfd\u4ec4\u8d5c\u5567\u8fee\u6603\u7b2e\u7ba6\u8234","zei":"\u8d3c","zen":"\u600e\u8c2e","zeng":"\u589e\u618e\u66fe\u8d60\u7f2f\u7511\u7f7e\u9503","zha":"\u624e\u55b3\u6e23\u672d\u8f67\u94e1\u95f8\u7728\u6805\u69a8\u548b\u4e4d\u70b8\u8bc8\u63f8\u5412\u54a4\u54f3\u600d\u781f\u75c4\u86b1\u9f44","zhai":"\u6458\u658b\u5b85\u7a84\u503a\u5be8\u7826","zhan":"\u77bb\u6be1\u8a79\u7c98\u6cbe\u76cf\u65a9\u8f97\u5d2d\u5c55\u8638\u6808\u5360\u6218\u7ad9\u6e5b\u7efd\u8c35\u640c\u65c3","zhang":"\u6a1f\u7ae0\u5f70\u6f33\u5f20\u638c\u6da8\u6756\u4e08\u5e10\u8d26\u4ed7\u80c0\u7634\u969c\u4ec9\u9123\u5e5b\u5d82\u7350\u5adc\u748b\u87d1","zhao":"\u62db\u662d\u627e\u6cbc\u8d75\u7167\u7f69\u5146\u8087\u53ec\u722a\u8bcf\u68f9\u948a\u7b0a","zhe":"\u906e\u6298\u54f2\u86f0\u8f99\u8005\u9517\u8517\u8fd9\u6d59\u8c2a\u966c\u67d8\u8f84\u78d4\u9e67\u891a\u8707\u8d6d","zhen":"\u73cd\u659f\u771f\u7504\u7827\u81fb\u8d1e\u9488\u4fa6\u6795\u75b9\u8bca\u9707\u632f\u9547\u9635\u7f1c\u6862\u699b\u8f78\u8d48\u80d7\u6715\u796f\u755b\u9e29","zheng":"\u84b8\u6323\u7741\u5f81\u72f0\u4e89\u6014\u6574\u62ef\u6b63\u653f\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d","zhi":"\u829d\u679d\u652f\u5431\u8718\u77e5\u80a2\u8102\u6c41\u4e4b\u7ec7\u804c\u76f4\u690d\u6b96\u6267\u503c\u4f84\u5740\u6307\u6b62\u8dbe\u53ea\u65e8\u7eb8\u5fd7\u631a\u63b7\u81f3\u81f4\u7f6e\u5e1c\u5cd9\u5236\u667a\u79e9\u7a1a\u8d28\u7099\u75d4\u6ede\u6cbb\u7a92\u536e\u965f\u90c5\u57f4\u82b7\u646d\u5e19\u5fee\u5f58\u54ab\u9a98\u6809\u67b3\u6800\u684e\u8f75\u8f7e\u6534\u8d3d\u81a3\u7949\u7957\u9ef9\u96c9\u9e37\u75e3\u86ed\u7d77\u916f\u8dd6\u8e2c\u8e2f\u8c78\u89ef","zhong":"\u4e2d\u76c5\u5fe0\u949f\u8877\u7ec8\u79cd\u80bf\u91cd\u4ef2\u4f17\u51a2\u953a\u87bd\u8202\u822f\u8e35","zhou":"\u821f\u5468\u5dde\u6d32\u8bcc\u7ca5\u8f74\u8098\u5e1a\u5492\u76b1\u5b99\u663c\u9aa4\u5544\u7740\u501c\u8bf9\u836e\u9b3b\u7ea3\u80c4\u78a1\u7c40\u8233\u914e\u9cb7","zhu":"\u73e0\u682a\u86db\u6731\u732a\u8bf8\u8bdb\u9010\u7af9\u70db\u716e\u62c4\u77a9\u5631\u4e3b\u8457\u67f1\u52a9\u86c0\u8d2e\u94f8\u7b51\u4f4f\u6ce8\u795d\u9a7b\u4f2b\u4f8f\u90be\u82ce\u8331\u6d19\u6e1a\u6f74\u9a7a\u677c\u69e0\u6a65\u70b7\u94e2\u75b0\u7603\u86b0\u7afa\u7bb8\u7fe5\u8e85\u9e88","zhua":"\u6293","zhuai":"\u62fd","zhuan":"\u4e13\u7816\u8f6c\u64b0\u8d5a\u7bc6\u629f\u556d\u989b","zhuang":"\u6869\u5e84\u88c5\u5986\u649e\u58ee\u72b6\u4e2c","zhui":"\u690e\u9525\u8ffd\u8d58\u5760\u7f00\u8411\u9a93\u7f12","zhun":"\u8c06\u51c6","zhuo":"\u6349\u62d9\u5353\u684c\u7422\u8301\u914c\u707c\u6d4a\u502c\u8bfc\u5ef4\u855e\u64e2\u555c\u6d5e\u6dbf\u6753\u712f\u799a\u65ab","zi":"\u5179\u54a8\u8d44\u59ff\u6ecb\u6dc4\u5b5c\u7d2b\u4ed4\u7c7d\u6ed3\u5b50\u81ea\u6e0d\u5b57\u8c18\u5d6b\u59ca\u5b73\u7f01\u6893\u8f8e\u8d40\u6063\u7726\u9531\u79ed\u8014\u7b2b\u7ca2\u89dc\u8a3e\u9cbb\u9aed","zong":"\u9b03\u68d5\u8e2a\u5b97\u7efc\u603b\u7eb5\u8159\u7cbd","zou":"\u90b9\u8d70\u594f\u63cd\u9139\u9cb0","zu":"\u79df\u8db3\u5352\u65cf\u7956\u8bc5\u963b\u7ec4\u4fce\u83f9\u5550\u5f82\u9a75\u8e74","zuan":"\u94bb\u7e82\u6525\u7f35","zui":"\u5634\u9189\u6700\u7f6a","zun":"\u5c0a\u9075\u6499\u6a3d\u9cdf","zuo":"\u6628\u5de6\u4f50\u67de\u505a\u4f5c\u5750\u5ea7\u961d\u963c\u80d9\u795a\u9162","cou":"\u85ae\u6971\u8f8f\u8160","nang":"\u652e\u54dd\u56d4\u9995\u66e9","o":"\u5594","dia":"\u55f2","chuai":"\u562c\u81aa\u8e39","cen":"\u5c91\u6d94","diu":"\u94e5","nou":"\u8028","fou":"\u7f36","bia":"\u9adf"},
    	},
    
    
    
    	/**
    	 * @author Rui.Zhang
    	 * @class 数据校验类
    	 * @description 提供一些数据校验函数
    	 */
    	validation : {
    
    	
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 通过正则判断数据是否为小数
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是小数
    		 **/
    		isDecimal : function (str_data) {
    			str_data = str_data || String(this);
    
    		    var reg =  /^[0-9]+\.[0-9]+$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 通过正则来判断数据是否为整数
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是整数
    		 **/
    		isInteger : function (str_data) {
    			str_data = str_data || String(this);
    		    var reg =  /^[0-9]+$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 通过正则来判断数据是否为数字(包括小数)
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是数字
    		 **/
    		isNumber : function (str_data) {
    			str_data = str_data || String(this);
    		    var reg =  /^[0-9]+(\.[0-9]+)?$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否为QQ
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是QQ
    		 **/
    		isQQ : function (str_data) {
    			str_data = str_data || String(this);
    		    var reg =  /^[1-9][0-9]{4,10}$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否全为英文, 即全为字母
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:全为字母
    		 **/
    		isEnglish : function (str_data) {
    			str_data = str_data || String(this);
    		    var reg =  /^[a-zA-Z]+$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否为IPV4地址
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是IPV4地址
    		 **/
    		isIpV4 : function (str_data) {
    			str_data = str_data || String(this);
    		    var reg =  /^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/;
    		    return reg.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description   判断数据是否为网址(URL),请传入满足http标准协议的链接
    		 * @param {String} str_data 待校验的数据
    		 * @param {Boolean} flag 是否使用严格模式,默认为false
    		 * @returns {Boolean}, true:是网址
    		 **/
    		isUrl : function (str_data, flag) {
    			str_data = str_data || String(this);
    			flag = flag || false;
    
    		    var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i
    		    var regular2 = /^((https?|ftp):\/\/)(www\.)?\S{0,30}\.\S+$/i
    
    		    if (regular2.test(str_data) && !flag) {
    		        return true;
    		    } else if(regular.test(str_data) && flag) {
    		    	return true;
    		    } else {
    		        return false;
    		    }
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否为邮箱
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是邮箱
    		 **/
    		isEmail : function (str_data) {
    			str_data = str_data || String(this);
    		    return  /^([a-zA-Z0-9_-]{1,16})@([a-zA-Z0-9]{1,9})(\.[a-zA-Z0-9]{1,9}){0,3}(\.(?:com|net|org|edu|gov|mil|cn|us)){1,4}$/.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否包含特殊字符, 包含中文标点
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:包含特殊字符, null表示传入参数为null 或者传入参数为空串
    		 **/
    		isContainsSpecialChar : function (str_data) {
    		    if (str_data) {
    		        //英文符号
    		        var containSpecialForEnglish = RegExp(/[(\s)(\`)(\~)(\!)(\@)(\#)(\$)(\%)(\^)(\&)(\*)(\()(\))(\-)(\_)(\+)(\=)(\[)(\])(\{)(\})(\|)(\\)(\;)(\:)(\')(\")(\,)(\.)(\/)(\<)(\>)(\?)(\)]+/);
    		        //中文符号
    		        var containSpecialForChinese = RegExp(/[(\·)(\~)(\!)(\¥)(\%)(\……)(\&)(\*)(\()(\))(\——)(\【)(\】)(\;)(\:)(\”)(\“)(\’)(\,)(\《)(\。)(\》)(\?)(\、)(\‘)(\’)]+/);
    
    		        str_data = str_data || String(this);
    		        return (containSpecialForEnglish.test(str_data) || containSpecialForChinese.test(str_data));
    		    }
    		    return null;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否为手机号
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是手机号
    		 **/
    		isMobile : function (str_data) {
    			str_data = str_data || String(this);
    		    var length = str_data.length;
    		    return length == 11 && /^1\d{10}$/.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否为座机号(固定电话)
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:是座机号
    		 **/
    		isTelephone : function (str_data) {
    			str_data = str_data || String(this);
    		    if (str_data.match(/^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/) == null) {
    		        return false;
    		    } else {
    		        return true;
    		    }
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据是否全为中文
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:全中文
    		 **/
    		isChinese : function (str_data) {
    			str_data = str_data || String(this);
    		    return /^[\u4E00-\u9FA5]*$/.test(str_data);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断是否为统一社会信用代码
    		 * @param {String} str_data 待校验的数据
    		 * @returns {Boolean}, true:社会信用代码正确
    		 **/
    		isCreditCode : function (str_data) {
    			var patrn = /^[0-9A-Z]+$/;
    			//18位校验及大写校验
    			if ((str_data.length != 18) || (patrn.test(str_data) == false)) { 
    				return false;
    			} else { 
    			var Ancode;//统一社会信用代码的每一个值
    			var Ancodevalue;//统一社会信用代码每一个值的权重 
    			var total = 0; 
    			var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子 
    			var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
    			//不用I、O、S、V、Z 
    			for (var i = 0; i < str_data.length - 1; i++) 
    			{
    			Ancode = str_data.substring(i, i + 1); 
    			Ancodevalue = str.indexOf(Ancode); 
    			total = total + Ancodevalue * weightedfactors[i];
    			//权重与加权因子相乘之和 
    			}
    			var logiccheckcode = 31 - total % 31;
    			if (logiccheckcode == 31) {
    			logiccheckcode = 0;
    			}
    			var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
    			var Array_Str = Str.split(',');
    			logiccheckcode = Array_Str[logiccheckcode];
    
    
    			var checkcode = str_data.substring(17, 18);
    			if (logiccheckcode != checkcode) { 
    				return false;
    			}
    				return true;
    			}
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断是否为银行卡号
    		 * @param {String} str_cardNo 待校验的数据
    		 * @returns {Boolean}, true:是银行卡号
    		 **/
    		isBankCard : function (str_cardNo) {
    			str_cardNo = str_cardNo || String(this);
    		    if ("" == str_cardNo.trim() || undefined == str_cardNo) {
    		        return false;
    		    }
    		    var lastNum = str_cardNo.substr(str_cardNo.length - 1, 1);//取出最后一位(与luhm进行比较)
    
    		    var first15Num = str_cardNo.substr(0, str_cardNo.length - 1);//前15或18位
    		    var newArr=new Array();
    		    for(var i=first15Num.length-1;i>-1;i--){    //前15或18位倒序存进数组
    		        newArr.push(first15Num.substr(i,1));
    		    }
    		    var arrJiShu=new Array();  //奇数位*2的积 <9
    		    var arrJiShu2=new Array(); //奇数位*2的积 >9
    
    		    var arrOuShu=new Array();  //偶数位数组
    		    for(var j=0;j<newArr.length;j++){
    		        if((j+1)%2==1){//奇数位
    		            if(parseInt(newArr[j])*2<9)
    		                arrJiShu.push(parseInt(newArr[j])*2);
    		            else
    		                arrJiShu2.push(parseInt(newArr[j])*2);
    		        }
    		        else //偶数位
    		            arrOuShu.push(newArr[j]);
    		    }
    
    		    var jishu_child1=new Array();//奇数位*2 >9 的分割之后的数组个位数
    		    var jishu_child2=new Array();//奇数位*2 >9 的分割之后的数组十位数
    		    for(var h=0;h<arrJiShu2.length;h++){
    		        jishu_child1.push(parseInt(arrJiShu2[h])%10);
    		        jishu_child2.push(parseInt(arrJiShu2[h])/10);
    		    }
    
    		    var sumJiShu=0; //奇数位*2 < 9 的数组之和
    		    var sumOuShu=0; //偶数位数组之和
    		    var sumJiShuChild1=0; //奇数位*2 >9 的分割之后的数组个位数之和
    		    var sumJiShuChild2=0; //奇数位*2 >9 的分割之后的数组十位数之和
    		    var sumTotal=0;
    		    for(var m=0;m<arrJiShu.length;m++){
    		        sumJiShu=sumJiShu+parseInt(arrJiShu[m]);
    		    }
    
    		    for(var n=0;n<arrOuShu.length;n++){
    		        sumOuShu=sumOuShu+parseInt(arrOuShu[n]);
    		    }
    
    		    for(var p=0;p<jishu_child1.length;p++){
    		        sumJiShuChild1=sumJiShuChild1+parseInt(jishu_child1[p]);
    		        sumJiShuChild2=sumJiShuChild2+parseInt(jishu_child2[p]);
    		    }
    		    //计算总和
    		    sumTotal=parseInt(sumJiShu)+parseInt(sumOuShu)+parseInt(sumJiShuChild1)+parseInt(sumJiShuChild2);
    
    		    //计算Luhm值
    		    var k= parseInt(sumTotal)%10==0?10:parseInt(sumTotal)%10;
    		    var luhm= 10-k;
    
    		    if(lastNum==luhm){
    		        return true;
    		    }
    		    else{
    		        return false;
    		    }
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断是否为身份证号码
    		 * @param {String} str_idCard 待校验的数据
    		 * @param {String} [sex] 可选参数,传入时同时校验性别,不传则不校验性别,此值只可能 constant.WOMAN(0) 或者 constant.MAN(1)
    		 * @returns {Boolean}, true:是身份证
    		 **/
    		isIdCard : function (str_idCard, sex) {
    			str_idCard = str_idCard || String(this);
    	        var check = function() {
    	            var factorArr = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
    	            var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");
    	            var varArray = new Array();
    	            var lngProduct = 0;
    	            var intCheckDigit;
    	            var intStrLen = str_idCard.length;
    	            var idNumber = str_idCard;
    	            // initialize
    	            if ((intStrLen != 15) && (intStrLen != 18)) {
    	                return false;
    	            }
    	            // check and set value
    	            for (i = 0; i < intStrLen; i++) {
    	                varArray[i] = idNumber.charAt(i);
    	                if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) {
    	                    return false;
    	                } else if (i < 17) {
    	                    varArray[i] = varArray[i] * factorArr[i];
    	                }
    	            }
    
    	            if (intStrLen == 18) {
    	                //check date
    	                var date8 = idNumber.substring(6, 14);
    
    	                if (!/^[0-9]{8}$/.test(date8)) {
    	                    return false;
    	                }
    	                var year, month, day;
    	                year = date8.substring(0, 4);
    	                month = date8.substring(4, 6);
    	                day = date8.substring(6, 8);
    	                var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    	                if (year < 1700 || year > 2500) return false;
    	                if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29;
    	                if (month < 1 || month > 12) return false;
    	                if (day < 1 || day > iaMonthDays[month - 1]) return false;
    
    	                // calculate the sum of the products
    	                for (i = 0; i < 17; i++) {
    	                    lngProduct = lngProduct + varArray[i];
    	                }
    	                // calculate the check digit
    	                intCheckDigit = parityBit[lngProduct % 11];
    	                // check last digit
    	                if (varArray[17] != intCheckDigit) {
    	                    return false;
    	                }
    	            }
    	            //length is 15
    	            else {
    	                //check date
    	                var date6 = idNumber.substring(6, 12);
    
    	                if (!/^[0-9]{6}$/.test(date6)) {
    	                    return false;
    	                }
    	                var  month, day, year;
    	                year = date6.substring(0, 2);	
    	                month = date6.substring(2, 4);
    	                day = date6.substring(4, 6);
    	                if (!/^\d{2}$/.test(year)) return false;
    	                if (month < 1 || month > 12) return false;
    	                if (day < 1 || day > 31) return false;
    	            }
    	            return true;
    	        }
    	        if(str_idCard && check(str_idCard)) {
    	            if(undefined != sex) {
    	                var sexStr = undefined, tmp = 0;
    	                if (15 == str_idCard.length) {
    	                    tmp = str_idCard.substring(str_idCard.length - 1, str_idCard.length);
    	                } else if (18 == str_idCard.length) {
    	                    tmp = str_idCard.substr(str_idCard.length - 2, 1);
    	                }
    	                if (0 == tmp % 2) {
    	                    sexStr = 0;
    	                } else {
    	                    sexStr = 1;
    	                }
    
    	                if (sex != sexStr) return false;
    	            }
    	            return true;
    	        }
    	        return false;
    	    }
    	},
    
    
    
    	/**
    	 * @author Rui.Zhang
    	 * @class 数据安全类
    	 * @description 提供一些数据安全函数
    	 */
    	security : {
    		/**
    		 * @author Rui.Zhang
    		 * @description 生成uuid, 该函数已扩展至Mtils对象中
    		 * @param {int} [len]   可选,生成uuid的长度,默认36位,建议20位以上
    		 * @param {int} [radix]   可选,生成的进制基数,8是8进制,10是10进制等等
    		 * @returns {String}, 生成的UUID
    		 **/
    		uuid : function (len, radix) {
    		  var uuid;
    		  var chars, i, r, uuid;
    		  chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
    		  uuid = [];
    		  i = void 0;
    		  radix = radix || chars.length;
    		  if (len) {
    		    i = 0;
    		    while (i < len) {
    		      uuid[i] = chars[0 | Math.random() * radix];
    		      i++;
    		    }
    		  } else {
    		    r = void 0;
    		    uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
    		    uuid[14] = '4';
    		    i = 0;
    		    while (i < 36) {
    		      if (!uuid[i]) {
    		        r = 0 | Math.random() * 16;
    		        uuid[i] = chars[i === 19 ? r & 0x3 | 0x8 : r];
    		      }
    		      i++;
    		    }
    		  }
    		  return uuid.join('');
    		},
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  密码强度检测
    		 * @param {String} str_psw  待签名数据
    		 * @returns {Object}, 检测结果,对象应为{"level":"2", "desc" : "检测提示:您的密码强度较差!"}, level为密码强度等级(1-5), desc为默认提示信息
    		 * @example 示例:Mtils.security.passwordStrengthMeter("asd##AS123"), 您可以通过如下方式来得到密码强度等级<br />
    		 * @example Mtils.security.passwordStrengthMeter("asd##AS123").level;
    		 * 也可以如下得到密码的检测信息:<br />
    		 * @example Mtils.security.checkerPasswordStrength("asd##AS123").level;
    		 **/
    		checkerPasswordStrength : function (str_psw) {
    		    var a = /[^ \f\n\r\t\v\da-zA-Z]/, b = /\d/, c = /[a-zA-Z]/;
    		    var d = /^[^ \f\n\r\t\v\da-zA-Z]+$/, e = /^\d+$/, f = /^[a-zA-Z]+$/;
    		    if (6 <= str_psw.length) {
    		        if (a.test(str_psw) && b.test(str_psw) && c.test(str_psw)) {
    		            if (8 > str_psw.length) {
    		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
    		            }
    		            if (12 > str_psw.length) {
    		                return {"level": "3", "desc": "检测提示:您的密码强度良好!"};
    		            }
    		            if (15 > str_psw.length) {
    		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
    		            }
    		            if (15 <= str_psw.length) {
    		                return {"level": "5", "desc": "检测提示:您的密码强度极高!"};
    		            }
    		        }
    		        if (a.test(str_psw) && b.test(str_psw) || a.test(str_psw) && c.test(str_psw) || b.test(str_psw) && c.test(str_psw)) {
    		            if (8 > str_psw.length) {
    		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
    		            }
    		            if (12 > str_psw.length) {
    		                return {"level": "3", "desc": "检测提示:您的密码强度良好!"};
    		            }
    		            if (15 > str_psw.length) {
    		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
    		            }
    		            if (15 <= str_psw.length) {
    		                return {"level": "4", "desc": "检测提示:您的密码强度很高!"};
    		            }
    		        }
    		        if (d.test(str_psw) || e.test(str_psw) || f.test(str_psw)) {
    		            if (8 <= str_psw.length) {
    		                return {"level": "2", "desc": "检测提示:您的密码强度较差!"};
    		            }
    		        }
    		        return {"level": "1", "desc": "检测提示:您的密码过于简单!"};
    		    }
    		    return {"level": "-1", "desc": "检测提示:通常您的密码应该在6位以上!"};
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 生成一个制定长度的随机数
    		 * @param {String} [length]   可选,生成随机数的长度, 默认为5位
    		 * @returns {Integer}, 生成的随机数
    		 **/
    		random : function(length) {
    		        var result, tmp, flag = true;
    		        if(length) {
    		            while(flag) {
    		                tmp = Math.random();
    		                if(tmp > 0.1) {
    		                    result = Math.floor(tmp * Math.pow(10, length));
    		                    flag = false;
    		                    return result;
    		                }
    		            }
    		        } else {
    		            while(flag) {
    		                tmp = Math.random();
    		                if(tmp > 0.1) {
    		                    result = Math.floor(tmp * Math.pow(10, 5));
    		                    flag = false;
    		                    return result;
    		                }
    		            }
    		        }
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 生成一个随机数,并介于最小值和最大值之间(包括最小值和最大值). 如果不传参数, 则返回一个大于0的随机数
    		 * @param {String} [min]         可选,生成随机数的最小值
    		 * @param {Array} [max]          可选,生成随机数的最大值
    		 * @returns {Integer}, 生成的随机数
    		 **/
    		randomBetween : function(min, max) {
    		    var length;
    		    var result;
    		    var tmp;
    		    if(min && max) {
    		        result = min + Math.floor( Math.random() * (max - min +1) ) ;
    		        return result;
    		    }
    		    if(!min && !max) {
    		        result =  Math.floor(Math.random() * 100000);
    		        return result;
    		    }
    
    		    if(min) {
    		        length = 100000;
    		        result = min + Math.floor(Math.random() * length);
    		        return result;
    		    }
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 对给定数据进行 hex_sha256 摘要计算
    		 * @param {String} str_data  待计算的数据
    		 * @returns {String}, hex_sha256 计算结果
    		 **/
    		hex_sha256 : function (str_data) {
    		    /* SHA256 logical functions */
    		    var rotateRight = function (n, x) {
    		        return ((x >>> n) | (x << (32 - n)));
    		    }
    		    var choice = function (x, y, z) {
    		        return ((x & y) ^ (~x & z));
    		    }
    		    var majority = function (x, y, z) {
    		        return ((x & y) ^ (x & z) ^ (y & z));
    		    }
    		    var sha256_Sigma0 = function (x) {
    		        return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
    		    }
    		    var sha256_Sigma1 = function (x) {
    		        return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
    		    }
    		    var sha256_sigma0 = function (x) {
    		        return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
    		    }
    		    var sha256_sigma1 = function (x) {
    		        return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
    		    }
    		    var sha256_expand = function (W, j) {
    		        return (W[j & 0x0f] += sha256_sigma1(W[(j + 14) & 0x0f]) + W[(j + 9) & 0x0f] +
    		        sha256_sigma0(W[(j + 1) & 0x0f]));
    		    }
    
    		    /* Hash constant words K: */
    		    var K256 = new Array(
    		        0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
    		        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
    		        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
    		        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
    		        0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
    		        0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
    		        0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
    		        0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
    		        0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
    		        0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
    		        0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
    		        0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
    		        0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
    		        0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
    		        0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
    		        0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
    		    );
    
    		    /* global arrays */
    		    var ihash, count, buffer;
    		    var sha256_hex_digits = "0123456789abcdef";
    
    		    /* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
    		     overflow) */
    		    var safe_add = function (x, y) {
    		        var lsw = (x & 0xffff) + (y & 0xffff);
    		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    		        return (msw << 16) | (lsw & 0xffff);
    		    }
    
    		    /* Initialise the SHA256 computation */
    		    var sha256_init = function () {
    		        ihash = new Array(8);
    		        count = new Array(2);
    		        buffer = new Array(64);
    		        count[0] = count[1] = 0;
    		        ihash[0] = 0x6a09e667;
    		        ihash[1] = 0xbb67ae85;
    		        ihash[2] = 0x3c6ef372;
    		        ihash[3] = 0xa54ff53a;
    		        ihash[4] = 0x510e527f;
    		        ihash[5] = 0x9b05688c;
    		        ihash[6] = 0x1f83d9ab;
    		        ihash[7] = 0x5be0cd19;
    		    }
    
    		    /* Transform a 512-bit message block */
    		    var sha256_transform = function () {
    		        var a, b, c, d, e, f, g, h, T1, T2;
    		        var W = new Array(16);
    
    		        /* Initialize registers with the previous intermediate value */
    		        a = ihash[0];
    		        b = ihash[1];
    		        c = ihash[2];
    		        d = ihash[3];
    		        e = ihash[4];
    		        f = ihash[5];
    		        g = ihash[6];
    		        h = ihash[7];
    
    		        /* make 32-bit words */
    		        for (var i = 0; i < 16; i++)
    		            W[i] = ((buffer[(i << 2) + 3]) | (buffer[(i << 2) + 2] << 8) | (buffer[(i << 2) + 1]
    		            << 16) | (buffer[i << 2] << 24));
    
    		        for (var j = 0; j < 64; j++) {
    		            T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
    		            if (j < 16) T1 += W[j];
    		            else T1 += sha256_expand(W, j);
    		            T2 = sha256_Sigma0(a) + majority(a, b, c);
    		            h = g;
    		            g = f;
    		            f = e;
    		            e = safe_add(d, T1);
    		            d = c;
    		            c = b;
    		            b = a;
    		            a = safe_add(T1, T2);
    		        }
    
    		        /* Compute the current intermediate hash value */
    		        ihash[0] += a;
    		        ihash[1] += b;
    		        ihash[2] += c;
    		        ihash[3] += d;
    		        ihash[4] += e;
    		        ihash[5] += f;
    		        ihash[6] += g;
    		        ihash[7] += h;
    		    }
    
    		    /* Read the next chunk of data and update the SHA256 computation */
    		    var sha256_update = function (data, inputLen) {
    		        var i, index, curpos = 0;
    		        /* Compute number of bytes mod 64 */
    		        index = ((count[0] >> 3) & 0x3f);
    		        var remainder = (inputLen & 0x3f);
    
    		        /* Update number of bits */
    		        if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
    		        count[1] += (inputLen >> 29);
    
    		        /* Transform as many times as possible */
    		        for (i = 0; i + 63 < inputLen; i += 64) {
    		            for (var j = index; j < 64; j++)
    		                buffer[j] = data.charCodeAt(curpos++);
    		            sha256_transform();
    		            index = 0;
    		        }
    
    		        /* Buffer remaining input */
    		        for (var j = 0; j < remainder; j++)
    		            buffer[j] = data.charCodeAt(curpos++);
    		    }
    
    		    /* Finish the computation by operations such as padding */
    		    var sha256_final = function () {
    		        var index = ((count[0] >> 3) & 0x3f);
    		        buffer[index++] = 0x80;
    		        if (index <= 56) {
    		            for (var i = index; i < 56; i++)
    		                buffer[i] = 0;
    		        } else {
    		            for (var i = index; i < 64; i++)
    		                buffer[i] = 0;
    		            sha256_transform();
    		            for (var i = 0; i < 56; i++)
    		                buffer[i] = 0;
    		        }
    		        buffer[56] = (count[1] >>> 24) & 0xff;
    		        buffer[57] = (count[1] >>> 16) & 0xff;
    		        buffer[58] = (count[1] >>> 8) & 0xff;
    		        buffer[59] = count[1] & 0xff;
    		        buffer[60] = (count[0] >>> 24) & 0xff;
    		        buffer[61] = (count[0] >>> 16) & 0xff;
    		        buffer[62] = (count[0] >>> 8) & 0xff;
    		        buffer[63] = count[0] & 0xff;
    		        sha256_transform();
    		    }
    
    		    /* Get the internal hash as a hex string */
    		    var sha256_encode_hex = function () {
    		        var output = new String();
    		        for (var i = 0; i < 8; i++) {
    		            for (var j = 28; j >= 0; j -= 4)
    		                output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
    		        }
    		        return output;
    		    }
    
    		    sha256_init();
    		    sha256_update(str_data, str_data.length);
    		    sha256_final();
    		    return sha256_encode_hex();
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 对给定数据进行 base64 解码
    		 * @param {String} str_data  待解码的数据
    		 * @returns {String}, base64 解码后的数据
    		 **/
    		base64_decode : function (str_data) {
    		    var output = "";
    		    var chr1, chr2, chr3;
    		    var enc1, enc2, enc3, enc4;
    		    var i = 0;
    		    // private property
    		    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    		    // private method for UTF-8 decoding
    		    var _utf8_decode = function (utftext) {
    		        var string = "";
    		        var i = 0;
    		        var c = c1 = c2 = 0;
    		        while (i < utftext.length) {
    		            c = utftext.charCodeAt(i);
    		            if (c < 128) {
    		                string += String.fromCharCode(c);
    		                i++;
    		            } else if ((c > 191) && (c < 224)) {
    		                c2 = utftext.charCodeAt(i + 1);
    		                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
    		                i += 2;
    		            } else {
    		                c2 = utftext.charCodeAt(i + 1);
    		                c3 = utftext.charCodeAt(i + 2);
    		                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
    		                i += 3;
    		            }
    		        }
    		        return string;
    		    }
    
    		    str_data = str_data.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    		    while (i < str_data.length) {
    		        enc1 = _keyStr.indexOf(str_data.charAt(i++));
    		        enc2 = _keyStr.indexOf(str_data.charAt(i++));
    		        enc3 = _keyStr.indexOf(str_data.charAt(i++));
    		        enc4 = _keyStr.indexOf(str_data.charAt(i++));
    		        chr1 = (enc1 << 2) | (enc2 >> 4);
    		        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
    		        chr3 = ((enc3 & 3) << 6) | enc4;
    		        output = output + String.fromCharCode(chr1);
    		        if (enc3 != 64) {
    		            output = output + String.fromCharCode(chr2);
    		        }
    		        if (enc4 != 64) {
    		            output = output + String.fromCharCode(chr3);
    		        }
    		    }
    		    output = _utf8_decode(output);
    		    return output;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 对给定数据进行 base64 编码
    		 * @param {String} str_data  待编码的数据
    		 * @returns {String}, base64 编码后的数据
    		 **/
    		base64_encode : function (str_data) {
    		    // private property
    		    var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    		    // private method for UTF-8 encoding
    		    var _utf8_encode = function (string) {
    		        string = string.replace(/\r\n/g, "\n");
    		        var utftext = "";
    		        for (var n = 0; n < string.length; n++) {
    		            var c = string.charCodeAt(n);
    		            if (c < 128) {
    		                utftext += String.fromCharCode(c);
    		            } else if ((c > 127) && (c < 2048)) {
    		                utftext += String.fromCharCode((c >> 6) | 192);
    		                utftext += String.fromCharCode((c & 63) | 128);
    		            } else {
    		                utftext += String.fromCharCode((c >> 12) | 224);
    		                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
    		                utftext += String.fromCharCode((c & 63) | 128);
    		            }
    
    		        }
    		        return utftext;
    		    }
    
    
    		    var output = "";
    		    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
    		    var i = 0;
    		    str_data = _utf8_encode(str_data);
    		    while (i < str_data.length) {
    		        chr1 = str_data.charCodeAt(i++);
    		        chr2 = str_data.charCodeAt(i++);
    		        chr3 = str_data.charCodeAt(i++);
    		        enc1 = chr1 >> 2;
    		        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    		        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    		        enc4 = chr3 & 63;
    		        if (isNaN(chr2)) {
    		            enc3 = enc4 = 64;
    		        } else if (isNaN(chr3)) {
    		            enc4 = 64;
    		        }
    		        output = output +
    		        _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
    		        _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
    		    }
    		    return output;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 对给定数据进行 sha1 摘要计算
    		 * @param {String} str_data  待计算的数据
    		 * @returns {String}, sha1 计算结果
    		 **/
    		hex_sha1 : function (str_data) {
    		    var hexcase = 0;
    		    /*   hex   output   format.   0   -   lowercase;   1   -   uppercase                 */
    		    var chrsz = 8;
    		    /*   bits   per   input   character.   8   -   ASCII;   16   -   Unicode             */
    
    		    /*
    		     *   Convert   an   array   of   big-endian   words   to   a   hex   string.
    		     */
    		    var binb2hex = function (binarray) {
    		        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    		        var str = "";
    		        for (var i = 0; i < binarray.length * 4; i++) {
    		            str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
    		        }
    		        return str;
    		    }
    
    		    /*
    		     *   Bitwise   rotate   a   32-bit   number   to   the   left.
    		     */
    		    var rol = function (num, cnt) {
    		        return (num << cnt) | (num >>> (32 - cnt));
    		    }
    
    		    /*
    		     *   Calculate   the   SHA-1   of   an   array   of   big-endian   words,   and   a   bit   length
    		     */
    		    var core_sha1 = function (x, len) {
    		        /*   append   padding   */
    		        x[len >> 5] |= 0x80 << (24 - len % 32);
    		        x[((len + 64 >> 9) << 4) + 15] = len;
    
    		        var w = Array(80);
    		        var a = 1732584193;
    		        var b = -271733879;
    		        var c = -1732584194;
    		        var d = 271733878;
    		        var e = -1009589776;
    
    		        for (var i = 0; i < x.length; i += 16) {
    		            var olda = a;
    		            var oldb = b;
    		            var oldc = c;
    		            var oldd = d;
    		            var olde = e;
    
    		            for (var j = 0; j < 80; j++) {
    		                if (j < 16) w[j] = x[i + j];
    		                else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
    		                var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
    		                e = d;
    		                d = c;
    		                c = rol(b, 30);
    		                b = a;
    		                a = t;
    		            }
    
    		            a = safe_add(a, olda);
    		            b = safe_add(b, oldb);
    		            c = safe_add(c, oldc);
    		            d = safe_add(d, oldd);
    		            e = safe_add(e, olde);
    		        }
    		        return Array(a, b, c, d, e);
    
    		    }
    
    		    /*
    		     *   Convert   an   8-bit   or   16-bit   string   to   an   array   of   big-endian   words
    		     *   In   8-bit   function,   characters   >255   have   their   hi-byte   silently   ignored.
    		     */
    		    var str2binb = function (str) {
    		        var bin = Array();
    		        var mask = (1 << chrsz) - 1;
    		        for (var i = 0; i < str.length * chrsz; i += chrsz)
    		            bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32);
    		        return bin;
    		    }
    
    		    /*
    		     *   Add   integers,   wrapping   at   2^32.   This   uses   16-bit   operations   internally
    		     *   to   work   around   bugs   in   some   JS   interpreters.
    		     */
    		    var safe_add = function (x, y) {
    		        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    		        return (msw << 16) | (lsw & 0xFFFF);
    		    }
    
    		    /*
    		     *   Perform   the   appropriate   triplet   combination   function   for   the   current
    		     *   iteration
    		     */
    		    var sha1_ft = function (t, b, c, d) {
    		        if (t < 20) return (b & c) | ((~b) & d);
    		        if (t < 40) return b ^ c ^ d;
    		        if (t < 60) return (b & c) | (b & d) | (c & d);
    		        return b ^ c ^ d;
    		    }
    
    		    /*
    		     *   Determine   the   appropriate   additive   constant   for   the   current   iteration
    		     */
    		    var sha1_kt = function (t) {
    		        return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
    		    }
    
    		    return binb2hex(core_sha1(str2binb(str_data), str_data.length * chrsz));
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 对给定数据进行 md5 摘要计算
    		 * @param {String} str_data  待计算的数据
    		 * @returns {String}, md5 计算结果
    		 **/
    		hex_md5 : function (str_data) {
    		    var chrsz = 8;
    		    /* bits per input character. 8 - ASCII; 16 - Unicode      */
    		    var hexcase = 0;
    		    /* hex output format. 0 - lowercase; 1 - uppercase        */
    
    		    /*
    		     * Convert an array of little-endian words to a base-64 string
    		     */
    		    var binl2b64 = function (binarray) {
    		        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    		        var str = "";
    		        for (var i = 0; i < binarray.length * 4; i += 3) {
    		            var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16)
    		                | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 )
    		                | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
    		            for (var j = 0; j < 4; j++) {
    		                if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
    		                else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
    		            }
    		        }
    		        return str;
    		    }
    
    		    /*
    		     * These functions implement the four basic operations the algorithm uses.
    		     */
    		    var md5_cmn = function (q, a, b, x, s, t) {
    		        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
    		    }
    		    var md5_ff = function (a, b, c, d, x, s, t) {
    		        return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
    		    }
    		    var md5_gg = function (a, b, c, d, x, s, t) {
    		        return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
    		    }
    		    var md5_hh = function (a, b, c, d, x, s, t) {
    		        return md5_cmn(b ^ c ^ d, a, b, x, s, t);
    		    }
    		    var md5_ii = function (a, b, c, d, x, s, t) {
    		        return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
    		    }
    
    		    /*
    		     * Convert an array of little-endian words to a base-64 string
    		     */
    		    var binl2b64 = function (binarray) {
    		        var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    		        var str = "";
    		        for (var i = 0; i < binarray.length * 4; i += 3) {
    		            var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16)
    		                | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 )
    		                | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
    		            for (var j = 0; j < 4; j++) {
    		                if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
    		                else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
    		            }
    		        }
    		        return str;
    		    }
    
    		    /*
    		     * Calculate the MD5 of an array of little-endian words, and a bit length
    		     */
    		    var core_md5 = function (x, len) {
    		        /* append padding */
    		        x[len >> 5] |= 0x80 << ((len) % 32);
    		        x[(((len + 64) >>> 9) << 4) + 14] = len;
    
    		        var a = 1732584193;
    		        var b = -271733879;
    		        var c = -1732584194;
    		        var d = 271733878;
    
    		        for (var i = 0; i < x.length; i += 16) {
    		            var olda = a;
    		            var oldb = b;
    		            var oldc = c;
    		            var oldd = d;
    
    		            a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
    		            d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
    		            c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
    		            b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
    		            a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
    		            d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
    		            c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
    		            b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
    		            a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
    		            d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
    		            c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
    		            b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
    		            a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
    		            d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
    		            c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
    		            b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
    
    		            a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
    		            d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
    		            c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
    		            b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
    		            a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
    		            d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
    		            c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
    		            b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
    		            a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
    		            d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
    		            c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
    		            b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
    		            a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
    		            d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
    		            c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
    		            b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
    
    		            a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
    		            d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
    		            c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
    		            b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
    		            a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
    		            d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
    		            c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
    		            b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
    		            a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
    		            d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
    		            c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
    		            b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
    		            a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
    		            d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
    		            c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
    		            b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
    
    		            a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
    		            d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
    		            c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
    		            b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
    		            a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
    		            d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
    		            c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
    		            b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
    		            a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
    		            d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
    		            c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
    		            b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
    		            a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
    		            d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
    		            c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
    		            b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
    
    		            a = safe_add(a, olda);
    		            b = safe_add(b, oldb);
    		            c = safe_add(c, oldc);
    		            d = safe_add(d, oldd);
    		        }
    		        return Array(a, b, c, d);
    		    }
    
    
    		    /*
    		     * These functions implement the four basic operations the algorithm uses.
    		     */
    		    var md5_cmn = function (q, a, b, x, s, t) {
    		        return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
    		    }
    
    		    /*
    		     * Convert an array of little-endian words to a hex string.
    		     */
    		    var binl2hex = function (binarray) {
    		        var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    		        var str = "";
    		        for (var i = 0; i < binarray.length * 4; i++) {
    		            str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
    		            hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8  )) & 0xF);
    		        }
    		        return str;
    		    }
    
    		    /*
    		     * Convert a string to an array of little-endian words
    		     * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
    		     */
    		    var str2binl = function (str) {
    		        var bin = Array();
    		        var mask = (1 << chrsz) - 1;
    		        for (var i = 0; i < str.length * chrsz; i += chrsz)
    		            bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
    		        return bin;
    		    }
    
    		    /*
    		     * Add integers, wrapping at 2^32. This uses 16-bit operations internally
    		     * to work around bugs in some JS interpreters.
    		     */
    		    var safe_add = function (x, y) {
    		        var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    		        var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    		        return (msw << 16) | (lsw & 0xFFFF);
    		    }
    
    		    /*
    		     * Bitwise rotate a 32-bit number to the left.
    		     */
    		    var bit_rol = function (num, cnt) {
    		        return (num << cnt) | (num >>> (32 - cnt));
    		    }
    
    		    return binl2hex(core_md5(str2binl(str_data), str_data.length * chrsz));
    		}
    	},
    
    
    
    	/**
    	 * @author Rui.Zhang
    	 * @class 扩展类
    	 * @description 提供一些扩展加强的函数
    	 */
    	extention : {
    		/**
    		 * @author Rui.Zhang
    		 * @description 数组排序;可以排序简单数组或对象数组;
    		 * @description 例如;根据年龄排序以下对象数组. <br> var arr = [{name:"张三", age:11}, {name:"李四", age:13}]; <br> result = arr.sort(sortBy("age", false)); <br> 排序结果为 [{name:"李四", age:13}, {name:"张三", age:11}];<br> 又例如排序简单数组 arr = [1,2,3,4,5];<br>正序排序调用 arr.sort(Mtils.extention.sortBy(true); <br> 逆序排序用 arr.sort(Mtils.extention.sortBy(false);
    		 * @param {string} arg1  排序对象数组时;此参数为欲排序的属性;当排序简单数组时,此参数含义与第二个参数相同
    		 * @param {boolean} arg2  true/升序;false/降序
    		 * @returns {boolean}
    		 **/
    		sortBy : function(attr, rev) {
    			if(!Mtils.isString(attr)) rev = attr;
    		    //第二个参数没有传递 默认升序排列
    	        if(rev ==  undefined){
    	            rev = 1;
    	        }else{
    	            rev = (rev) ? 1 : -1;
    	        }
    
    	        return function(a,b){
    	        	if(Mtils.isString(attr)) {
    					if(Mtils.isObject(a)) a = a[attr];
    		            if(Mtils.isObject(b)) b = b[attr];
    	        	}
    	        
    	            if(a < b){
    	                return rev * -1;
    	            }
    	            if(a > b){
    	                return rev * 1;
    	            }
    	            return 0;
    	        }
    		},
    		
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 将一个对象进行拷贝,可以传入多个对象,第一个参数会覆盖第二个参数的属性.该对象已扩展到Mtils
    		 * @param {any} arg1  欲拷贝属性的对象1,若为true则为深拷贝
    		 * @param {any} arg2  欲拷贝属性的对象2
    		 * @returns {boolean}
    		 **/
    		extend : function() {
    		    var src, copyIsArray, copy, name, options, clone,
    		        target = arguments[0] || {},
    		        i = 1,
    		        length = arguments.length,
    		        deep = false;
    
    		    // Handle a deep copy situation
    		    if ( typeof target === "boolean" ) {
    		        deep = target;
    		        target = arguments[1] || {};
    		        // skip the boolean and the target
    		        i = 2;
    		    }
    
    		    // Handle case when target is a string or something (possible in deep copy)
    		    if ( !Mtils.isObject(target)) {
    		        target = {};
    		    }
    
    		    for ( ; i < length; i++ ) {
    		        // Only deal with non-null/undefined values
    		        if ( (options = arguments[ i ]) != null ) {
    		            // Extend the base object
    		            for ( name in options ) {
    		                src = target[ name ];
    		                copy = options[ name ];
    
    		                // Prevent never-ending loop
    		                if ( target === copy ) {
    		                    continue;
    		                }
    
    		                // Recurse if we're merging plain objects or arrays
    		                if ( deep && copy && ( Mtils.isEmpty(copy) || (copyIsArray = Mtils.extend(copy)) ) ) {
    		                    if ( copyIsArray ) {
    		                        copyIsArray = false;
    		                        clone = src && Mtils.isArray(src) ? src : [];
    
    		                    } else {
    		                        clone = src && Mtils.isEmpty(src) ? src : {};
    		                    }
    
    		                    // Never move original objects, clone them
    		                    target[ name ] = Mtils.extend( deep, clone, copy );
    
    		                // Don't bring in undefined values
    		                } else if ( copy !== undefined ) {
    		                    target[ name ] = copy;
    		                }
    		            }
    		        }
    		    }
    
    		    // Return the modified object
    		    return target;
    		},
    		
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断数据中是否包含指定数据,该对象已经扩展到Array,String.
    		 * @param {any} param  被搜寻的数据
    		 * @param {any} include  欲搜寻的数据
    		 * @returns {boolean}
    		 **/
    		includes : function (param, include) {
    			if(1 == arguments.length && Mtils.extention !== this) {
    				include = param;
    				return -1 !== this.indexOf(include);
    			} else if(2 === arguments.length) {
    				return -1 !== param.indexOf(include);
    			}
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 将非严格模式的JSON字符串转换为JSON对象, 也可用于字符串转普通数据类型, 如'true'转为true, 该函数已扩展到window/Mtils对象中;
    		 * @param {String} str  待转换的JSON字符串
    		 * @returns {any}
    		 **/
    		strToJson : function (str) {
    		    return (new Function("return " + str))();
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 返回服务器的当前时间时间,可以格式化后返回,默认返回时间戳. 该函数已扩展到Date/Mtils对象中
    		 * @description 注意:当在本地使用此函数将会返回本地时间,服务器请求地址为:location.href
    		 * @param {String} format  时间格式化参数
    		 * @returns {float/Int}
    		 **/
    		now : function (format) {
    		    var timestamp = null;
    			var ajax = null;
    			if("file:" != location.protocol) {
    				try{
    			    	ajax = new ActiveXObject("microsoft.xmlhttp");
    				}catch(e1){
    				    try{
    				        ajax = new XMLHttpRequest();
    				    }catch(e2){
    				        console.log("你的浏览器中不支持异步对象,请换浏览器");
    				    }
    				}
    				ajax.open("HEAD", location.href, false);
    				ajax.send(null);
    				timestamp = ajax.getResponseHeader("Date");
    			} else {
    				timestamp = new Date().getTime();
    			}
    			
    
    			if(!timestamp) return null;
    			timestamp = new Date(timestamp).getTime();
    
    		    if(format) 
    		    	return Mtils.extention.formatDate(timestamp, format);
    		    return timestamp;	
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 加法函数,用来得到精确的加法结果, 该函数已扩展到Math对象中
    		 * @param {Float/Int} arg1  数值1
    		 * @param {Float/Int} arg2  数值2
    		 * @returns {float/Int}
    		 **/
    		accAdd : function (arg1, arg2) {
    		    var r1, r2, m, c;
    		    try {
    		        r1 = arg1.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		        r1 = 0;
    		    }
    		    try {
    		        r2 = arg2.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		        r2 = 0;
    		    }
    		    c = Math.abs(r1 - r2);
    		    m = Math.pow(10, Math.max(r1, r2));
    		    if (c > 0) {
    		        var cm = Math.pow(10, c);
    		        if (r1 > r2) {
    		            arg1 = Number(arg1.toString().replace(".", ""));
    		            arg2 = Number(arg2.toString().replace(".", "")) * cm;
    		        } else {
    		            arg1 = Number(arg1.toString().replace(".", "")) * cm;
    		            arg2 = Number(arg2.toString().replace(".", ""));
    		        }
    		    } else {
    		        arg1 = Number(arg1.toString().replace(".", ""));
    		        arg2 = Number(arg2.toString().replace(".", ""));
    		    }
    		    return (arg1 + arg2) / m;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 减法函数,用来得到精确的减法结果, 该函数已扩展到Math对象中
    		 * @param {Float/Int} arg1  数值1
    		 * @param {Float/Int} arg2  数值2
    		 * @returns {float/Int}
    		 **/
    		accSub : function (arg1, arg2) {
    		    var r1, r2, m, n;
    		    try {
    		        r1 = arg1.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		        r1 = 0;
    		    }
    		    try {
    		        r2 = arg2.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		        r2 = 0;
    		    }
    		    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    		    n = (r1 >= r2) ? r1 : r2;
    		    return ((arg1 * m - arg2 * m) / m).toFixed(n);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 减法乘法,用来得到精确的乘法结果, 该函数已扩展到Math对象中
    		 * @param {Float/Int} arg1  数值1
    		 * @param {Float/Int} arg2  数值2
    		 * @returns {float/Int}
    		 **/
    		accMul : function (arg1, arg2) {
    		    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    		    try {
    		        m += s1.split(".")[1].length;
    		    }
    		    catch (e) {
    		    }
    		    try {
    		        m += s2.split(".")[1].length;
    		    }
    		    catch (e) {
    		    }
    		    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 除法函数,用来得到精确的除法结果, 该函数已扩展到Math对象中
    		 * @param {Float/Int} arg1  数值1
    		 * @param {Float/Int} arg2  数值2
    		 * @returns {float/Int}
    		 **/
    		accDiv : function (arg1, arg2) {
    		    var t1 = 0, t2 = 0, r1, r2;
    		    try {
    		        t1 = arg1.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		    }
    		    try {
    		        t2 = arg2.toString().split(".")[1].length;
    		    }
    		    catch (e) {
    		    }
    	        r1 = Number(arg1.toString().replace(".", ""));
    	        r2 = Number(arg2.toString().replace(".", ""));
    	        return (r1 / r2) * Math.pow(10, t2 - t1);
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 时间格式化,该函数已扩展到Date对象中
    		 * @param {String} timestamp  时间戳
    		 * @param {String} pattern 格式化字符串,如 "yy-MM-dd hh:mm:ss"
    		 * @returns {String}, 格式化后的时间
    		 * @example Mtils.text.formatDate(new Date().getTime(), "yy年MM月dd日  hh时mm分ss秒");
    		 * @example new Date().format("yy年MM月dd日  hh时mm分ss秒");
    		 **/
    		formatDate : function (timestamp, pattern) {
    			if(this !== Mtils.extention) {
    				pattern = timestamp || "yyyy-MM-dd";
    				timestamp = this;
    			} else {
    				pattern = pattern || "yyyy-MM-dd";
    			}
    
    
    		  	var tmp = new Date(timestamp);
    		    var o = {
    		        "M+": tmp.getMonth() + 1, //month
    		        "d+": tmp.getDate(), //day
    		        "h+": tmp.getHours(), //hour
    		        "m+": tmp.getMinutes(), //minute
    		        "s+": tmp.getSeconds(), //second
    		        "q+": Math.floor((tmp.getMonth() + 3) / 3), //quarter
    		        "S": tmp.getMilliseconds() //millisecond
    		    }
    
    		    if (/(y+)/.test(pattern)) {
    		        pattern = pattern.replace(RegExp.$1, (tmp.getFullYear() + "").substr(4 - RegExp.$1.length));
    		    }
    
    		    for (var k in o) {
    		        if (new RegExp("(" + k + ")").test(pattern)) {
    		            pattern = pattern.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
    		        }
    		    }
    		    return pattern;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 去除数组中的重复元素, 该函数已扩展到Mtils对象中
    		 * @param {Arr} array  待去重数组
    		 * @returns {Arr}, 去重后的数组
    		 **/
    		uniqueArray : function(arr) {
                var _this = arr || this;
                if(undefined === _this || null === _this || 0 === _this.length) return [];
                _this.sort();
                var re=[_this[0]];
                for(var i = 1; i < _this.length; i++) {
                    if( _this[i] !== re[re.length-1]) {
                        re.push(_this[i]);
                    }
                }
                return re;
            },
    
            
    		/**
    		 * @author Rui.Zhang
    		 * @description  清除文本右边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
    		 * @param {String} str_data    欲清除的文本
    		 * @returns {String}, 清除空白字符后的文本
    		 **/
    		rtrim : function (str_data) {
    			str_data = str_data || String(this);
    		    return str_data.replace(/(\s*| *)$/, "");
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  清除文本左边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
    		 * @param {String} str_data    欲清除的文本
    		 * @returns {String}, 清除空白字符后的文本
    		 **/
    		ltrim : function (str_data) {
    			str_data = str_data || String(this);
    		    return str_data.replace(/^(\s*| *)/, "");
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  清除文本中所有的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中
    		 * @param {String} str_data    欲清除的文本
    		 * @returns {String}, 清除空白字符后的文本
    		 **/
    		atrim : function (str_data) {
    			str_data = str_data || String(this);
    		    return str_data.replace(/\s+/g, "");
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  替换源文本中的所有目标文本, 该函数已扩展到String对象中
    		 * @param {String} str_origin    被替换的文本
    		 * @param {String} str_target    欲替换的文本
    		 * @param {String} str_replace   用作替换的文本
    		 * @returns {String}, 替换后的文本
    		 **/
    		replaceAll : function (str_origin, str_target, str_replace) {
    			if(this !== Mtils.extention) {
    				str_replace = str_target;
    				str_target = str_origin;
    				str_origin = this;
    			}
    		    return str_origin.replace(new RegExp(str_target, "gm"), str_replace)
    		},
    
    
    		 /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为普通对象, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isObject : function(varName) {
    			return varName !== null && Mtils.utils.getVarType(varName) === '[object Object]';
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为window对象, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isWindow : function(varName) {
            	return varName && varName.window === varName;
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为文件, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isFile : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object File]';
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为表单数据, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isFormData : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object FormData]';
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为正则表达式, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isRegExp : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object RegExp]';
            },
    
    
            /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为数组, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
    		isArray : Array.isArray,
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为NaN
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
    		isNaN : function(val) {
    			return Mtils.isNumber(val) && val !== val; 
    		},
    
            /**
    		 * @author Rui.Zhang
    		 * @description 通过数据类型判断变量是否为数字, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isNumber : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object Number]';
            },
    
    
            /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为函数, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isFunction : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object Function]';
            },
    
    
            /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为日期, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isDate : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object Date]';
            },
    
    
            /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为字符串, 该函数已扩展到Mtils对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isString : function(varName) {
            	return Mtils.utils.getVarType(varName) === '[object String]';
            },
    	},
    
    
    
    	/**
    	 * @author Rui.Zhang
    	 * @class 浏览器类
    	 * @description 提供一些与当前运行环境相关的函数
    	 */
    	browser : {
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 获取当前浏览器平台内核
    		 * @returns {Object}, 该对象描述了一系列可能的浏览器内核,它包含以下属性:trident: IE内核, presto: opera内核, webKit: 苹果、谷歌内核, gecko: 火狐内核Gecko, mobile: 是否为移动终端, ios: ios ,android: android, iPhone: iPhone, iPad: iPad, webApp: Safari, weChat: 微信
    		 **/
    		version : function () {
    			var u = navigator.userAgent; 
    	        return { 
    	            trident: u.indexOf('Trident') > -1, //IE内核 
    	            presto: u.indexOf('Presto') > -1, //opera内核 
    	            webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 
    	            gecko: u.indexOf('Firefox') > -1, //火狐内核Gecko 
    	            mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 
    	            ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios 
    	            android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android 
    	            iPhone: u.indexOf('iPhone') > -1 , //iPhone 
    	            iPad: u.indexOf('iPad') > -1, //iPad 
    	            webApp: u.indexOf('Safari') > -1, //Safari 
    	            weChat: u.indexOf('MicroMessenger') > -1 //微信
    	        }; 
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 获取URL中的请求参数,该函数已扩展到window/Mtils对象中
    		 * @param {String} [Url]  可选,带参数的URL, 默认为当前访问的URL
    		 * @returns {Object}, 序列化后的参数对象 array[param_Key] = param_value
    		 **/
    		getUrlParam : function (Url) {
    		    var result = new Object();
    		    if(Url) {
    		        var tmp = Url.split("?")[1];
    		        if(tmp) {
    		            tmp = tmp.split("&");
    		            for(var j=0;j<tmp.length;j++) {
    		                result[tmp[j].split("=")[0]] = tmp[j].split("=")[1];
    		            }
    		        }
    		    } else {
    		        var tmp = location.search.substring(1);
    		        if(tmp) {
    		            tmp = tmp.split("&");
    		            for(var j=0;j<tmp.length;j++) {
    		                result[tmp[j].split("=")[0]] = tmp[j].split("=")[1];
    		            }
    		        }
    		    }
    		    return result;
    		},
    		
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  删除所有cookie
    		 * @returns {boolean}, true: 删除成功
    		 **/
    		delAllCookie : function () {
    		    try {
    		        var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
    		        if (keys) {
    		            for (var i = 0; i < keys.length; i++) {
    		                document.cookie = keys[i] + '=null;path=/;expires=' + new Date(0).toGMTString();
    		            }
    		        }
    		    } catch (ae) {
    		        return false;
    		    }
    		    return true;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  删除cookie
    		 * @param {String} str_name    欲删除的cookie名称
    		 * @returns {boolean}, true: 删除成功
    		 **/
    		delCookie : function (str_name) {
    		    try {
    		        var exp = new Date();
    		        exp.setTime(exp.getTime() - 10000);
    		        document.cookie = str_name + "=null;path=/;expires=" + exp.toGMTString() + ";";
    		    } catch (ae) {
    		        return false;
    		    }
    		    return true;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  设置cookie
    		 * @param {String} str_name    欲设置的cookie名称
    		 * @param {String} value       cookie值
    		 * @param {String} [expires]   可选 , cookie过期时间,以分钟为单位
    		 * @returns {boolean}, true: 设置成功
    		 **/
    		setCookie : function (str_name, value, expires) {
    		    var exp = new Date();
    		    try {
    		        exp.setTime(exp.getTime() + expires * 60 * 1000);
    		        if (expires) {
    		            document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;expires=" + exp.toGMTString() + ";";
    		        } else {
    		            document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;";
    		        }
    		    } catch (ae) {
    		        return false;
    		    }
    		    return true;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  获取cookie值
    		 * @param {String} str_name    欲获取的cookie名称
    		 * @returns {String}, cookie值, null表示未找到
    		 **/
    		getCookie : function (str_name) {
    		    var arr = document.cookie.match(new RegExp("(^| )" + str_name + "=([^;]*)(;|$)"));
    		    if (arr != null) return decodeURI(arr[2]);
    		    return null;
    		},
    	},
    
    
    
    	/**
    	 * @author Rui.Zhang
    	 * @class 工具类
    	 * @description 提供一些辅助代码封装
    	 */
    	utils : {
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 清除数组或者对象中的Empty属性,以下会被判断为Empty:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils对象中
    		 * @param {Array|Object} param 欲清除的目标对象
    		 * @returns {any} result  已清除empty属性的对象
    		 **/
    		clearEmpty : function() {
    			var target = arguments[0] || this, key, i, length, tmpArray = [];
    
    			if(!Mtils.isObject(target) && !Mtils.isArray(target)) return target;
    
    			if(Mtils.isObject(target)) {
    				for(key in target) {
    					if(Mtils.isEmpty(target[key])) {
    						if(Reflect && Reflect.deleteProperty) {
    							Reflect.deleteProperty(target, key);
    						} else {
    							delete target[key];
    						}
    					} else if(Mtils.isObject(target) || Mtils.isArray(target)) {
    						Mtils.utils.clearEmpty(target[key])
    					}
    					
    				}
    			}
    
    			if(Mtils.isArray(target)) {
    				tmpArray = [];
    				for(i=0,length=target.length; i<length; i++) {
    					if(!Mtils.isEmpty(target[i])) tmpArray.push(target[i]);
    				}
    				target = tmpArray;
    			}
    
    			return target;
    
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 在数组中根据ID获取对象, 该函数已扩展到Mtils对象中
    		 * @param {string|number|array} id   欲获取的ID值
    		 * @param {array} arr  数据源
    		 * @param {string} key  如指定此参数则使用此参数为key进行查询
    		 * @returns {array} result 符合条件的返回结果集,如果传入的不是数组则返回结果集中的第一个元素
    		 **/
    		getById : function(search, key) {
            	var result = [], arr = this, searchs = [], querys = [], key = key || "id", tmp;
    
            	if(Mtils.isEmpty(search)) return result[0];
    
            	if(Mtils.isArray(search)) {
            		searchs = searchs.concat(search);
            	} else {
            		searchs.push(search);
            	}
            	searchs.forEach(function(item) {
            		tmp = {};
    
    	        	if(Mtils.isObject(item) && item[key]) {
    	        		tmp[key] = item[key];
    	        		querys.push(tmp);
    	        	}
    	        	if(Mtils.isString(item) || Mtils.isNumber(item)) {
    	        		tmp[key] = item;
    	        		querys.push(tmp);
    	        	}
            	});
    			result = Mtils.findInArray(querys, arr);
    			if(!Mtils.isArray(search)) {
    	        	return result [0];
    			}
    			return result;
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 在数组中根据根据条件进行过滤, 该函数已扩展到Mtils对象中
    		 * @param {any} serch   查询条件,可以为字符串,也可以用数组一次查询多个
    		 * @param {array} arr  数据源
    		 * @param {boolean} regular  在匹配字符串时是否启用正则,启用正则后,查询条件中的值将转化为正则表达式
    		 * @returns {array} result 符合条件的返回结果集
    		 **/
            findInArray : function(search, arr, regular) {
            	var result = [], keys , reg, searchs = [];
            	arr = arr || this;
            	if(undefined === search) result = arr;
            	if(!Array.isArray(arr)) return result;
    
            	if(Mtils.isArray(search)) {
            		searchs = searchs.concat(search);
            	} else {
            		searchs.push(search);
            	}
    	        	
    
            	searchs.forEach(function(search) {
            		if(Mtils.isObject(search)) keys = Object.keys(search);
    
            		result = result.concat(arr.filter(function(item) {
            			if(typeof(item) === typeof(search)) {
            				if(Mtils.isString(search)) {
            					if(true === regular) {
    								reg = new RegExp(search);
    	        					if(reg.test(item)) return true;
            					} else {
            						if(item === search) return true;
            					}
            				} else
            				if(Mtils.isObject(search)) {
    							if(keys.every(function(key) {
    		        				if(true === regular && Mtils.isString(item[key]) && Mtils.isString(search[key])) {
    		        					reg = new RegExp(search[key]);
    		        					if(reg.test(item[key])) return true;
    		        				} else {
    			        				if(item[key] === search[key]) return true;
    		        				}
    		        			})) return true;
            				} else
            				if(item === search) return true;
            			}
            		}))
            	});
            	return result;
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否定义, 该函数已扩展到Mtils/window对象中
    		 * @param {varName} varName  待判断的变量
    		 * @returns {boolean}, true/false
    		 **/
            isDefined : function(varName) {
            	return typeof varName !== 'undefined';
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 保存数据到localStorage中,该函数已扩展到Mtils对象中
    		 * @param {string} key 存取键值, key值重复会导致数据覆盖, 如果参数2为对象, key值可以为该对象属性
    		 * @param {String} data 欲存取数据
    		 * @param {String} [objKey] 可选项, 当存取数据为对象时, 指定此选项后, 可以通过data[objKey]的值来存取数据
    		 * @returns {any}
    		 * @example 
    		 * 1: Mtils.cache("Authorization", "uc43d452bdb373e4a36c3efc0f91c928d7"), 这里存入了一个名为'Authorization'的数据, 取回方式:  Mtils.cache("Authorization")
    		 * 2: Mtils.cache("id", {id:235, name:'mr.zr', age:34}), 这里存入了一个对象, 取回方式如下:  Mtils.cache(235) 或者 Mtils.cache("id")
    		 * 3: Mtils.cache("man", {id:235, name:'mr.zr', age:34}, "id"), 这里存入了一个对象, 取回方式如下:  Mtils.cache(235) 或者 Mtils.cache("man")
    		 *
    		 **/
    		cache : function(key, data, obj_key) {
    			if(key && data && arguments.length > 1) {
    				var mtilsData = localStorage.mtilsData || '{}';
    				mtilsData = JSON.parse(mtilsData);
    
    				if(!obj_key && Mtils.utils.isObject(data) && data[key] && !mtilsData[data[key]]) {
    					mtilsData[data[key]] = data;
    				} else if(obj_key) {
    					mtilsData[data[obj_key]] = data;
    				}
    				mtilsData[key] = data;
    				
    				localStorage.mtilsData = JSON.stringify(mtilsData);
    			} else {
    				var mtilsData = localStorage.mtilsData || '{}';
    				mtilsData = JSON.parse(mtilsData);
    				return mtilsData[key];
    			}
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 深复制, 该函数已扩展到Mtils对象上
    		 * @param {any} varName  待复制的数据
    		 * @returns {any},  返回深复制的新对象
    		 **/
            copy : function(obj) {
                return JSON.parse(JSON.stringify(obj));
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 简单版本的链式语法函数调用,该函数已扩展到Window/Mtils对象中
    		 * @param {none} 无参数
    		 * @returns {none}, 无返回值 
    		 * @example 此方案简单解决回调的解决方案,使用如下:
    		 * 
    		 * ChainCallManager() 返回一个链式调用对象,可以调用.then(fn)来注册需要调用的函数
             * 当函数注册完毕后,调用.start()或.run(),方法启动函数链的调用
             * .start()该函数需要你在函数中使用this.next()或this.callNext()方法来手动调用下一个函数,适用于函数之间有先后顺序的调用.比如异步且有顺序,.next()/.callNext()可以传递参数给下一个函数
             * .run()函数则系统自动按注册顺序调用调用,适合于函数之间没有关联的调用.比如:函数中有异步请求,则系统不会消耗时间等待异步请求返回.会在发送异步请求后直接调用下一个函数
    		 * ChainCallManager().then(function(params) {
    	 	 *	 console.log('this is one function', params);
    	 	 *   this.next('call function2'); //请注意,如果这里不调用.next(),函数调用将在这里终止,.next()函数中的参数将会传递给下一个函数
    		 * }).then(function(params) {
    	     *   console.log('this is two function', params);
    		 * }).start('start');  //携带启动参数 start
    		 * 
    		 * 上面将会依次输出: 
    		 * line1: this is one function start
    		 * line2: this is two function call function2
    		 * 
    		 * 
    		 * ChainCallManager().then(function(params) {
    	 	 *	 console.log('this is one function', params);
    	 	 *   return 'call funtcion2';    //这里的返回值将会传递给下一个函数
    		 * }).then(function(params) {
    	     *   console.log('this is two function', params);
    		 * }).run('start'); //携带启动参数 start
    		 *
    		 *
    		 * 上面将会依次输出: 
    		 * line1: this is one function start
    		 * line2: this is two function call funtcion2
    		 *
    		 **/
    		 ChainCallManager : function () {
    		    var fn = function() {
    		        this.methodsRunIndex = 0;
    		        this.methods = [];
    		        this.autoCall = false;
    
    
    		        this.next = this.callNext = function(params) {
    		            if(!this.autoCall) {
    		                this.methodsRunIndex ++;
    		                if(this.methods[this.methodsRunIndex]) {
    		                    this.methods[this.methodsRunIndex].call(this, params);
    		                }
    		            }
    		            return this;
    		        };
    
    		        this.then = function(fn) {
    		            if(fn && "function" === typeof(fn)) {
    		                this.methods.push(fn);
    		            }
    		            return this;
    		        };
    
    		        this.start = function(params) {
    		            this.autoCall = false;
    
    		            this.methods[this.methodsRunIndex].call(this, params);
    		        };
    
    		        this.run = function(params) {
    		            var preResult = params || undefined;
    
    		            this.autoCall = true;
    
    		            for(var i=0; i<this.methods.length; i++) {
    		                this.methodsRunIndex = i;
    
    		                preResult = this.methods[this.methodsRunIndex].call(this, preResult);
    		            }
    		        };
    		    };
    
       			return new fn();
    		},
    
    
    	 	/**
    		 * @author Rui.Zhang
    		 * @description 用字符串创建map, 该函数已扩展到Mtils对象中
    		 * @param {string} keys 主键字符串,使用','分隔多个key, 例如'key1, key2,...'
    		 * @param {any} defaultVal 创建对象时使用的默认值
    		 * @returns {object}, 返回创建完成的对象
    		 * @example Mtils.utils.makeMap('id,name,sex');  返回值: {id:true, name:true, sex:true}
    		 **/
    		 makeMap : function(str, defaultVal) {
    		  var obj = {}, items = Mtils.extention.trim(str).split(","), i;
    		  for (i = 0; i < items.length; i++)
    		    obj[ items[i] ] = defaultVal;
    		  return obj;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 获取变量的数据类型, 推荐使用Mtils.extention下的数据类型校验方法
    		 * @param {varName} varName  待取数据类型的变量
    		 * @returns {string}, 变量的数据类型,可能能为以下类型object,array,number,string,function,date,null,undefined
    		 **/
            getVarType : function(varName) {
                return Object.prototype.toString.call(varName);
            },
           
    
            /**
    		 * @author Rui.Zhang
    		 * @description 判断变量是否为空值,请注意以下对象会被判断为空值:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils/Window对象中
    		 * @param {varName} varName  待判断数据类型的变量
    		 * @returns {boolean}, true/false
    		 **/
            isEmpty : function(varName) {
            	if(varName === undefined) return true;
            	if(varName === null) return true;
            	if(Mtils.isNaN(varName)) return true;
            	if(Mtils.isString(varName) && 0 === varName.length) return true;
            	if(Mtils.isArray(varName) && 0 === varName.length) return true;
            	if(Mtils.isObject(varName) && 0 === Object.keys(varName).length) return true;
    
            	return false;
            },
    
    
         	/**
    		 * @author Rui.Zhang
    		 * @description 根据对象属性在数组中抽取所有该对象属性的值组成新数组返回
    		 * @param {array} sourceArr  待查找的数组
    		 * @param {string} properties  要获取的字段
    		 * @param {string} defaultVal  默认值
    		 * @returns {Array}, 指定属性的集合 
    		 **/
            extractPropertyValuesInArray : function(sourceArr ,properties, defaultVal) {
                var result = [];
    
                if(sourceArr && Array.isArray(sourceArr)) {
                    for(var i= 0, item; i<sourceArr.length; i ++) {
                        item = sourceArr[i];
                        if(properties && "object" == typeof(item)) {
                            if(item[properties]) {
                                result.push(item[properties]);
                            } else if(undefined != defaultVal) {
                                result.push(defaultVal);
                            }
                        } else {
                            if(item) {
                                result.push(String(item));
                            }else if(undefined != defaultVal) {
                                result.push(defaultVal);
                            }
                        }
                    }
                }
                return result;
            },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 提供进制转换,最大为64进制
    		 * @param {String} number  待转换进制序列
    		 * @param {number} from  待转换进制(2-64)
    		 * @param {number} to  转换到进制(2-64)
    		 * @returns {String}, 转换后的进制序列
    		 * @example 把16进制0x7b转为2进制, Mtils.utils.decimalConversion("7b",16,2);
    		 **/
    		decimalConversion : function(number, from, to) {
    			var origin = Mtils.constant.BASE_DECIMAL,  tmp, decimal = 0, result = "";
    			if(undefined == number || !String(number).replace(/ /gi,"")) return "";
    			if(!from) return "";
    
    			try {
    				if(from)
    					from = Number(from);    
    				if(to)
    					to = Number(to);
    
    				//先将其转换为10进制
    				tmp = String(number);
    				for(var i=0, j=1;i<tmp.length; i++, j++) {
    					decimal +=  origin.indexOf(tmp.charAt(i)) * Math.pow(from, tmp.length - j);
    				}
    				if(to == '10' || !to) return decimal;
    
    				//再转换为指定进制
    				while(decimal != 0) {
    					tmp = decimal % to;
    					result = origin.charAt(tmp) + result;
    					decimal = (decimal - tmp) / to;
    				}
    				return result;
    			} catch(e) {
    				console.log(e);
    				return "";
    			}
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 获取汉字拼音或首字母
    		 * @param {String} str 待获取拼音的字符串,除汉字外其余字符会直接返回
    		 * @param {Boolean} extractFirst 只获取汉字拼音首字母
    		 * @returns {String} 目标的拼音字符串
    		 **/
    	    makePy : function (str, extractFirst) {
    	    	var i, tmp, key, result = '', flag, firstChar, PYMaps;
    
    	    	extractFirst = extractFirst || false;
    	    	PYMaps = Mtils.constant.PY_MAPS;
    
    			for(i=0; i<str.length; i++) {
    				tmp = str.substr(i, 1);
    				flag = false;
    				for (key in PYMaps){
    		        	if (Mtils.extention.isString(PYMaps[key]) && PYMaps[key].indexOf(tmp) != -1) {
    		        	    firstChar = key.substr(0, 1).toUpperCase();
    
    		        		if(true == extractFirst) {
    		        			result += firstChar;
    		        		} else {
    		        			result += firstChar + key.substr(1, key.length).toLowerCase();
    		        		}
    		        		
    		        		flag = true;
    		        		break;
    		        	} 
    		        }
    		        if(!flag ) {
    		        	result += tmp;
    		        }
    		    }
    		    return result;
    	    },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 计算年龄
    		 * @param {Date} birth 待设置的对象
    		 * @param {Date} now 待设置属性名称
    		 * @returns {Int} 计算出的年龄
    		 **/
    		 calcAge : function(birth, now) {
    		 	now = now || new Date();
    	         if(birth && now) {
    	             try {
    	                 var birth, now, age;
    	                 if("string" === typeof (birth) || "number" === typeof (now)) {
    	                     birth = new Date(birth);
    	                 }
    	                 if("string" === typeof (now) || "number" === typeof (now)) {
    	                     now = new Date(now);
    	                 }
    
    	                 age = now.getFullYear() - birth.getFullYear();
    	                 if(0 >= age) {
    	                     age = 0;
    	                 } else if(0 < age) {
    	                     if(birth.getMonth() == now.getMonth()) {
    	                         if(birth.getDate() > now.getDate()) {
    	                             age --;
    	                         }
    	                     } else if(birth.getMonth() >= now.getMonth()) {
    	                         age --;
    	                     }
    	                 }
    	                 return age + "";
    	             } catch(e) {
    	             	 console.log("Invalid Date, please input like '1992-08-12' or '1992/12/12'");
    	                 return "";
    	             }
    	         }
    	         return "";
         	},
    
    
    	    /**
    		 * @author Rui.Zhang
    		 * @description 设置对象属性值
    		 * @param {String} obj 待设置的对象
    		 * @param {String} propName 待设置属性名称
    		 * @param {String} defaultVal 待设置属性的值
    		 * @param {String} isCreate 如没有该属性是否创建,默认不创建
    		 * @returns {Void}
    		 **/
    	    setObjectPropertyVal : function (obj, propName, propVal, isCreate) {
    	        if(obj && propName ) {
    	            if(propName.length > 0 && "object" == typeof obj) {
    	                var props = propName.split("."), varStr = "obj";
    	                for(var i= 0, attr;i<props.length;i++) {
    	                    attr = props[i];
    	                    varStr += "." + attr ;
    
    	                    if(isCreate) {
    	                        try {
                                    if(undefined == eval(varStr)) {
                                        eval(varStr + "={}");
                                    }
    	                        } catch(e) {
    	                            console.log(e)
    	                        }
    	                    }
    	                }
    	                varStr += "=propVal";
    
    	                try {
                            eval(varStr);
    	                } catch(e) {
    	                    console.log(e)
    	                }
    	            } else {
    	                console.log("obj is not object or propName not value");
    	            }
    	        } else {
    	            console.log("params error");
    	        }
    	    },
    
    
    	    /**
    		 * @author Rui.Zhang
    		 * @description 获取对象属性值
    		 * @param {String} obj 待获取长度的数据
    		 * @param {String} propName 待获取属性名称
    		 * @param {String} defaultVal 待获取属性未定义则返回此值
    		 * @returns {Any}, 获取的属性值
    		 **/
    	    getObjectPropertyVal : function (obj, propName, defaultVal) {
    	        if(obj && propName ) {
    	            if(propName.length > 0 && "object" == typeof obj) {
    	                var props = propName.split("."), varStr = "obj";
    	                for(var i=0;i<props.length;i++) {
    	                    varStr += "." + props[i];
    
    	                    if(null != defaultVal || undefined != defaultVal) {
    	                        try {
                                    if(undefined == eval(varStr)) {
                                       return defaultVal;
                                    }
    	                        } catch(e) {
    	                            console.log(e)
    	                        }
    	                    }
    	                }
    
    	                try {
                            var tmp = eval(varStr);
                            if(null == tmp || undefined == tmp) {
                                return defaultVal;
                            } else {
                                return tmp;
                            }
    	                } catch(e) {
    	                    console.log(e)
    	                }
    	            } else {
    	                console.log("obj is not object or propName not value");
    	            }
    	        } else {
    	            console.log("params error");
    	        }
    	    },
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description 获取字符串的字节长度
    		 * @param {String} str_data 待获取长度的数据
    		 * @returns {Long}, 字符串长度 
    		 **/
    		getByteLength : function(str_data) {
    			str_data = str_data || String(this);
    			if(Mtils.utils.isString(str_data)) {
    				var Zhlength = 0;// 全角
    		        var Enlength = 0;// 半角
    		        if(str_data) {
    		            for (var i = 0; i < str_data.length; i++) {
    		                if (str_data.substring(i, i + 1).match(/[^\x00-\xff]/ig) != null)
    		                    Zhlength += 1;
    		                else
    		                    Enlength += 1;
    		            }
    		        }
    		        // 返回当前字符串字节长度
    		        return  (Zhlength * 2) + Enlength; //所占字节数
    			}
    			return 0;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  格式化金额, 展示位银行金额格式
    		 * @param {Long} long_data     待格式化数值
    		 * @param {Integer} [length]     可选,格式化金额精度, 即小数点位数. 如: 3 标示保留小数点后三位, 默认为2位
    		 * @returns {String}, 格式化后金额
    		 **/
    		formatMoney : function (long_data, length) {
    		    length = length > 0 && length <= 20 ? length : 2;
    		    long_data = parseFloat((long_data + "").replace(/[^\d\.-]/g, "")).toFixed(length) + "";
    		    var l = long_data.split(".")[0].split("").reverse(),
    		        r = long_data.split(".")[1];
    		    t = "";
    		    for(i = 0; i < l.length; i ++ )
    		    {
    		        t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
    		    }
    		    return t.split("").reverse().join("") + "." + r;
    		},
    
    
    		/**
    		 * @author Rui.Zhang
    		 * @description  文本简介, 即截取字符串前几个字符
    		 * @param {String} str_data    待截取文本
    		 * @param {Integer} length     待截取长度
    		 * @returns {String}, 文本简介
    		 **/
    		strIntro : function (str_data, length) {
    		    if (str_data.length > length) {
    		        return str_data.substr(0, length) + "...";
    		    } else {
    		        return str_data;
    		    }
    		},
    
    	}
    };
    
    
    
    
    window.ChainCallManager = Mtils.ChainCallManager = Mtils.utils.ChainCallManager;
    window.isDefined = Mtils.isDefined = Mtils.utils.isDefined;
    window.isEmpty = Mtils.isEmpty = Mtils.utils.isEmpty;
    window.strToJson = Mtils.strToJson = Mtils.extention.strToJson;
    
    Mtils.copy = Mtils.utils.copy;
    Mtils.cache = Mtils.utils.cache;
    Mtils.makeMap = Mtils.utils.makeMap;
    Mtils.extend = Mtils.extention.extend;
    
    Mtils.findInArray = Mtils.utils.findInArray;
    Mtils.getById = Mtils.utils.getById;
    
    Mtils.isObject = Mtils.extention.isObject;
    Mtils.isArray = Mtils.extention.isArray;
    Mtils.isNaN = Mtils.extention.isNaN;
    Mtils.isString = Mtils.extention.isString;
    Mtils.isDate = Mtils.extention.isDate;
    Mtils.isFunction = Mtils.extention.isFunction;
    Mtils.isNumber = Mtils.extention.isNumber;
    Mtils.isWindow = Mtils.extention.isWindow;
    Mtils.isFile = Mtils.extention.isFile;
    Mtils.isFormData = Mtils.extention.isFormData;
    Mtils.isRegExp = Mtils.extention.isRegExp;
    Mtils.unique = Mtils.extention.uniqueArray;
    Mtils.includes = Mtils.extention.includes;
    Mtils.clearEmpty = Mtils.utils.clearEmpty;
    Mtils.uuid = Mtils.security.uuid;
    
    
    if(!Mtils.isEmpty(Math)) Math.accAdd = Mtils.extention.accAdd;
    if(!Mtils.isEmpty(Math)) Math.accSub = Mtils.extention.accSub;
    if(!Mtils.isEmpty(Math)) Math.accMul = Mtils.extention.accMul;
    if(!Mtils.isEmpty(Math)) Math.accDiv = Mtils.extention.accDiv;
    
    if(Mtils.isEmpty(Date.prototype.formatDate)) Date.prototype.formatDate = Date.prototype.format = Mtils.extention.formatDate;
    if(Mtils.isEmpty(Date.prototype.now)) Date.prototype.now = Mtils.now = Mtils.extention.now;
    
    if(Mtils.isEmpty(String.prototype.rtrim)) String.prototype.rtrim = Mtils.extention.rtrim;
    if(Mtils.isEmpty(String.prototype.ltrim)) String.prototype.ltrim = Mtils.extention.ltrim;
    if(Mtils.isEmpty(String.prototype.atrim)) String.prototype.atrim = Mtils.extention.atrim;
    if(Mtils.isEmpty(String.prototype.replaceAll)) String.prototype.replaceAll = Mtils.extention.replaceAll;
    if(Mtils.isEmpty(String.prototype.includes)) String.prototype.includes = Mtils.extention.includes;
    
    
    

     

    更多相关内容
  • 项目要求修改原本验证码登录为顺序点击图片验证码登录 验证码登录: 顺序点击汉字验证码登录: 这里就不讲解前端样式如何做的了,因为我是前后端分离,所以只做后端接口开发,将后台生成的图片返回给前台,前台...

    项目要求修改原本验证码登录为顺序点击图片验证码登录
    验证码登录:
    图片验证码登录
    顺序点击汉字验证码登录:
    在这里插入图片描述
    这里就不讲解前端样式如何做的了,因为我是前后端分离,所以只做后端接口开发,将后台生成的图片返回给前台,前台监控鼠标,按照点击所获得的坐标进行保存,并发送给后台,后台生成图片验证码时会将汉字的坐标存储到redis或者ehcache中做一个缓存,当校验的请求进入之后,对前后端的坐标进行校验,成功后,然后校验密码,如果密码正确登录成功。
    设计图如下:(涉及到一些业务场景不完全相同)
    在这里插入图片描述
    直接使用流将图片返回给前台,前台使用如下示例展示图片

    <img data-v-d649224e="" src="/demo/drawChinesePhote?time=1610359826578"" class="loginverifyimg" style="cursor: pointer;">
    

    controller中返回图片的代码

     BufferedImage image = drawChineseService.draw(codeCount, token, iWidth, iHeight);
                    ehcacheLoginTimesService.addLoginTime(ip, times == null ? 1 : times + 1);
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    response.setDateHeader("Expires", 0);
                    response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
                    response.addHeader("Cache-Control", "post-check=0, pre-check=0");
                    response.setHeader("Pragma", "no-cache");
                    try {
                        ImageIO.write(image, "png", stream);
                        BASE64Encoder encoder = new BASE64Encoder();
                        base64 = encoder.encodeBuffer(stream.toByteArray());
                        base64 = base64.replaceAll("\n", "").replaceAll("\r", "");
                        object.put("data", "data:image/png;base64," + base64);
                        object.put("code", "200");
                        object.put("number", codeCount);
                        response.getWriter().write(object.toString());
                    } catch (IOException e) {
                        response.getWriter().write("");
                    } finally {
                        if (stream != null) {
                            stream.flush();
                            stream.close();
                            response.getWriter().close();
                        }
                    }
    

    调用service层解决业务逻辑

     public BufferedImage draw(int count, String token, int iWidth, int iHeight) throws IOException {
            if (logger.isDebugEnabled()) {
                logger.debug("生成图片的iWidth:" + iWidth + "------iHeight:" + iHeight);
            }
            //开始画图返回image和坐标对象
            DrawChinese drawChinese = DrawUtil.createChineseImage(count, iWidth, iHeight,chineseErrorSize);
            //获取坐标list
            List<Coords> coordsList = drawChinese.getCoordsList();
            if (logger.isDebugEnabled()) {
                logger.debug("coordsList存取前:" + coordsList);
            }
            //坐标list存入redis
            loginService.saveXYZList(token, coordsList);
            return drawChinese.getImage();
        }
    

    生成图片的工具类

    public static DrawChinese createChineseImage(int count, int iWidth, int iHeight,int chineseErrorSize) throws IOException {
            DrawChinese drawChinese = new DrawChinese();
            Random random = new Random();
            BufferedImage image = new BufferedImage(iWidth, iHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = (Graphics2D) image.getGraphics();
            ClassPathResource classPathResource = new ClassPathResource("png" + File.separator + "picture.png");
            g.setBackground(Color.white);
            //File picPath= classPathResource.getFile();  //读取本地图片,做背景图片
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            InputStream inputStream = classPathResource.getInputStream();
            //生成目标文件
            File somethingFile = File.createTempFile("DailyReportTemplate", ".png");
            try {
                FileUtils.copyInputStreamToFile(inputStream, somethingFile);
            } finally {
                IOUtils.closeQuietly(inputStream);
            }
    
            g.drawImage(ImageIO.read(somethingFile), 0, 0, iWidth, iHeight, null); //将背景图片从高度20开始
            //g.setColor(Color.white);  //设置颜色
            g.drawRect(0, 0, iWidth - 1, iHeight - 1); //画边框
            AffineTransform affineTransform = new AffineTransform();
            Font font = new Font("华文行楷", Font.PLAIN, 40);
    
            Integer x = null, y = null;  //用于记录坐标
            String target = null; // 用于记录文字
            List<Coords> coordsList = new ArrayList<Coords>();
            int a = 0;
            int b = 0;
            for (int i = 0; i < count; i++) {  //随机产生4个文字,坐标,颜色都不同
                //g.setColor(new Color(random.nextInt(50) + 200, random.nextInt(150) + 100, random.nextInt(50) + 200));
                g.setColor(new Color(random.nextInt(50) + 100, random.nextInt(200), random.nextInt(200)));
                String str = getRandomChineseChar();
                int listx, listy;
                int j = 0;
                Coords coords = new Coords();
                boolean flag = true;
                //校验,如果字体坐标重复在一起影响美观
                while (true) {
                    if (flag) {
                        a = random.nextInt(iWidth - 80) + 40;
                        b = random.nextInt(iHeight - 80) + 40;
                        flag = false;
                    }
                    if (j < coordsList.size()) {
                        listx = coordsList.get(j).getX();
                        listy = coordsList.get(j).getY();
                        //判断坐标如果相等直接重新生成
                        if (listx == a && listx == b) {
                            flag = true;
                        }
                        //判断字体是否会覆盖
                        if (!((listx - chineseErrorSize <= a) && (listx + chineseErrorSize >= a) &&
                                (listy - chineseErrorSize <= b) && (listy + chineseErrorSize >= b))) {
                            if (j == coordsList.size() - 1) {
                                coords.setX(a);
                                coords.setY(b);
                                //保存坐标
                                coordsList.add(coords);
                                break;
                            }
                            j++;
                        } else {
                            flag = true;
                        }
    
    
                    } else {
                        coords.setX(a);
                        coords.setY(b);
                        //保存坐标
                        coordsList.add(coords);
                        break;
                    }
                }
                Font rotatedFont = font.deriveFont(affineTransform);
                affineTransform.rotate(Math.toRadians(random.nextInt(45)), 0, 0);
                g.setFont(rotatedFont);
                g.drawLine(a + 5, b - 4, random.nextInt(iWidth - 100) + 50, random.nextInt(iHeight - 70) + 55);                //设置干扰线的坐标
    
                if (target == null) {
                    target = str; //记录第一个文字
                } else {
                    target = target + str;
                }
                g.drawString(str, a, b);
            }
            g.setColor(Color.black);
            g.setFont(new Font("华文仿宋", Font.BOLD, 20)); //设置字体
            g.drawString(target, 0, 17);//写入验证码第一行文字  “点击..”
            //5.释放资源
            g.dispose();
            drawChinese.setCoordsList(coordsList);
            drawChinese.setImage(image);
            return drawChinese;
        }
        
    

    返回的drawChinese是一个DrawChinese对象,

    public class DrawChinese {
        private List<Coords> coordsList;
        private BufferedImage image;
    
        public List<Coords> getCoordsList() {
            return coordsList;
        }
    
        public BufferedImage getImage() {
            return image;
        }
    
        public void setCoordsList(List<Coords> coordsList) {
            this.coordsList = coordsList;
        }
    
        public void setImage(BufferedImage image) {
            this.image = image;
        }
    
        @Override
        public String toString() {
            return "DrawChinese{" +
                    "coordsList=" + coordsList +
                    '}';
        }
    }
    

    以上为生成步骤
    下面为校验步骤,chineseErrorSize为误差范围,用户点击验证码必然有误差,不可能百分之百正确。

    @Override
        public Boolean checkXYZ(String token, List<Coords> userCoords, int chineseErrorSize) throws IOException {
            List<String> coords = loginService.getXYZList(token);
            System.out.println("coords:" + coords);
            if (logger.isDebugEnabled()) {
                logger.debug("登陆的Coords:" + coords);
            }
            List<Coords> redisCoords = new ArrayList<>();
            for (int i = 0; i < coords.size(); i++) {
                String coordString = coords.get(i);
                Coords coord = JsonUtil.getBean(coordString, Coords.class);
                redisCoords.add(coord);
            }
            if (logger.isDebugEnabled()) {
                logger.debug("redis内Coords:" + redisCoords);
            }
            if (!(redisCoords.size() == userCoords.size())) {
                return false;
            }
            for (int i = 0; i < redisCoords.size(); i++) {
                Coords redis = redisCoords.get(i);
                Coords user = userCoords.get(i);
                if (!(user.getX() < redis.getX() + chineseErrorSize && user.getX() > redis.getX() - chineseErrorSize
                        && redis.getY() + chineseErrorSize > user.getY() && redis.getY() - chineseErrorSize < user.getY())) {
                    return false;
                }
            }
            return true;
        }
    
    展开全文
  • 出现下面这种情况时,采取的办法是,将Accept包含的信息也加入headers。

    出现下面这种情况时,采取的办法是,将Accept包含的信息也加入headers。

     

     

     

     

    展开全文
  • android 按顺序点选验证码

    千次阅读 2019-06-26 18:01:34
    Toast.makeText(MainActivity.this,"验证成功",Toast.LENGTH_LONG).show(); } @Override public void fail() { Toast.makeText(MainActivity.this,"验证失败",Toast.LENGTH_LONG).show(); } }); //重置 ...

     

     最近需求要用到点选验证码,百度一波之后发现android端的点选验证码基本没有,没办法只能造轮子了,初步实现功能,欢迎指教,纠正!

    效果截图如下

    github项目地址  https://github.com/zhengshuaizhou/verifyCode

    项目中两个主要的类,一个是生成汉字的类,一个是继承RelativeLayout的自定义布局

    自定义布局在xml文件中 直接使用就行,设置宽高即可

    在activity中使用的时候是这样的

            tv = findViewById(R.id.tv);
            cf = findViewById(R.id.cf);
            bt = findViewById(R.id.bt);
           //设置静态资源背景图
            cf.setBackground(ContextCompat.getDrawable(this,R.drawable.douyu));
    
            String str = "请点选   " + cf.getVerifyText();
            tv.setText(str);
    
            //验证回调
            cf.setOnVerifyListener(new ClickVerifyCode.VerifyListener() {
                @Override
                public void success() {
                    Toast.makeText(MainActivity.this,"验证成功",Toast.LENGTH_LONG).show();
                }
    
                @Override
                public void fail() {
                    Toast.makeText(MainActivity.this,"验证失败",Toast.LENGTH_LONG).show();
                }
            });
    
            //重置
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    cf.reSet();
                    String str = "请点选   " + cf.getVerifyText();
                    tv.setText(str);
                }
            });

    有待优化,有兴趣的可以一起优化一下

    展开全文
  • 使用谷歌身份验证器增强SSH安全

    万次阅读 2016-06-12 10:01:51
    咨询过前同事赛赛,他们目前使用了谷歌身份验证器。查看了谷歌身份验证器的github网址和其它网上文档,重新整理归纳。 谷歌身份验证器生成的是动态验证码,默认30秒更新。修改配置,SSH登录必须在输入密码之前输入...
  • 效果如上图; 引入dll 添加所需要的文件夹(picverificationimg:用于存放背景图 字体等) 引入js、css(添加分布视图_PictureVerifaction.cshtml 分布式图会包含这些文件...滑动验证:创新行为式验证,轻松一滑...
  • 阿里妹导读:近日,阿里安全双子座实验室与马里兰大学等高校合作的论文《Covert Security with Public Verifiability: Fas...
  • API接口签名验证

    千次阅读 2017-11-18 22:35:50
    对于API安全这块,我们要考虑三个问题: 1.请求参数是否被篡改; 2.请求来源是否合法; 3.请求是否具有唯一性。 为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证
  • 接入流程 V5验证码前后端对接流程如下图所示...用于网站后台定时通过V5控制台刷新获取验证所需要的Token及验证服务器地址。Token有效期为24小时。 请求方式:GET 调用示例: curl -X GET 'https://www.verify5.com/o...
  • 以国家企业信用信息公示系统网站为例,点击查询就会产生验证界面! selenium控制浏览器进入页面,查询调出验证页面 查看网页获取图片链接,将图片转成字节流的形式传给第三方平台 第三方返回图片中各个文字的坐...
  • WebApi安全性 使用TOKEN+签名验证

    千次阅读 2018-05-30 19:16:20
    首先问大家一个问题,你在写开放的API接口时是如何保证数据...请求的唯一性(不可复制),防止请求被恶意攻击为了保证数据在通信时的安全性,我们可以采用TOKEN+参数签名的方式来进行相关验证。 比如说我们客户端需要...
  • 最近有线上发现一个bug:多个业务场景并行请求,出现下发结果存在串的现象。 一、现象描述 如下图所示:两个不同策略出现串的情况 ...顺序执行,指的是测试计划中存在多个线程组时,第一个线程组执行完后再...
  • --JWT java web token 权限验证--> <groupId>com.auth0</groupId> <artifactId>java-jwt <version>3.4.0 <!--shiro 权限框架--> <groupId>org.apache.shiro <artifactId>shiro-spring <version>1.4.0 ...
  • 防机器人验证机制之验证码

    千次阅读 2021-03-03 16:17:12
    指定顺序点击图片中的文字或标识。 5. 空间点选 请点击离某某最近的文字或标识。 6. 面积验证 选择割裂后的指定面积。 7. 对象识别 选择下图中的某某对象。 8. 文字识别 输入下图中文字。 9. 阅读理解 这个...
  • 非常感谢举办方让我们学到了新知识,DataCon也是我比较喜欢和推荐的大数据安全比赛,这篇文章2020年10月就进了我的草稿箱,但由于小珞珞刚出生,所以今天才发表,希望对您有所帮助!感恩同行,不负青春。
  • ①windows+R ②输入regedit ③ctrl+F ④输入图1中最后一条目录,目的是快速进入所在位置,即图2 这些文件加很有特色,因为下面还会出现很多类似错误,但都是在这写目录下,按顺序排列 之后找到该目录,点击它出现下...
  • 点击上方“Java团长”,选择“置顶公众号”干货文章第一时间送达!一、Shiro框架简单介绍Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权。Sh...
  • 用户名密码登录并验证 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE ...
  • 王树义读完需要19分钟速读仅需7分钟训练集、验证集和测试集,林林总总的数据集合类型,到底该怎么选、怎么用?看过这篇教程后,你就能游刃有余地处理它们了。1 问题审稿的时...
  • JackHttp -- HTTPS 为什么是安全的?

    千次阅读 2019-12-10 17:53:38
    HTTP 为什么是不安全的 什么是 HTTPS? SSL/TLS 在网络分层中所处的位置 HTTPS 与 HTTP & SSL/TLS 之间的关系 HTTPS 为什么是安全的 HTTPS 连接流程 分析 HTTPS 真的一定安全吗?
  • ASP.NET身份验证——Form身份认证

    千次阅读 2015-11-03 11:49:26
    1. allow和deny之间的顺序一定不能写错了,UrlAuthorizationModule将这个顺序依次判断。 2. 如果某个资源只允许某类用户访问,那么最后的一条规则一定是 *" /> 在allow和deny的配置中,我们可以在一条规则...
  • 1. 了解DVWA靶场的安全级别设置; 2. 掌握请求内容含user_token的密码爆破;
  • 开放api接口签名验证

    千次阅读 2018-12-27 22:23:25
    先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在...为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。 案列分析 我们通过给某[移动端(a...
  • 今天笔者就写一篇新手向的攻防实例文章,带领大家初步了解安卓开发中的防守与进攻,我们今天的主题就是比较常见的程序签名验证机制,并演示如何攻破它。  安卓程序在打包时,必须加上一层数字签名,来代表该...
  • 开放式API安全防护的七大原则

    千次阅读 2021-01-19 08:45:00
    我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。 在我们日常工作程序开发过程中,难免会涉及与第三方系统进行数据的交互与...
  • Web应用程序中的身份验证

    千次阅读 2018-06-08 14:19:46
    原文地址:https://docs.spring.io/spring-security/site/docs/4.2.6.RELEASE/reference/htmlsingle/#authorization一个典型的Web应用程序的身份验证过程:您访问主页,然后点击链接。请求发送到服务器,并且服务器...
  • 防火墙安全策略功能入门

    千次阅读 2020-09-08 10:03:38
    前面使用域间策略验证了设备的上线效果,这种配置方法是长期使用老版本设备命令行操作留下来的习惯。现在版本更新很快,WEB页面功能更加完善,其中新版本主推的安全策略配置功能,操作也很方便。 首先在命令行移除...
  • 开放api接口签名验证规则

    千次阅读 2019-11-22 15:23:44
    为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证。 案列分析 我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: 客户端: 以下简称app 后台接口:以下简称api 我们通过app...
  • 有5个动词(这些也可以被认为是命令或行为)由auth系统调用,并且不一定按顺序调用。这些都是不相互通信的独立操作,但是,当一起使用时,允许用户登录并访问否则被拒绝的页面。以下是每个动词负责的简要说明。我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,101
精华内容 16,440
关键字:

安全验证按顺序点击怎么验证