From 7113053f7d84c9c195ba64c406c22f7ca32d5cdf Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Tue, 3 Oct 2023 00:57:57 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E6=B7=BB=E5=8A=A0PDC=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 1011 +++++++++++++++++++++++++++ 1 file changed, 1011 insertions(+) create mode 100644 Publications Data Center - China.js diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js new file mode 100644 index 00000000..0feb4e68 --- /dev/null +++ b/Publications Data Center - China.js @@ -0,0 +1,1011 @@ +{ + "translatorID": "3ab06b2e-5cfa-4561-9770-4f76710a32ab", + "label": "Publications Data Center - China", + "creator": "jiaojiaodubai23", + "target": "https?://pdc.capub.cn/search.html", + "minVersion": "5.0", + "maxVersion": "", + "priority": 100, + "inRepository": true, + "translatorType": 4, + "browserSupport": "gcsibv", + "lastUpdated": "2023-10-02 16:57:05" +} + +/* + ***** BEGIN LICENSE BLOCK ***** + Publications Data Center - China Translator + Copyright © 2023 jiaojiaodubai23 + + This file is part of Zotero. + + Zotero is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Zotero is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with Zotero. If not, see . + ***** END LICENSE BLOCK ***** +*/ + + + +function detectWeb(doc, url) { + var multi_flag = url.split(/[/,?]/)[4]; + if (multi_flag == 'quick') { + return "multiple"; + } + else if (multi_flag == 'detail') { + return "book"; + } + return false; +} + +function getTypeFromDoc(doc, row) { + let medium_type = ZU.xpath(doc, "//div[@class='data_classify']//div[@class='checkbox']/span[1]").map( + (element) => (element).className).indexOf("checkboxkey bcurrent"); + if (medium_type > 1) { + return "comic"; + } else { + let type = { + "CIP数据库": "cip", + "馆藏数据库": "marc", + "ISBN数据库": "isbn" + }[row.querySelector('.data_from span').innerText]; + return (medium_type == 0) ? type : `${type}_ele`; + } +} + +function getSearchResults(doc, checkOnly) { + var items = {}; + var found = false; + var rows = doc.querySelectorAll('.book_item'); + for (let row of rows) { + let title = ZU.trimInternal(row.querySelector('.book_title').innerText); + let id = row.querySelector('.ant-checkbox-input').value; + let type = getTypeFromDoc(doc, row); + let requestdata = `{"id":"${id}","type":"${type}"}`; + if (!id || !type || !title) { + continue + } + else { + if (checkOnly) return true; + found = true; + items[requestdata] = title; + } + } + return found ? items : false; +} + +async function doWeb(doc, url) { + if (detectWeb(doc, url) == 'multiple') { + let items = await Zotero.selectItems(getSearchResults(doc, false)); + // Z.debug(items); + if (!items) return; + for (let postdata of Object.keys(items)) { + // await scrape_multi(postdata); + // Z.debug(postdata); + // postdata = JSON.parse(postdata); + // Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); + // await ZU.doPost( + // "https://pdc.capub.cn/api/index/bookDetail", + // `id=${postdata.id}&searchType=${postdata.type}`, + // function (postresult) { + // Z.debug(postresult); + // } + // ) + /* var test = "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"; + ciphertext = aescbc.base64.toBytes(test); + var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); + var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); + var cbc = new aescbc.CBC(key, iv); + var bookdata = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); + bookdata = new Map(Object.entries(JSON.parse(bookdata))); + Z.debug(bookdata); + var newItem = new Z.Item("book"); + var key_map = { + "title": "firstbookname", + "abstractNote": ["contentsummary", "ontentabstract"], + "series": "volumename", + "seriesNumber": "volumeno", + "edition": "edition", + "place": "publisheradd", + "publisher": "publisher", + "date": ["publishingdate", "publishyear", "publishingyear"], + "ISBN": "isbn", + "callNumber": "sort", + "suite": "secondbookname", + }; + for (const key in key_map) { + if (Object.hasOwnProperty.call(key_map, key)) { + // Z.debug(key); + // Z.debug(key_map[key]); + newItem[key] = match_text(data = bookdata, labels = key_map[key]); + // Z.debug(newItem.key); + } + // Z.debug(newItem); + }; + // newItem = Object.assign(newItem, match_text_type(postdata.type)); + newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), + newItem.creators = match_text_creators(data = bookdata, labels = "firstauthor")[0]; + newItem.creators_raw = match_text_creators(data = bookdata, labels = "firstauthor")[1]; + newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, + newItem.tags.push({ "tag": match_text(data = bookdata, labels = "keyword") }); + newItem.complete(); */ + } + } + else { + await scrape(doc, url); + } +} + +function match_text(data, labels) { + // Z.debug(typeof(data)); + if (Array.isArray(labels)) { + var value = labels.find( + function (element, index, array) { + data.get(element); + } + ); + } else { + var value = data.get(labels); + } + if (!value || value == "**") { + return ""; + } + else { + return value; + } +} + +function match_text_type(type) { + /* 音像电子 */ + if (type.includes('ele')) { + var type_container; + type_container.medium = "CD"; + if (type.includes('marc')) { + // 馆藏条目无“著作权人”字段 + // https://pdc.capub.cn/search.html#/detail?id=qketqfp26hwqthuwmwi6dzr4hu27o2efur5pu6ms5szvi6oasvqa&from=1&type=marc_ele + type_container.archiveLocation = "馆藏"; + } + else if (type.includes('isbn')) { + // https://pdc.capub.cn/search.html#/detail?id=vhtadivummqsacsc5ygdxljzrsmvrevrgwvg47sjxodgfzgcx5qa&from=1&type=isbn_ele + type_container.archiveLocation = "ISBN"; + type_container.rights = match_text(data = meta_all, labels = "著作权人"); + } + /* 图书 */ + } else { + type_container.medium = ""; + if (type.includes('cip')) { + type_container.archiveLocation = "CIP"; + } + else if (type.includes('marc')) { + type_container.archiveLocation = "馆藏"; + } + else if (type.includes('isbn')) { + type_container.archiveLocation = "ISBN"; + } + } + return type_container; +} + +function match_text_creators(data, labels) { + // 作者带有“等” + // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn + const surffix_patten = ["[编|原]?著", "主?编", "等"]; + var creators_raw = []; + var creators_zh = match_text(data, labels); + // Z.debug(creators_zh); + for (const surffix of surffix_patten) { + creators_zh = creators_zh.replace(new RegExp(`(.+?)(,? ?\[?${surffix}\]?)\$`), "$1"); + } + creators_zh = creators_zh.split(", "); + var zhnamesplit = Z.getHiddenPref('zhnamesplit'); + for (let i = 0; i < creators_zh.length; i++) { + let creator = creators_zh[i]; + creator = ZU.trimInternal(creator.toString()); + /* 英文译名一律不拆分 */ + if (creator.search(/[A-Za-z]/) !== -1) { + // 英文名去除国籍标识 + creator = creator.replace(/\([\u4e00-\u9fa5]+\)/, ""); + // 保留中英对照形式供用户参考 + creators_raw.push(creator); + // 英文名去除英文原名 + creator = creator.replace(/ ?\(.+\)/, ""); + creator = { + "lastName": creator, + "creatorType": "autor", + }; + // Z.debug(creator); + } + /* 中文名根据配置决定是否拆分 */ + else { + if (zhnamesplit === undefined || zhnamesplit) { + // zhnamesplit is true, split firstname and lastname. + // Chinese name. first character is last name, the rest are first name + // Z.debug(creator); + creator = { + "firstName": creator.substr(1), + "lastName": creator.charAt(0), + "creatorType": "autor" + }; + } + else { + creator = { + "lastName": "creator", + "creatorType": "autor" + }; + } + } + creators_zh[i] = creator; + } + creators_raw.length > 0 ? creators_raw.join("; ") : ""; + return [creators_zh, creators_raw]; +} + +function match_text_lang(data, labels) { + var language_flag = match_text(data, labels); + let lang_map = { + "chi": "zh-CN", + "eng": "en-US" + }; + if (lang_map.hasOwnProperty(language_flag)) { + return lang_map[language_flag]; + } + else { + return language_flag; + } +} + +async function scrape_multi(postdata) { + Z.debug(postdata); + postdata = JSON.parse(postdata); + Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); + ZU.doPost( + "https://pdc.capub.cn/api/index/bookDetail", + `id=${postdata.id}&searchType=${postdata.type}`, + function (postresult) { + Z.debug(postresult); + postresult = JSON.parse(postresult); + var statue = postresult["code"] + if (statue == "0") { + ciphertext = JSON.parse(ciphertext)["result"]; + ciphertext = aescbc.base64.toBytes(ciphertext); + var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); + var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); + var cbc = new aescbc.CBC(key, iv); + var bookdata = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); + bookdata = new Map(Object.entries(JSON.parse(bookdata))); + var newItem = new Z.Item("book"); + var key_map = { + "title": "firstbookname", + "abstractNote": ["contentsummary", "ontentabstract"], + "series": "volumename", + "seriesNumber": "volumeno", + // "volume": "卷次", + // "numberOfVolumes": "总卷数", + "edition": "edition", + "place": "publisheradd", + "publisher": "publisher", + "date": ["publishingdate", "publishyear", "publishingyear"], + // "numPages": "总页数", + "ISBN": "isbn", + // "shortTitle": "短标题", + // "accessDate": "访问时间", + // "archive": "档案", + // "archiveLocation": "存档位置", + // "libraryCatalog": "文库编目", + "callNumber": "sort", + // "rights": "版权", + // "extra": "其他", + "suite": "secondbookname", + }; + for (const key in key_map) { + if (Object.hasOwnProperty.call(key_map, key)) { + newItem[key] = match_text(data = bookdata, labels = key_map[key]); + } + }; + newItem = Object.assign(newItem, match_text_type(postdata.type)); + newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), + newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; + newItem.creators_raw = match_text_creators(data = bookdata, labels = firstauthor)[1]; + newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, + newItem.tags.push({ "tag": match_text(data = meta_all, labels = "keyword") }); + // 还有一些未能识别的属性 + // { + // "applydate": "**", + // "approveno": "2005124403", + // "auditDate": "**", + // "author": "**", + // "authorintroduce": "**", + // "authorother": "**", + // "beginprintnum": "**", + // "bookbinding": "**", + // "bookformat": "**", + // "bookheight": "**", + // "bookmaker": "**", + // "bookprice": "58", + // "booksize": "**", + // "bookweight": "**", + // "capacity": "**", + // "capacityunit": "**", + // "carriertype": "**", + // "cate": "**", + // "cate1": "**", + // "cate2": "**", + // "cipPages": "**", + // "cipPrintbooks": "**", + // "cipid": "2005109250980000", + // "cn": "**", + // "contentabstract": "**", + // "contentsummary": "本书是《朗文少儿语音》4B。", + // "contenttype": "**", + // "copyrightno": "**", + // "copyrightor": "**", + // "createdate": "**", + // "dimensions": "**", + // "edition": "**", + // "fAuthor": "[\"(美)邦登\"]", + // "f_iamges": [ + // "https://pdc.capub.cn/profile/default_cover.png?t=20191216&size=800x800&t=20231002222855" + // ], + // "firstauthor": "(美) 邦登 (Bunton,J.) , 著", + // "firstauthorV": "**", + // "firstbookname": "朗文少儿语音", + // "frequencynote": "**", + // "id": "2005109250980000", + // "image": "https://pdc.capub.cn/profile/default_cover.png?t=20191216", + // "isbn": "7-5062-7945-2", + // "isrc": "**", + // "issn": "**", + // "issuer": "**", + // "jdcate1": "**", + // "jdcate2": "**", + // "keyword": "英语,美国-语音-儿童教育-教材", + // "link": "", + // "made": "**", + // "name": "**", + // "originalbookname": "**", + // "otherauthor": "**", + // "pdf": "", + // "postissuenum": "**", + // "pricesign": "**", + // "printinfo": " 朗文少儿语音 : 美语版. 4B / (美) 邦登 \n(Bunton,J.) 著. -- 北京 : 世界图书出版公司北京公司\n, 2005.10 \n\n ISBN 7-5062-7945-2\n \n Ⅰ. ①朗… Ⅱ. ①邦… Ⅲ. ①英语,美国-语音-儿\n童教育-教材 Ⅳ. ①H311\n \n 中国版本图书馆CIP数据核字(2005)第124403号", + // "printnum": "**", + // "printnumat": "**", + // "printnumber": "**", + // "province": "**", + // "psize": "**", + // "publisher": "世界图书出版公司北京公司", + // "publisheradd": "北京", + // "publishingdate": "2005.10", + // "publishingday": "**", + // "publishingmonth": "10", + // "publishingyear": "2005", + // "publishmethod": "**", + // "publishplacetranslate": "**", + // "publishtime": "**", + // "publishtype": "**", + // "publishunittranslate": "**", + // "publishyear": "2005", + // "sort": "H311", + // "subbookname": "美语版", + // "t": "cip", + // "targetreader": "**", + // "topicname": "**", + // "totalprintnum": "**", + // "type": "**", + // "volumeno": "4B", + // "words": "**", + // "worklanguage": "**" + // } + newItem.complete(); + } + else { + return false; + } + } + ) +} + +async function scrape(doc, url = doc.location.href) { + // Z.debug(url); + Z.debug(doc); + var keys_values = ZU.xpath(doc, "//div[@class='table_wrap']/table/tr/td"); + var meta_all = new Map(); + for (let i = 0; i < keys_values.length; i += 2) { + meta_all.set(keys_values[i].innerText, keys_values[i + 1].innerText); + } + var newItem = new Z.Item("book"); + // 标题变为「选题名称」 + // https://pdc.capub.cn/search.html#/detail?id=3xfbatmnh3626ppgzvztast2odbumgsdujt3eejchz4ovfsqrnfq&from=1&type=isbn_ele + newItem.title = match_text(data = meta_all, labels = ["正书名", "电子音像制品名", "选题名称"]); + newItem.creators = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[0]; + newItem.creators_raw = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[1]; + newItem.language = match_text_lang(data = meta_all, labels = "正文语种"); + var type = new URL(url.replace('#', '')).searchParams.get('type'); + newItem = Object.assign(newItem, match_text_type(type)); + // Z.debug(meta_all); + Z.debug(type); + newItem.abstractNote = match_text(data = meta_all, labels = "内容摘要"); + newItem.series = match_text(data = meta_all, labels = "分册名"); + newItem.seriesNumber = match_text(data = meta_all, labels = "分册号"); + // "volume": "卷次", + // "numberOfVolumes": "总卷数", + // "edition": "版本", + newItem.place = match_text(data = meta_all, labels = "出版地"); + newItem.publisher = match_text(data = meta_all, labels = "出版单位"); + newItem.date = match_text(data = meta_all, labels = "出版时间"); + // "numPages": "总页数", + newItem.ISBN = match_text(data = meta_all, labels = "ISBN"); + + // "shortTitle": "短标题", + newItem.url = url; + // "accessDate": "访问时间", + // "archive": "档案", + // "libraryCatalog": "文库编目", + newItem.callNumber = match_text(data = meta_all, labels = "中图法分类"); + newItem.tags.push({ "tag": match_text(data = meta_all, labels = "主题词") }); + // 丛书名示 + // https://pdc.capub.cn/search.html#/detail?id=6fvn57xzq2kxf7qldopfgfhcr3svtkp6n7a23d7djxgkt6gmpsbxsgvyspiasyexnlbqn6ffm62mw&from=1&type=cip + newItem.suite = match_text(data = meta_all, labels = "丛书名"); + newItem.complete(); +} + +// below codes are modified from https://github.com/ricmoo/aes-js, Thank macoo for his efforts. +// I have ported the code required for this project from his work. +function coerceArray(arg, copy) { + // ArrayBuffer view + if (arg.buffer && arg.name === 'Uint8Array') { + if (copy) { + if (arg.slice) { + arg = arg.slice(); + } else { + arg = Array.prototype.slice.call(arg); + } + } + return arg; + } + + // It's an array; check it is a valid representation of a byte + if (Array.isArray(arg)) { + if (!checkInts(arg)) { + throw new Error('Array contains invalid value: ' + arg); + } + + return new Uint8Array(arg); + } + + // Something else, but behaves like an array (maybe a Buffer? Arguments?) + if (checkInt(arg.length) && checkInts(arg)) { + return new Uint8Array(arg); + } + + throw new Error('unsupported array-like object'); +} + +function createArray(length) { + return new Uint8Array(length); +} + +function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { + if (sourceStart != null || sourceEnd != null) { + if (sourceArray.slice) { + sourceArray = sourceArray.slice(sourceStart, sourceEnd); + } else { + sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); + } + } + targetArray.set(sourceArray, targetStart); +} + +var Utf8 = (function () { + function toBytes(text) { + var result = [], i = 0; + text = encodeURI(text); + while (i < text.length) { + var c = text.charCodeAt(i++); + + // if it is a % sign, encode the following 2 bytes as a hex value + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)) + i += 2; + + // otherwise, just the actual byte + } else { + result.push(c) + } + } + + return coerceArray(result); + } + + function fromBytes(bytes) { + var result = [], i = 0; + + while (i < bytes.length) { + var c = bytes[i]; + + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } else if (c > 191 && c < 224) { + result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); + i += 2; + } else { + result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); + i += 3; + } + } + + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } +})(); + +// The base64 comes from https://developer.mozilla.org/zh-CN/docs/Glossary/Base64#%E2%80%9Cunicode_%E9%97%AE%E9%A2%98%E2%80%9D +var Base64 = (function () { + // Array of bytes to Base64 string decoding + function b64ToUint6(nChr) { + return nChr > 64 && nChr < 91 + ? nChr - 65 + : nChr > 96 && nChr < 123 + ? nChr - 71 + : nChr > 47 && nChr < 58 + ? nChr + 4 + : nChr === 43 + ? 62 + : nChr === 47 + ? 63 + : 0; + } + + function decBase64ToArr(sBase64, nBlocksSize) { + const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, ""); // Remove any non-base64 characters, such as trailing "=", whitespace, and more. + const nInLen = sB64Enc.length; + const nOutLen = nBlocksSize + ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize + : (nInLen * 3 + 1) >> 2; + const taBytes = new Uint8Array(nOutLen); + + let nMod3; + let nMod4; + let nUint24 = 0; + let nOutIdx = 0; + for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) { + nMod4 = nInIdx & 3; + nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (6 * (3 - nMod4)); + if (nMod4 === 3 || nInLen - nInIdx === 1) { + nMod3 = 0; + while (nMod3 < 3 && nOutIdx < nOutLen) { + taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255; + nMod3++; + nOutIdx++; + } + nUint24 = 0; + } + } + + return taBytes; + } + + /* Base64 string to array encoding */ + function uint6ToB64(nUint6) { + return nUint6 < 26 + ? nUint6 + 65 + : nUint6 < 52 + ? nUint6 + 71 + : nUint6 < 62 + ? nUint6 - 4 + : nUint6 === 62 + ? 43 + : nUint6 === 63 + ? 47 + : 65; + } + + function encArrToBase64(aBytes) { + let nMod3 = 2; + let sB64Enc = ""; + + const nLen = aBytes.length; + let nUint24 = 0; + for (let nIdx = 0; nIdx < nLen; nIdx++) { + nMod3 = nIdx % 3; + // To break your base64 into several 80-character lines, add: + // if (nIdx > 0 && ((nIdx * 4) / 3) % 76 === 0) { + // sB64Enc += "\r\n"; + // } + + nUint24 |= aBytes[nIdx] << ((16 >>> nMod3) & 24); + if (nMod3 === 2 || aBytes.length - nIdx === 1) { + sB64Enc += String.fromCodePoint( + uint6ToB64((nUint24 >>> 18) & 63), + uint6ToB64((nUint24 >>> 12) & 63), + uint6ToB64((nUint24 >>> 6) & 63), + uint6ToB64(nUint24 & 63), + ); + nUint24 = 0; + } + } + return ( + sB64Enc.substring(0, sB64Enc.length - 2 + nMod3) + + (nMod3 === 2 ? "" : nMod3 === 1 ? "=" : "==") + ); + } + return { + toBytes: decBase64ToArr, + fromBytes: encArrToBase64 + } +})(); + +function pkcs7pad(data) { + data = coerceArray(data, true); + var padder = 16 - (data.length % 16); + var result = createArray(data.length + padder); + copyArray(data, result); + for (var i = data.length; i < result.length; i++) { + result[i] = padder; + } + return result; +} + +function pkcs7strip(data) { + data = coerceArray(data, true); + if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + + var padder = data[data.length - 1]; + if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + + var length = data.length - padder; + for (var i = 0; i < padder; i++) { + if (data[length + i] !== padder) { + throw new Error('PKCS#7 invalid padding byte'); + } + } + + var result = createArray(length); + copyArray(data, result, 0, 0, length); + return result; +} + +// Number of rounds by keysize +var numberOfRounds = { 16: 10, 24: 12, 32: 14 } + +// Round constant words +var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; + +// S-box and Inverse S-box (S is for Substitution) +var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; +var Si = [0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; + +// Transformations for encryption +var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; +var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; +var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; +var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; + +// Transformations for decryption +var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; +var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; +var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; +var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; + +// Transformations for decryption key expansion +var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; +var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; +var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; +var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; + +function convertToInt32(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i += 4) { + result.push( + (bytes[i] << 24) | + (bytes[i + 1] << 16) | + (bytes[i + 2] << 8) | + bytes[i + 3] + ); + } + return result; +} + +var AES = function (key) { + if (!(this instanceof AES)) { + throw Error('AES must be instanitated with `new`'); + } + + Object.defineProperty(this, 'key', { + value: coerceArray(key, true) + }); + + this._prepare(); +} + +AES.prototype._prepare = function () { + + var rounds = numberOfRounds[this.key.length]; + if (rounds == null) { + throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); + } + + // encryption round keys + this._Ke = []; + + // decryption round keys + this._Kd = []; + + for (var i = 0; i <= rounds; i++) { + this._Ke.push([0, 0, 0, 0]); + this._Kd.push([0, 0, 0, 0]); + } + + var roundKeyCount = (rounds + 1) * 4; + var KC = this.key.length / 4; + + // convert the key into ints + var tk = convertToInt32(this.key); + + // copy values into round key arrays + var index; + for (var i = 0; i < KC; i++) { + index = i >> 2; + this._Ke[index][i % 4] = tk[i]; + this._Kd[rounds - index][i % 4] = tk[i]; + } + + // key expansion (fips-197 section 5.2) + var rconpointer = 0; + var t = KC, tt; + while (t < roundKeyCount) { + tt = tk[KC - 1]; + tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ + (S[(tt >> 8) & 0xFF] << 16) ^ + (S[tt & 0xFF] << 8) ^ + S[(tt >> 24) & 0xFF] ^ + (rcon[rconpointer] << 24)); + rconpointer += 1; + + // key expansion (for non-256 bit) + if (KC != 8) { + for (var i = 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + + // key expansion for 256-bit keys is "slightly different" (fips-197) + } else { + for (var i = 1; i < (KC / 2); i++) { + tk[i] ^= tk[i - 1]; + } + tt = tk[(KC / 2) - 1]; + + tk[KC / 2] ^= (S[tt & 0xFF] ^ + (S[(tt >> 8) & 0xFF] << 8) ^ + (S[(tt >> 16) & 0xFF] << 16) ^ + (S[(tt >> 24) & 0xFF] << 24)); + + for (var i = (KC / 2) + 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + } + + // copy values into round key arrays + var i = 0, r, c; + while (i < KC && t < roundKeyCount) { + r = t >> 2; + c = t % 4; + this._Ke[r][c] = tk[i]; + this._Kd[rounds - r][c] = tk[i++]; + t++; + } + } + + // inverse-cipher-ify the decryption round key (fips-197 section 5.3) + for (var r = 1; r < rounds; r++) { + for (var c = 0; c < 4; c++) { + tt = this._Kd[r][c]; + this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ + U2[(tt >> 16) & 0xFF] ^ + U3[(tt >> 8) & 0xFF] ^ + U4[tt & 0xFF]); + } + } +} + +AES.prototype.encrypt = function (plaintext) { + if (plaintext.length != 16) { + throw new Error('invalid plaintext size (must be 16 bytes)'); + } + + var rounds = this._Ke.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(plaintext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Ke[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T1[(t[i] >> 24) & 0xff] ^ + T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ + T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T4[t[(i + 3) % 4] & 0xff] ^ + this._Ke[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Ke[rounds][i]; + result[4 * i] = (S[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (S[t[(i + 3) % 4] & 0xff] ^ tt) & 0xff; + } + + return result; +} + +AES.prototype.decrypt = function (ciphertext) { + if (ciphertext.length != 16) { + throw new Error('invalid ciphertext size (must be 16 bytes)'); + } + + var rounds = this._Kd.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(ciphertext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Kd[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T5[(t[i] >> 24) & 0xff] ^ + T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ + T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T8[t[(i + 1) % 4] & 0xff] ^ + this._Kd[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Kd[rounds][i]; + result[4 * i] = (Si[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (Si[t[(i + 1) % 4] & 0xff] ^ tt) & 0xff; + } + + return result; +} + +/** + * Mode Of Operation - Cipher Block Chaining (CBC) + */ +var CBC = function (key, iv) { + if (!(this instanceof CBC)) { + throw Error('AES must be instanitated with `new`'); + } + + // this.description = "Cipher Block Chaining"; + // this.name = "cbc"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + + this._lastCipherblock = coerceArray(iv, true); + + this._aes = new AES(key); +} + +CBC.prototype.encrypt = function (plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + + for (var j = 0; j < 16; j++) { + block[j] ^= this._lastCipherblock[j]; + } + + this._lastCipherblock = this._aes.encrypt(block); + copyArray(this._lastCipherblock, ciphertext, i); + } + + return ciphertext; +} + +CBC.prototype.decrypt = function (ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + + for (var j = 0; j < 16; j++) { + plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; + } + + copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); + } + + return plaintext; +} + +function checkInt(value) { + return (parseInt(value) === value); +} + +function checkInts(arrayish) { + if (!checkInt(arrayish.length)) { return false; } + + for (var i = 0; i < arrayish.length; i++) { + if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { + return false; + } + } + + return true; +} + +var aescbc = { + AES: AES, + CBC: CBC, + utf8: Utf8, + base64: Base64, + pkcs7: { + padding: pkcs7pad, + strip: pkcs7strip + } + , +}; + +/** BEGIN TEST CASES **/ +var testCases = [ + { + "type": "web", + "url": "about:blank", + "detectedItemType": false, + "items": [] + } +] +/** END TEST CASES **/ From cd2371afb091182208f7dbce87129149b7bfc17b Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Tue, 3 Oct 2023 01:58:31 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=95=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=E4=B8=8D=E8=83=BD=E5=AF=BC=E5=85=A5=E7=9A=84bug?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 37 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 0feb4e68..cf694e18 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-02 16:57:05" + "lastUpdated": "2023-10-02 17:57:10" } /* @@ -146,17 +146,24 @@ async function doWeb(doc, url) { } function match_text(data, labels) { - // Z.debug(typeof(data)); + // Z.debug(labels); + var value = ""; if (Array.isArray(labels)) { - var value = labels.find( - function (element, index, array) { - data.get(element); + for (const label of labels) { + // Z.debug(`label = ${label}`); + if (data.get(label)) { + value = data.get(label); + // Z.debug(`get to ${data.get(label)}`) + break + } else { + continue } - ); + } } else { - var value = data.get(labels); + value = data.get(labels); } - if (!value || value == "**") { + // Z.debug(`value = ${value}`); + if (value == undefined || value == "**") { return ""; } else { @@ -165,9 +172,10 @@ function match_text(data, labels) { } function match_text_type(type) { + var type_container = {}; + // Z.debug(type); /* 音像电子 */ if (type.includes('ele')) { - var type_container; type_container.medium = "CD"; if (type.includes('marc')) { // 馆藏条目无“著作权人”字段 @@ -264,7 +272,6 @@ function match_text_lang(data, labels) { } async function scrape_multi(postdata) { - Z.debug(postdata); postdata = JSON.parse(postdata); Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); ZU.doPost( @@ -272,7 +279,7 @@ async function scrape_multi(postdata) { `id=${postdata.id}&searchType=${postdata.type}`, function (postresult) { Z.debug(postresult); - postresult = JSON.parse(postresult); + postresult = JSON.parse(postresult); var statue = postresult["code"] if (statue == "0") { ciphertext = JSON.parse(ciphertext)["result"]; @@ -313,10 +320,10 @@ async function scrape_multi(postdata) { }; newItem = Object.assign(newItem, match_text_type(postdata.type)); newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), - newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; + newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; newItem.creators_raw = match_text_creators(data = bookdata, labels = firstauthor)[1]; newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, - newItem.tags.push({ "tag": match_text(data = meta_all, labels = "keyword") }); + newItem.tags.push({ "tag": match_text(data = meta_all, labels = "keyword") }); // 还有一些未能识别的属性 // { // "applydate": "**", @@ -416,7 +423,6 @@ async function scrape_multi(postdata) { async function scrape(doc, url = doc.location.href) { // Z.debug(url); - Z.debug(doc); var keys_values = ZU.xpath(doc, "//div[@class='table_wrap']/table/tr/td"); var meta_all = new Map(); for (let i = 0; i < keys_values.length; i += 2) { @@ -426,13 +432,13 @@ async function scrape(doc, url = doc.location.href) { // 标题变为「选题名称」 // https://pdc.capub.cn/search.html#/detail?id=3xfbatmnh3626ppgzvztast2odbumgsdujt3eejchz4ovfsqrnfq&from=1&type=isbn_ele newItem.title = match_text(data = meta_all, labels = ["正书名", "电子音像制品名", "选题名称"]); + // Z.debug(newItem.title); newItem.creators = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[0]; newItem.creators_raw = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[1]; newItem.language = match_text_lang(data = meta_all, labels = "正文语种"); var type = new URL(url.replace('#', '')).searchParams.get('type'); newItem = Object.assign(newItem, match_text_type(type)); // Z.debug(meta_all); - Z.debug(type); newItem.abstractNote = match_text(data = meta_all, labels = "内容摘要"); newItem.series = match_text(data = meta_all, labels = "分册名"); newItem.seriesNumber = match_text(data = meta_all, labels = "分册号"); @@ -996,7 +1002,6 @@ var aescbc = { padding: pkcs7pad, strip: pkcs7strip } - , }; /** BEGIN TEST CASES **/ From 941a13eb0b2d1d5f3be7317b0c9d336ba0426b1a Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Tue, 3 Oct 2023 02:53:07 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=96=E6=96=87?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E8=A7=84=E5=88=99=EF=BC=9B=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=91=97=E4=BD=9C=E6=9D=83=E4=BA=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 41 ++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index cf694e18..0ef42489 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-02 17:57:10" + "lastUpdated": "2023-10-02 18:51:09" } /* @@ -131,7 +131,7 @@ async function doWeb(doc, url) { } // Z.debug(newItem); }; - // newItem = Object.assign(newItem, match_text_type(postdata.type)); + // newItem = Object.assign(newItem, match_text_type(data=bookdata, type=postdata.type)); newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), newItem.creators = match_text_creators(data = bookdata, labels = "firstauthor")[0]; newItem.creators_raw = match_text_creators(data = bookdata, labels = "firstauthor")[1]; @@ -171,7 +171,7 @@ function match_text(data, labels) { } } -function match_text_type(type) { +function match_text_type(data, type) { var type_container = {}; // Z.debug(type); /* 音像电子 */ @@ -185,7 +185,7 @@ function match_text_type(type) { else if (type.includes('isbn')) { // https://pdc.capub.cn/search.html#/detail?id=vhtadivummqsacsc5ygdxljzrsmvrevrgwvg47sjxodgfzgcx5qa&from=1&type=isbn_ele type_container.archiveLocation = "ISBN"; - type_container.rights = match_text(data = meta_all, labels = "著作权人"); + type_container.rights = match_text(data = data, labels = "著作权人"); } /* 图书 */ } else { @@ -206,7 +206,7 @@ function match_text_type(type) { function match_text_creators(data, labels) { // 作者带有“等” // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn - const surffix_patten = ["[编|原]?著", "主?编", "等"]; + const surffix_patten = ["[编|原]?著?绘", "主?编", "等"]; var creators_raw = []; var creators_zh = match_text(data, labels); // Z.debug(creators_zh); @@ -214,12 +214,13 @@ function match_text_creators(data, labels) { creators_zh = creators_zh.replace(new RegExp(`(.+?)(,? ?\[?${surffix}\]?)\$`), "$1"); } creators_zh = creators_zh.split(", "); + // Z.debug(creators_zh); var zhnamesplit = Z.getHiddenPref('zhnamesplit'); for (let i = 0; i < creators_zh.length; i++) { let creator = creators_zh[i]; creator = ZU.trimInternal(creator.toString()); /* 英文译名一律不拆分 */ - if (creator.search(/[A-Za-z]/) !== -1) { + if (creator.search(/[A-Za-z]/) !== -1 || creator.includes("·")) { // 英文名去除国籍标识 creator = creator.replace(/\([\u4e00-\u9fa5]+\)/, ""); // 保留中英对照形式供用户参考 @@ -318,9 +319,9 @@ async function scrape_multi(postdata) { newItem[key] = match_text(data = bookdata, labels = key_map[key]); } }; - newItem = Object.assign(newItem, match_text_type(postdata.type)); + newItem = Object.assign(newItem, match_text_type(data = meta_all, type = postdata.type)); newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), - newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; + newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; newItem.creators_raw = match_text_creators(data = bookdata, labels = firstauthor)[1]; newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, newItem.tags.push({ "tag": match_text(data = meta_all, labels = "keyword") }); @@ -431,13 +432,13 @@ async function scrape(doc, url = doc.location.href) { var newItem = new Z.Item("book"); // 标题变为「选题名称」 // https://pdc.capub.cn/search.html#/detail?id=3xfbatmnh3626ppgzvztast2odbumgsdujt3eejchz4ovfsqrnfq&from=1&type=isbn_ele - newItem.title = match_text(data = meta_all, labels = ["正书名", "电子音像制品名", "选题名称"]); + newItem.title = match_text(data = meta_all, labels = ["正书名", "音像电子制品名", "选题名称"]); // Z.debug(newItem.title); newItem.creators = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[0]; newItem.creators_raw = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[1]; newItem.language = match_text_lang(data = meta_all, labels = "正文语种"); var type = new URL(url.replace('#', '')).searchParams.get('type'); - newItem = Object.assign(newItem, match_text_type(type)); + newItem = Object.assign(newItem, match_text_type(data = meta_all, type = type)); // Z.debug(meta_all); newItem.abstractNote = match_text(data = meta_all, labels = "内容摘要"); newItem.series = match_text(data = meta_all, labels = "分册名"); @@ -1011,6 +1012,26 @@ var testCases = [ "url": "about:blank", "detectedItemType": false, "items": [] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=5j3ztk3ke3qubcvs7g4ecat7qsve4ieqm34wjat3zjxiowiwbosa&from=1&type=marc_ele", + "items": [ + { + "itemType": "book", + "title": "量子力学教程", + "creators": [], + "ISBN": "9787900254313", + "archiveLocation": "馆藏", + "libraryCatalog": "Publications Data Center - China", + "publisher": "科学出版社", + "url": "https://pdc.capub.cn/search.html#/detail?id=5j3ztk3ke3qubcvs7g4ecat7qsve4ieqm34wjat3zjxiowiwbosa&from=1&type=marc_ele", + "attachments": [], + "tags": [], + "notes": [], + "seeAlso": [] + } + ] } ] /** END TEST CASES **/ From a7c4dfbe12b9773d6b4c4785e3b8480279cda014 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Tue, 3 Oct 2023 16:39:24 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E8=A7=84=E8=8C=83=E4=B8=80=E5=A4=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 0ef42489..58476c00 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -100,7 +100,7 @@ async function doWeb(doc, url) { // Z.debug(postresult); // } // ) - /* var test = "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"; + // var test = "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"; ciphertext = aescbc.base64.toBytes(test); var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); From 217e9304cf54aa75d913e775910801c8bf013693 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Wed, 4 Oct 2023 23:08:06 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=B8=85=E7=90=86=E6=97=A0=E6=95=88?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=9B=E5=AE=9E=E7=8E=B0=E6=8A=93=E5=8F=96?= =?UTF-8?q?=E5=A4=9A=E6=9D=A1=E7=9B=AE=EF=BC=9B=E6=B7=BB=E5=8A=A0=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=A1=88=E4=BE=8B=EF=BC=9B=E6=9B=B4=E6=AD=A3=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 104 ++++++++++------------------ 1 file changed, 38 insertions(+), 66 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 58476c00..95de3b5a 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-02 18:51:09" + "lastUpdated": "2023-10-04 15:04:01" } /* @@ -89,55 +89,7 @@ async function doWeb(doc, url) { // Z.debug(items); if (!items) return; for (let postdata of Object.keys(items)) { - // await scrape_multi(postdata); - // Z.debug(postdata); - // postdata = JSON.parse(postdata); - // Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); - // await ZU.doPost( - // "https://pdc.capub.cn/api/index/bookDetail", - // `id=${postdata.id}&searchType=${postdata.type}`, - // function (postresult) { - // Z.debug(postresult); - // } - // ) - // var test = "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"; - ciphertext = aescbc.base64.toBytes(test); - var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); - var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); - var cbc = new aescbc.CBC(key, iv); - var bookdata = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); - bookdata = new Map(Object.entries(JSON.parse(bookdata))); - Z.debug(bookdata); - var newItem = new Z.Item("book"); - var key_map = { - "title": "firstbookname", - "abstractNote": ["contentsummary", "ontentabstract"], - "series": "volumename", - "seriesNumber": "volumeno", - "edition": "edition", - "place": "publisheradd", - "publisher": "publisher", - "date": ["publishingdate", "publishyear", "publishingyear"], - "ISBN": "isbn", - "callNumber": "sort", - "suite": "secondbookname", - }; - for (const key in key_map) { - if (Object.hasOwnProperty.call(key_map, key)) { - // Z.debug(key); - // Z.debug(key_map[key]); - newItem[key] = match_text(data = bookdata, labels = key_map[key]); - // Z.debug(newItem.key); - } - // Z.debug(newItem); - }; - // newItem = Object.assign(newItem, match_text_type(data=bookdata, type=postdata.type)); - newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), - newItem.creators = match_text_creators(data = bookdata, labels = "firstauthor")[0]; - newItem.creators_raw = match_text_creators(data = bookdata, labels = "firstauthor")[1]; - newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, - newItem.tags.push({ "tag": match_text(data = bookdata, labels = "keyword") }); - newItem.complete(); */ + await scrape_multi(postdata); } } else { @@ -274,16 +226,27 @@ function match_text_lang(data, labels) { async function scrape_multi(postdata) { postdata = JSON.parse(postdata); - Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); + // Z.debug(postdata); + // Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); + // 在Scaffold中无法调用下面这个对象,但大部分浏览器是支持的, + // 详见 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#browser_compatibility + let usersessionid = localStorage.getItem("user-token"); + // 在Scaffold调试时请用浏览器devtools从请求头找到Usersessionid手动复制粘贴到下方 + // let usersessionid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + // Z.debug(usersessionid); ZU.doPost( "https://pdc.capub.cn/api/index/bookDetail", `id=${postdata.id}&searchType=${postdata.type}`, function (postresult) { - Z.debug(postresult); + // Z.debug(postresult); + // postresult = JSON.stringify(postresult); + // postresult = JSON.parse(postresult); + // Z.debug(typeof(postresult)); postresult = JSON.parse(postresult); var statue = postresult["code"] + // Z.debug(typeof(statue)); if (statue == "0") { - ciphertext = JSON.parse(ciphertext)["result"]; + var ciphertext = postresult["result"]; ciphertext = aescbc.base64.toBytes(ciphertext); var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); @@ -314,17 +277,18 @@ async function scrape_multi(postdata) { // "extra": "其他", "suite": "secondbookname", }; + // Z.debug(bookdata); for (const key in key_map) { if (Object.hasOwnProperty.call(key_map, key)) { newItem[key] = match_text(data = bookdata, labels = key_map[key]); } }; - newItem = Object.assign(newItem, match_text_type(data = meta_all, type = postdata.type)); - newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"), - newItem.creators = match_text_creators(data = bookdata, labels = firstauthor)[0]; - newItem.creators_raw = match_text_creators(data = bookdata, labels = firstauthor)[1]; - newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`, - newItem.tags.push({ "tag": match_text(data = meta_all, labels = "keyword") }); + newItem = Object.assign(newItem, match_text_type(data = bookdata, type = postdata.type)); + newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"); + newItem.creators = match_text_creators(data = bookdata, labels = "firstauthor")[0]; + newItem.creators_raw = match_text_creators(data = bookdata, labels = "firstauthor")[1]; + newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`; + newItem.tags.push({ "tag": match_text(data = bookdata, labels = "keyword") }); // 还有一些未能识别的属性 // { // "applydate": "**", @@ -418,7 +382,8 @@ async function scrape_multi(postdata) { else { return false; } - } + }, + { "Usersessionid": usersessionid } ) } @@ -462,6 +427,11 @@ async function scrape(doc, url = doc.location.href) { // 丛书名示 // https://pdc.capub.cn/search.html#/detail?id=6fvn57xzq2kxf7qldopfgfhcr3svtkp6n7a23d7djxgkt6gmpsbxsgvyspiasyexnlbqn6ffm62mw&from=1&type=cip newItem.suite = match_text(data = meta_all, labels = "丛书名"); + newItem.attachments.push({ + "url": url, + "title": "Snapshot", + "mimeType": "text/html" + }); newItem.complete(); } @@ -1005,14 +975,11 @@ var aescbc = { } }; + + + /** BEGIN TEST CASES **/ var testCases = [ - { - "type": "web", - "url": "about:blank", - "detectedItemType": false, - "items": [] - }, { "type": "web", "url": "https://pdc.capub.cn/search.html#/detail?id=5j3ztk3ke3qubcvs7g4ecat7qsve4ieqm34wjat3zjxiowiwbosa&from=1&type=marc_ele", @@ -1032,6 +999,11 @@ var testCases = [ "seeAlso": [] } ] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/quick?type=%E5%9B%BE%E4%B9%A6&search=%E5%89%AA%E7%BA%B8", + "items": "multiple" } ] /** END TEST CASES **/ From f05ea0bfe35204a6bfc0648c443bcb3d58b87486 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Wed, 4 Oct 2023 23:19:17 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E5=99=A8=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ data/data.json | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index da1e6d3e..42e5a0c8 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ + [国家图书馆文津搜索](http://find.nlc.cn/) -> [Wenjin.js](./translators/Wenjin.js) - [x] 抓取引文信息 - [x] 支持文献类型:图书,论文 ++ [国家版本馆版权数字中心](https://pdc.capub.cn/) -> [Publications Data Center - China.js](./Publications Data Center - China.js) + - [x] 抓取引文信息 + - [x] 多条目导出 + [ProQuest 学位论文全文检索平台](http://www.pqdtcn.com/) -> [ProQuestCN Thesis.js](<./translators/ProQuestCN Thesis.js>) - [x] 抓取引文信息 - [x] 支持文献类型:学位论文 diff --git a/data/data.json b/data/data.json index f27a8af0..d31c32e0 100644 --- a/data/data.json +++ b/data/data.json @@ -24,5 +24,6 @@ "dpaper": "中国科学院文献情报中心", "xiaoyuzhouFM": "小宇宙FM", "PKULaw": "北大法宝", - "China Judgements Online": "中国裁判文书网" + "China Judgements Online": "中国裁判文书网", + "Publications Data Center - China": "国家版本馆版权数据中心" } \ No newline at end of file From f4e0e0fbdc295045aeee26a7c80b248ec3341cb6 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Thu, 5 Oct 2023 02:13:39 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=BA=E5=90=8D?= =?UTF-8?q?=E6=B8=85=E6=B4=97=E7=AE=97=E6=B3=95=EF=BC=9B=E4=B8=BA=E6=AF=8F?= =?UTF-8?q?=E4=B8=80=E7=A7=8D=E6=9D=A1=E7=9B=AE=E7=B1=BB=E5=9E=8B=E9=83=BD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 209 ++++++++++++++++++++++++++-- 1 file changed, 198 insertions(+), 11 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 95de3b5a..c07c8d90 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-04 15:04:01" + "lastUpdated": "2023-10-04 18:12:02" } /* @@ -158,12 +158,15 @@ function match_text_type(data, type) { function match_text_creators(data, labels) { // 作者带有“等” // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn - const surffix_patten = ["[编|原]?著?绘", "主?编", "等"]; + const surffix_patten = ["编?著", "原?著","编?绘", "主?编", "等"]; var creators_raw = []; var creators_zh = match_text(data, labels); + creators_zh = creators_zh.replace(/[\[|\]]/g, ""); // Z.debug(creators_zh); for (const surffix of surffix_patten) { - creators_zh = creators_zh.replace(new RegExp(`(.+?)(,? ?\[?${surffix}\]?)\$`), "$1"); + if (creators_zh.match(new RegExp(`.+(?=(${surffix}))`))) { + creators_zh = creators_zh.match(new RegExp(`.+(?=${surffix})`))[0]; + } } creators_zh = creators_zh.split(", "); // Z.debug(creators_zh); @@ -978,22 +981,156 @@ var aescbc = { + + /** BEGIN TEST CASES **/ var testCases = [ { "type": "web", - "url": "https://pdc.capub.cn/search.html#/detail?id=5j3ztk3ke3qubcvs7g4ecat7qsve4ieqm34wjat3zjxiowiwbosa&from=1&type=marc_ele", + "url": "https://pdc.capub.cn/search.html#/quick?type=%E5%9B%BE%E4%B9%A6&search=%E5%89%AA%E7%BA%B8", + "items": "multiple" + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=o2py6lzfry3cnhuwmwi6dzr4hvthnu2xcvee2h7gzqylkgq3xvra&from=1&type=marc", + "items": [ + { + "itemType": "book", + "title": "结构化学", + "creators": [ + { + "firstName": "新义", + "lastName": "李", + "creatorType": "autor" + } + ], + "date": "2018.04", + "ISBN": "9787312044403", + "abstractNote": "本书分为原子结构与性质、分子结构与性质和晶体结构与性质三个部分,其主要特色是从微观上探析物质结构,通过模型认知化学原理,利用新媒体技术阐述物质的微观结构与宏观性质的相互关系。", + "archiveLocation": "馆藏", + "callNumber": "G634.83", + "language": "zh-CN", + "libraryCatalog": "Publications Data Center - China", + "place": "合肥", + "publisher": "中国科学技术大学出版社", + "url": "https://pdc.capub.cn/search.html#/detail?id=o2py6lzfry3cnhuwmwi6dzr4hvthnu2xcvee2h7gzqylkgq3xvra&from=1&type=marc", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], + "tags": [ + { + "tag": "结构化学" + } + ], + "notes": [], + "seeAlso": [] + } + ] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=lqnkn7225pikfse54xek4qe6bp3bjgrzlt5dmswezuiv5nahbq7q&from=1&type=marc", + "items": [ + { + "itemType": "book", + "title": "俄维大词典", + "creators": [ + { + "lastName": "孜亚依丁·艾则孜", + "creatorType": "autor" + } + ], + "date": "2012.09", + "ISBN": "9787228157433", + "abstractNote": "本书是俄维两种文字混合的工具书之一。本词典共收单字4万余条左右,短语,派生词,复合词4000余条,包括今年以来已进入人们日常生活的大量新词或新义。每个单字和词条释义都用最常用的意义来解释。", + "archiveLocation": "馆藏", + "callNumber": "H356", + "language": "rus;uig", + "libraryCatalog": "Publications Data Center - China", + "place": "乌鲁木齐", + "publisher": "新疆人民出版社", + "url": "https://pdc.capub.cn/search.html#/detail?id=lqnkn7225pikfse54xek4qe6bp3bjgrzlt5dmswezuiv5nahbq7q&from=1&type=marc", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], + "tags": [ + { + "tag": "俄语;对照词典" + } + ], + "notes": [], + "seeAlso": [] + } + ] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=e25o2y6oxxgsichz6ugozjmjacv647ksy3adn25ccazny3ghqrja&from=1&type=cip", + "items": [ + { + "itemType": "book", + "title": "朗文少儿语音", + "creators": [ + { + "lastName": " 戈登", + "creatorType": "autor" + }, + { + "lastName": " 孙", + "creatorType": "autor" + } + ], + "date": "2005.10", + "ISBN": "9787506279437", + "abstractNote": "本书是《朗文少儿语音》3B。", + "archiveLocation": "CIP", + "callNumber": "H311", + "libraryCatalog": "Publications Data Center - China", + "place": "北京", + "publisher": "世界图书出版公司北京公司", + "seriesNumber": "3B", + "url": "https://pdc.capub.cn/search.html#/detail?id=e25o2y6oxxgsichz6ugozjmjacv647ksy3adn25ccazny3ghqrja&from=1&type=cip", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], + "tags": [ + { + "tag": "英语,美国-语音-儿童教育-教材" + } + ], + "notes": [], + "seeAlso": [] + } + ] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=7dahxrzkhzanmop46ag7xrgmamkgn37ew2sdi5cnnilkbp73rrtq&from=1&type=marc_ele", "items": [ { "itemType": "book", - "title": "量子力学教程", + "title": "长征", "creators": [], - "ISBN": "9787900254313", + "ISBN": "9787883310471", "archiveLocation": "馆藏", "libraryCatalog": "Publications Data Center - China", - "publisher": "科学出版社", - "url": "https://pdc.capub.cn/search.html#/detail?id=5j3ztk3ke3qubcvs7g4ecat7qsve4ieqm34wjat3zjxiowiwbosa&from=1&type=marc_ele", - "attachments": [], + "publisher": "北京国家大剧院古典音乐有限责任公司出版", + "url": "https://pdc.capub.cn/search.html#/detail?id=7dahxrzkhzanmop46ag7xrgmamkgn37ew2sdi5cnnilkbp73rrtq&from=1&type=marc_ele", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], "tags": [], "notes": [], "seeAlso": [] @@ -1002,8 +1139,58 @@ var testCases = [ }, { "type": "web", - "url": "https://pdc.capub.cn/search.html#/quick?type=%E5%9B%BE%E4%B9%A6&search=%E5%89%AA%E7%BA%B8", - "items": "multiple" + "url": "https://pdc.capub.cn/search.html#/detail?id=bf6fudz5x2oxcxfcrydehnw3l4sdv7l5exokw5ef5nw4cgfvwa4q&from=1&type=isbn_ele", + "items": [ + { + "itemType": "book", + "title": "长征组歌——京剧音乐史诗", + "creators": [ + { + "firstName": "振强", + "lastName": "谢", + "creatorType": "autor" + } + ], + "ISBN": "9787887333315", + "archiveLocation": "ISBN", + "libraryCatalog": "Publications Data Center - China", + "publisher": "中国文联音像出版公司(中国文联出版社有限公司)", + "rights": "谢振强", + "url": "https://pdc.capub.cn/search.html#/detail?id=bf6fudz5x2oxcxfcrydehnw3l4sdv7l5exokw5ef5nw4cgfvwa4q&from=1&type=isbn_ele", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], + "tags": [], + "notes": [], + "seeAlso": [] + } + ] + }, + { + "type": "web", + "url": "https://pdc.capub.cn/search.html#/detail?id=ahvu2dxdy7sdhl6f2vgpe6taasmpnohq4tpnrgl3424yx2cr7xma&from=1&type=comics", + "items": [ + { + "itemType": "book", + "title": "列宁在一九一八", + "creators": [], + "libraryCatalog": "Publications Data Center - China", + "publisher": "上海人民美术出版社", + "url": "https://pdc.capub.cn/search.html#/detail?id=ahvu2dxdy7sdhl6f2vgpe6taasmpnohq4tpnrgl3424yx2cr7xma&from=1&type=comics", + "attachments": [ + { + "title": "Snapshot", + "mimeType": "text/html" + } + ], + "tags": [], + "notes": [], + "seeAlso": [] + } + ] } ] /** END TEST CASES **/ From 010dc484c8f9a1c614584c0ecc3d68fb364042c0 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Thu, 5 Oct 2023 02:17:45 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E8=A7=84=E8=8C=83README=E7=9A=84?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=86=99=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42e5a0c8..621e9dab 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ + [国家图书馆文津搜索](http://find.nlc.cn/) -> [Wenjin.js](./translators/Wenjin.js) - [x] 抓取引文信息 - [x] 支持文献类型:图书,论文 -+ [国家版本馆版权数字中心](https://pdc.capub.cn/) -> [Publications Data Center - China.js](./Publications Data Center - China.js) ++ [国家版本馆版权数字中心](https://pdc.capub.cn/) -> [Publications Data Center - China.js](<./Publications Data Center - China.js>) - [x] 抓取引文信息 - [x] 多条目导出 + [ProQuest 学位论文全文检索平台](http://www.pqdtcn.com/) -> [ProQuestCN Thesis.js](<./translators/ProQuestCN Thesis.js>) From a2b16fbc9cab0c9b6343e61570e2f1af3fd57796 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Sun, 15 Oct 2023 15:20:22 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E5=90=8D=E5=88=86=E5=89=B2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index c07c8d90..7e81f106 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -190,7 +190,7 @@ function match_text_creators(data, labels) { } /* 中文名根据配置决定是否拆分 */ else { - if (zhnamesplit === undefined || zhnamesplit) { + if ((zhnamesplit === undefined) ? true : zhnamesplit) { // zhnamesplit is true, split firstname and lastname. // Chinese name. first character is last name, the rest are first name // Z.debug(creator); From e6d25fb0c8e840fb6da5d08485c0766e1df3a9c5 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Mon, 16 Oct 2023 16:36:46 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=B7=B2=E5=BA=9F?= =?UTF-8?q?=E5=BC=83=E7=9A=84DoPost=EF=BC=9B=E8=A7=A3=E8=80=A6=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=87=BD=E6=95=B0=EF=BC=9B=E7=BB=9F=E4=B8=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=A3=8E=E6=A0=BC=EF=BC=9B=E7=BB=9F=E4=B8=80=E5=8D=95?= =?UTF-8?q?=E6=9D=A1=E7=9B=AE=E5=92=8C=E5=A4=9A=E6=9D=A1=E7=9B=AE=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 542 ++++++++++++---------------- 1 file changed, 228 insertions(+), 314 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 7e81f106..c8aa4411 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-04 18:12:02" + "lastUpdated": "2023-10-16 08:33:45" } /* @@ -37,31 +37,16 @@ function detectWeb(doc, url) { - var multi_flag = url.split(/[/,?]/)[4]; - if (multi_flag == 'quick') { + let multiFlag = url.split(/[/,?]/)[4]; + if (multiFlag == 'quick') { return "multiple"; } - else if (multi_flag == 'detail') { + else if (multiFlag == 'detail') { return "book"; } return false; } -function getTypeFromDoc(doc, row) { - let medium_type = ZU.xpath(doc, "//div[@class='data_classify']//div[@class='checkbox']/span[1]").map( - (element) => (element).className).indexOf("checkboxkey bcurrent"); - if (medium_type > 1) { - return "comic"; - } else { - let type = { - "CIP数据库": "cip", - "馆藏数据库": "marc", - "ISBN数据库": "isbn" - }[row.querySelector('.data_from span').innerText]; - return (medium_type == 0) ? type : `${type}_ele`; - } -} - function getSearchResults(doc, checkOnly) { var items = {}; var found = false; @@ -69,15 +54,28 @@ function getSearchResults(doc, checkOnly) { for (let row of rows) { let title = ZU.trimInternal(row.querySelector('.book_title').innerText); let id = row.querySelector('.ant-checkbox-input').value; - let type = getTypeFromDoc(doc, row); - let requestdata = `{"id":"${id}","type":"${type}"}`; + let type = (function (){ + let mediumType = ZU.xpath(doc, '//div[@class="data_classify"]//div[@class="checkbox"]/span[1]').map( + (element) => (element).className).indexOf('checkboxkey bcurrent'); + if (mediumType > 1) { + return 'comic'; + } else { + let type = { + "CIP数据库": "cip", + "馆藏数据库": "marc", + "ISBN数据库": "isbn" + }[row.querySelector('.data_from span').innerText]; + return (mediumType == 0) ? type : `${type}_ele`; + } + })(); + let postData = `{"id":"${id}","type":"${type}"}`; if (!id || !type || !title) { continue } else { if (checkOnly) return true; found = true; - items[requestdata] = title; + items[postData] = title; } } return found ? items : false; @@ -88,348 +86,258 @@ async function doWeb(doc, url) { let items = await Zotero.selectItems(getSearchResults(doc, false)); // Z.debug(items); if (!items) return; - for (let postdata of Object.keys(items)) { - await scrape_multi(postdata); + for (let postData of Object.keys(items)) { + await scrapeMulti(postData); } } else { - await scrape(doc, url); + await scrapeSingle(doc, url); } } -function match_text(data, labels) { - // Z.debug(labels); - var value = ""; - if (Array.isArray(labels)) { - for (const label of labels) { - // Z.debug(`label = ${label}`); - if (data.get(label)) { - value = data.get(label); - // Z.debug(`get to ${data.get(label)}`) - break - } else { - continue - } - } - } else { - value = data.get(labels); - } - // Z.debug(`value = ${value}`); - if (value == undefined || value == "**") { - return ""; - } - else { - return value; - } -} - -function match_text_type(data, type) { - var type_container = {}; +function matchArchiveLocation(type) { + var cell = {}; // Z.debug(type); /* 音像电子 */ if (type.includes('ele')) { - type_container.medium = "CD"; + cell.medium = "CD"; if (type.includes('marc')) { // 馆藏条目无“著作权人”字段 // https://pdc.capub.cn/search.html#/detail?id=qketqfp26hwqthuwmwi6dzr4hu27o2efur5pu6ms5szvi6oasvqa&from=1&type=marc_ele - type_container.archiveLocation = "馆藏"; + cell.archiveLocation = "馆藏"; } else if (type.includes('isbn')) { // https://pdc.capub.cn/search.html#/detail?id=vhtadivummqsacsc5ygdxljzrsmvrevrgwvg47sjxodgfzgcx5qa&from=1&type=isbn_ele - type_container.archiveLocation = "ISBN"; - type_container.rights = match_text(data = data, labels = "著作权人"); + cell.archiveLocation = "ISBN"; } /* 图书 */ } else { - type_container.medium = ""; + cell.medium = ''; if (type.includes('cip')) { - type_container.archiveLocation = "CIP"; + cell.archiveLocation = "CIP"; } else if (type.includes('marc')) { - type_container.archiveLocation = "馆藏"; + cell.archiveLocation = "馆藏"; } else if (type.includes('isbn')) { - type_container.archiveLocation = "ISBN"; + cell.archiveLocation = "ISBN"; } } - return type_container; + return cell; } -function match_text_creators(data, labels) { - // 作者带有“等” - // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn - const surffix_patten = ["编?著", "原?著","编?绘", "主?编", "等"]; - var creators_raw = []; - var creators_zh = match_text(data, labels); - creators_zh = creators_zh.replace(/[\[|\]]/g, ""); - // Z.debug(creators_zh); - for (const surffix of surffix_patten) { - if (creators_zh.match(new RegExp(`.+(?=(${surffix}))`))) { - creators_zh = creators_zh.match(new RegExp(`.+(?=${surffix})`))[0]; - } - } - creators_zh = creators_zh.split(", "); +function matchCreator(creator, raw = false) { // Z.debug(creators_zh); var zhnamesplit = Z.getHiddenPref('zhnamesplit'); - for (let i = 0; i < creators_zh.length; i++) { - let creator = creators_zh[i]; - creator = ZU.trimInternal(creator.toString()); - /* 英文译名一律不拆分 */ - if (creator.search(/[A-Za-z]/) !== -1 || creator.includes("·")) { - // 英文名去除国籍标识 - creator = creator.replace(/\([\u4e00-\u9fa5]+\)/, ""); - // 保留中英对照形式供用户参考 - creators_raw.push(creator); - // 英文名去除英文原名 - creator = creator.replace(/ ?\(.+\)/, ""); + creator = ZU.trimInternal(creator.toString()); + /* 英文译名一律不拆分 */ + if (creator.search(/[A-Za-z]/) !== -1 || creator.includes('·')) { + // 英文名去除国籍标识 + creator = creator.replace(/\([\u4e00-\u9fa5]+\)/, ''); + // 保留中英对照形式供用户参考 + if (raw) return creator; + // 英文名去除英文原名 + creator = creator.replace(/ ?\(.+\)/, ""); + creator = { + "lastName": creator, + "creatorType": "autor", + }; + // Z.debug(creator); + } + /* 中文名根据配置决定是否拆分 */ + else { + if ((zhnamesplit === undefined) ? true : zhnamesplit) { + // zhnamesplit is true, split firstname and lastname. + // Chinese name. first character is last name, the rest are first name + // Z.debug(creator); creator = { - "lastName": creator, - "creatorType": "autor", + "firstName": creator.substr(1), + "lastName": creator.charAt(0), + "creatorType": "autor" }; - // Z.debug(creator); } - /* 中文名根据配置决定是否拆分 */ else { - if ((zhnamesplit === undefined) ? true : zhnamesplit) { - // zhnamesplit is true, split firstname and lastname. - // Chinese name. first character is last name, the rest are first name - // Z.debug(creator); - creator = { - "firstName": creator.substr(1), - "lastName": creator.charAt(0), - "creatorType": "autor" - }; - } - else { - creator = { - "lastName": "creator", - "creatorType": "autor" - }; + creator = { + "lastName": "creator", + "creatorType": "autor" + }; + } + } + return creator; +} + +const FIELDMAP = { + title: { + labels: ['正书名', '音像电子制品名', '选题名称'], + keys: ['firstbookname', 'originalbookname'] + }, + abstractNote: { + labels: ['内容摘要'], + keys: ['contentsummary', 'ontentabstract'] + }, + series: { + labels: ['分册名'], + keys: ['volumename'] + }, + seriesNumber: { + labels: ['分册号'], + keys: ['volumeno'] + }, + edition: { + labels: ['版次'], + keys: ['edition'] + }, + place: { + labels: ['出版地', '原出版地'], + keys: ['publisheradd', 'publishplacetranslate'] + }, + publisher: { + labels: ['出版单位', '原出版商'], + keys: ['publisher', 'publishunittranslate'] + }, + date: { + labels: ['出版时间'], + keys: ['publishingdate', 'publishyear', 'publishingyear', 'createdate'] + }, + language: { + labels: ['正文语种', '语种', '文种'], + keys: ['textlangue', 'worklanguage'], + callback: function (text) { + return (text == 'chi') ? 'zh-CN' : 'en-US'; + } + }, + ISBN: { + labels: ['ISBN'], + keys: ['isbn'] + }, + callNumber: { + labels: ['中图法分类'], + keys: ['sort'] + }, + rights: { + labels: ['著作权人', '制作单位'], + keys: ['copyrightor', 'made'] + }, + creators: { + labels: ['作者', '著作权人', '其他著作者'], + keys: ['firstauthor', 'copyrightor', 'authorother'], + callback: function (creators) { + // 作者带有“等” + // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn + const surffix_patten = ['编?著', '原?著','编?绘', '主?编', '等']; + creators = creators.replace(/[\[\]]/g, ''); + for (const surffix of surffix_patten) { + if (creators.match(new RegExp(`.+(?=(${surffix}))`))) { + creators = creators.match(new RegExp(`.+(?=${surffix})`))[0]; + } } + return creators.split(/,\s/g).map((creator) => (matchCreator(creator))); + } + }, + tags: { + labels: ['主题词'], + keys: ['keyword'], + callback: function (text) { + return [{tag: text}]; } - creators_zh[i] = creator; + }, + // 丛书名示例 + // https://pdc.capub.cn/search.html#/detail?id=6fvn57xzq2kxf7qldopfgfhcr3svtkp6n7a23d7djxgkt6gmpsbxsgvyspiasyexnlbqn6ffm62mw&from=1&type=cip + suite: { + labels: ['丛书名'], + keys: ['secondbookname'] } - creators_raw.length > 0 ? creators_raw.join("; ") : ""; - return [creators_zh, creators_raw]; } -function match_text_lang(data, labels) { - var language_flag = match_text(data, labels); - let lang_map = { - "chi": "zh-CN", - "eng": "en-US" - }; - if (lang_map.hasOwnProperty(language_flag)) { - return lang_map[language_flag]; +class Data extends Map { + get(keys) { + var value; + for (const key of keys) { + value = super.get(key) + if (value) break; + } + return value ? value : ''; } - else { - return language_flag; +} + +async function scrapeSingle(doc, url = doc.location.href) { + // Z.debug(url); + var tableCell = ZU.xpath(doc, "//div[@class='table_wrap']/table/tr/td"); + var tableData = new Data(); + for (let i = 0; i < tableCell.length; i += 2) { + tableData.set(tableCell[i].innerText, tableCell[i + 1].innerText); + } + // Z.debug(tableData); + var newItem = new Z.Item("book"); + var result = ''; + for (const field in FIELDMAP) { + const recipe = FIELDMAP[field]; + result = tableData.get(recipe.labels); + // Z.debug(`for field ${field}, I get \n${result}`); + if (recipe.callback) { + result = recipe.callback(result); + } + newItem[field] = result; } + + let type = new URL(url.replace('#', '')).searchParams.get('type'); + newItem = Object.assign(newItem, matchArchiveLocation(type)); + newItem.url = url; + newItem.attachments.push({ + "url": url, + "title": "Snapshot", + "mimeType": "text/html" + }); + newItem.complete(); } -async function scrape_multi(postdata) { - postdata = JSON.parse(postdata); - // Z.debug(postdata); - // Z.debug(`id=${postdata.id}&searchType=${postdata.type}`); +async function scrapeMulti(postData) { + postData = JSON.parse(postData); + // Z.debug(postData); + // Z.debug(`id=${postData.id}&searchType=${postData.type}`); // 在Scaffold中无法调用下面这个对象,但大部分浏览器是支持的, // 详见 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#browser_compatibility let usersessionid = localStorage.getItem("user-token"); // 在Scaffold调试时请用浏览器devtools从请求头找到Usersessionid手动复制粘贴到下方 // let usersessionid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // Z.debug(usersessionid); - ZU.doPost( - "https://pdc.capub.cn/api/index/bookDetail", - `id=${postdata.id}&searchType=${postdata.type}`, - function (postresult) { - // Z.debug(postresult); - // postresult = JSON.stringify(postresult); - // postresult = JSON.parse(postresult); - // Z.debug(typeof(postresult)); - postresult = JSON.parse(postresult); - var statue = postresult["code"] - // Z.debug(typeof(statue)); - if (statue == "0") { - var ciphertext = postresult["result"]; - ciphertext = aescbc.base64.toBytes(ciphertext); - var key = aescbc.utf8.toBytes("zg35ws76swnxz679"); - var iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); - var cbc = new aescbc.CBC(key, iv); - var bookdata = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); - bookdata = new Map(Object.entries(JSON.parse(bookdata))); - var newItem = new Z.Item("book"); - var key_map = { - "title": "firstbookname", - "abstractNote": ["contentsummary", "ontentabstract"], - "series": "volumename", - "seriesNumber": "volumeno", - // "volume": "卷次", - // "numberOfVolumes": "总卷数", - "edition": "edition", - "place": "publisheradd", - "publisher": "publisher", - "date": ["publishingdate", "publishyear", "publishingyear"], - // "numPages": "总页数", - "ISBN": "isbn", - // "shortTitle": "短标题", - // "accessDate": "访问时间", - // "archive": "档案", - // "archiveLocation": "存档位置", - // "libraryCatalog": "文库编目", - "callNumber": "sort", - // "rights": "版权", - // "extra": "其他", - "suite": "secondbookname", - }; - // Z.debug(bookdata); - for (const key in key_map) { - if (Object.hasOwnProperty.call(key_map, key)) { - newItem[key] = match_text(data = bookdata, labels = key_map[key]); - } - }; - newItem = Object.assign(newItem, match_text_type(data = bookdata, type = postdata.type)); - newItem.language = match_text_lang(data = bookdata, labels = "worklanguage"); - newItem.creators = match_text_creators(data = bookdata, labels = "firstauthor")[0]; - newItem.creators_raw = match_text_creators(data = bookdata, labels = "firstauthor")[1]; - newItem.url = `https://pdc.capub.cn/search.html#/detail?id=${postdata.id}&from=1&type=${postdata.type}`; - newItem.tags.push({ "tag": match_text(data = bookdata, labels = "keyword") }); - // 还有一些未能识别的属性 - // { - // "applydate": "**", - // "approveno": "2005124403", - // "auditDate": "**", - // "author": "**", - // "authorintroduce": "**", - // "authorother": "**", - // "beginprintnum": "**", - // "bookbinding": "**", - // "bookformat": "**", - // "bookheight": "**", - // "bookmaker": "**", - // "bookprice": "58", - // "booksize": "**", - // "bookweight": "**", - // "capacity": "**", - // "capacityunit": "**", - // "carriertype": "**", - // "cate": "**", - // "cate1": "**", - // "cate2": "**", - // "cipPages": "**", - // "cipPrintbooks": "**", - // "cipid": "2005109250980000", - // "cn": "**", - // "contentabstract": "**", - // "contentsummary": "本书是《朗文少儿语音》4B。", - // "contenttype": "**", - // "copyrightno": "**", - // "copyrightor": "**", - // "createdate": "**", - // "dimensions": "**", - // "edition": "**", - // "fAuthor": "[\"(美)邦登\"]", - // "f_iamges": [ - // "https://pdc.capub.cn/profile/default_cover.png?t=20191216&size=800x800&t=20231002222855" - // ], - // "firstauthor": "(美) 邦登 (Bunton,J.) , 著", - // "firstauthorV": "**", - // "firstbookname": "朗文少儿语音", - // "frequencynote": "**", - // "id": "2005109250980000", - // "image": "https://pdc.capub.cn/profile/default_cover.png?t=20191216", - // "isbn": "7-5062-7945-2", - // "isrc": "**", - // "issn": "**", - // "issuer": "**", - // "jdcate1": "**", - // "jdcate2": "**", - // "keyword": "英语,美国-语音-儿童教育-教材", - // "link": "", - // "made": "**", - // "name": "**", - // "originalbookname": "**", - // "otherauthor": "**", - // "pdf": "", - // "postissuenum": "**", - // "pricesign": "**", - // "printinfo": " 朗文少儿语音 : 美语版. 4B / (美) 邦登 \n(Bunton,J.) 著. -- 北京 : 世界图书出版公司北京公司\n, 2005.10 \n\n ISBN 7-5062-7945-2\n \n Ⅰ. ①朗… Ⅱ. ①邦… Ⅲ. ①英语,美国-语音-儿\n童教育-教材 Ⅳ. ①H311\n \n 中国版本图书馆CIP数据核字(2005)第124403号", - // "printnum": "**", - // "printnumat": "**", - // "printnumber": "**", - // "province": "**", - // "psize": "**", - // "publisher": "世界图书出版公司北京公司", - // "publisheradd": "北京", - // "publishingdate": "2005.10", - // "publishingday": "**", - // "publishingmonth": "10", - // "publishingyear": "2005", - // "publishmethod": "**", - // "publishplacetranslate": "**", - // "publishtime": "**", - // "publishtype": "**", - // "publishunittranslate": "**", - // "publishyear": "2005", - // "sort": "H311", - // "subbookname": "美语版", - // "t": "cip", - // "targetreader": "**", - // "topicname": "**", - // "totalprintnum": "**", - // "type": "**", - // "volumeno": "4B", - // "words": "**", - // "worklanguage": "**" - // } - newItem.complete(); - } - else { - return false; - } - }, - { "Usersessionid": usersessionid } - ) -} - -async function scrape(doc, url = doc.location.href) { - // Z.debug(url); - var keys_values = ZU.xpath(doc, "//div[@class='table_wrap']/table/tr/td"); - var meta_all = new Map(); - for (let i = 0; i < keys_values.length; i += 2) { - meta_all.set(keys_values[i].innerText, keys_values[i + 1].innerText); - } + let postResult = await requestJSON( + 'https://pdc.capub.cn/api/index/bookDetail', + { + method: 'POST', + headers: {"Usersessionid": usersessionid}, + body: `id=${postData.id}&searchType=${postData.type}` + } + ); + // Z.debug(postResult); + if (postResult[code] == "0") return false; + var ciphertext = postResult["result"]; + ciphertext = aescbc.base64.toBytes(ciphertext); + let key = aescbc.utf8.toBytes("zg35ws76swnxz679"); + let iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); + let cbc = new aescbc.CBC(key, iv); + var jsonData = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); + jsonData = new Data( + Object.entries(JSON.parse(jsonData)).filter(([key, value]) => (value != '**')) + ); + // Z.debug(jsonData); var newItem = new Z.Item("book"); - // 标题变为「选题名称」 - // https://pdc.capub.cn/search.html#/detail?id=3xfbatmnh3626ppgzvztast2odbumgsdujt3eejchz4ovfsqrnfq&from=1&type=isbn_ele - newItem.title = match_text(data = meta_all, labels = ["正书名", "音像电子制品名", "选题名称"]); - // Z.debug(newItem.title); - newItem.creators = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[0]; - newItem.creators_raw = match_text_creators(data = meta_all, labels = ["作者", "著作权人"])[1]; - newItem.language = match_text_lang(data = meta_all, labels = "正文语种"); - var type = new URL(url.replace('#', '')).searchParams.get('type'); - newItem = Object.assign(newItem, match_text_type(data = meta_all, type = type)); - // Z.debug(meta_all); - newItem.abstractNote = match_text(data = meta_all, labels = "内容摘要"); - newItem.series = match_text(data = meta_all, labels = "分册名"); - newItem.seriesNumber = match_text(data = meta_all, labels = "分册号"); - // "volume": "卷次", - // "numberOfVolumes": "总卷数", - // "edition": "版本", - newItem.place = match_text(data = meta_all, labels = "出版地"); - newItem.publisher = match_text(data = meta_all, labels = "出版单位"); - newItem.date = match_text(data = meta_all, labels = "出版时间"); - // "numPages": "总页数", - newItem.ISBN = match_text(data = meta_all, labels = "ISBN"); - - // "shortTitle": "短标题", + var result; + for (const field in FIELDMAP) { + const recipe = FIELDMAP[field]; + result = jsonData.get(recipe.keys); + if (recipe.callback) { + result = recipe.callback(result); + } + newItem[field] = result; + } + let subBookName = jsonData.get('subbookname'); + if (subBookName) { + newItem.title = `${newItem.title}(${subBookName})`; + } + newItem = Object.assign(newItem, matchArchiveLocation(postData.type)); + let url = `https://pdc.capub.cn/search.html#/detail?id=${postData.id}&from=1&type=${postData.type}`; newItem.url = url; - // "accessDate": "访问时间", - // "archive": "档案", - // "libraryCatalog": "文库编目", - newItem.callNumber = match_text(data = meta_all, labels = "中图法分类"); - newItem.tags.push({ "tag": match_text(data = meta_all, labels = "主题词") }); - // 丛书名示 - // https://pdc.capub.cn/search.html#/detail?id=6fvn57xzq2kxf7qldopfgfhcr3svtkp6n7a23d7djxgkt6gmpsbxsgvyspiasyexnlbqn6ffm62mw&from=1&type=cip - newItem.suite = match_text(data = meta_all, labels = "丛书名"); newItem.attachments.push({ "url": url, "title": "Snapshot", @@ -983,6 +891,11 @@ var aescbc = { + + + + + /** BEGIN TEST CASES **/ var testCases = [ { @@ -1177,6 +1090,7 @@ var testCases = [ "itemType": "book", "title": "列宁在一九一八", "creators": [], + "language": "en-US", "libraryCatalog": "Publications Data Center - China", "publisher": "上海人民美术出版社", "url": "https://pdc.capub.cn/search.html#/detail?id=ahvu2dxdy7sdhl6f2vgpe6taasmpnohq4tpnrgl3424yx2cr7xma&from=1&type=comics", From 9bde22019037c9d888e081a867bcd9c2d1c7e929 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Tue, 17 Oct 2023 14:37:40 +0800 Subject: [PATCH 11/17] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E5=90=8D=E5=88=86=E5=89=B2=EF=BC=9B=E9=BB=98=E8=AE=A4=E8=AF=AD?= =?UTF-8?q?=E7=A7=8D=E4=B8=BA=E4=B8=AD=E6=96=87=EF=BC=9B=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 37 ++++++++++------------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index c8aa4411..489ea203 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-16 08:33:45" + "lastUpdated": "2023-10-17 06:30:22" } /* @@ -127,8 +127,6 @@ function matchArchiveLocation(type) { } function matchCreator(creator, raw = false) { - // Z.debug(creators_zh); - var zhnamesplit = Z.getHiddenPref('zhnamesplit'); creator = ZU.trimInternal(creator.toString()); /* 英文译名一律不拆分 */ if (creator.search(/[A-Za-z]/) !== -1 || creator.includes('·')) { @@ -146,22 +144,11 @@ function matchCreator(creator, raw = false) { } /* 中文名根据配置决定是否拆分 */ else { - if ((zhnamesplit === undefined) ? true : zhnamesplit) { - // zhnamesplit is true, split firstname and lastname. - // Chinese name. first character is last name, the rest are first name - // Z.debug(creator); - creator = { - "firstName": creator.substr(1), - "lastName": creator.charAt(0), - "creatorType": "autor" - }; - } - else { - creator = { - "lastName": "creator", - "creatorType": "autor" - }; - } + creator = { + "lastName": creator, + "creatorType": "autor", + "fieldMode": true + }; } return creator; } @@ -203,7 +190,7 @@ const FIELDMAP = { labels: ['正文语种', '语种', '文种'], keys: ['textlangue', 'worklanguage'], callback: function (text) { - return (text == 'chi') ? 'zh-CN' : 'en-US'; + return ((text == '') || (text == 'chi')) ? 'zh-CN' : 'en-US'; } }, ISBN: { @@ -896,6 +883,7 @@ var aescbc = { + /** BEGIN TEST CASES **/ var testCases = [ { @@ -1059,13 +1047,14 @@ var testCases = [ "title": "长征组歌——京剧音乐史诗", "creators": [ { - "firstName": "振强", - "lastName": "谢", - "creatorType": "autor" + "lastName": "谢振强", + "creatorType": "autor", + "fieldMode": true } ], "ISBN": "9787887333315", "archiveLocation": "ISBN", + "language": "en-US", "libraryCatalog": "Publications Data Center - China", "publisher": "中国文联音像出版公司(中国文联出版社有限公司)", "rights": "谢振强", @@ -1105,6 +1094,6 @@ var testCases = [ "seeAlso": [] } ] - } + }, ] /** END TEST CASES **/ From 9b88445dfc3f146fd82ec6ac063b966ad5fa8aa9 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Sat, 21 Oct 2023 17:49:22 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 489ea203..e6492e6e 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-17 06:30:22" + "lastUpdated": "2023-10-21 09:45:01" } /* @@ -54,9 +54,9 @@ function getSearchResults(doc, checkOnly) { for (let row of rows) { let title = ZU.trimInternal(row.querySelector('.book_title').innerText); let id = row.querySelector('.ant-checkbox-input').value; - let type = (function (){ + let type = (function () { let mediumType = ZU.xpath(doc, '//div[@class="data_classify"]//div[@class="checkbox"]/span[1]').map( - (element) => (element).className).indexOf('checkboxkey bcurrent'); + (element) => (element).className).indexOf('checkboxkey bcurrent'); if (mediumType > 1) { return 'comic'; } else { @@ -211,7 +211,7 @@ const FIELDMAP = { callback: function (creators) { // 作者带有“等” // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn - const surffix_patten = ['编?著', '原?著','编?绘', '主?编', '等']; + const surffix_patten = ['编?著', '原?著', '编?绘', '主?编', '等']; creators = creators.replace(/[\[\]]/g, ''); for (const surffix of surffix_patten) { if (creators.match(new RegExp(`.+(?=(${surffix}))`))) { @@ -225,7 +225,7 @@ const FIELDMAP = { labels: ['主题词'], keys: ['keyword'], callback: function (text) { - return [{tag: text}]; + return [{ tag: text }]; } }, // 丛书名示例 @@ -266,7 +266,7 @@ async function scrapeSingle(doc, url = doc.location.href) { } newItem[field] = result; } - + let type = new URL(url.replace('#', '')).searchParams.get('type'); newItem = Object.assign(newItem, matchArchiveLocation(type)); newItem.url = url; @@ -292,7 +292,7 @@ async function scrapeMulti(postData) { 'https://pdc.capub.cn/api/index/bookDetail', { method: 'POST', - headers: {"Usersessionid": usersessionid}, + headers: { "Usersessionid": usersessionid }, body: `id=${postData.id}&searchType=${postData.type}` } ); @@ -306,7 +306,7 @@ async function scrapeMulti(postData) { var jsonData = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); jsonData = new Data( Object.entries(JSON.parse(jsonData)).filter(([key, value]) => (value != '**')) - ); + ); // Z.debug(jsonData); var newItem = new Z.Item("book"); var result; @@ -873,17 +873,6 @@ var aescbc = { } }; - - - - - - - - - - - /** BEGIN TEST CASES **/ var testCases = [ { From 97e2f68b3f01f25b02f1af480b220c469efff7dd Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Sun, 22 Oct 2023 10:49:52 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E8=A7=84=E8=8C=83target=E6=AD=A3?= =?UTF-8?q?=E5=88=99=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index e6492e6e..215aa4be 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -2,7 +2,7 @@ "translatorID": "3ab06b2e-5cfa-4561-9770-4f76710a32ab", "label": "Publications Data Center - China", "creator": "jiaojiaodubai23", - "target": "https?://pdc.capub.cn/search.html", + "target": "^https?://pdc\\.capub\\.cn/search\\.html", "minVersion": "5.0", "maxVersion": "", "priority": 100, From 904f9dafdb67839de6b8e198debd07db62d5c847 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai23 Date: Mon, 23 Oct 2023 16:44:40 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E9=A3=8E=E6=A0=BC=EF=BC=9B=E9=80=9A=E8=BF=87ESLint=E6=A3=80?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 512 ++++++++++++++-------------- 1 file changed, 257 insertions(+), 255 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 215aa4be..2bf89d57 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-21 09:45:01" + "lastUpdated": "2023-10-23 08:40:46" } /* @@ -34,15 +34,13 @@ ***** END LICENSE BLOCK ***** */ - - function detectWeb(doc, url) { let multiFlag = url.split(/[/,?]/)[4]; if (multiFlag == 'quick') { - return "multiple"; + return 'multiple'; } else if (multiFlag == 'detail') { - return "book"; + return 'book'; } return false; } @@ -56,21 +54,22 @@ function getSearchResults(doc, checkOnly) { let id = row.querySelector('.ant-checkbox-input').value; let type = (function () { let mediumType = ZU.xpath(doc, '//div[@class="data_classify"]//div[@class="checkbox"]/span[1]').map( - (element) => (element).className).indexOf('checkboxkey bcurrent'); + element => (element).className).indexOf('checkboxkey bcurrent'); if (mediumType > 1) { return 'comic'; - } else { + } + else { let type = { - "CIP数据库": "cip", - "馆藏数据库": "marc", - "ISBN数据库": "isbn" + CIP数据库: 'cip', + 馆藏数据库: 'marc', + ISBN数据库: 'isbn' }[row.querySelector('.data_from span').innerText]; return (mediumType == 0) ? type : `${type}_ele`; } })(); let postData = `{"id":"${id}","type":"${type}"}`; if (!id || !type || !title) { - continue + continue; } else { if (checkOnly) return true; @@ -100,27 +99,27 @@ function matchArchiveLocation(type) { // Z.debug(type); /* 音像电子 */ if (type.includes('ele')) { - cell.medium = "CD"; + cell.medium = 'CD'; if (type.includes('marc')) { // 馆藏条目无“著作权人”字段 // https://pdc.capub.cn/search.html#/detail?id=qketqfp26hwqthuwmwi6dzr4hu27o2efur5pu6ms5szvi6oasvqa&from=1&type=marc_ele - cell.archiveLocation = "馆藏"; + cell.archiveLocation = '馆藏'; } else if (type.includes('isbn')) { // https://pdc.capub.cn/search.html#/detail?id=vhtadivummqsacsc5ygdxljzrsmvrevrgwvg47sjxodgfzgcx5qa&from=1&type=isbn_ele - cell.archiveLocation = "ISBN"; + cell.archiveLocation = 'ISBN'; } - /* 图书 */ - } else { + } + else { cell.medium = ''; if (type.includes('cip')) { - cell.archiveLocation = "CIP"; + cell.archiveLocation = 'CIP'; } else if (type.includes('marc')) { - cell.archiveLocation = "馆藏"; + cell.archiveLocation = '馆藏'; } else if (type.includes('isbn')) { - cell.archiveLocation = "ISBN"; + cell.archiveLocation = 'ISBN'; } } return cell; @@ -128,26 +127,24 @@ function matchArchiveLocation(type) { function matchCreator(creator, raw = false) { creator = ZU.trimInternal(creator.toString()); - /* 英文译名一律不拆分 */ - if (creator.search(/[A-Za-z]/) !== -1 || creator.includes('·')) { + if (/[A-Za-z]/.test(creator) || creator.includes('·')) { // 英文名去除国籍标识 creator = creator.replace(/\([\u4e00-\u9fa5]+\)/, ''); // 保留中英对照形式供用户参考 if (raw) return creator; // 英文名去除英文原名 - creator = creator.replace(/ ?\(.+\)/, ""); + creator = creator.replace(/ ?\(.+\)/, ''); creator = { - "lastName": creator, - "creatorType": "autor", + lastName: creator, + creatorType: 'autor', }; // Z.debug(creator); } - /* 中文名根据配置决定是否拆分 */ else { creator = { - "lastName": creator, - "creatorType": "autor", - "fieldMode": true + lastName: creator, + creatorType: 'autor', + fieldMode: 1 }; } return creator; @@ -211,14 +208,14 @@ const FIELDMAP = { callback: function (creators) { // 作者带有“等” // https://pdc.capub.cn/search.html#/detail?id=lvwm4hubadqj7appufemd6rx24zjequztct3eok3imqvsongueeq&from=1&type=isbn - const surffix_patten = ['编?著', '原?著', '编?绘', '主?编', '等']; - creators = creators.replace(/[\[\]]/g, ''); - for (const surffix of surffix_patten) { + const surffixPatten = ['编?著', '原?著', '编?绘', '主?编', '等']; + creators = creators.replace(/[[\]]/g, ''); + for (const surffix of surffixPatten) { if (creators.match(new RegExp(`.+(?=(${surffix}))`))) { creators = creators.match(new RegExp(`.+(?=${surffix})`))[0]; } } - return creators.split(/,\s/g).map((creator) => (matchCreator(creator))); + return creators.split(/,\s/g).map(creator => (matchCreator(creator))); } }, tags: { @@ -234,13 +231,13 @@ const FIELDMAP = { labels: ['丛书名'], keys: ['secondbookname'] } -} +}; class Data extends Map { get(keys) { var value; for (const key of keys) { - value = super.get(key) + value = super.get(key); if (value) break; } return value ? value : ''; @@ -249,31 +246,30 @@ class Data extends Map { async function scrapeSingle(doc, url = doc.location.href) { // Z.debug(url); - var tableCell = ZU.xpath(doc, "//div[@class='table_wrap']/table/tr/td"); + var tableCell = ZU.xpath(doc, '//div[@class="table_wrap"]/table/tr/td'); var tableData = new Data(); for (let i = 0; i < tableCell.length; i += 2) { tableData.set(tableCell[i].innerText, tableCell[i + 1].innerText); } // Z.debug(tableData); - var newItem = new Z.Item("book"); + var newItem = new Z.Item('book'); var result = ''; for (const field in FIELDMAP) { const recipe = FIELDMAP[field]; result = tableData.get(recipe.labels); - // Z.debug(`for field ${field}, I get \n${result}`); + Z.debug(`for field ${field}, I get \n${result}`); if (recipe.callback) { result = recipe.callback(result); } newItem[field] = result; } - let type = new URL(url.replace('#', '')).searchParams.get('type'); newItem = Object.assign(newItem, matchArchiveLocation(type)); newItem.url = url; newItem.attachments.push({ - "url": url, - "title": "Snapshot", - "mimeType": "text/html" + url: url, + title: 'Snapshot', + mimeType: 'text/html' }); newItem.complete(); } @@ -284,31 +280,30 @@ async function scrapeMulti(postData) { // Z.debug(`id=${postData.id}&searchType=${postData.type}`); // 在Scaffold中无法调用下面这个对象,但大部分浏览器是支持的, // 详见 https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage#browser_compatibility - let usersessionid = localStorage.getItem("user-token"); + let usersessionid = localStorage.getItem('user-token'); // 在Scaffold调试时请用浏览器devtools从请求头找到Usersessionid手动复制粘贴到下方 - // let usersessionid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + // let usersessionid = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // Z.debug(usersessionid); let postResult = await requestJSON( 'https://pdc.capub.cn/api/index/bookDetail', { method: 'POST', - headers: { "Usersessionid": usersessionid }, + headers: { Usersessionid: usersessionid }, body: `id=${postData.id}&searchType=${postData.type}` } ); // Z.debug(postResult); - if (postResult[code] == "0") return false; - var ciphertext = postResult["result"]; + var ciphertext = postResult.result; ciphertext = aescbc.base64.toBytes(ciphertext); - let key = aescbc.utf8.toBytes("zg35ws76swnxz679"); - let iv = aescbc.utf8.toBytes("z66qa18l0w9o521k"); + let key = aescbc.utf8.toBytes('zg35ws76swnxz679'); + let iv = aescbc.utf8.toBytes('z66qa18l0w9o521k'); let cbc = new aescbc.CBC(key, iv); - var jsonData = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); - jsonData = new Data( - Object.entries(JSON.parse(jsonData)).filter(([key, value]) => (value != '**')) + var plainText = aescbc.utf8.fromBytes(aescbc.pkcs7.strip(cbc.decrypt(ciphertext))); + var jsonData = new Data( + Object.entries(JSON.parse(plainText)).filter(([_key, value]) => (value != '**')) ); // Z.debug(jsonData); - var newItem = new Z.Item("book"); + var newItem = new Z.Item('book'); var result; for (const field in FIELDMAP) { const recipe = FIELDMAP[field]; @@ -326,9 +321,9 @@ async function scrapeMulti(postData) { let url = `https://pdc.capub.cn/search.html#/detail?id=${postData.id}&from=1&type=${postData.type}`; newItem.url = url; newItem.attachments.push({ - "url": url, - "title": "Snapshot", - "mimeType": "text/html" + url: url, + title: 'Snapshot', + mimeType: 'text/html' }); newItem.complete(); } @@ -341,7 +336,8 @@ function coerceArray(arg, copy) { if (copy) { if (arg.slice) { arg = arg.slice(); - } else { + } + else { arg = Array.prototype.slice.call(arg); } } @@ -370,10 +366,11 @@ function createArray(length) { } function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { - if (sourceStart != null || sourceEnd != null) { + if (sourceStart !== null || sourceEnd !== null) { if (sourceArray.slice) { sourceArray = sourceArray.slice(sourceStart, sourceEnd); - } else { + } + else { sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); } } @@ -381,147 +378,150 @@ function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd } var Utf8 = (function () { - function toBytes(text) { - var result = [], i = 0; - text = encodeURI(text); - while (i < text.length) { - var c = text.charCodeAt(i++); - - // if it is a % sign, encode the following 2 bytes as a hex value - if (c === 37) { - result.push(parseInt(text.substr(i, 2), 16)) - i += 2; - - // otherwise, just the actual byte - } else { - result.push(c) - } +function toBytes(text) { + var result = [], i = 0; + text = encodeURI(text); + while (i < text.length) { + var c = text.charCodeAt(i++); + + // if it is a % sign, encode the following 2 bytes as a hex value + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)); + i += 2; + + // otherwise, just the actual byte + } + else { + result.push(c); } - - return coerceArray(result); } - function fromBytes(bytes) { - var result = [], i = 0; - - while (i < bytes.length) { - var c = bytes[i]; - - if (c < 128) { - result.push(String.fromCharCode(c)); - i++; - } else if (c > 191 && c < 224) { - result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); - i += 2; - } else { - result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); - i += 3; - } - } + return coerceArray(result); +} - return result.join(''); - } +function fromBytes(bytes) { + var result = [], i = 0; + + while (i < bytes.length) { + var c = bytes[i]; - return { - toBytes: toBytes, - fromBytes: fromBytes, + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } + else if (c > 191 && c < 224) { + result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); + i += 2; + } + else { + result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); + i += 3; + } } + + return result.join(''); +} + +return { + toBytes: toBytes, + fromBytes: fromBytes, +}; })(); // The base64 comes from https://developer.mozilla.org/zh-CN/docs/Glossary/Base64#%E2%80%9Cunicode_%E9%97%AE%E9%A2%98%E2%80%9D var Base64 = (function () { - // Array of bytes to Base64 string decoding - function b64ToUint6(nChr) { - return nChr > 64 && nChr < 91 - ? nChr - 65 - : nChr > 96 && nChr < 123 - ? nChr - 71 - : nChr > 47 && nChr < 58 - ? nChr + 4 - : nChr === 43 - ? 62 - : nChr === 47 - ? 63 - : 0; - } +// Array of bytes to Base64 string decoding +function b64ToUint6(nChr) { + return nChr > 64 && nChr < 91 + ? nChr - 65 + : nChr > 96 && nChr < 123 + ? nChr - 71 + : nChr > 47 && nChr < 58 + ? nChr + 4 + : nChr === 43 + ? 62 + : nChr === 47 + ? 63 + : 0; +} - function decBase64ToArr(sBase64, nBlocksSize) { - const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, ""); // Remove any non-base64 characters, such as trailing "=", whitespace, and more. - const nInLen = sB64Enc.length; - const nOutLen = nBlocksSize - ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize - : (nInLen * 3 + 1) >> 2; - const taBytes = new Uint8Array(nOutLen); - - let nMod3; - let nMod4; - let nUint24 = 0; - let nOutIdx = 0; - for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) { - nMod4 = nInIdx & 3; - nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (6 * (3 - nMod4)); - if (nMod4 === 3 || nInLen - nInIdx === 1) { - nMod3 = 0; - while (nMod3 < 3 && nOutIdx < nOutLen) { - taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255; - nMod3++; - nOutIdx++; - } - nUint24 = 0; +function decBase64ToArr(sBase64, nBlocksSize) { + const sB64Enc = sBase64.replace(/[^A-Za-z0-9+/]/g, ""); // Remove any non-base64 characters, such as trailing "=", whitespace, and more. + const nInLen = sB64Enc.length; + const nOutLen = nBlocksSize + ? Math.ceil(((nInLen * 3 + 1) >> 2) / nBlocksSize) * nBlocksSize + : (nInLen * 3 + 1) >> 2; + const taBytes = new Uint8Array(nOutLen); + + let nMod3; + let nMod4; + let nUint24 = 0; + let nOutIdx = 0; + for (let nInIdx = 0; nInIdx < nInLen; nInIdx++) { + nMod4 = nInIdx & 3; + nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (6 * (3 - nMod4)); + if (nMod4 === 3 || nInLen - nInIdx === 1) { + nMod3 = 0; + while (nMod3 < 3 && nOutIdx < nOutLen) { + taBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255; + nMod3++; + nOutIdx++; } + nUint24 = 0; } - - return taBytes; } - /* Base64 string to array encoding */ - function uint6ToB64(nUint6) { - return nUint6 < 26 - ? nUint6 + 65 - : nUint6 < 52 - ? nUint6 + 71 - : nUint6 < 62 - ? nUint6 - 4 - : nUint6 === 62 - ? 43 - : nUint6 === 63 - ? 47 - : 65; - } + return taBytes; +} - function encArrToBase64(aBytes) { - let nMod3 = 2; - let sB64Enc = ""; - - const nLen = aBytes.length; - let nUint24 = 0; - for (let nIdx = 0; nIdx < nLen; nIdx++) { - nMod3 = nIdx % 3; - // To break your base64 into several 80-character lines, add: - // if (nIdx > 0 && ((nIdx * 4) / 3) % 76 === 0) { - // sB64Enc += "\r\n"; - // } - - nUint24 |= aBytes[nIdx] << ((16 >>> nMod3) & 24); - if (nMod3 === 2 || aBytes.length - nIdx === 1) { - sB64Enc += String.fromCodePoint( - uint6ToB64((nUint24 >>> 18) & 63), - uint6ToB64((nUint24 >>> 12) & 63), - uint6ToB64((nUint24 >>> 6) & 63), - uint6ToB64(nUint24 & 63), - ); - nUint24 = 0; - } +/* Base64 string to array encoding */ +function uint6ToB64(nUint6) { + return nUint6 < 26 + ? nUint6 + 65 + : nUint6 < 52 + ? nUint6 + 71 + : nUint6 < 62 + ? nUint6 - 4 + : nUint6 === 62 + ? 43 + : nUint6 === 63 + ? 47 + : 65; +} + +function encArrToBase64(aBytes) { + let nMod3 = 2; + let sB64Enc = ""; + + const nLen = aBytes.length; + let nUint24 = 0; + for (let nIdx = 0; nIdx < nLen; nIdx++) { + nMod3 = nIdx % 3; + // To break your base64 into several 80-character lines, add: + // if (nIdx > 0 && ((nIdx * 4) / 3) % 76 === 0) { + // sB64Enc += "\r\n"; + // } + + nUint24 |= aBytes[nIdx] << ((16 >>> nMod3) & 24); + if (nMod3 === 2 || aBytes.length - nIdx === 1) { + sB64Enc += String.fromCodePoint( + uint6ToB64((nUint24 >>> 18) & 63), + uint6ToB64((nUint24 >>> 12) & 63), + uint6ToB64((nUint24 >>> 6) & 63), + uint6ToB64(nUint24 & 63), + ); + nUint24 = 0; } - return ( - sB64Enc.substring(0, sB64Enc.length - 2 + nMod3) + - (nMod3 === 2 ? "" : nMod3 === 1 ? "=" : "==") - ); - } - return { - toBytes: decBase64ToArr, - fromBytes: encArrToBase64 } + return ( + sB64Enc.substring(0, sB64Enc.length - 2 + nMod3) + + (nMod3 === 2 ? "" : nMod3 === 1 ? "=" : "==") + ); +} +return { + toBytes: decBase64ToArr, + fromBytes: encArrToBase64 +}; })(); function pkcs7pad(data) { @@ -529,7 +529,7 @@ function pkcs7pad(data) { var padder = 16 - (data.length % 16); var result = createArray(data.length + padder); copyArray(data, result); - for (var i = data.length; i < result.length; i++) { + for (let i = data.length; i < result.length; i++) { result[i] = padder; } return result; @@ -537,13 +537,13 @@ function pkcs7pad(data) { function pkcs7strip(data) { data = coerceArray(data, true); - if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + if (data.length < 16) throw new Error('PKCS#7 invalid length'); var padder = data[data.length - 1]; - if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + if (padder > 16) throw new Error('PKCS#7 padding byte out of range'); var length = data.length - padder; - for (var i = 0; i < padder; i++) { + for (let i = 0; i < padder; i++) { if (data[length + i] !== padder) { throw new Error('PKCS#7 invalid padding byte'); } @@ -555,7 +555,7 @@ function pkcs7strip(data) { } // Number of rounds by keysize -var numberOfRounds = { 16: 10, 24: 12, 32: 14 } +var numberOfRounds = { 16: 10, 24: 12, 32: 14 }; // Round constant words var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; @@ -584,12 +584,12 @@ var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736 function convertToInt32(bytes) { var result = []; - for (var i = 0; i < bytes.length; i += 4) { + for (let i = 0; i < bytes.length; i += 4) { result.push( - (bytes[i] << 24) | - (bytes[i + 1] << 16) | - (bytes[i + 2] << 8) | - bytes[i + 3] + (bytes[i] << 24) + | (bytes[i + 1] << 16) + | (bytes[i + 2] << 8) + | bytes[i + 3] ); } return result; @@ -605,12 +605,11 @@ var AES = function (key) { }); this._prepare(); -} +}; AES.prototype._prepare = function () { - var rounds = numberOfRounds[this.key.length]; - if (rounds == null) { + if (rounds === null) { throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); } @@ -620,7 +619,7 @@ AES.prototype._prepare = function () { // decryption round keys this._Kd = []; - for (var i = 0; i <= rounds; i++) { + for (let i = 0; i <= rounds; i++) { this._Ke.push([0, 0, 0, 0]); this._Kd.push([0, 0, 0, 0]); } @@ -633,7 +632,7 @@ AES.prototype._prepare = function () { // copy values into round key arrays var index; - for (var i = 0; i < KC; i++) { + for (let i = 0; i < KC; i++) { index = i >> 2; this._Ke[index][i % 4] = tk[i]; this._Kd[rounds - index][i % 4] = tk[i]; @@ -644,32 +643,33 @@ AES.prototype._prepare = function () { var t = KC, tt; while (t < roundKeyCount) { tt = tk[KC - 1]; - tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ - (S[(tt >> 8) & 0xFF] << 16) ^ - (S[tt & 0xFF] << 8) ^ - S[(tt >> 24) & 0xFF] ^ - (rcon[rconpointer] << 24)); + tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) + ^ (S[(tt >> 8) & 0xFF] << 16) + ^ (S[tt & 0xFF] << 8) + ^ S[(tt >> 24) & 0xFF] + ^ (rcon[rconpointer] << 24)); rconpointer += 1; // key expansion (for non-256 bit) if (KC != 8) { - for (var i = 1; i < KC; i++) { + for (let i = 1; i < KC; i++) { tk[i] ^= tk[i - 1]; } // key expansion for 256-bit keys is "slightly different" (fips-197) - } else { - for (var i = 1; i < (KC / 2); i++) { + } + else { + for (let i = 1; i < (KC / 2); i++) { tk[i] ^= tk[i - 1]; } tt = tk[(KC / 2) - 1]; - tk[KC / 2] ^= (S[tt & 0xFF] ^ - (S[(tt >> 8) & 0xFF] << 8) ^ - (S[(tt >> 16) & 0xFF] << 16) ^ - (S[(tt >> 24) & 0xFF] << 24)); + tk[KC / 2] ^= (S[tt & 0xFF] + ^ (S[(tt >> 8) & 0xFF] << 8) + ^ (S[(tt >> 16) & 0xFF] << 16) + ^ (S[(tt >> 24) & 0xFF] << 24)); - for (var i = (KC / 2) + 1; i < KC; i++) { + for (let i = (KC / 2) + 1; i < KC; i++) { tk[i] ^= tk[i - 1]; } } @@ -686,16 +686,16 @@ AES.prototype._prepare = function () { } // inverse-cipher-ify the decryption round key (fips-197 section 5.3) - for (var r = 1; r < rounds; r++) { - for (var c = 0; c < 4; c++) { + for (let r = 1; r < rounds; r++) { + for (let c = 0; c < 4; c++) { tt = this._Kd[r][c]; - this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ - U2[(tt >> 16) & 0xFF] ^ - U3[(tt >> 8) & 0xFF] ^ - U4[tt & 0xFF]); + this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] + ^ U2[(tt >> 16) & 0xFF] + ^ U3[(tt >> 8) & 0xFF] + ^ U4[tt & 0xFF]); } } -} +}; AES.prototype.encrypt = function (plaintext) { if (plaintext.length != 16) { @@ -707,25 +707,25 @@ AES.prototype.encrypt = function (plaintext) { // convert plaintext to (ints ^ key) var t = convertToInt32(plaintext); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { t[i] ^= this._Ke[0][i]; } // apply round transforms - for (var r = 1; r < rounds; r++) { - for (var i = 0; i < 4; i++) { - a[i] = (T1[(t[i] >> 24) & 0xff] ^ - T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ - T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ - T4[t[(i + 3) % 4] & 0xff] ^ - this._Ke[r][i]); + for (let r = 1; r < rounds; r++) { + for (let i = 0; i < 4; i++) { + a[i] = (T1[(t[i] >> 24) & 0xff] + ^ T2[(t[(i + 1) % 4] >> 16) & 0xff] + ^ T3[(t[(i + 2) % 4] >> 8) & 0xff] + ^ T4[t[(i + 3) % 4] & 0xff] + ^ this._Ke[r][i]); } t = a.slice(); } // the last round is special var result = createArray(16), tt; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { tt = this._Ke[rounds][i]; result[4 * i] = (S[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; @@ -734,7 +734,7 @@ AES.prototype.encrypt = function (plaintext) { } return result; -} +}; AES.prototype.decrypt = function (ciphertext) { if (ciphertext.length != 16) { @@ -746,25 +746,25 @@ AES.prototype.decrypt = function (ciphertext) { // convert plaintext to (ints ^ key) var t = convertToInt32(ciphertext); - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { t[i] ^= this._Kd[0][i]; } // apply round transforms - for (var r = 1; r < rounds; r++) { - for (var i = 0; i < 4; i++) { - a[i] = (T5[(t[i] >> 24) & 0xff] ^ - T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ - T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ - T8[t[(i + 1) % 4] & 0xff] ^ - this._Kd[r][i]); + for (let r = 1; r < rounds; r++) { + for (let i = 0; i < 4; i++) { + a[i] = (T5[(t[i] >> 24) & 0xff] + ^ T6[(t[(i + 3) % 4] >> 16) & 0xff] + ^ T7[(t[(i + 2) % 4] >> 8) & 0xff] + ^ T8[t[(i + 1) % 4] & 0xff] + ^ this._Kd[r][i]); } t = a.slice(); } // the last round is special var result = createArray(16), tt; - for (var i = 0; i < 4; i++) { + for (let i = 0; i < 4; i++) { tt = this._Kd[rounds][i]; result[4 * i] = (Si[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; @@ -773,7 +773,7 @@ AES.prototype.decrypt = function (ciphertext) { } return result; -} +}; /** * Mode Of Operation - Cipher Block Chaining (CBC) @@ -788,15 +788,15 @@ var CBC = function (key, iv) { if (!iv) { iv = createArray(16); - - } else if (iv.length != 16) { + } + else if (iv.length != 16) { throw new Error('invalid initialation vector size (must be 16 bytes)'); } this._lastCipherblock = coerceArray(iv, true); this._aes = new AES(key); -} +}; CBC.prototype.encrypt = function (plaintext) { plaintext = coerceArray(plaintext); @@ -808,10 +808,10 @@ CBC.prototype.encrypt = function (plaintext) { var ciphertext = createArray(plaintext.length); var block = createArray(16); - for (var i = 0; i < plaintext.length; i += 16) { + for (let i = 0; i < plaintext.length; i += 16) { copyArray(plaintext, block, 0, i, i + 16); - for (var j = 0; j < 16; j++) { + for (let j = 0; j < 16; j++) { block[j] ^= this._lastCipherblock[j]; } @@ -820,7 +820,7 @@ CBC.prototype.encrypt = function (plaintext) { } return ciphertext; -} +}; CBC.prototype.decrypt = function (ciphertext) { ciphertext = coerceArray(ciphertext); @@ -832,11 +832,11 @@ CBC.prototype.decrypt = function (ciphertext) { var plaintext = createArray(ciphertext.length); var block = createArray(16); - for (var i = 0; i < ciphertext.length; i += 16) { + for (let i = 0; i < ciphertext.length; i += 16) { copyArray(ciphertext, block, 0, i, i + 16); block = this._aes.decrypt(block); - for (var j = 0; j < 16; j++) { + for (let j = 0; j < 16; j++) { plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; } @@ -844,16 +844,16 @@ CBC.prototype.decrypt = function (ciphertext) { } return plaintext; -} +}; function checkInt(value) { return (parseInt(value) === value); } function checkInts(arrayish) { - if (!checkInt(arrayish.length)) { return false; } + if (!checkInt(arrayish.length)) return false; - for (var i = 0; i < arrayish.length; i++) { + for (let i = 0; i < arrayish.length; i++) { if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { return false; } @@ -889,9 +889,9 @@ var testCases = [ "title": "结构化学", "creators": [ { - "firstName": "新义", - "lastName": "李", - "creatorType": "autor" + "lastName": "李新义", + "creatorType": "autor", + "fieldMode": 1 } ], "date": "2018.04", @@ -938,7 +938,7 @@ var testCases = [ "abstractNote": "本书是俄维两种文字混合的工具书之一。本词典共收单字4万余条左右,短语,派生词,复合词4000余条,包括今年以来已进入人们日常生活的大量新词或新义。每个单字和词条释义都用最常用的意义来解释。", "archiveLocation": "馆藏", "callNumber": "H356", - "language": "rus;uig", + "language": "en-US", "libraryCatalog": "Publications Data Center - China", "place": "乌鲁木齐", "publisher": "新疆人民出版社", @@ -981,6 +981,7 @@ var testCases = [ "abstractNote": "本书是《朗文少儿语音》3B。", "archiveLocation": "CIP", "callNumber": "H311", + "language": "zh-CN", "libraryCatalog": "Publications Data Center - China", "place": "北京", "publisher": "世界图书出版公司北京公司", @@ -1012,6 +1013,7 @@ var testCases = [ "creators": [], "ISBN": "9787883310471", "archiveLocation": "馆藏", + "language": "zh-CN", "libraryCatalog": "Publications Data Center - China", "publisher": "北京国家大剧院古典音乐有限责任公司出版", "url": "https://pdc.capub.cn/search.html#/detail?id=7dahxrzkhzanmop46ag7xrgmamkgn37ew2sdi5cnnilkbp73rrtq&from=1&type=marc_ele", @@ -1038,12 +1040,12 @@ var testCases = [ { "lastName": "谢振强", "creatorType": "autor", - "fieldMode": true + "fieldMode": 1 } ], "ISBN": "9787887333315", "archiveLocation": "ISBN", - "language": "en-US", + "language": "zh-CN", "libraryCatalog": "Publications Data Center - China", "publisher": "中国文联音像出版公司(中国文联出版社有限公司)", "rights": "谢振强", @@ -1068,7 +1070,7 @@ var testCases = [ "itemType": "book", "title": "列宁在一九一八", "creators": [], - "language": "en-US", + "language": "zh-CN", "libraryCatalog": "Publications Data Center - China", "publisher": "上海人民美术出版社", "url": "https://pdc.capub.cn/search.html#/detail?id=ahvu2dxdy7sdhl6f2vgpe6taasmpnohq4tpnrgl3424yx2cr7xma&from=1&type=comics", @@ -1083,6 +1085,6 @@ var testCases = [ "seeAlso": [] } ] - }, + } ] /** END TEST CASES **/ From 6527338cfeeb3bc8514fecefd57e802934b18f1a Mon Sep 17 00:00:00 2001 From: jiaojiaodubai <63148861+jiaojiaodubai@users.noreply.github.com> Date: Sat, 25 Nov 2023 04:20:32 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E5=A4=9A=E6=9D=A1=E7=9B=AE=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=AA=97=E5=8F=A3=E6=8F=90=E4=BE=9B=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=EF=BC=9B=E4=BC=98=E5=8C=96tag=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=EF=BC=9B=E6=9B=B4=E6=96=B0=E6=B5=8B=E8=AF=95=E6=A1=88?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 2bf89d57..279e1fc9 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-10-23 08:40:46" + "lastUpdated": "2023-11-24 20:16:57" } /* @@ -49,8 +49,9 @@ function getSearchResults(doc, checkOnly) { var items = {}; var found = false; var rows = doc.querySelectorAll('.book_item'); - for (let row of rows) { - let title = ZU.trimInternal(row.querySelector('.book_title').innerText); + for (let i = 0; i < rows.length; i++) { + row = rows[i]; + let title = `【${i + 1}】${ZU.trimInternal(row.querySelector('.book_title').innerText)}`; let id = row.querySelector('.ant-checkbox-input').value; let type = (function () { let mediumType = ZU.xpath(doc, '//div[@class="data_classify"]//div[@class="checkbox"]/span[1]').map( @@ -222,6 +223,7 @@ const FIELDMAP = { labels: ['主题词'], keys: ['keyword'], callback: function (text) { + text = text.split(/\s?[;,,;-]\s?/g); return [{ tag: text }]; } }, @@ -951,7 +953,10 @@ var testCases = [ ], "tags": [ { - "tag": "俄语;对照词典" + "tag": [ + "俄语", + "对照词典" + ] } ], "notes": [], @@ -995,7 +1000,13 @@ var testCases = [ ], "tags": [ { - "tag": "英语,美国-语音-儿童教育-教材" + "tag": [ + "英语", + "美国", + "语音", + "儿童教育", + "教材" + ] } ], "notes": [], From 0de997e643ee3121decc9f5f10503c2d0d546cf0 Mon Sep 17 00:00:00 2001 From: jiaojiaodubai <63148861+jiaojiaodubai@users.noreply.github.com> Date: Sat, 25 Nov 2023 04:29:25 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E9=80=9A=E8=BF=87ESLint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 279e1fc9..865a6f73 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -50,7 +50,7 @@ function getSearchResults(doc, checkOnly) { var found = false; var rows = doc.querySelectorAll('.book_item'); for (let i = 0; i < rows.length; i++) { - row = rows[i]; + let row = rows[i]; let title = `【${i + 1}】${ZU.trimInternal(row.querySelector('.book_title').innerText)}`; let id = row.querySelector('.ant-checkbox-input').value; let type = (function () { From 9c92985100bd24d952e7ce1a3ff310092db9f5bc Mon Sep 17 00:00:00 2001 From: jiaojiaodubai <63148861+jiaojiaodubai@users.noreply.github.com> Date: Sat, 25 Nov 2023 04:43:14 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E7=82=B9typo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Publications Data Center - China.js | 32 +++++++++++++++++------------ data/data.json | 8 ++++---- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Publications Data Center - China.js b/Publications Data Center - China.js index 865a6f73..69f6898d 100644 --- a/Publications Data Center - China.js +++ b/Publications Data Center - China.js @@ -9,7 +9,7 @@ "inRepository": true, "translatorType": 4, "browserSupport": "gcsibv", - "lastUpdated": "2023-11-24 20:16:57" + "lastUpdated": "2023-11-24 20:41:06" } /* @@ -224,7 +224,7 @@ const FIELDMAP = { keys: ['keyword'], callback: function (text) { text = text.split(/\s?[;,,;-]\s?/g); - return [{ tag: text }]; + return text.map(element => ({ tag: element })); } }, // 丛书名示例 @@ -953,10 +953,10 @@ var testCases = [ ], "tags": [ { - "tag": [ - "俄语", - "对照词典" - ] + "tag": "俄语" + }, + { + "tag": "对照词典" } ], "notes": [], @@ -1000,13 +1000,19 @@ var testCases = [ ], "tags": [ { - "tag": [ - "英语", - "美国", - "语音", - "儿童教育", - "教材" - ] + "tag": "儿童教育" + }, + { + "tag": "教材" + }, + { + "tag": "美国" + }, + { + "tag": "英语" + }, + { + "tag": "语音" } ], "notes": [], diff --git a/data/data.json b/data/data.json index da6febb8..51caca4f 100644 --- a/data/data.json +++ b/data/data.json @@ -26,10 +26,10 @@ "PKULaw": "北大法宝", "China Judgements Online": "中国裁判文书网", "PubScholar": "PubScholar公益学术平台", - "chaoxingqikan": "超星期刊" - "MagTech": "玛格泰克" - "E-Tiller": "勤云科技" - "RHHZ": "仁和汇智" + "chaoxingqikan": "超星期刊", + "MagTech": "玛格泰克", + "E-Tiller": "勤云科技", + "RHHZ": "仁和汇智", "ChinaXiv": "中国科学院科技论文预发布平台", "National Science and Technology Library - China": "国家科技图书文献中心", "CCPINFO.js": "国家出版发行信息公共服务平台",