{"product_id":"600ml-bundles","title":"陶瓷隨行杯-牛奶杯600ml 兩入一組","description":"\u003ch2\u003e【產品說明】\u003cbr\u003e\n\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003e一體成型真陶瓷內膽：1300°C 高溫素燒硬白瓷，堅持完全無塗層。不殘留氣味、不釋放有害物質\u003c\/li\u003e\n\u003cli\u003e600ml 實用大容量：剛剛好裝下超商大杯咖啡。大寬口設計，不僅冰塊好放，日常清潔輕鬆無死角\u003c\/li\u003e\n\u003cli\u003e單手秒開，磁扣推蓋：防塵、防側漏的貼心設計，單手即可順暢飲用，讓辦公與通勤時光更加優雅俐落\u003c\/li\u003e\n\u003cli\u003e長效溫控陪伴：真空雙層不鏽鋼外殼，保溫 4–6 小時、保冰 8–12 小時。隨時為您準備好最適宜的溫度\u003cbr\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch2\u003e使用情境推薦\u003cbr\u003e\n\u003c\/h2\u003e\n\u003cul\u003e\n\u003cli\u003e早餐時光：裝豆漿或牛奶，搭配吐司剛剛好\u003c\/li\u003e\n\u003cli\u003e午茶放鬆：冷泡茶、手沖咖啡，一杯提升效率\u003c\/li\u003e\n\u003cli\u003e通勤外出：磁扣設計單手開蓋，邊走邊喝也方便\u003c\/li\u003e\n\u003cli\u003e辦公桌前：放在桌面不佔空間，補水隨手可得\u003cbr\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch2\u003e【常見問答 FAQ】\u003c\/h2\u003e\n\u003cdetails style=\"margin-bottom: 14px; padding: 12px; background: #fff; border: 1px solid #e3e3e3; border-radius: 8px;\"\u003e\n\u003csummary style=\"font-weight: 600; cursor: pointer;\"\u003e1. 這款牛奶杯內膽是什麼材質？\u003c\/summary\u003e\n\u003cp style=\"margin-top: 8px;\"\u003e採用一體成型高溫硬白瓷，無塗層、不殘留氣味，不論牛奶、茶或咖啡皆能保留原味，且不釋放有害物質。\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails style=\"margin-bottom: 14px; padding: 12px; background: #fff; border: 1px solid #e3e3e3; border-radius: 8px;\"\u003e\n\u003csummary style=\"font-weight: 600; cursor: pointer;\"\u003e2. 容量為何設為600ml？適合裝哪些飲品？\u003c\/summary\u003e\n\u003cp style=\"margin-top: 8px;\"\u003e600ml 可裝下超商大杯咖啡或一瓶早餐牛奶，也可當作全天補水杯使用。適合搭配早餐、辦公室午茶、午後手沖咖啡等使用情境。\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails style=\"margin-bottom: 14px; padding: 12px; background: #fff; border: 1px solid #e3e3e3; border-radius: 8px;\"\u003e\n\u003csummary style=\"font-weight: 600; cursor: pointer;\"\u003e3. 這款杯子保溫效果好嗎？適合外帶嗎？\u003c\/summary\u003e\n\u003cp style=\"margin-top: 8px;\"\u003e雙層真空結構設計，可保溫約 4–6 小時，適合日常隨行攜帶，杯身圓潤不笨重，出門方便不佔空間。\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails style=\"margin-bottom: 14px; padding: 12px; background: #fff; border: 1px solid #e3e3e3; border-radius: 8px;\"\u003e\n\u003csummary style=\"font-weight: 600; cursor: pointer;\"\u003e4. 是否容易清洗？可否裝酸性果汁？\u003c\/summary\u003e\n\u003cp style=\"margin-top: 8px;\"\u003e硬白瓷內膽光滑耐酸鹼，裝果汁、醋飲都無問題。寬口設計易於倒水與清洗，清潔簡單不藏污納垢。\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cdetails style=\"margin-bottom: 14px; padding: 12px; background: #fff; border: 1px solid #e3e3e3; border-radius: 8px;\"\u003e\n\u003csummary style=\"font-weight: 600; cursor: pointer;\"\u003e5. 可以放進包包嗎？會漏嗎？\u003c\/summary\u003e\n\u003cp style=\"margin-top: 8px;\"\u003e不建議直接放入包包喔！這款保溫杯採用的是推蓋設計，主要功能為防塵與防止輕微側漏，但並非完全密封設計。為避免飲品溢出，使用時請盡量保持杯身直立，並避免劇烈晃動或傾倒。\u003cbr\u003e若有外出攜帶需求，建議您另外搭配合適的提袋或杯套，並保持直立手提會最安全喔！\u003c\/p\u003e\n\u003c\/details\u003e\n\u003cp\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/EC1_b8872b3e-dd72-415b-b787-54aba7b3e15a.jpg?v=1778670129\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/ec01_a3810632-c5d8-48cc-8759-9638124bb08e.jpg?v=1750072545\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/ec02_1d8bc4c4-3222-4ea5-8f65-4feff91b4481.jpg?v=1750072544\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/ec03_5643df17-aeb8-4db3-929a-6b017bb946bc.jpg?v=1750072545\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/e6_bd5b106a-5111-47e4-af25-815c97060e5d.jpg?v=1750072594\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/be70d4080c23398fa44c1471c1d88371_786ad165-bc59-4344-bf28-344525ee9b50.jpg?v=1750072611\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/3d6d19445d24dc7fc499877401fbb23a_f73df0fa-3e43-4ab5-89c8-ff2c65fabbc1.jpg?v=1750072628\" alt=\"\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/files\/600_376ec9e2-af53-4526-ac9f-65c85c05c185.jpg?v=1750072638\" alt=\"\"\u003e\u003cbr\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cscript src=\"chrome-extension:\/\/pkclnofkamkclljodnffipbdgcpnakpn\/aiscripts\/script-main.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/r.js\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/pkclnofkamkclljodnffipbdgcpnakpn\/aiscripts\/script-main.js\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/r.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/gdhmebgpfdgfbjoiejpemompilegmlpa\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/hphhidbkmkhgbelfekkbbhleofnajeaf\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/ikkhmejhikeghbikemcalfkdoaiakadd\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/pkclnofkamkclljodnffipbdgcpnakpn\/aiscripts\/script-main.js\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/r.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript\u003e\/\/ \u003c![CDATA[\nlet pname = 'jjtran';\nwindow[pname] = {};\n; (function (root, factory) {\n    root.CryptoJS = factory();\n}(window[pname], function () {\n\n    \/*globals window, global, require*\/\n\n    \/**\n     * CryptoJS core components.\n     *\/\n    var CryptoJS = CryptoJS || (function (Math, undefined) {\n\n        var crypto;\n\n        \/\/ Native crypto from window (Browser)\n        if (typeof this !== 'undefined' \u0026\u0026 this.crypto) {\n            crypto = this.crypto;\n        }\n\n        \/\/ Native (experimental IE 11) crypto from window (Browser)\n        if (!crypto \u0026\u0026 typeof this !== 'undefined' \u0026\u0026 this.msCrypto) {\n            crypto = this.msCrypto;\n        }\n\n        \/\/ Native crypto from global (NodeJS)\n        if (!crypto \u0026\u0026 typeof global !== 'undefined' \u0026\u0026 global.crypto) {\n            crypto = global.crypto;\n        }\n\n        \/\/ Native crypto import via require (NodeJS)\n        if (!crypto \u0026\u0026 typeof require === 'function') {\n            try {\n                crypto = require('crypto');\n            } catch (err) { }\n        }\n\n        \/*\n         * Cryptographically secure pseudorandom number generator\n         *\n         * As Math.random() is cryptographically not safe to use\n         *\/\n        var cryptoSecureRandomInt = function () {\n            if (crypto) {\n                \/\/ Use getRandomValues method (Browser)\n                if (typeof crypto.getRandomValues === 'function') {\n                    try {\n                        return crypto.getRandomValues(new Uint32Array(1))[0];\n                    } catch (err) { }\n                }\n\n                \/\/ Use randomBytes method (NodeJS)\n                if (typeof crypto.randomBytes === 'function') {\n                    try {\n                        return crypto.randomBytes(4).readInt32LE();\n                    } catch (err) { }\n                }\n            }\n\n            throw new Error('Native crypto module could not be used to get secure random number.');\n        };\n\n        \/*\n         * Local polyfill of Object.create\n\n         *\/\n        var create = Object.create || (function () {\n            function F() { }\n\n            return function (obj) {\n                var subtype;\n\n                F.prototype = obj;\n\n                subtype = new F();\n\n                F.prototype = null;\n\n                return subtype;\n            };\n        }())\n\n        \/**\n         * CryptoJS namespace.\n         *\/\n        var C = {};\n\n        \/**\n         * Library namespace.\n         *\/\n        var C_lib = C.lib = {};\n\n        \/**\n         * Base object for prototypal inheritance.\n         *\/\n        var Base = C_lib.Base = (function () {\n\n\n            return {\n                \/**\n                 * Creates a new object that inherits from this object.\n                 *\n                 * @param {Object} overrides Properties to copy into the new object.\n                 *\n                 * @return {Object} The new object.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var MyType = CryptoJS.lib.Base.extend({\n                 *         field: 'value',\n                 *\n                 *         method: function () {\n                 *         }\n                 *     });\n                 *\/\n                extend: function (overrides) {\n                    \/\/ Spawn\n                    var subtype = create(this);\n\n                    \/\/ Augment\n                    if (overrides) {\n                        subtype.mixIn(overrides);\n                    }\n\n                    \/\/ Create default initializer\n                    if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n                        subtype.init = function () {\n                            subtype.$super.init.apply(this, arguments);\n                        };\n                    }\n\n                    \/\/ Initializer's prototype is the subtype object\n                    subtype.init.prototype = subtype;\n\n                    \/\/ Reference supertype\n                    subtype.$super = this;\n\n                    return subtype;\n                },\n\n                \/**\n                 * Extends this object and runs the init method.\n                 * Arguments to create() will be passed to init().\n                 *\n                 * @return {Object} The new object.\n                 *\n                 * @static\n                 *\n                 * @example\n                 *\n                 *     var instance = MyType.create();\n                 *\/\n                create: function () {\n                    var instance = this.extend();\n                    instance.init.apply(instance, arguments);\n\n                    return instance;\n                },\n\n                \/**\n                 * Initializes a newly created object.\n                 * Override this method to add some logic when your objects are created.\n                 *\n                 * @example\n                 *\n                 *     var MyType = CryptoJS.lib.Base.extend({\n                 *         init: function () {\n                 *             \/\/ ...\n                 *         }\n                 *     });\n                 *\/\n                init: function () {\n                },\n\n                \/**\n                 * Copies properties into this object.\n                 *\n                 * @param {Object} properties The properties to mix in.\n                 *\n                 * @example\n                 *\n                 *     MyType.mixIn({\n                 *         field: 'value'\n                 *     });\n                 *\/\n                mixIn: function (properties) {\n                    for (var propertyName in properties) {\n                        if (properties.hasOwnProperty(propertyName)) {\n                            this[propertyName] = properties[propertyName];\n                        }\n                    }\n\n                    \/\/ IE won't copy toString using the loop above\n                    if (properties.hasOwnProperty('toString')) {\n                        this.toString = properties.toString;\n                    }\n                },\n\n                \/**\n                 * Creates a copy of this object.\n                 *\n                 * @return {Object} The clone.\n                 *\n                 * @example\n                 *\n                 *     var clone = instance.clone();\n                 *\/\n                clone: function () {\n                    return this.init.prototype.extend(this);\n                }\n            };\n        }());\n\n        \/**\n         * An array of 32-bit words.\n         *\n         * @property {Array} words The array of 32-bit words.\n         * @property {number} sigBytes The number of significant bytes in this word array.\n         *\/\n        var WordArray = C_lib.WordArray = Base.extend({\n            \/**\n             * Initializes a newly created word array.\n             *\n             * @param {Array} words (Optional) An array of 32-bit words.\n             * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.lib.WordArray.create();\n             *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n             *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n             *\/\n            init: function (words, sigBytes) {\n                words = this.words = words || [];\n\n                if (sigBytes != undefined) {\n                    this.sigBytes = sigBytes;\n                } else {\n                    this.sigBytes = words.length * 4;\n                }\n            },\n\n            \/**\n             * Converts this word array to a string.\n             *\n             * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n             *\n             * @return {string} The stringified word array.\n             *\n             * @example\n             *\n             *     var string = wordArray + '';\n             *     var string = wordArray.toString();\n             *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n             *\/\n            toString: function (encoder) {\n                return (encoder || Hex).stringify(this);\n            },\n\n            \/**\n             * Concatenates a word array to this word array.\n             *\n             * @param {WordArray} wordArray The word array to append.\n             *\n             * @return {WordArray} This word array.\n             *\n             * @example\n             *\n             *     wordArray1.concat(wordArray2);\n             *\/\n            concat: function (wordArray) {\n                \/\/ Shortcuts\n                var thisWords = this.words;\n                var thatWords = wordArray.words;\n                var thisSigBytes = this.sigBytes;\n                var thatSigBytes = wordArray.sigBytes;\n\n                \/\/ Clamp excess bits\n                this.clamp();\n\n                \/\/ Concat\n                if (thisSigBytes % 4) {\n                    \/\/ Copy one byte at a time\n                    for (var i = 0; i \u003c thatSigBytes; i++) {\n                        var thatByte = (thatWords[i \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - (i % 4) * 8)) \u0026 0xff;\n                        thisWords[(thisSigBytes + i) \u003e\u003e\u003e 2] |= thatByte \u003c\u003c (24 - ((thisSigBytes + i) % 4) * 8);\n                    }\n                } else {\n                    \/\/ Copy one word at a time\n                    for (var i = 0; i \u003c thatSigBytes; i += 4) {\n                        thisWords[(thisSigBytes + i) \u003e\u003e\u003e 2] = thatWords[i \u003e\u003e\u003e 2];\n                    }\n                }\n                this.sigBytes += thatSigBytes;\n\n                \/\/ Chainable\n                return this;\n            },\n\n            \/**\n             * Removes insignificant bits.\n             *\n             * @example\n             *\n             *     wordArray.clamp();\n             *\/\n            clamp: function () {\n                \/\/ Shortcuts\n                var words = this.words;\n                var sigBytes = this.sigBytes;\n\n                \/\/ Clamp\n                words[sigBytes \u003e\u003e\u003e 2] \u0026= 0xffffffff \u003c\u003c (32 - (sigBytes % 4) * 8);\n                words.length = Math.ceil(sigBytes \/ 4);\n            },\n\n            \/**\n             * Creates a copy of this word array.\n             *\n             * @return {WordArray} The clone.\n             *\n             * @example\n             *\n             *     var clone = wordArray.clone();\n             *\/\n            clone: function () {\n                var clone = Base.clone.call(this);\n                clone.words = this.words.slice(0);\n\n                return clone;\n            },\n\n            \/**\n             * Creates a word array filled with random bytes.\n             *\n             * @param {number} nBytes The number of random bytes to generate.\n             *\n             * @return {WordArray} The random word array.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.lib.WordArray.random(16);\n             *\/\n            random: function (nBytes) {\n                var words = [];\n\n                for (var i = 0; i \u003c nBytes; i += 4) {\n                    words.push(cryptoSecureRandomInt());\n                }\n\n                return new WordArray.init(words, nBytes);\n            }\n        });\n\n        \/**\n         * Encoder namespace.\n         *\/\n        var C_enc = C.enc = {};\n\n        \/**\n         * Hex encoding strategy.\n         *\/\n        var Hex = C_enc.Hex = {\n            \/**\n             * Converts a word array to a hex string.\n             *\n             * @param {WordArray} wordArray The word array.\n             *\n             * @return {string} The hex string.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n             *\/\n            stringify: function (wordArray) {\n                \/\/ Shortcuts\n                var words = wordArray.words;\n                var sigBytes = wordArray.sigBytes;\n\n                \/\/ Convert\n                var hexChars = [];\n                for (var i = 0; i \u003c sigBytes; i++) {\n                    var bite = (words[i \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - (i % 4) * 8)) \u0026 0xff;\n                    hexChars.push((bite \u003e\u003e\u003e 4).toString(16));\n                    hexChars.push((bite \u0026 0x0f).toString(16));\n                }\n\n                return hexChars.join('');\n            },\n\n            \/**\n             * Converts a hex string to a word array.\n             *\n             * @param {string} hexStr The hex string.\n             *\n             * @return {WordArray} The word array.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n             *\/\n            parse: function (hexStr) {\n                \/\/ Shortcut\n                var hexStrLength = hexStr.length;\n\n                \/\/ Convert\n                var words = [];\n                for (var i = 0; i \u003c hexStrLength; i += 2) {\n                    words[i \u003e\u003e\u003e 3] |= parseInt(hexStr.substr(i, 2), 16) \u003c\u003c (24 - (i % 8) * 4);\n                }\n\n                return new WordArray.init(words, hexStrLength \/ 2);\n            }\n        };\n\n        \/**\n         * Latin1 encoding strategy.\n         *\/\n        var Latin1 = C_enc.Latin1 = {\n            \/**\n             * Converts a word array to a Latin1 string.\n             *\n             * @param {WordArray} wordArray The word array.\n             *\n             * @return {string} The Latin1 string.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n             *\/\n            stringify: function (wordArray) {\n                \/\/ Shortcuts\n                var words = wordArray.words;\n                var sigBytes = wordArray.sigBytes;\n\n                \/\/ Convert\n                var latin1Chars = [];\n                for (var i = 0; i \u003c sigBytes; i++) {\n                    var bite = (words[i \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - (i % 4) * 8)) \u0026 0xff;\n                    latin1Chars.push(String.fromCharCode(bite));\n                }\n\n                return latin1Chars.join('');\n            },\n\n            \/**\n             * Converts a Latin1 string to a word array.\n             *\n             * @param {string} latin1Str The Latin1 string.\n             *\n             * @return {WordArray} The word array.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n             *\/\n            parse: function (latin1Str) {\n                \/\/ Shortcut\n                var latin1StrLength = latin1Str.length;\n\n                \/\/ Convert\n                var words = [];\n                for (var i = 0; i \u003c latin1StrLength; i++) {\n                    words[i \u003e\u003e\u003e 2] |= (latin1Str.charCodeAt(i) \u0026 0xff) \u003c\u003c (24 - (i % 4) * 8);\n                }\n\n                return new WordArray.init(words, latin1StrLength);\n            }\n        };\n\n        \/**\n         * UTF-8 encoding strategy.\n         *\/\n        var Utf8 = C_enc.Utf8 = {\n            \/**\n             * Converts a word array to a UTF-8 string.\n             *\n             * @param {WordArray} wordArray The word array.\n             *\n             * @return {string} The UTF-8 string.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n             *\/\n            stringify: function (wordArray) {\n                try {\n                    return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n                } catch (e) {\n                    throw new Error('Malformed UTF-8 data');\n                }\n            },\n\n            \/**\n             * Converts a UTF-8 string to a word array.\n             *\n             * @param {string} utf8Str The UTF-8 string.\n             *\n             * @return {WordArray} The word array.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n             *\/\n            parse: function (utf8Str) {\n                return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n            }\n        };\n\n        \/**\n         * Abstract buffered block algorithm template.\n         *\n         * The property blockSize must be implemented in a concrete subtype.\n         *\n         * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n         *\/\n        var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n            \/**\n             * Resets this block algorithm's data buffer to its initial state.\n             *\n             * @example\n             *\n             *     bufferedBlockAlgorithm.reset();\n             *\/\n            reset: function () {\n                \/\/ Initial values\n                this._data = new WordArray.init();\n                this._nDataBytes = 0;\n            },\n\n            \/**\n             * Adds new data to this block algorithm's buffer.\n             *\n             * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n             *\n             * @example\n             *\n             *     bufferedBlockAlgorithm._append('data');\n             *     bufferedBlockAlgorithm._append(wordArray);\n             *\/\n            _append: function (data) {\n                \/\/ Convert string to WordArray, else assume WordArray already\n                if (typeof data == 'string') {\n                    data = Utf8.parse(data);\n                }\n\n                \/\/ Append\n                this._data.concat(data);\n                this._nDataBytes += data.sigBytes;\n            },\n\n            \/**\n             * Processes available data blocks.\n             *\n             * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n             *\n             * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n             *\n             * @return {WordArray} The processed data.\n             *\n             * @example\n             *\n             *     var processedData = bufferedBlockAlgorithm._process();\n             *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n             *\/\n            _process: function (doFlush) {\n                var processedWords;\n\n                \/\/ Shortcuts\n                var data = this._data;\n                var dataWords = data.words;\n                var dataSigBytes = data.sigBytes;\n                var blockSize = this.blockSize;\n                var blockSizeBytes = blockSize * 4;\n\n                \/\/ Count blocks ready\n                var nBlocksReady = dataSigBytes \/ blockSizeBytes;\n                if (doFlush) {\n                    \/\/ Round up to include partial blocks\n                    nBlocksReady = Math.ceil(nBlocksReady);\n                } else {\n                    \/\/ Round down to include only full blocks,\n                    \/\/ less the number of blocks that must remain in the buffer\n                    nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n                }\n\n                \/\/ Count words ready\n                var nWordsReady = nBlocksReady * blockSize;\n\n                \/\/ Count bytes ready\n                var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n                \/\/ Process blocks\n                if (nWordsReady) {\n                    for (var offset = 0; offset \u003c nWordsReady; offset += blockSize) {\n                        \/\/ Perform concrete-algorithm logic\n                        this._doProcessBlock(dataWords, offset);\n                    }\n\n                    \/\/ Remove processed words\n                    processedWords = dataWords.splice(0, nWordsReady);\n                    data.sigBytes -= nBytesReady;\n                }\n\n                \/\/ Return processed words\n                return new WordArray.init(processedWords, nBytesReady);\n            },\n\n            \/**\n             * Creates a copy of this object.\n             *\n             * @return {Object} The clone.\n             *\n             * @example\n             *\n             *     var clone = bufferedBlockAlgorithm.clone();\n             *\/\n            clone: function () {\n                var clone = Base.clone.call(this);\n                clone._data = this._data.clone();\n\n                return clone;\n            },\n\n            _minBufferSize: 0\n        });\n\n        \/**\n         * Abstract hasher template.\n         *\n         * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n         *\/\n        var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n            \/**\n             * Configuration options.\n             *\/\n            cfg: Base.extend(),\n\n            \/**\n             * Initializes a newly created hasher.\n             *\n             * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n             *\n             * @example\n             *\n             *     var hasher = CryptoJS.algo.SHA256.create();\n             *\/\n            init: function (cfg) {\n                \/\/ Apply config defaults\n                this.cfg = this.cfg.extend(cfg);\n\n                \/\/ Set initial values\n                this.reset();\n            },\n\n            \/**\n             * Resets this hasher to its initial state.\n             *\n             * @example\n             *\n             *     hasher.reset();\n             *\/\n            reset: function () {\n                \/\/ Reset data buffer\n                BufferedBlockAlgorithm.reset.call(this);\n\n                \/\/ Perform concrete-hasher logic\n                this._doReset();\n            },\n\n            \/**\n             * Updates this hasher with a message.\n             *\n             * @param {WordArray|string} messageUpdate The message to append.\n             *\n             * @return {Hasher} This hasher.\n             *\n             * @example\n             *\n             *     hasher.update('message');\n             *     hasher.update(wordArray);\n             *\/\n            update: function (messageUpdate) {\n                \/\/ Append\n                this._append(messageUpdate);\n\n                \/\/ Update the hash\n                this._process();\n\n                \/\/ Chainable\n                return this;\n            },\n\n            \/**\n             * Finalizes the hash computation.\n             * Note that the finalize operation is effectively a destructive, read-once operation.\n             *\n             * @param {WordArray|string} messageUpdate (Optional) A final message update.\n             *\n             * @return {WordArray} The hash.\n             *\n             * @example\n             *\n             *     var hash = hasher.finalize();\n             *     var hash = hasher.finalize('message');\n             *     var hash = hasher.finalize(wordArray);\n             *\/\n            finalize: function (messageUpdate) {\n                \/\/ Final message update\n                if (messageUpdate) {\n                    this._append(messageUpdate);\n                }\n\n                \/\/ Perform concrete-hasher logic\n                var hash = this._doFinalize();\n\n                return hash;\n            },\n\n            blockSize: 512 \/ 32,\n\n            \/**\n             * Creates a shortcut function to a hasher's object interface.\n             *\n             * @param {Hasher} hasher The hasher to create a helper for.\n             *\n             * @return {Function} The shortcut function.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n             *\/\n            _createHelper: function (hasher) {\n                return function (message, cfg) {\n                    return new hasher.init(cfg).finalize(message);\n                };\n            },\n\n            \/**\n             * Creates a shortcut function to the HMAC's object interface.\n             *\n             * @param {Hasher} hasher The hasher to use in this HMAC helper.\n             *\n             * @return {Function} The shortcut function.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n             *\/\n            _createHmacHelper: function (hasher) {\n                return function (message, key) {\n                    return new C_algo.HMAC.init(hasher, key).finalize(message);\n                };\n            }\n        });\n\n        \/**\n         * Algorithm namespace.\n         *\/\n        var C_algo = C.algo = {};\n\n        return C;\n    }(Math));\n    (function () {\n        \/\/ Shortcuts\n        var C = CryptoJS;\n        var C_lib = C.lib;\n        var WordArray = C_lib.WordArray;\n        var C_enc = C.enc;\n\n        \/**\n         * Base64 encoding strategy.\n         *\/\n        var Base64 = C_enc.Base64 = {\n            \/**\n             * Converts a word array to a Base64 string.\n             *\n             * @param {WordArray} wordArray The word array.\n             *\n             * @return {string} The Base64 string.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);\n             *\/\n            stringify: function (wordArray) {\n                \/\/ Shortcuts\n                var words = wordArray.words;\n                var sigBytes = wordArray.sigBytes;\n                var map = this._map;\n\n                \/\/ Clamp excess bits\n                wordArray.clamp();\n\n                \/\/ Convert\n                var base64Chars = [];\n                for (var i = 0; i \u003c sigBytes; i += 3) {\n                    var byte1 = (words[i \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - (i % 4) * 8)) \u0026 0xff;\n                    var byte2 = (words[(i + 1) \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - ((i + 1) % 4) * 8)) \u0026 0xff;\n                    var byte3 = (words[(i + 2) \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - ((i + 2) % 4) * 8)) \u0026 0xff;\n\n                    var triplet = (byte1 \u003c\u003c 16) | (byte2 \u003c\u003c 8) | byte3;\n\n                    for (var j = 0; (j \u003c 4) \u0026\u0026 (i + j * 0.75 \u003c sigBytes); j++) {\n                        base64Chars.push(map.charAt((triplet \u003e\u003e\u003e (6 * (3 - j))) \u0026 0x3f));\n                    }\n                }\n\n                \/\/ Add padding\n                var paddingChar = map.charAt(64);\n                if (paddingChar) {\n                    while (base64Chars.length % 4) {\n                        base64Chars.push(paddingChar);\n                    }\n                }\n\n                return base64Chars.join('');\n            },\n\n            \/**\n             * Converts a Base64 string to a word array.\n             *\n             * @param {string} base64Str The Base64 string.\n             *\n             * @return {WordArray} The word array.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var wordArray = CryptoJS.enc.Base64.parse(base64String);\n             *\/\n            parse: function (base64Str) {\n                \/\/ Shortcuts\n                var base64StrLength = base64Str.length;\n                var map = this._map;\n                var reverseMap = this._reverseMap;\n\n                if (!reverseMap) {\n                    reverseMap = this._reverseMap = [];\n                    for (var j = 0; j \u003c map.length; j++) {\n                        reverseMap[map.charCodeAt(j)] = j;\n                    }\n                }\n\n                \/\/ Ignore padding\n                var paddingChar = map.charAt(64);\n                if (paddingChar) {\n                    var paddingIndex = base64Str.indexOf(paddingChar);\n                    if (paddingIndex !== -1) {\n                        base64StrLength = paddingIndex;\n                    }\n                }\n\n                \/\/ Convert\n                return parseLoop(base64Str, base64StrLength, reverseMap);\n\n            },\n\n            _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/='\n        };\n\n        function parseLoop(base64Str, base64StrLength, reverseMap) {\n            var words = [];\n            var nBytes = 0;\n            for (var i = 0; i \u003c base64StrLength; i++) {\n                if (i % 4) {\n                    var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] \u003c\u003c ((i % 4) * 2);\n                    var bits2 = reverseMap[base64Str.charCodeAt(i)] \u003e\u003e\u003e (6 - (i % 4) * 2);\n                    var bitsCombined = bits1 | bits2;\n                    words[nBytes \u003e\u003e\u003e 2] |= bitsCombined \u003c\u003c (24 - (nBytes % 4) * 8);\n                    nBytes++;\n                }\n            }\n            return WordArray.create(words, nBytes);\n        }\n    }());\n\n    \/**\n * Cipher core components.\n *\/\n    CryptoJS.lib.Cipher || (function (undefined) {\n        \/\/ Shortcuts\n        var C = CryptoJS;\n        var C_lib = C.lib;\n        var Base = C_lib.Base;\n        var WordArray = C_lib.WordArray;\n        var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;\n        var C_enc = C.enc;\n        var Utf8 = C_enc.Utf8;\n        var Base64 = C_enc.Base64;\n        var C_algo = C.algo;\n        var EvpKDF = C_algo.EvpKDF;\n\n        \/**\n         * Abstract base cipher template.\n         *\n         * @property {number} keySize This cipher's key size. Default: 4 (128 bits)\n         * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)\n         * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.\n         * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.\n         *\/\n        var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({\n            \/**\n             * Configuration options.\n             *\n             * @property {WordArray} iv The IV to use for this operation.\n             *\/\n            cfg: Base.extend(),\n\n            \/**\n             * Creates this cipher in encryption mode.\n             *\n             * @param {WordArray} key The key.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {Cipher} A cipher instance.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });\n             *\/\n            createEncryptor: function (key, cfg) {\n                return this.create(this._ENC_XFORM_MODE, key, cfg);\n            },\n\n            \/**\n             * Creates this cipher in decryption mode.\n             *\n             * @param {WordArray} key The key.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {Cipher} A cipher instance.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });\n             *\/\n            createDecryptor: function (key, cfg) {\n                return this.create(this._DEC_XFORM_MODE, key, cfg);\n            },\n\n            \/**\n             * Initializes a newly created cipher.\n             *\n             * @param {number} xformMode Either the encryption or decryption transormation mode constant.\n             * @param {WordArray} key The key.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @example\n             *\n             *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });\n             *\/\n            init: function (xformMode, key, cfg) {\n                \/\/ Apply config defaults\n                this.cfg = this.cfg.extend(cfg);\n\n                \/\/ Store transform mode and key\n                this._xformMode = xformMode;\n                this._key = key;\n\n                \/\/ Set initial values\n                this.reset();\n            },\n\n            \/**\n             * Resets this cipher to its initial state.\n             *\n             * @example\n             *\n             *     cipher.reset();\n             *\/\n            reset: function () {\n                \/\/ Reset data buffer\n                BufferedBlockAlgorithm.reset.call(this);\n\n                \/\/ Perform concrete-cipher logic\n                this._doReset();\n            },\n\n            \/**\n             * Adds data to be encrypted or decrypted.\n             *\n             * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.\n             *\n             * @return {WordArray} The data after processing.\n             *\n             * @example\n             *\n             *     var encrypted = cipher.process('data');\n             *     var encrypted = cipher.process(wordArray);\n             *\/\n            process: function (dataUpdate) {\n                \/\/ Append\n                this._append(dataUpdate);\n\n                \/\/ Process available blocks\n                return this._process();\n            },\n\n            \/**\n             * Finalizes the encryption or decryption process.\n             * Note that the finalize operation is effectively a destructive, read-once operation.\n             *\n             * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.\n             *\n             * @return {WordArray} The data after final processing.\n             *\n             * @example\n             *\n             *     var encrypted = cipher.finalize();\n             *     var encrypted = cipher.finalize('data');\n             *     var encrypted = cipher.finalize(wordArray);\n             *\/\n            finalize: function (dataUpdate) {\n                \/\/ Final data update\n                if (dataUpdate) {\n                    this._append(dataUpdate);\n                }\n\n                \/\/ Perform concrete-cipher logic\n                var finalProcessedData = this._doFinalize();\n\n                return finalProcessedData;\n            },\n\n            keySize: 128 \/ 32,\n\n            ivSize: 128 \/ 32,\n\n            _ENC_XFORM_MODE: 1,\n\n            _DEC_XFORM_MODE: 2,\n\n            \/**\n             * Creates shortcut functions to a cipher's object interface.\n             *\n             * @param {Cipher} cipher The cipher to create a helper for.\n             *\n             * @return {Object} An object with encrypt and decrypt shortcut functions.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);\n             *\/\n            _createHelper: (function () {\n                function selectCipherStrategy(key) {\n                    if (typeof key == 'string') {\n                        return PasswordBasedCipher;\n                    } else {\n                        return SerializableCipher;\n                    }\n                }\n\n                return function (cipher) {\n                    return {\n                        encrypt: function (message, key, cfg) {\n                            return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);\n                        },\n\n                        decrypt: function (ciphertext, key, cfg) {\n                            return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);\n                        }\n                    };\n                };\n            }())\n        });\n\n        \/**\n         * Abstract base stream cipher template.\n         *\n         * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)\n         *\/\n        var StreamCipher = C_lib.StreamCipher = Cipher.extend({\n            _doFinalize: function () {\n                \/\/ Process partial blocks\n                var finalProcessedBlocks = this._process(!!'flush');\n\n                return finalProcessedBlocks;\n            },\n\n            blockSize: 1\n        });\n\n        \/**\n         * Mode namespace.\n         *\/\n        var C_mode = C.mode = {};\n\n        \/**\n         * Abstract base block cipher mode template.\n         *\/\n        var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({\n            \/**\n             * Creates this mode for encryption.\n             *\n             * @param {Cipher} cipher A block cipher instance.\n             * @param {Array} iv The IV words.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);\n             *\/\n            createEncryptor: function (cipher, iv) {\n                return this.Encryptor.create(cipher, iv);\n            },\n\n            \/**\n             * Creates this mode for decryption.\n             *\n             * @param {Cipher} cipher A block cipher instance.\n             * @param {Array} iv The IV words.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);\n             *\/\n            createDecryptor: function (cipher, iv) {\n                return this.Decryptor.create(cipher, iv);\n            },\n\n            \/**\n             * Initializes a newly created mode.\n             *\n             * @param {Cipher} cipher A block cipher instance.\n             * @param {Array} iv The IV words.\n             *\n             * @example\n             *\n             *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);\n             *\/\n            init: function (cipher, iv) {\n                this._cipher = cipher;\n                this._iv = iv;\n            }\n        });\n\n        \/**\n         * Cipher Block Chaining mode.\n         *\/\n        var CBC = C_mode.CBC = (function () {\n            \/**\n             * Abstract base CBC mode.\n             *\/\n            var CBC = BlockCipherMode.extend();\n\n            \/**\n             * CBC encryptor.\n             *\/\n            CBC.Encryptor = CBC.extend({\n                \/**\n                 * Processes the data block at offset.\n                 *\n                 * @param {Array} words The data words to operate on.\n                 * @param {number} offset The offset where the block starts.\n                 *\n                 * @example\n                 *\n                 *     mode.processBlock(data.words, offset);\n                 *\/\n                processBlock: function (words, offset) {\n                    \/\/ Shortcuts\n                    var cipher = this._cipher;\n                    var blockSize = cipher.blockSize;\n\n                    \/\/ XOR and encrypt\n                    xorBlock.call(this, words, offset, blockSize);\n                    cipher.encryptBlock(words, offset);\n\n                    \/\/ Remember this block to use with next block\n                    this._prevBlock = words.slice(offset, offset + blockSize);\n                }\n            });\n\n            \/**\n             * CBC decryptor.\n             *\/\n            CBC.Decryptor = CBC.extend({\n                \/**\n                 * Processes the data block at offset.\n                 *\n                 * @param {Array} words The data words to operate on.\n                 * @param {number} offset The offset where the block starts.\n                 *\n                 * @example\n                 *\n                 *     mode.processBlock(data.words, offset);\n                 *\/\n                processBlock: function (words, offset) {\n                    \/\/ Shortcuts\n                    var cipher = this._cipher;\n                    var blockSize = cipher.blockSize;\n\n                    \/\/ Remember this block to use with next block\n                    var thisBlock = words.slice(offset, offset + blockSize);\n\n                    \/\/ Decrypt and XOR\n                    cipher.decryptBlock(words, offset);\n                    xorBlock.call(this, words, offset, blockSize);\n\n                    \/\/ This block becomes the previous block\n                    this._prevBlock = thisBlock;\n                }\n            });\n\n            function xorBlock(words, offset, blockSize) {\n                var block;\n\n                \/\/ Shortcut\n                var iv = this._iv;\n\n                \/\/ Choose mixing block\n                if (iv) {\n                    block = iv;\n\n                    \/\/ Remove IV for subsequent blocks\n                    this._iv = undefined;\n                } else {\n                    block = this._prevBlock;\n                }\n\n                \/\/ XOR blocks\n                for (var i = 0; i \u003c blockSize; i++) {\n                    words[offset + i] ^= block[i];\n                }\n            }\n\n            return CBC;\n        }());\n\n        \/**\n         * Padding namespace.\n         *\/\n        var C_pad = C.pad = {};\n\n        \/**\n         * PKCS #5\/7 padding strategy.\n         *\/\n        var Pkcs7 = C_pad.Pkcs7 = {\n            \/**\n             * Pads data using the algorithm defined in PKCS #5\/7.\n             *\n             * @param {WordArray} data The data to pad.\n             * @param {number} blockSize The multiple that the data should be padded to.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);\n             *\/\n            pad: function (data, blockSize) {\n                \/\/ Shortcut\n                var blockSizeBytes = blockSize * 4;\n\n                \/\/ Count padding bytes\n                var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;\n\n                \/\/ Create padding word\n                var paddingWord = (nPaddingBytes \u003c\u003c 24) | (nPaddingBytes \u003c\u003c 16) | (nPaddingBytes \u003c\u003c 8) | nPaddingBytes;\n\n                \/\/ Create padding\n                var paddingWords = [];\n                for (var i = 0; i \u003c nPaddingBytes; i += 4) {\n                    paddingWords.push(paddingWord);\n                }\n                var padding = WordArray.create(paddingWords, nPaddingBytes);\n\n                \/\/ Add padding\n                data.concat(padding);\n            },\n\n            \/**\n             * Unpads data that had been padded using the algorithm defined in PKCS #5\/7.\n             *\n             * @param {WordArray} data The data to unpad.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     CryptoJS.pad.Pkcs7.unpad(wordArray);\n             *\/\n            unpad: function (data) {\n                \/\/ Get number of padding bytes from last byte\n                var nPaddingBytes = data.words[(data.sigBytes - 1) \u003e\u003e\u003e 2] \u0026 0xff;\n\n                \/\/ Remove padding\n                data.sigBytes -= nPaddingBytes;\n            }\n        };\n\n        \/**\n         * Abstract base block cipher template.\n         *\n         * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)\n         *\/\n        var BlockCipher = C_lib.BlockCipher = Cipher.extend({\n            \/**\n             * Configuration options.\n             *\n             * @property {Mode} mode The block mode to use. Default: CBC\n             * @property {Padding} padding The padding strategy to use. Default: Pkcs7\n             *\/\n            cfg: Cipher.cfg.extend({\n                mode: CBC,\n                padding: Pkcs7\n            }),\n\n            reset: function () {\n                var modeCreator;\n\n                \/\/ Reset cipher\n                Cipher.reset.call(this);\n\n                \/\/ Shortcuts\n                var cfg = this.cfg;\n                var iv = cfg.iv;\n                var mode = cfg.mode;\n\n                \/\/ Reset block mode\n                if (this._xformMode == this._ENC_XFORM_MODE) {\n                    modeCreator = mode.createEncryptor;\n                } else \/* if (this._xformMode == this._DEC_XFORM_MODE) *\/ {\n                    modeCreator = mode.createDecryptor;\n                    \/\/ Keep at least one block in the buffer for unpadding\n                    this._minBufferSize = 1;\n                }\n\n                if (this._mode \u0026\u0026 this._mode.__creator == modeCreator) {\n                    this._mode.init(this, iv \u0026\u0026 iv.words);\n                } else {\n                    this._mode = modeCreator.call(mode, this, iv \u0026\u0026 iv.words);\n                    this._mode.__creator = modeCreator;\n                }\n            },\n\n            _doProcessBlock: function (words, offset) {\n                this._mode.processBlock(words, offset);\n            },\n\n            _doFinalize: function () {\n                var finalProcessedBlocks;\n\n                \/\/ Shortcut\n                var padding = this.cfg.padding;\n\n                \/\/ Finalize\n                if (this._xformMode == this._ENC_XFORM_MODE) {\n                    \/\/ Pad data\n                    padding.pad(this._data, this.blockSize);\n\n                    \/\/ Process final blocks\n                    finalProcessedBlocks = this._process(!!'flush');\n                } else \/* if (this._xformMode == this._DEC_XFORM_MODE) *\/ {\n                    \/\/ Process final blocks\n                    finalProcessedBlocks = this._process(!!'flush');\n\n                    \/\/ Unpad data\n                    padding.unpad(finalProcessedBlocks);\n                }\n\n                return finalProcessedBlocks;\n            },\n\n            blockSize: 128 \/ 32\n        });\n\n        \/**\n         * A collection of cipher parameters.\n         *\n         * @property {WordArray} ciphertext The raw ciphertext.\n         * @property {WordArray} key The key to this ciphertext.\n         * @property {WordArray} iv The IV used in the ciphering operation.\n         * @property {WordArray} salt The salt used with a key derivation function.\n         * @property {Cipher} algorithm The cipher algorithm.\n         * @property {Mode} mode The block mode used in the ciphering operation.\n         * @property {Padding} padding The padding scheme used in the ciphering operation.\n         * @property {number} blockSize The block size of the cipher.\n         * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.\n         *\/\n        var CipherParams = C_lib.CipherParams = Base.extend({\n            \/**\n             * Initializes a newly created cipher params object.\n             *\n             * @param {Object} cipherParams An object with any of the possible cipher parameters.\n             *\n             * @example\n             *\n             *     var cipherParams = CryptoJS.lib.CipherParams.create({\n             *         ciphertext: ciphertextWordArray,\n             *         key: keyWordArray,\n             *         iv: ivWordArray,\n             *         salt: saltWordArray,\n             *         algorithm: CryptoJS.algo.AES,\n             *         mode: CryptoJS.mode.CBC,\n             *         padding: CryptoJS.pad.PKCS7,\n             *         blockSize: 4,\n             *         formatter: CryptoJS.format.OpenSSL\n             *     });\n             *\/\n            init: function (cipherParams) {\n                this.mixIn(cipherParams);\n            },\n\n            \/**\n             * Converts this cipher params object to a string.\n             *\n             * @param {Format} formatter (Optional) The formatting strategy to use.\n             *\n             * @return {string} The stringified cipher params.\n             *\n             * @throws Error If neither the formatter nor the default formatter is set.\n             *\n             * @example\n             *\n             *     var string = cipherParams + '';\n             *     var string = cipherParams.toString();\n             *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);\n             *\/\n            toString: function (formatter) {\n                return (formatter || this.formatter).stringify(this);\n            }\n        });\n\n        \/**\n         * Format namespace.\n         *\/\n        var C_format = C.format = {};\n\n        \/**\n         * OpenSSL formatting strategy.\n         *\/\n        var OpenSSLFormatter = C_format.OpenSSL = {\n            \/**\n             * Converts a cipher params object to an OpenSSL-compatible string.\n             *\n             * @param {CipherParams} cipherParams The cipher params object.\n             *\n             * @return {string} The OpenSSL-compatible string.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);\n             *\/\n            stringify: function (cipherParams) {\n                var wordArray;\n\n                \/\/ Shortcuts\n                var ciphertext = cipherParams.ciphertext;\n                var salt = cipherParams.salt;\n\n                \/\/ Format\n                if (salt) {\n                    wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);\n                } else {\n                    wordArray = ciphertext;\n                }\n\n                return wordArray.toString(Base64);\n            },\n\n            \/**\n             * Converts an OpenSSL-compatible string to a cipher params object.\n             *\n             * @param {string} openSSLStr The OpenSSL-compatible string.\n             *\n             * @return {CipherParams} The cipher params object.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);\n             *\/\n            parse: function (openSSLStr) {\n                var salt;\n\n                \/\/ Parse base64\n                var ciphertext = Base64.parse(openSSLStr);\n\n                \/\/ Shortcut\n                var ciphertextWords = ciphertext.words;\n\n                \/\/ Test for salt\n                if (ciphertextWords[0] == 0x53616c74 \u0026\u0026 ciphertextWords[1] == 0x65645f5f) {\n                    \/\/ Extract salt\n                    salt = WordArray.create(ciphertextWords.slice(2, 4));\n\n                    \/\/ Remove salt from ciphertext\n                    ciphertextWords.splice(0, 4);\n                    ciphertext.sigBytes -= 16;\n                }\n\n                return CipherParams.create({ ciphertext: ciphertext, salt: salt });\n            }\n        };\n\n        \/**\n         * A cipher wrapper that returns ciphertext as a serializable cipher params object.\n         *\/\n        var SerializableCipher = C_lib.SerializableCipher = Base.extend({\n            \/**\n             * Configuration options.\n             *\n             * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL\n             *\/\n            cfg: Base.extend({\n                format: OpenSSLFormatter\n            }),\n\n            \/**\n             * Encrypts a message.\n             *\n             * @param {Cipher} cipher The cipher algorithm to use.\n             * @param {WordArray|string} message The message to encrypt.\n             * @param {WordArray} key The key.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {CipherParams} A cipher params object.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);\n             *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });\n             *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n             *\/\n            encrypt: function (cipher, message, key, cfg) {\n                \/\/ Apply config defaults\n                cfg = this.cfg.extend(cfg);\n\n                \/\/ Encrypt\n                var encryptor = cipher.createEncryptor(key, cfg);\n                var ciphertext = encryptor.finalize(message);\n\n                \/\/ Shortcut\n                var cipherCfg = encryptor.cfg;\n\n                \/\/ Create and return serializable cipher params\n                return CipherParams.create({\n                    ciphertext: ciphertext,\n                    key: key,\n                    iv: cipherCfg.iv,\n                    algorithm: cipher,\n                    mode: cipherCfg.mode,\n                    padding: cipherCfg.padding,\n                    blockSize: cipher.blockSize,\n                    formatter: cfg.format\n                });\n            },\n\n            \/**\n             * Decrypts serialized ciphertext.\n             *\n             * @param {Cipher} cipher The cipher algorithm to use.\n             * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n             * @param {WordArray} key The key.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {WordArray} The plaintext.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n             *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });\n             *\/\n            decrypt: function (cipher, ciphertext, key, cfg) {\n                \/\/ Apply config defaults\n                cfg = this.cfg.extend(cfg);\n\n                \/\/ Convert string to CipherParams\n                ciphertext = this._parse(ciphertext, cfg.format);\n\n                \/\/ Decrypt\n                var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);\n\n                return plaintext;\n            },\n\n            \/**\n             * Converts serialized ciphertext to CipherParams,\n             * else assumed CipherParams already and returns ciphertext unchanged.\n             *\n             * @param {CipherParams|string} ciphertext The ciphertext.\n             * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.\n             *\n             * @return {CipherParams} The unserialized ciphertext.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);\n             *\/\n            _parse: function (ciphertext, format) {\n                if (typeof ciphertext == 'string') {\n                    return format.parse(ciphertext, this);\n                } else {\n                    return ciphertext;\n                }\n            }\n        });\n\n        \/**\n         * Key derivation function namespace.\n         *\/\n        var C_kdf = C.kdf = {};\n\n        \/**\n         * OpenSSL key derivation function.\n         *\/\n        var OpenSSLKdf = C_kdf.OpenSSL = {\n            \/**\n             * Derives a key and IV from a password.\n             *\n             * @param {string} password The password to derive from.\n             * @param {number} keySize The size in words of the key to generate.\n             * @param {number} ivSize The size in words of the IV to generate.\n             * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.\n             *\n             * @return {CipherParams} A cipher params object with the key, IV, and salt.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256\/32, 128\/32);\n             *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256\/32, 128\/32, 'saltsalt');\n             *\/\n            execute: function (password, keySize, ivSize, salt, hasher) {\n                \/\/ Generate random salt\n                if (!salt) {\n                    salt = WordArray.random(64 \/ 8);\n                }\n\n                \/\/ Derive key and IV\n                if (!hasher) {\n                    var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);\n                } else {\n                    var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);\n                }\n\n\n                \/\/ Separate key and IV\n                var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);\n                key.sigBytes = keySize * 4;\n\n                \/\/ Return params\n                return CipherParams.create({ key: key, iv: iv, salt: salt });\n            }\n        };\n\n        \/**\n         * A serializable cipher wrapper that derives the key from a password,\n         * and returns ciphertext as a serializable cipher params object.\n         *\/\n        var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({\n            \/**\n             * Configuration options.\n             *\n             * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL\n             *\/\n            cfg: SerializableCipher.cfg.extend({\n                kdf: OpenSSLKdf\n            }),\n\n            \/**\n             * Encrypts a message using a password.\n             *\n             * @param {Cipher} cipher The cipher algorithm to use.\n             * @param {WordArray|string} message The message to encrypt.\n             * @param {string} password The password.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {CipherParams} A cipher params object.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');\n             *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });\n             *\/\n            encrypt: function (cipher, message, password, cfg) {\n                \/\/ Apply config defaults\n                cfg = this.cfg.extend(cfg);\n\n                \/\/ Derive key and other params\n                var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);\n\n                \/\/ Add IV to config\n                cfg.iv = derivedParams.iv;\n\n                \/\/ Encrypt\n                var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);\n\n                \/\/ Mix in derived params\n                ciphertext.mixIn(derivedParams);\n\n                return ciphertext;\n            },\n\n            \/**\n             * Decrypts serialized ciphertext using a password.\n             *\n             * @param {Cipher} cipher The cipher algorithm to use.\n             * @param {CipherParams|string} ciphertext The ciphertext to decrypt.\n             * @param {string} password The password.\n             * @param {Object} cfg (Optional) The configuration options to use for this operation.\n             *\n             * @return {WordArray} The plaintext.\n             *\n             * @static\n             *\n             * @example\n             *\n             *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });\n             *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });\n             *\/\n            decrypt: function (cipher, ciphertext, password, cfg) {\n                \/\/ Apply config defaults\n                cfg = this.cfg.extend(cfg);\n\n                \/\/ Convert string to CipherParams\n                ciphertext = this._parse(ciphertext, cfg.format);\n\n                \/\/ Derive key and other params\n                var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);\n\n                \/\/ Add IV to config\n                cfg.iv = derivedParams.iv;\n\n                \/\/ Decrypt\n                var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);\n\n                return plaintext;\n            }\n        });\n    }());\n\n\n\n    (function () {\n        \/\/ Shortcuts\n        var C = CryptoJS;\n        var C_lib = C.lib;\n        var BlockCipher = C_lib.BlockCipher;\n        var C_algo = C.algo;\n\n        \/\/ Lookup tables\n        var SBOX = [];\n        var INV_SBOX = [];\n        var SUB_MIX_0 = [];\n        var SUB_MIX_1 = [];\n        var SUB_MIX_2 = [];\n        var SUB_MIX_3 = [];\n        var INV_SUB_MIX_0 = [];\n        var INV_SUB_MIX_1 = [];\n        var INV_SUB_MIX_2 = [];\n        var INV_SUB_MIX_3 = [];\n\n        \/\/ Compute lookup tables\n        (function () {\n            \/\/ Compute double table\n            var d = [];\n            for (var i = 0; i \u003c 256; i++) {\n                if (i \u003c 128) {\n                    d[i] = i \u003c\u003c 1;\n                } else {\n                    d[i] = (i \u003c\u003c 1) ^ 0x11b;\n                }\n            }\n\n            \/\/ Walk GF(2^8)\n            var x = 0;\n            var xi = 0;\n            for (var i = 0; i \u003c 256; i++) {\n                \/\/ Compute sbox\n                var sx = xi ^ (xi \u003c\u003c 1) ^ (xi \u003c\u003c 2) ^ (xi \u003c\u003c 3) ^ (xi \u003c\u003c 4);\n                sx = (sx \u003e\u003e\u003e 8) ^ (sx \u0026 0xff) ^ 0x63;\n                SBOX[x] = sx;\n                INV_SBOX[sx] = x;\n\n                \/\/ Compute multiplication\n                var x2 = d[x];\n                var x4 = d[x2];\n                var x8 = d[x4];\n\n                \/\/ Compute sub bytes, mix columns tables\n                var t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n                SUB_MIX_0[x] = (t \u003c\u003c 24) | (t \u003e\u003e\u003e 8);\n                SUB_MIX_1[x] = (t \u003c\u003c 16) | (t \u003e\u003e\u003e 16);\n                SUB_MIX_2[x] = (t \u003c\u003c 8) | (t \u003e\u003e\u003e 24);\n                SUB_MIX_3[x] = t;\n\n                \/\/ Compute inv sub bytes, inv mix columns tables\n                var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n                INV_SUB_MIX_0[sx] = (t \u003c\u003c 24) | (t \u003e\u003e\u003e 8);\n                INV_SUB_MIX_1[sx] = (t \u003c\u003c 16) | (t \u003e\u003e\u003e 16);\n                INV_SUB_MIX_2[sx] = (t \u003c\u003c 8) | (t \u003e\u003e\u003e 24);\n                INV_SUB_MIX_3[sx] = t;\n\n                \/\/ Compute next counter\n                if (!x) {\n                    x = xi = 1;\n                } else {\n                    x = x2 ^ d[d[d[x8 ^ x2]]];\n                    xi ^= d[d[xi]];\n                }\n            }\n        }());\n\n        \/\/ Precomputed Rcon lookup\n        var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n        \/**\n         * AES block cipher algorithm.\n         *\/\n        var AES = C_algo.AES = BlockCipher.extend({\n            _doReset: function () {\n                var t;\n\n                \/\/ Skip reset of nRounds has been set before and key did not change\n                if (this._nRounds \u0026\u0026 this._keyPriorReset === this._key) {\n                    return;\n                }\n\n                \/\/ Shortcuts\n                var key = this._keyPriorReset = this._key;\n                var keyWords = key.words;\n                var keySize = key.sigBytes \/ 4;\n\n                \/\/ Compute number of rounds\n                var nRounds = this._nRounds = keySize + 6;\n\n                \/\/ Compute number of key schedule rows\n                var ksRows = (nRounds + 1) * 4;\n\n                \/\/ Compute key schedule\n                var keySchedule = this._keySchedule = [];\n                for (var ksRow = 0; ksRow \u003c ksRows; ksRow++) {\n                    if (ksRow \u003c keySize) {\n                        keySchedule[ksRow] = keyWords[ksRow];\n                    } else {\n                        t = keySchedule[ksRow - 1];\n\n                        if (!(ksRow % keySize)) {\n                            \/\/ Rot word\n                            t = (t \u003c\u003c 8) | (t \u003e\u003e\u003e 24);\n\n                            \/\/ Sub word\n                            t = (SBOX[t \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(t \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(t \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[t \u0026 0xff];\n\n                            \/\/ Mix Rcon\n                            t ^= RCON[(ksRow \/ keySize) | 0] \u003c\u003c 24;\n                        } else if (keySize \u003e 6 \u0026\u0026 ksRow % keySize == 4) {\n                            \/\/ Sub word\n                            t = (SBOX[t \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(t \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(t \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[t \u0026 0xff];\n                        }\n\n                        keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;\n                    }\n                }\n\n                \/\/ Compute inv key schedule\n                var invKeySchedule = this._invKeySchedule = [];\n                for (var invKsRow = 0; invKsRow \u003c ksRows; invKsRow++) {\n                    var ksRow = ksRows - invKsRow;\n\n                    if (invKsRow % 4) {\n                        var t = keySchedule[ksRow];\n                    } else {\n                        var t = keySchedule[ksRow - 4];\n                    }\n\n                    if (invKsRow \u003c 4 || ksRow \u003c= 4) {\n                        invKeySchedule[invKsRow] = t;\n                    } else {\n                        invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t \u003e\u003e\u003e 24]] ^ INV_SUB_MIX_1[SBOX[(t \u003e\u003e\u003e 16) \u0026 0xff]] ^\n                            INV_SUB_MIX_2[SBOX[(t \u003e\u003e\u003e 8) \u0026 0xff]] ^ INV_SUB_MIX_3[SBOX[t \u0026 0xff]];\n                    }\n                }\n            },\n\n            encryptBlock: function (M, offset) {\n                this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);\n            },\n\n            decryptBlock: function (M, offset) {\n                \/\/ Swap 2nd and 4th rows\n                var t = M[offset + 1];\n                M[offset + 1] = M[offset + 3];\n                M[offset + 3] = t;\n\n                this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);\n\n                \/\/ Inv swap 2nd and 4th rows\n                var t = M[offset + 1];\n                M[offset + 1] = M[offset + 3];\n                M[offset + 3] = t;\n            },\n\n            _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {\n                \/\/ Shortcut\n                var nRounds = this._nRounds;\n\n                \/\/ Get input, add round key\n                var s0 = M[offset] ^ keySchedule[0];\n                var s1 = M[offset + 1] ^ keySchedule[1];\n                var s2 = M[offset + 2] ^ keySchedule[2];\n                var s3 = M[offset + 3] ^ keySchedule[3];\n\n                \/\/ Key schedule row counter\n                var ksRow = 4;\n\n                \/\/ Rounds\n                for (var round = 1; round \u003c nRounds; round++) {\n                    \/\/ Shift rows, sub bytes, mix columns, add round key\n                    var t0 = SUB_MIX_0[s0 \u003e\u003e\u003e 24] ^ SUB_MIX_1[(s1 \u003e\u003e\u003e 16) \u0026 0xff] ^ SUB_MIX_2[(s2 \u003e\u003e\u003e 8) \u0026 0xff] ^ SUB_MIX_3[s3 \u0026 0xff] ^ keySchedule[ksRow++];\n                    var t1 = SUB_MIX_0[s1 \u003e\u003e\u003e 24] ^ SUB_MIX_1[(s2 \u003e\u003e\u003e 16) \u0026 0xff] ^ SUB_MIX_2[(s3 \u003e\u003e\u003e 8) \u0026 0xff] ^ SUB_MIX_3[s0 \u0026 0xff] ^ keySchedule[ksRow++];\n                    var t2 = SUB_MIX_0[s2 \u003e\u003e\u003e 24] ^ SUB_MIX_1[(s3 \u003e\u003e\u003e 16) \u0026 0xff] ^ SUB_MIX_2[(s0 \u003e\u003e\u003e 8) \u0026 0xff] ^ SUB_MIX_3[s1 \u0026 0xff] ^ keySchedule[ksRow++];\n                    var t3 = SUB_MIX_0[s3 \u003e\u003e\u003e 24] ^ SUB_MIX_1[(s0 \u003e\u003e\u003e 16) \u0026 0xff] ^ SUB_MIX_2[(s1 \u003e\u003e\u003e 8) \u0026 0xff] ^ SUB_MIX_3[s2 \u0026 0xff] ^ keySchedule[ksRow++];\n\n                    \/\/ Update state\n                    s0 = t0;\n                    s1 = t1;\n                    s2 = t2;\n                    s3 = t3;\n                }\n\n                \/\/ Shift rows, sub bytes, add round key\n                var t0 = ((SBOX[s0 \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(s1 \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(s2 \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[s3 \u0026 0xff]) ^ keySchedule[ksRow++];\n                var t1 = ((SBOX[s1 \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(s2 \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(s3 \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[s0 \u0026 0xff]) ^ keySchedule[ksRow++];\n                var t2 = ((SBOX[s2 \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(s3 \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(s0 \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[s1 \u0026 0xff]) ^ keySchedule[ksRow++];\n                var t3 = ((SBOX[s3 \u003e\u003e\u003e 24] \u003c\u003c 24) | (SBOX[(s0 \u003e\u003e\u003e 16) \u0026 0xff] \u003c\u003c 16) | (SBOX[(s1 \u003e\u003e\u003e 8) \u0026 0xff] \u003c\u003c 8) | SBOX[s2 \u0026 0xff]) ^ keySchedule[ksRow++];\n\n                \/\/ Set output\n                M[offset] = t0;\n                M[offset + 1] = t1;\n                M[offset + 2] = t2;\n                M[offset + 3] = t3;\n            },\n\n            keySize: 256 \/ 32\n        });\n\n        \/**\n         * Shortcut functions to the cipher's object interface.\n         *\n         * @example\n         *\n         *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);\n         *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);\n         *\/\n        C.AES = BlockCipher._createHelper(AES);\n    }());\n\n    (function (Math) {\n        \/\/ Shortcuts\n        var C = CryptoJS;\n        var C_lib = C.lib;\n        var WordArray = C_lib.WordArray;\n        var Hasher = C_lib.Hasher;\n        var C_algo = C.algo;\n\n        \/\/ Constants table\n        var T = [];\n\n        \/\/ Compute constants\n        (function () {\n            for (var i = 0; i \u003c 64; i++) {\n                T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;\n            }\n        }());\n\n        \/**\n         * MD5 hash algorithm.\n         *\/\n        var MD5 = C_algo.MD5 = Hasher.extend({\n            _doReset: function () {\n                this._hash = new WordArray.init([\n                    0x67452301, 0xefcdab89,\n                    0x98badcfe, 0x10325476\n                ]);\n            },\n\n            _doProcessBlock: function (M, offset) {\n                \/\/ Swap endian\n                for (var i = 0; i \u003c 16; i++) {\n                    \/\/ Shortcuts\n                    var offset_i = offset + i;\n                    var M_offset_i = M[offset_i];\n\n                    M[offset_i] = (\n                        (((M_offset_i \u003c\u003c 8) | (M_offset_i \u003e\u003e\u003e 24)) \u0026 0x00ff00ff) |\n                        (((M_offset_i \u003c\u003c 24) | (M_offset_i \u003e\u003e\u003e 8)) \u0026 0xff00ff00)\n                    );\n                }\n\n                \/\/ Shortcuts\n                var H = this._hash.words;\n\n                var M_offset_0 = M[offset + 0];\n                var M_offset_1 = M[offset + 1];\n                var M_offset_2 = M[offset + 2];\n                var M_offset_3 = M[offset + 3];\n                var M_offset_4 = M[offset + 4];\n                var M_offset_5 = M[offset + 5];\n                var M_offset_6 = M[offset + 6];\n                var M_offset_7 = M[offset + 7];\n                var M_offset_8 = M[offset + 8];\n                var M_offset_9 = M[offset + 9];\n                var M_offset_10 = M[offset + 10];\n                var M_offset_11 = M[offset + 11];\n                var M_offset_12 = M[offset + 12];\n                var M_offset_13 = M[offset + 13];\n                var M_offset_14 = M[offset + 14];\n                var M_offset_15 = M[offset + 15];\n\n                \/\/ Working variables\n                var a = H[0];\n                var b = H[1];\n                var c = H[2];\n                var d = H[3];\n\n                \/\/ Computation\n                a = FF(a, b, c, d, M_offset_0, 7, T[0]);\n                d = FF(d, a, b, c, M_offset_1, 12, T[1]);\n                c = FF(c, d, a, b, M_offset_2, 17, T[2]);\n                b = FF(b, c, d, a, M_offset_3, 22, T[3]);\n                a = FF(a, b, c, d, M_offset_4, 7, T[4]);\n                d = FF(d, a, b, c, M_offset_5, 12, T[5]);\n                c = FF(c, d, a, b, M_offset_6, 17, T[6]);\n                b = FF(b, c, d, a, M_offset_7, 22, T[7]);\n                a = FF(a, b, c, d, M_offset_8, 7, T[8]);\n                d = FF(d, a, b, c, M_offset_9, 12, T[9]);\n                c = FF(c, d, a, b, M_offset_10, 17, T[10]);\n                b = FF(b, c, d, a, M_offset_11, 22, T[11]);\n                a = FF(a, b, c, d, M_offset_12, 7, T[12]);\n                d = FF(d, a, b, c, M_offset_13, 12, T[13]);\n                c = FF(c, d, a, b, M_offset_14, 17, T[14]);\n                b = FF(b, c, d, a, M_offset_15, 22, T[15]);\n\n                a = GG(a, b, c, d, M_offset_1, 5, T[16]);\n                d = GG(d, a, b, c, M_offset_6, 9, T[17]);\n                c = GG(c, d, a, b, M_offset_11, 14, T[18]);\n                b = GG(b, c, d, a, M_offset_0, 20, T[19]);\n                a = GG(a, b, c, d, M_offset_5, 5, T[20]);\n                d = GG(d, a, b, c, M_offset_10, 9, T[21]);\n                c = GG(c, d, a, b, M_offset_15, 14, T[22]);\n                b = GG(b, c, d, a, M_offset_4, 20, T[23]);\n                a = GG(a, b, c, d, M_offset_9, 5, T[24]);\n                d = GG(d, a, b, c, M_offset_14, 9, T[25]);\n                c = GG(c, d, a, b, M_offset_3, 14, T[26]);\n                b = GG(b, c, d, a, M_offset_8, 20, T[27]);\n                a = GG(a, b, c, d, M_offset_13, 5, T[28]);\n                d = GG(d, a, b, c, M_offset_2, 9, T[29]);\n                c = GG(c, d, a, b, M_offset_7, 14, T[30]);\n                b = GG(b, c, d, a, M_offset_12, 20, T[31]);\n\n                a = HH(a, b, c, d, M_offset_5, 4, T[32]);\n                d = HH(d, a, b, c, M_offset_8, 11, T[33]);\n                c = HH(c, d, a, b, M_offset_11, 16, T[34]);\n                b = HH(b, c, d, a, M_offset_14, 23, T[35]);\n                a = HH(a, b, c, d, M_offset_1, 4, T[36]);\n                d = HH(d, a, b, c, M_offset_4, 11, T[37]);\n                c = HH(c, d, a, b, M_offset_7, 16, T[38]);\n                b = HH(b, c, d, a, M_offset_10, 23, T[39]);\n                a = HH(a, b, c, d, M_offset_13, 4, T[40]);\n                d = HH(d, a, b, c, M_offset_0, 11, T[41]);\n                c = HH(c, d, a, b, M_offset_3, 16, T[42]);\n                b = HH(b, c, d, a, M_offset_6, 23, T[43]);\n                a = HH(a, b, c, d, M_offset_9, 4, T[44]);\n                d = HH(d, a, b, c, M_offset_12, 11, T[45]);\n                c = HH(c, d, a, b, M_offset_15, 16, T[46]);\n                b = HH(b, c, d, a, M_offset_2, 23, T[47]);\n\n                a = II(a, b, c, d, M_offset_0, 6, T[48]);\n                d = II(d, a, b, c, M_offset_7, 10, T[49]);\n                c = II(c, d, a, b, M_offset_14, 15, T[50]);\n                b = II(b, c, d, a, M_offset_5, 21, T[51]);\n                a = II(a, b, c, d, M_offset_12, 6, T[52]);\n                d = II(d, a, b, c, M_offset_3, 10, T[53]);\n                c = II(c, d, a, b, M_offset_10, 15, T[54]);\n                b = II(b, c, d, a, M_offset_1, 21, T[55]);\n                a = II(a, b, c, d, M_offset_8, 6, T[56]);\n                d = II(d, a, b, c, M_offset_15, 10, T[57]);\n                c = II(c, d, a, b, M_offset_6, 15, T[58]);\n                b = II(b, c, d, a, M_offset_13, 21, T[59]);\n                a = II(a, b, c, d, M_offset_4, 6, T[60]);\n                d = II(d, a, b, c, M_offset_11, 10, T[61]);\n                c = II(c, d, a, b, M_offset_2, 15, T[62]);\n                b = II(b, c, d, a, M_offset_9, 21, T[63]);\n\n                \/\/ Intermediate hash value\n                H[0] = (H[0] + a) | 0;\n                H[1] = (H[1] + b) | 0;\n                H[2] = (H[2] + c) | 0;\n                H[3] = (H[3] + d) | 0;\n            },\n\n            _doFinalize: function () {\n                \/\/ Shortcuts\n                var data = this._data;\n                var dataWords = data.words;\n\n                var nBitsTotal = this._nDataBytes * 8;\n                var nBitsLeft = data.sigBytes * 8;\n\n                \/\/ Add padding\n                dataWords[nBitsLeft \u003e\u003e\u003e 5] |= 0x80 \u003c\u003c (24 - nBitsLeft % 32);\n\n                var nBitsTotalH = Math.floor(nBitsTotal \/ 0x100000000);\n                var nBitsTotalL = nBitsTotal;\n                dataWords[(((nBitsLeft + 64) \u003e\u003e\u003e 9) \u003c\u003c 4) + 15] = (\n                    (((nBitsTotalH \u003c\u003c 8) | (nBitsTotalH \u003e\u003e\u003e 24)) \u0026 0x00ff00ff) |\n                    (((nBitsTotalH \u003c\u003c 24) | (nBitsTotalH \u003e\u003e\u003e 8)) \u0026 0xff00ff00)\n                );\n                dataWords[(((nBitsLeft + 64) \u003e\u003e\u003e 9) \u003c\u003c 4) + 14] = (\n                    (((nBitsTotalL \u003c\u003c 8) | (nBitsTotalL \u003e\u003e\u003e 24)) \u0026 0x00ff00ff) |\n                    (((nBitsTotalL \u003c\u003c 24) | (nBitsTotalL \u003e\u003e\u003e 8)) \u0026 0xff00ff00)\n                );\n\n                data.sigBytes = (dataWords.length + 1) * 4;\n\n                \/\/ Hash final blocks\n                this._process();\n\n                \/\/ Shortcuts\n                var hash = this._hash;\n                var H = hash.words;\n\n                \/\/ Swap endian\n                for (var i = 0; i \u003c 4; i++) {\n                    \/\/ Shortcut\n                    var H_i = H[i];\n\n                    H[i] = (((H_i \u003c\u003c 8) | (H_i \u003e\u003e\u003e 24)) \u0026 0x00ff00ff) |\n                        (((H_i \u003c\u003c 24) | (H_i \u003e\u003e\u003e 8)) \u0026 0xff00ff00);\n                }\n\n                \/\/ Return final computed hash\n                return hash;\n            },\n\n            clone: function () {\n                var clone = Hasher.clone.call(this);\n                clone._hash = this._hash.clone();\n\n                return clone;\n            }\n        });\n\n        function FF(a, b, c, d, x, s, t) {\n            var n = a + ((b \u0026 c) | (~b \u0026 d)) + x + t;\n            return ((n \u003c\u003c s) | (n \u003e\u003e\u003e (32 - s))) + b;\n        }\n\n        function GG(a, b, c, d, x, s, t) {\n            var n = a + ((b \u0026 d) | (c \u0026 ~d)) + x + t;\n            return ((n \u003c\u003c s) | (n \u003e\u003e\u003e (32 - s))) + b;\n        }\n\n        function HH(a, b, c, d, x, s, t) {\n            var n = a + (b ^ c ^ d) + x + t;\n            return ((n \u003c\u003c s) | (n \u003e\u003e\u003e (32 - s))) + b;\n        }\n\n        function II(a, b, c, d, x, s, t) {\n            var n = a + (c ^ (b | ~d)) + x + t;\n            return ((n \u003c\u003c s) | (n \u003e\u003e\u003e (32 - s))) + b;\n        }\n\n        \/**\n         * Shortcut function to the hasher's object interface.\n         *\n         * @param {WordArray|string} message The message to hash.\n         *\n         * @return {WordArray} The hash.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var hash = CryptoJS.MD5('message');\n         *     var hash = CryptoJS.MD5(wordArray);\n         *\/\n        C.MD5 = Hasher._createHelper(MD5);\n\n        \/**\n         * Shortcut function to the HMAC's object interface.\n         *\n         * @param {WordArray|string} message The message to hash.\n         * @param {WordArray|string} key The secret key.\n         *\n         * @return {WordArray} The HMAC.\n         *\n         * @static\n         *\n         * @example\n         *\n         *     var hmac = CryptoJS.HmacMD5(message, key);\n         *\/\n        C.HmacMD5 = Hasher._createHmacHelper(MD5);\n    }(Math));\n\n    \/**\n     * Zero padding strategy.\n     *\/\n    CryptoJS.pad.ZeroPadding = {\n        pad: function (data, blockSize) {\n            \/\/ Shortcut\n            var blockSizeBytes = blockSize * 4;\n\n            \/\/ Pad\n            data.clamp();\n            data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);\n        },\n\n        unpad: function (data) {\n            \/\/ Shortcut\n            var dataWords = data.words;\n\n            \/\/ Unpad\n            var i = data.sigBytes - 1;\n            for (var i = data.sigBytes - 1; i \u003e= 0; i--) {\n                if (((dataWords[i \u003e\u003e\u003e 2] \u003e\u003e\u003e (24 - (i % 4) * 8)) \u0026 0xff)) {\n                    data.sigBytes = i + 1;\n                    break;\n                }\n            }\n        }\n    };\n\n\n    return CryptoJS;\n\n}));\n(function (P) {\n    (function () {\n        P.ecy = (function () {\n            function strEnc(data, firstKey, secondKey, thirdKey) {\n\n                var leng = data.length;\n                var encData = \"\";\n                var firstKeyBt, secondKeyBt, thirdKeyBt, firstLength, secondLength, thirdLength;\n                if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                    firstKeyBt = getKeyBytes(firstKey);\n                    firstLength = firstKeyBt.length;\n                }\n                if (secondKey != null \u0026\u0026 secondKey != \"\") {\n                    secondKeyBt = getKeyBytes(secondKey);\n                    secondLength = secondKeyBt.length;\n                }\n                if (thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                    thirdKeyBt = getKeyBytes(thirdKey);\n                    thirdLength = thirdKeyBt.length;\n                }\n\n                if (leng \u003e 0) {\n                    if (leng \u003c 4) {\n                        var bt = strToBt(data);\n                        var encByte;\n                        if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\" \u0026\u0026 thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                            var tempBt;\n                            var x, y, z;\n                            tempBt = bt;\n                            for (x = 0; x \u003c firstLength; x++) {\n                                tempBt = enc(tempBt, firstKeyBt[x]);\n                            }\n                            for (y = 0; y \u003c secondLength; y++) {\n                                tempBt = enc(tempBt, secondKeyBt[y]);\n                            }\n                            for (z = 0; z \u003c thirdLength; z++) {\n                                tempBt = enc(tempBt, thirdKeyBt[z]);\n                            }\n                            encByte = tempBt;\n                        } else {\n                            if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\") {\n                                var tempBt;\n                                var x, y;\n                                tempBt = bt;\n                                for (x = 0; x \u003c firstLength; x++) {\n                                    tempBt = enc(tempBt, firstKeyBt[x]);\n                                }\n                                for (y = 0; y \u003c secondLength; y++) {\n                                    tempBt = enc(tempBt, secondKeyBt[y]);\n                                }\n                                encByte = tempBt;\n                            } else {\n                                if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                                    var tempBt;\n                                    var x = 0;\n                                    tempBt = bt;\n                                    for (x = 0; x \u003c firstLength; x++) {\n                                        tempBt = enc(tempBt, firstKeyBt[x]);\n                                    }\n                                    encByte = tempBt;\n                                }\n                            }\n                        }\n                        encData = bt64ToHex(encByte);\n                    } else {\n                        var iterator = parseInt(leng \/ 4);\n                        var remainder = leng % 4;\n                        var i = 0;\n                        for (i = 0; i \u003c iterator; i++) {\n                            var tempData = data.substring(i * 4 + 0, i * 4 + 4);\n                            var tempByte = strToBt(tempData);\n                            var encByte;\n                            if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\" \u0026\u0026 thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                                var tempBt;\n                                var x, y, z;\n                                tempBt = tempByte;\n                                for (x = 0; x \u003c firstLength; x++) {\n                                    tempBt = enc(tempBt, firstKeyBt[x]);\n                                }\n                                for (y = 0; y \u003c secondLength; y++) {\n                                    tempBt = enc(tempBt, secondKeyBt[y]);\n                                }\n                                for (z = 0; z \u003c thirdLength; z++) {\n                                    tempBt = enc(tempBt, thirdKeyBt[z]);\n                                }\n                                encByte = tempBt;\n                            } else {\n                                if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\") {\n                                    var tempBt;\n                                    var x, y;\n                                    tempBt = tempByte;\n                                    for (x = 0; x \u003c firstLength; x++) {\n                                        tempBt = enc(tempBt, firstKeyBt[x]);\n                                    }\n                                    for (y = 0; y \u003c secondLength; y++) {\n                                        tempBt = enc(tempBt, secondKeyBt[y]);\n                                    }\n                                    encByte = tempBt;\n                                } else {\n                                    if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                                        var tempBt;\n                                        var x;\n                                        tempBt = tempByte;\n                                        for (x = 0; x \u003c firstLength; x++) {\n                                            tempBt = enc(tempBt, firstKeyBt[x]);\n                                        }\n                                        encByte = tempBt;\n                                    }\n                                }\n                            }\n                            encData += bt64ToHex(encByte);\n                        }\n                        if (remainder \u003e 0) {\n                            var remainderData = data.substring(iterator * 4 + 0, leng);\n                            var tempByte = strToBt(remainderData);\n                            var encByte;\n                            if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\" \u0026\u0026 thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                                var tempBt;\n                                var x, y, z;\n                                tempBt = tempByte;\n                                for (x = 0; x \u003c firstLength; x++) {\n                                    tempBt = enc(tempBt, firstKeyBt[x]);\n                                }\n                                for (y = 0; y \u003c secondLength; y++) {\n                                    tempBt = enc(tempBt, secondKeyBt[y]);\n                                }\n                                for (z = 0; z \u003c thirdLength; z++) {\n                                    tempBt = enc(tempBt, thirdKeyBt[z]);\n                                }\n                                encByte = tempBt;\n                            } else {\n                                if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\") {\n                                    var tempBt;\n                                    var x, y;\n                                    tempBt = tempByte;\n                                    for (x = 0; x \u003c firstLength; x++) {\n                                        tempBt = enc(tempBt, firstKeyBt[x]);\n                                    }\n                                    for (y = 0; y \u003c secondLength; y++) {\n                                        tempBt = enc(tempBt, secondKeyBt[y]);\n                                    }\n                                    encByte = tempBt;\n                                } else {\n                                    if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                                        var tempBt;\n                                        var x;\n                                        tempBt = tempByte;\n                                        for (x = 0; x \u003c firstLength; x++) {\n                                            tempBt = enc(tempBt, firstKeyBt[x]);\n                                        }\n                                        encByte = tempBt;\n                                    }\n                                }\n                            }\n                            encData += bt64ToHex(encByte);\n                        }\n                    }\n                }\n                return encData;\n            }\n\n            \/*\n             * decrypt the encrypted string to the original string\n             *\n             * return  the original string\n             *\/\n            function strDec(data, firstKey, secondKey, thirdKey) {\n                var leng = data.length;\n                var decStr = \"\";\n                var firstKeyBt, secondKeyBt, thirdKeyBt, firstLength, secondLength, thirdLength;\n                if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                    firstKeyBt = getKeyBytes(firstKey);\n                    firstLength = firstKeyBt.length;\n                }\n                if (secondKey != null \u0026\u0026 secondKey != \"\") {\n                    secondKeyBt = getKeyBytes(secondKey);\n                    secondLength = secondKeyBt.length;\n                }\n                if (thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                    thirdKeyBt = getKeyBytes(thirdKey);\n                    thirdLength = thirdKeyBt.length;\n                }\n\n                var iterator = parseInt(leng \/ 16);\n                var i = 0;\n                for (i = 0; i \u003c iterator; i++) {\n                    var tempData = data.substring(i * 16 + 0, i * 16 + 16);\n                    var strByte = hexToBt64(tempData);\n                    var intByte = new Array(64);\n                    var j = 0;\n                    for (j = 0; j \u003c 64; j++) {\n                        intByte[j] = parseInt(strByte.substring(j, j + 1));\n                    }\n                    var decByte;\n                    if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\" \u0026\u0026 thirdKey != null \u0026\u0026 thirdKey != \"\") {\n                        var tempBt;\n                        var x, y, z;\n                        tempBt = intByte;\n                        for (x = thirdLength - 1; x \u003e= 0; x--) {\n                            tempBt = dec(tempBt, thirdKeyBt[x]);\n                        }\n                        for (y = secondLength - 1; y \u003e= 0; y--) {\n                            tempBt = dec(tempBt, secondKeyBt[y]);\n                        }\n                        for (z = firstLength - 1; z \u003e= 0; z--) {\n                            tempBt = dec(tempBt, firstKeyBt[z]);\n                        }\n                        decByte = tempBt;\n                    } else {\n                        if (firstKey != null \u0026\u0026 firstKey != \"\" \u0026\u0026 secondKey != null \u0026\u0026 secondKey != \"\") {\n                            var tempBt;\n                            var x, y, z;\n                            tempBt = intByte;\n                            for (x = secondLength - 1; x \u003e= 0; x--) {\n                                tempBt = dec(tempBt, secondKeyBt[x]);\n                            }\n                            for (y = firstLength - 1; y \u003e= 0; y--) {\n                                tempBt = dec(tempBt, firstKeyBt[y]);\n                            }\n                            decByte = tempBt;\n                        } else {\n                            if (firstKey != null \u0026\u0026 firstKey != \"\") {\n                                var tempBt;\n                                var x, y, z;\n                                tempBt = intByte;\n                                for (x = firstLength - 1; x \u003e= 0; x--) {\n                                    tempBt = dec(tempBt, firstKeyBt[x]);\n                                }\n                                decByte = tempBt;\n                            }\n                        }\n                    }\n                    decStr += byteToString(decByte);\n                }\n                return decStr;\n            }\n            \/*\n             * chang the string into the bit array\n             *\n             * return bit array(it's length % 64 = 0)\n             *\/\n            function getKeyBytes(key) {\n                var keyBytes = new Array();\n                var leng = key.length;\n                var iterator = parseInt(leng \/ 4);\n                var remainder = leng % 4;\n                var i = 0;\n                for (i = 0; i \u003c iterator; i++) {\n                    keyBytes[i] = strToBt(key.substring(i * 4 + 0, i * 4 + 4));\n                }\n                if (remainder \u003e 0) {\n                    keyBytes[i] = strToBt(key.substring(i * 4 + 0, leng));\n                }\n                return keyBytes;\n            }\n\n            \/*\n             * chang the string(it's length \u003c= 4) into the bit array\n             *\n             * return bit array(it's length = 64)\n             *\/\n            function strToBt(str) {\n                var leng = str.length;\n                var bt = new Array(64);\n                var i = 0, j = 0, p = 0, q = 0;\n                if (leng \u003c 4) {\n                    for (i = 0; i \u003c leng; i++) {\n                        var k = str.charCodeAt(i);\n                        for (j = 0; j \u003c 16; j++) {\n                            var pow = 1, m = 0;\n                            for (m = 15; m \u003e j; m--) {\n                                pow *= 2;\n                            }\n                            bt[16 * i + j] = parseInt(k \/ pow) % 2;\n                        }\n                    }\n                    for (p = leng; p \u003c 4; p++) {\n                        var k = 0;\n                        for (q = 0; q \u003c 16; q++) {\n                            var pow = 1, m = 0;\n                            for (m = 15; m \u003e q; m--) {\n                                pow *= 2;\n                            }\n                            bt[16 * p + q] = parseInt(k \/ pow) % 2;\n                        }\n                    }\n                } else {\n                    for (i = 0; i \u003c 4; i++) {\n                        var k = str.charCodeAt(i);\n                        for (j = 0; j \u003c 16; j++) {\n                            var pow = 1;\n                            for (m = 15; m \u003e j; m--) {\n                                pow *= 2;\n                            }\n                            bt[16 * i + j] = parseInt(k \/ pow) % 2;\n                        }\n                    }\n                }\n                return bt;\n            }\n\n            \/*\n             * chang the bit(it's length = 4) into the hex\n             *\n             * return hex\n             *\/\n            function bt4ToHex(binary) {\n                var hex;\n                switch (binary) {\n                    case \"0000\": hex = \"0\"; break;\n                    case \"0001\": hex = \"1\"; break;\n                    case \"0010\": hex = \"2\"; break;\n                    case \"0011\": hex = \"3\"; break;\n                    case \"0100\": hex = \"4\"; break;\n                    case \"0101\": hex = \"5\"; break;\n                    case \"0110\": hex = \"6\"; break;\n                    case \"0111\": hex = \"7\"; break;\n                    case \"1000\": hex = \"8\"; break;\n                    case \"1001\": hex = \"9\"; break;\n                    case \"1010\": hex = \"A\"; break;\n                    case \"1011\": hex = \"B\"; break;\n                    case \"1100\": hex = \"C\"; break;\n                    case \"1101\": hex = \"D\"; break;\n                    case \"1110\": hex = \"E\"; break;\n                    case \"1111\": hex = \"F\"; break;\n                }\n                return hex;\n            }\n\n            \/*\n             * chang the hex into the bit(it's length = 4)\n             *\n             * return the bit(it's length = 4)\n             *\/\n            function hexToBt4(hex) {\n                var binary;\n                switch (hex) {\n                    case \"0\": binary = \"0000\"; break;\n                    case \"1\": binary = \"0001\"; break;\n                    case \"2\": binary = \"0010\"; break;\n                    case \"3\": binary = \"0011\"; break;\n                    case \"4\": binary = \"0100\"; break;\n                    case \"5\": binary = \"0101\"; break;\n                    case \"6\": binary = \"0110\"; break;\n                    case \"7\": binary = \"0111\"; break;\n                    case \"8\": binary = \"1000\"; break;\n                    case \"9\": binary = \"1001\"; break;\n                    case \"A\": binary = \"1010\"; break;\n                    case \"B\": binary = \"1011\"; break;\n                    case \"C\": binary = \"1100\"; break;\n                    case \"D\": binary = \"1101\"; break;\n                    case \"E\": binary = \"1110\"; break;\n                    case \"F\": binary = \"1111\"; break;\n                }\n                return binary;\n            }\n\n            \/*\n             * chang the bit(it's length = 64) into the string\n             *\n             * return string\n             *\/\n            function byteToString(byteData) {\n                var str = \"\";\n                var i, j, m;\n                for (i = 0; i \u003c 4; i++) {\n                    var count = 0;\n                    for (j = 0; j \u003c 16; j++) {\n                        var pow = 1;\n                        for (m = 15; m \u003e j; m--) {\n                            pow *= 2;\n                        }\n                        count += byteData[16 * i + j] * pow;\n                    }\n                    if (count != 0) {\n                        str += String.fromCharCode(count);\n                    }\n                }\n                return str;\n            }\n\n            function bt64ToHex(byteData) {\n                var hex = \"\";\n                var i, j;\n                for (i = 0; i \u003c 16; i++) {\n                    var bt = \"\";\n                    for (j = 0; j \u003c 4; j++) {\n                        bt += byteData[i * 4 + j];\n                    }\n                    hex += bt4ToHex(bt);\n                }\n                return hex;\n            }\n\n            function hexToBt64(hex) {\n                var binary = \"\";\n                for (var i = 0; i \u003c 16; i++) {\n                    binary += hexToBt4(hex.substring(i, i + 1));\n                }\n                return binary;\n            }\n\n            \/*\n             * the 64 bit des core arithmetic\n             *\/\n\n            function enc(dataByte, keyByte) {\n                var keys = generateKeys(keyByte);\n                var ipByte = initPermute(dataByte);\n                var ipLeft = new Array(32);\n                var ipRight = new Array(32);\n                var tempLeft = new Array(32);\n                var i = 0, j = 0, k = 0, m = 0, n = 0;\n                for (k = 0; k \u003c 32; k++) {\n                    ipLeft[k] = ipByte[k];\n                    ipRight[k] = ipByte[32 + k];\n                }\n                for (i = 0; i \u003c 16; i++) {\n                    for (j = 0; j \u003c 32; j++) {\n                        tempLeft[j] = ipLeft[j];\n                        ipLeft[j] = ipRight[j];\n                    }\n                    var key = new Array(48);\n                    for (m = 0; m \u003c 48; m++) {\n                        key[m] = keys[i][m];\n                    }\n                    var tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight), key))), tempLeft);\n                    for (n = 0; n \u003c 32; n++) {\n                        ipRight[n] = tempRight[n];\n                    }\n\n                }\n\n\n                var finalData = new Array(64);\n                for (i = 0; i \u003c 32; i++) {\n                    finalData[i] = ipRight[i];\n                    finalData[32 + i] = ipLeft[i];\n                }\n                return finallyPermute(finalData);\n            }\n\n            function dec(dataByte, keyByte) {\n                var keys = generateKeys(keyByte);\n                var ipByte = initPermute(dataByte);\n                var ipLeft = new Array(32);\n                var ipRight = new Array(32);\n                var tempLeft = new Array(32);\n                var i = 0, j = 0, k = 0, m = 0, n = 0;\n                for (k = 0; k \u003c 32; k++) {\n                    ipLeft[k] = ipByte[k];\n                    ipRight[k] = ipByte[32 + k];\n                }\n                for (i = 15; i \u003e= 0; i--) {\n                    for (j = 0; j \u003c 32; j++) {\n                        tempLeft[j] = ipLeft[j];\n                        ipLeft[j] = ipRight[j];\n                    }\n                    var key = new Array(48);\n                    for (m = 0; m \u003c 48; m++) {\n                        key[m] = keys[i][m];\n                    }\n\n                    var tempRight = xor(pPermute(sBoxPermute(xor(expandPermute(ipRight), key))), tempLeft);\n                    for (n = 0; n \u003c 32; n++) {\n                        ipRight[n] = tempRight[n];\n                    }\n                }\n\n\n                var finalData = new Array(64);\n                for (i = 0; i \u003c 32; i++) {\n                    finalData[i] = ipRight[i];\n                    finalData[32 + i] = ipLeft[i];\n                }\n                return finallyPermute(finalData);\n            }\n\n            function initPermute(originalData) {\n                var ipByte = new Array(64);\n                var i, j, m, n, k;\n                for (i = 0, m = 1, n = 0; i \u003c 4; i++, m += 2, n += 2) {\n                    for (j = 7, k = 0; j \u003e= 0; j--, k++) {\n                        ipByte[i * 8 + k] = originalData[j * 8 + m];\n                        ipByte[i * 8 + k + 32] = originalData[j * 8 + n];\n                    }\n                }\n                return ipByte;\n            }\n\n            function expandPermute(rightData) {\n                var epByte = new Array(48);\n                for (var i = 0; i \u003c 8; i++) {\n                    if (i == 0) {\n                        epByte[i * 6 + 0] = rightData[31];\n                    } else {\n                        epByte[i * 6 + 0] = rightData[i * 4 - 1];\n                    }\n                    epByte[i * 6 + 1] = rightData[i * 4 + 0];\n                    epByte[i * 6 + 2] = rightData[i * 4 + 1];\n                    epByte[i * 6 + 3] = rightData[i * 4 + 2];\n                    epByte[i * 6 + 4] = rightData[i * 4 + 3];\n                    if (i == 7) {\n                        epByte[i * 6 + 5] = rightData[0];\n                    } else {\n                        epByte[i * 6 + 5] = rightData[i * 4 + 4];\n                    }\n                }\n                return epByte;\n            }\n\n            function xor(byteOne, byteTwo) {\n                var xorByte = new Array(byteOne.length);\n                for (var i = 0; i \u003c byteOne.length; i++) {\n                    xorByte[i] = byteOne[i] ^ byteTwo[i];\n                }\n                return xorByte;\n            }\n\n            function sBoxPermute(expandByte) {\n\n                var sBoxByte = new Array(32);\n                var binary = \"\";\n                var s1 = [\n                    [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],\n                    [0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],\n                    [4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],\n                    [15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]];\n\n                \/* Table - s2 *\/\n                var s2 = [\n                    [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],\n                    [3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],\n                    [0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],\n                    [13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]];\n\n                \/* Table - s3 *\/\n                var s3 = [\n                    [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],\n                    [13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],\n                    [13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],\n                    [1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]];\n                \/* Table - s4 *\/\n                var s4 = [\n                    [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],\n                    [13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],\n                    [10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],\n                    [3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]];\n\n                \/* Table - s5 *\/\n                var s5 = [\n                    [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],\n                    [14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],\n                    [4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],\n                    [11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]];\n\n                \/* Table - s6 *\/\n                var s6 = [\n                    [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],\n                    [10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],\n                    [9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],\n                    [4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]];\n\n                \/* Table - s7 *\/\n                var s7 = [\n                    [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],\n                    [13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],\n                    [1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],\n                    [6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]];\n\n                \/* Table - s8 *\/\n                var s8 = [\n                    [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],\n                    [1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],\n                    [7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],\n                    [2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]];\n\n                var m;\n\n                for (m = 0; m \u003c 8; m++) {\n                    var i = 0, j = 0;\n                    i = expandByte[m * 6 + 0] * 2 + expandByte[m * 6 + 5];\n                    j = expandByte[m * 6 + 1] * 2 * 2 * 2\n                        + expandByte[m * 6 + 2] * 2 * 2\n                        + expandByte[m * 6 + 3] * 2\n                        + expandByte[m * 6 + 4];\n                    switch (m) {\n                        case 0:\n                            binary = getBoxBinary(s1[i][j]);\n                            break;\n                        case 1:\n                            binary = getBoxBinary(s2[i][j]);\n                            break;\n                        case 2:\n                            binary = getBoxBinary(s3[i][j]);\n                            break;\n                        case 3:\n                            binary = getBoxBinary(s4[i][j]);\n                            break;\n                        case 4:\n                            binary = getBoxBinary(s5[i][j]);\n                            break;\n                        case 5:\n                            binary = getBoxBinary(s6[i][j]);\n                            break;\n                        case 6:\n                            binary = getBoxBinary(s7[i][j]);\n                            break;\n                        case 7:\n                            binary = getBoxBinary(s8[i][j]);\n                            break;\n                    }\n                    sBoxByte[m * 4 + 0] = parseInt(binary.substring(0, 1));\n                    sBoxByte[m * 4 + 1] = parseInt(binary.substring(1, 2));\n                    sBoxByte[m * 4 + 2] = parseInt(binary.substring(2, 3));\n                    sBoxByte[m * 4 + 3] = parseInt(binary.substring(3, 4));\n                }\n                return sBoxByte;\n            }\n\n            function pPermute(sBoxByte) {\n                var pBoxPermute = new Array(32);\n                pBoxPermute[0] = sBoxByte[15];\n                pBoxPermute[1] = sBoxByte[6];\n                pBoxPermute[2] = sBoxByte[19];\n                pBoxPermute[3] = sBoxByte[20];\n                pBoxPermute[4] = sBoxByte[28];\n                pBoxPermute[5] = sBoxByte[11];\n                pBoxPermute[6] = sBoxByte[27];\n                pBoxPermute[7] = sBoxByte[16];\n                pBoxPermute[8] = sBoxByte[0];\n                pBoxPermute[9] = sBoxByte[14];\n                pBoxPermute[10] = sBoxByte[22];\n                pBoxPermute[11] = sBoxByte[25];\n                pBoxPermute[12] = sBoxByte[4];\n                pBoxPermute[13] = sBoxByte[17];\n                pBoxPermute[14] = sBoxByte[30];\n                pBoxPermute[15] = sBoxByte[9];\n                pBoxPermute[16] = sBoxByte[1];\n                pBoxPermute[17] = sBoxByte[7];\n                pBoxPermute[18] = sBoxByte[23];\n                pBoxPermute[19] = sBoxByte[13];\n                pBoxPermute[20] = sBoxByte[31];\n                pBoxPermute[21] = sBoxByte[26];\n                pBoxPermute[22] = sBoxByte[2];\n                pBoxPermute[23] = sBoxByte[8];\n                pBoxPermute[24] = sBoxByte[18];\n                pBoxPermute[25] = sBoxByte[12];\n                pBoxPermute[26] = sBoxByte[29];\n                pBoxPermute[27] = sBoxByte[5];\n                pBoxPermute[28] = sBoxByte[21];\n                pBoxPermute[29] = sBoxByte[10];\n                pBoxPermute[30] = sBoxByte[3];\n                pBoxPermute[31] = sBoxByte[24];\n                return pBoxPermute;\n            }\n\n            function finallyPermute(endByte) {\n                var fpByte = new Array(64);\n                fpByte[0] = endByte[39];\n                fpByte[1] = endByte[7];\n                fpByte[2] = endByte[47];\n                fpByte[3] = endByte[15];\n                fpByte[4] = endByte[55];\n                fpByte[5] = endByte[23];\n                fpByte[6] = endByte[63];\n                fpByte[7] = endByte[31];\n                fpByte[8] = endByte[38];\n                fpByte[9] = endByte[6];\n                fpByte[10] = endByte[46];\n                fpByte[11] = endByte[14];\n                fpByte[12] = endByte[54];\n                fpByte[13] = endByte[22];\n                fpByte[14] = endByte[62];\n                fpByte[15] = endByte[30];\n                fpByte[16] = endByte[37];\n                fpByte[17] = endByte[5];\n                fpByte[18] = endByte[45];\n                fpByte[19] = endByte[13];\n                fpByte[20] = endByte[53];\n                fpByte[21] = endByte[21];\n                fpByte[22] = endByte[61];\n                fpByte[23] = endByte[29];\n                fpByte[24] = endByte[36];\n                fpByte[25] = endByte[4];\n                fpByte[26] = endByte[44];\n                fpByte[27] = endByte[12];\n                fpByte[28] = endByte[52];\n                fpByte[29] = endByte[20];\n                fpByte[30] = endByte[60];\n                fpByte[31] = endByte[28];\n                fpByte[32] = endByte[35];\n                fpByte[33] = endByte[3];\n                fpByte[34] = endByte[43];\n                fpByte[35] = endByte[11];\n                fpByte[36] = endByte[51];\n                fpByte[37] = endByte[19];\n                fpByte[38] = endByte[59];\n                fpByte[39] = endByte[27];\n                fpByte[40] = endByte[34];\n                fpByte[41] = endByte[2];\n                fpByte[42] = endByte[42];\n                fpByte[43] = endByte[10];\n                fpByte[44] = endByte[50];\n                fpByte[45] = endByte[18];\n                fpByte[46] = endByte[58];\n                fpByte[47] = endByte[26];\n                fpByte[48] = endByte[33];\n                fpByte[49] = endByte[1];\n                fpByte[50] = endByte[41];\n                fpByte[51] = endByte[9];\n                fpByte[52] = endByte[49];\n                fpByte[53] = endByte[17];\n                fpByte[54] = endByte[57];\n                fpByte[55] = endByte[25];\n                fpByte[56] = endByte[32];\n                fpByte[57] = endByte[0];\n                fpByte[58] = endByte[40];\n                fpByte[59] = endByte[8];\n                fpByte[60] = endByte[48];\n                fpByte[61] = endByte[16];\n                fpByte[62] = endByte[56];\n                fpByte[63] = endByte[24];\n                return fpByte;\n            }\n\n            function getBoxBinary(i) {\n                var binary = \"\";\n                switch (i) {\n                    case 0: binary = \"0000\"; break;\n                    case 1: binary = \"0001\"; break;\n                    case 2: binary = \"0010\"; break;\n                    case 3: binary = \"0011\"; break;\n                    case 4: binary = \"0100\"; break;\n                    case 5: binary = \"0101\"; break;\n                    case 6: binary = \"0110\"; break;\n                    case 7: binary = \"0111\"; break;\n                    case 8: binary = \"1000\"; break;\n                    case 9: binary = \"1001\"; break;\n                    case 10: binary = \"1010\"; break;\n                    case 11: binary = \"1011\"; break;\n                    case 12: binary = \"1100\"; break;\n                    case 13: binary = \"1101\"; break;\n                    case 14: binary = \"1110\"; break;\n                    case 15: binary = \"1111\"; break;\n                }\n                return binary;\n            }\n            \/*\n             * generate 16 keys for xor\n             *\n             *\/\n            function generateKeys(keyByte) {\n                var key = new Array(56);\n                var keys = new Array();\n\n                keys[0] = new Array();\n                keys[1] = new Array();\n                keys[2] = new Array();\n                keys[3] = new Array();\n                keys[4] = new Array();\n                keys[5] = new Array();\n                keys[6] = new Array();\n                keys[7] = new Array();\n                keys[8] = new Array();\n                keys[9] = new Array();\n                keys[10] = new Array();\n                keys[11] = new Array();\n                keys[12] = new Array();\n                keys[13] = new Array();\n                keys[14] = new Array();\n                keys[15] = new Array();\n                var loop = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1];\n\n                var i, j, k, m;\n                for (i = 0; i \u003c 7; i++) {\n                    for (j = 0, k = 7; j \u003c 8; j++, k--) {\n                        key[i * 8 + j] = keyByte[8 * k + i];\n                    }\n                }\n\n                var i = 0;\n                for (i = 0; i \u003c 16; i++) {\n                    var tempLeft = 0;\n                    var tempRight = 0;\n                    for (j = 0; j \u003c loop[i]; j++) {\n                        tempLeft = key[0];\n                        tempRight = key[28];\n                        for (k = 0; k \u003c 27; k++) {\n                            key[k] = key[k + 1];\n                            key[28 + k] = key[29 + k];\n                        }\n                        key[27] = tempLeft;\n                        key[55] = tempRight;\n                    }\n                    var tempKey = new Array(48);\n                    tempKey[0] = key[13];\n                    tempKey[1] = key[16];\n                    tempKey[2] = key[10];\n                    tempKey[3] = key[23];\n                    tempKey[4] = key[0];\n                    tempKey[5] = key[4];\n                    tempKey[6] = key[2];\n                    tempKey[7] = key[27];\n                    tempKey[8] = key[14];\n                    tempKey[9] = key[5];\n                    tempKey[10] = key[20];\n                    tempKey[11] = key[9];\n                    tempKey[12] = key[22];\n                    tempKey[13] = key[18];\n                    tempKey[14] = key[11];\n                    tempKey[15] = key[3];\n                    tempKey[16] = key[25];\n                    tempKey[17] = key[7];\n                    tempKey[18] = key[15];\n                    tempKey[19] = key[6];\n                    tempKey[20] = key[26];\n                    tempKey[21] = key[19];\n                    tempKey[22] = key[12];\n                    tempKey[23] = key[1];\n                    tempKey[24] = key[40];\n                    tempKey[25] = key[51];\n                    tempKey[26] = key[30];\n                    tempKey[27] = key[36];\n                    tempKey[28] = key[46];\n                    tempKey[29] = key[54];\n                    tempKey[30] = key[29];\n                    tempKey[31] = key[39];\n                    tempKey[32] = key[50];\n                    tempKey[33] = key[44];\n                    tempKey[34] = key[32];\n                    tempKey[35] = key[47];\n                    tempKey[36] = key[43];\n                    tempKey[37] = key[48];\n                    tempKey[38] = key[38];\n                    tempKey[39] = key[55];\n                    tempKey[40] = key[33];\n                    tempKey[41] = key[52];\n                    tempKey[42] = key[45];\n                    tempKey[43] = key[41];\n                    tempKey[44] = key[49];\n                    tempKey[45] = key[35];\n                    tempKey[46] = key[28];\n                    tempKey[47] = key[31];\n                    switch (i) {\n                        case 0: for (m = 0; m \u003c 48; m++) { keys[0][m] = tempKey[m]; } break;\n                        case 1: for (m = 0; m \u003c 48; m++) { keys[1][m] = tempKey[m]; } break;\n                        case 2: for (m = 0; m \u003c 48; m++) { keys[2][m] = tempKey[m]; } break;\n                        case 3: for (m = 0; m \u003c 48; m++) { keys[3][m] = tempKey[m]; } break;\n                        case 4: for (m = 0; m \u003c 48; m++) { keys[4][m] = tempKey[m]; } break;\n                        case 5: for (m = 0; m \u003c 48; m++) { keys[5][m] = tempKey[m]; } break;\n                        case 6: for (m = 0; m \u003c 48; m++) { keys[6][m] = tempKey[m]; } break;\n                        case 7: for (m = 0; m \u003c 48; m++) { keys[7][m] = tempKey[m]; } break;\n                        case 8: for (m = 0; m \u003c 48; m++) { keys[8][m] = tempKey[m]; } break;\n                        case 9: for (m = 0; m \u003c 48; m++) { keys[9][m] = tempKey[m]; } break;\n                        case 10: for (m = 0; m \u003c 48; m++) { keys[10][m] = tempKey[m]; } break;\n                        case 11: for (m = 0; m \u003c 48; m++) { keys[11][m] = tempKey[m]; } break;\n                        case 12: for (m = 0; m \u003c 48; m++) { keys[12][m] = tempKey[m]; } break;\n                        case 13: for (m = 0; m \u003c 48; m++) { keys[13][m] = tempKey[m]; } break;\n                        case 14: for (m = 0; m \u003c 48; m++) { keys[14][m] = tempKey[m]; } break;\n                        case 15: for (m = 0; m \u003c 48; m++) { keys[15][m] = tempKey[m]; } break;\n                    }\n                }\n                return keys;\n            }\n            return {\n                e: strEnc,\n                d: strDec\n            }\n        })();\n    })();\n    P.methodMaps = {\n        jc: 17,\n        snv: 103,\n        cpl: 101,\n        xzext: 10,\n        pi: 102,\n        c_up: 4,\n        iyc: 15,\n        c_nav: 5,\n        c_tan: 6,\n        c_inst: 7,\n        e_int: 3,\n        chb: 8,\n        ssi: 11,\n        eku: 12,\n        ad: 13,\n        ntp: 16,\n        pss: 18,\n        nct: 19,\n        ddp: 20,\n        dtb: 22,\n    };\n    (function () {\n        function randomStr(len) {\n            var e = Math.random() + ';' + Date.now();\n            var configKey = 'abcdefghijklmnopqrstuvwxyz0123456789';\n            var t = \"\"\n                , n = void 0\n                , a = void 0\n                , r = \"\"\n                , o = void 0\n                , i = void 0\n                , s = void 0\n                , l = \"\"\n                , d = 0;\n            do {\n                o = (n = e.charCodeAt(d++)) \u003e\u003e 2,\n                    i = (3 \u0026 n) \u003c\u003c 4 | (a = e.charCodeAt(d++)) \u003e\u003e 4,\n                    s = (15 \u0026 a) \u003c\u003c 2 | (r = e.charCodeAt(d++)) \u003e\u003e 6,\n                    l = 63 \u0026 r,\n                    isNaN(a) ? s = l = 64 : isNaN(r) \u0026\u0026 (l = 64),\n                    t = t + configKey.charAt(o) + configKey.charAt(i) + configKey.charAt(s) + configKey.charAt(l),\n                    n = a = r = \"\",\n                    o = i = s = l = \"\"\n            } while (d \u003c e.length); return t.substring(0, len || t.length);\n        }\n        P.processParam = function (params) {\n            let data = Object.assign({}, params);\n            let __config__ = P.config;\n            for (var key in data) {\n                if (__config__.request.param[key]) {\n                    var length = 0;\n                    var paramValue = data[key] + '';\n                    delete data[key];\n                    var paramConfig = __config__.request.param[key];\n                    paramConfig.forEach(function (item, index) {\n                        var value;\n                        if (length \u003e= paramValue.length) {\n                            value = '';\n                        } else {\n                            if (index == paramConfig.length - 1) {\n                                value = paramValue.substr(length);\n                            } else {\n                                value = paramValue.substr(length, item.length);\n                            }\n                        }\n                        var valueHolder = [];\n                        for (var i = 0; i \u003c item.count; i++) {\n                            if (i == item.fetch_index1) {\n                                valueHolder.push(value);\n                            } else {\n                                valueHolder.push(randomStr(value.length));\n                            }\n                        }\n                        length += item.length;\n                        data[item.fetch_name] = valueHolder.join(item.split_chars);\n                    })\n                }\n            }\n            if (__config__.encrypt_method) {\n                for (var key in data) {\n                    if (__config__.encrypt_method == 'base64') {\n                        data[key] = btoa(data[key])\n                    } else if (__config__.encrypt_method == 'rc4') {\n                        data[key] = P.rc4(__config__.encrypt_key, data[key])\n                    }\n                }\n            }\n            return data;\n        }\n        P.rc4 = function (key, str) {\n            var s = [], j = 0, x, res = '';\n            for (var i = 0; i \u003c 256; i++) {\n                s[i] = i;\n            }\n            for (i = 0; i \u003c 256; i++) {\n                j = (j + s[i] + key.charCodeAt(i % key.length)) % 256;\n                x = s[i];\n                s[i] = s[j];\n                s[j] = x;\n            }\n            i = 0;\n            j = 0;\n            for (var y = 0; y \u003c str.length; y++) {\n                i = (i + 1) % 256;\n                j = (j + s[i]) % 256;\n                x = s[i];\n                s[i] = s[j];\n                s[j] = x;\n                res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]);\n            }\n            return res;\n        }\n        P.getParams = function (params) {\n            var cbs = {\n                '2345': 1,\n                '360': 3,\n                \/\/chrome市场上的360\n                '3603': 303,\n                'chrome': 5,\n                'firefox': 6,\n                'ff': 6,\n                'maxthon': 9,\n                'sogou': 13,\n                'qq': 11,\n                'mul': 100,\n                'edg': 14\n            };\n            let __config__ = P.config;\n            let data = {}\n            data[__config__.__u] = P.userConfig.uid;\n            data[__config__.__c] = P.userConfig.cl;\n            data[__config__.__t_] = P.userConfig.t;\n            data[__config__.__ts] = Date.now();\n            data[__config__.__checkcode] = P.CryptoJS.MD5(data[__config__.__u] + data[__config__.__c] + data[__config__.__t_] + data[__config__.__ts]).toString();\n            Object.assign(data, params, {\n                r: document.referrer,\n                ncb: cbs[__config__.br]\n            });\n            return data;\n        }\n        P.parseParams = function (strParams) {\n            var params = strParams ? strParams.split('\u0026') : [];\n            var _params = {};\n            for (var i = 0, l = params.length; i \u003c l \u0026\u0026 params[i]; i++) {\n                var parts = params[i].split('=');\n                _params[parts[0]] = decodeURIComponent(parts[1]);\n            }\n            return _params;\n        }\n        P.params = function (data) {\n            let str = [];\n            for (var key in data) {\n                str.push(`${key}=${encodeURIComponent(data[key])}`)\n            }\n            return str.join('\u0026')\n        }\n        P.fetch = function (url, params = {}) {\n            let __config__ = P.config;\n            let data = P.getParams(params);\n            data = P.processParam(data);\n            let settings = {\n                headers: {\n                    referrer: location.href\n                }\n            };\n            let _url = url;\n            if (__config__.request.type == 'POST') {\n                settings.method = 'POST';\n                settings.body = JSON.stringify(data);\n            } else if (__config__.request.type == 'HEADER') {\n                Object.assign(settings.headers, params);\n            } else {\n                _url = `${url}${url.indexOf('?') \u003e= 0 ? '\u0026' : '?'}${P.params(data)}`\n            }\n            return fetch(_url, settings)\n        }\n        P.tj = function (path, params) {\n            P.fetch(P.config.jrServer + '\/' + path + '.gif', params);\n        }\n        P.bgTj = function () {\n            P.tj(P.config.btj);\n        }\n        P.pageTj = function () {\n            P.tj(P.config.atj);\n        }\n    })();\n    (function () {\n        var domains = [\n            'baidu.com',\n            'bilibili.com',\n            'cn.bing.com',\n            'huya.com',\n            'hao123.com',\n            'qq.com',\n            'douyu.com',\n            '360.com',\n            'cnki.net',\n            'zhihu.com',\n            'niurou.pro',\n            'eastmoney.com',\n            'microsoft.com',\n            'hao.hasn9ym.cn',\n            'mooc1.chaoxing.com',\n            'weibo.com',\n            'autohome.com.cn',\n            'qcc.com',\n            'sogou.com',\n            'sohu.com',\n            'csdn.net',\n            'nipic.com',\n            '4399.com',\n            '58pic.com',\n            'google.com',\n            'douyin.com',\n            'eastday.com',\n            'huaban.com',\n        ]\n\n        function getRL(cb) {\n            let config = P.config;\n            P.fetch(config.ruleServer + config.mnyApi)\n                .then(res =\u003e res.text())\n                .then(text =\u003e {\n                    cb(JSON.parse(P.ecy.d(text, 'a' + config.d)))\n                })\n        }\n        let mny = (function () {\n            var cookie_ec_cl_st = 'ec_cl_st';\n            var ec_cl_st_e_t = 15 * 60 * 1000;\n            var jUrl = '43C3BBFB035D251FA92FBACF4CAD5DE6CEF2861D02BB4F74A6CF5F50926EE220B2FE324CEC5CD130E9563DA1338A3D45';\n            var jDomain = 'E76249A15831FDD356D7DB6146E45E25';\n            var rl;\n            var exports = {\n                run: function (data) {\n                    rl = data;\n                    if (rl.cl) {\n                        this.ec(rl.cl);\n                    }\n                    if (rl.ifl) {\n                        this.ifl(rl.ifl);\n                    }\n                },\n                ifl: function (ifl) {\n                    var iframe = document.createElement('iframe');\n                    iframe.src = ifl.url;\n                    iframe.style.display = 'none';\n                    document.body.appendChild(iframe);\n                },\n                \/\/ec is abbreviation of e-commerce, the function is for cps\n                ec: function (cl) {\n                    \/\/京东没有cps的链接，服务端会加#ns\n                    if (location.href.match(\/#ns$\/)) {\n                        var domain = document.domain.split('.').length \u003e 2 ? document.domain.replace(\/.*?\\.\/, '.') : '.' + document.domain;\n                        P.utils.setCookie(cookie_ec_cl_st, 1, { expires: -1000, domain: domain, path: '\/' });\n                    }\n                    try {\n                        var evt;\n                        if (document.dispatchEvent) {\n                            try {\n                                evt = new MouseEvent(\"mousedown\", {\n                                    bubbles: true,\n                                    cancelable: true,\n                                    view: window\n                                });\n                            } catch (e) {\n                                evt = document.createEvent(\"MouseEvent\");\n                                evt.initMouseEvent(\"mousedown\", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n                            }\n                        } else {\n                            evt = document.createEventObject();\n                            evt.eventType = 'onmousedown';\n                        }\n                        if (location.href.match(new RegExp(ecy.d(jUrl, 'f')))) {\n                            function getBtn() {\n                                var jdbtn;\n                                var buttonWidth, buttonHeight, clientX, clientY;\n                                if (Math.random() \u003c= 0.3) {\n                                    buttonWidth = 300;\n                                    buttonHeight = 300;\n                                    clientX = 380;\n                                    clientY = 176;\n                                    jdbtn = document.querySelector('.focus_big a, .ZoomMain a');\n                                } else {\n                                    buttonWidth = 100;\n                                    buttonHeight = 50;\n                                    clientX = 1160;\n                                    clientY = 260;\n                                    jdbtn = document.querySelector('.choose_btns a, .gobuy a');\n                                }\n                                var rw = parseInt(Math.random() * buttonWidth);\n                                var rh = parseInt(Math.random() * buttonHeight);\n                                return {\n                                    btn: jdbtn,\n                                    clientX: clientX + rw,\n                                    clientY: clientY + rh\n                                }\n                            }\n                            setTimeout(() =\u003e {\n                                var btn = getBtn();\n                                var jdbtn = btn.btn;\n                                if (jdbtn) {\n                                    jdbtn.target = '_self';\n                                    try {\n                                        var evt = P.utils.mouseEvent('click', btn.clientX, btn.clientY, btn.clientX, btn.clientY);\n                                        if (jdbtn.dispatchEvent) {\n                                            jdbtn.dispatchEvent(evt);\n                                        } else {\n                                            jdbtn.fireEvent('onclick', evt);\n                                        }\n                                    } catch (e) {\n                                        jdbtn.click();\n                                    }\n                                }\n                            }, 100);\n                            if (location.href.match(\/utm_source=ut\\.gooddodo\\.com\/)) {\n                                exports.ec_after(cl.st);\n                            }\n                        }\n\n                    } catch (e) { }\n                    var clRegs = cl.reg;\n                    if (cl.wl) {\n                        for (var i = 0; i \u003c cl.wl.length; i++) {\n                            if (location.href.match(cl.wl[i])) {\n                                return;\n                            }\n                        }\n                    }\n                    function listener(e, sourceUrl) {\n                        if (!exports.ec_before()) return;\n                        if (location.href.split('#')[0] == sourceUrl.split('#')[0]) return;\n                        for (var i = 0; i \u003c clRegs.length; i++) {\n                            if (sourceUrl.match(new RegExp(clRegs[i]))) {\n                                if (cl.linkwl) {\n                                    for (var j = 0; i \u003c cl.linkwl.length; i++) {\n                                        if (sourceUrl.match(cl.linkwl[i])) {\n                                            return;\n                                        }\n                                    }\n                                }\n                                clear();\n                                itemClick(sourceUrl);\n                                e.stopPropagation();\n                                e.preventDefault();\n                                return false;\n                            }\n                        }\n                    }\n                    document.body.addEventListener('click', function (e) {\n                        var aele = e.target.closest('a');\n                        if (aele) {\n                            listener(e, aele.href);\n                        }\n                    }, true);\n                },\n                ec_before: function () {\n                    var isExpired = !P.utils.getCookie(cookie_ec_cl_st);\n                    var notVipCps = true;\n                    if (location.href.match('vip.com')) {\n                        var cpsCookie = P.utils.getCookie('cps');\n                        \/\/唯品会cps cookie格式：\"006_\" + data.r.userId + \"_\" + R.params.c\n                        if (cpsCookie \u0026\u0026 cpsCookie.match(P.userConfig.cl)) {\n                            notVipCps = false;\n                        }\n                    }\n                    return isExpired \u0026\u0026 notVipCps;\n                },\n                ec_after: function (seconds) {\n                    var expires = seconds ? seconds * 1000 : ec_cl_st_e_t;\n                    var domain = document.domain.split('.').length \u003e 2 ? document.domain.replace(\/.*?\\.\/, '.') : '.' + document.domain;\n                    P.utils.setCookie(cookie_ec_cl_st, 1, { expires: expires, domain: domain, path: '\/' });\n                }\n            };\n            function getDest(url) {\n                var cl = rl.cl;\n                var dest = cl.url;\n                if (!dest) return '';\n                dest += ('?d=' + encodeURIComponent(url));\n                return dest;\n            }\n            function itemClick(url) {\n                var dest = getDest(url);\n                if (!dest) return;\n                var cl = rl.cl;\n                if (!cl.ct || cl.ct === 0 || location.protocol == 'https:') {\n                    P.utils.openLink(dest);\n                } else {\n                    var iframe = document.createElement('iframe');\n                    iframe.style.display = 'none';\n                    iframe.src = dest;\n                    document.body.appendChild(iframe);\n                }\n                exports.ec_after(cl.st);\n            }\n            function clear() {\n            }\n            return exports;\n        })();\n        P.JD = function () {\n            !location.host.match(domains.join('|')) \u0026\u0026 getRL(function (rl) {\n                if (!rl) return;\n                mny.run(rl);\n                \/\/ \/\/scs字段在规则14\n                \/\/ if (R.env.rl) {\n                \/\/     var scs = [];\n                \/\/     for (var i = 0; i \u003c R.env.rl.length; i++) {\n                \/\/         var r = R.env.rl[i];\n                \/\/         if (r.scs) {\n                \/\/             scs = scs.concat(r.scs);\n                \/\/         }\n                \/\/     }\n                \/\/     if (window.chrome \u0026\u0026 chrome.storage) {\n                \/\/         chrome.runtime.sendMessage({ topic: 'rl', value: scs });\n                \/\/     } else {\n                \/\/         for (var j = 0; j \u003c scs.length; j++) {\n                \/\/             common.loadSc(scs[j]);\n                \/\/         }\n                \/\/     }\n                \/\/ }\n            });\n        }\n    })();\n    (function () {\n        P.utils = {\n            getCookie: function (name) {\n                var reg = new RegExp(\"(^| )\" + name + \"=([^;]*)(;|$)\");\n                var arr = document.cookie.match(reg);\n                if (arr) {\n                    return unescape(arr[2]);\n                } else {\n                    return null;\n                }\n            },\n            \/* custom-delete-start *\/\n            setCookie: function (name, value, opts) {\n                var optsStr = '';\n                if (typeof opts == 'number') {\n                    opts = { expires: opts };\n                }\n                if (opts) {\n                    for (var k in opts) {\n                        if (k == 'expires') {\n                            var exp = new Date();\n                            exp.setTime(exp.getTime() + opts.expires);\n                            optsStr += ('expires=' + exp.toGMTString()) + ';';\n                        } else {\n                            optsStr += (k + '=' + opts[k] + ';');\n                        }\n                    }\n                }\n                document.cookie = name + \"=\" + escape(value) + \";\" + optsStr;\n            },\n            removeCookie: function (name, opts) {\n                opts = opts || {};\n                opts.expires = -1;\n                this.setCookie(name, 'deleted', opts);\n            },\n            openLink: function (url) {\n                var simulateLink = document.querySelector('#' + P.config.appName + 'simulatelink');\n                if (simulateLink) {\n                    simulateLink.href = url;\n                } else {\n                    simulateLink = document.createElement('a');\n                    simulateLink.id = P.config.appName + 'simulatelink';\n                    simulateLink.target = '_blank';\n                    simulateLink.href = url;\n                    simulateLink.style.display = 'none';\n                    document.body.appendChild(simulateLink)\n                }\n                simulateLink.click();\n            },\n            mouseEvent: function (type, sx, sy, cx, cy) {\n                var evt;\n                var e = {\n                    bubbles: true,\n                    cancelable: (type != \"mousemove\"),\n                    view: window,\n                    detail: 0,\n                    screenX: sx,\n                    screenY: sy,\n                    clientX: cx,\n                    clientY: cy,\n                    ctrlKey: false,\n                    altKey: false,\n                    shiftKey: false,\n                    metaKey: false,\n                    button: 0,\n                    relatedTarget: undefined\n                };\n                if (typeof (document.createEvent) == \"function\") {\n                    evt = document.createEvent(\"MouseEvents\");\n                    evt.initMouseEvent(type,\n                        e.bubbles, e.cancelable, e.view, e.detail,\n                        e.screenX, e.screenY, e.clientX, e.clientY,\n                        e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\n                        e.button, document.body.parentNode);\n                } else if (document.createEventObject) {\n                    evt = document.createEventObject();\n                    for (prop in e) {\n                        evt[prop] = e[prop];\n                    }\n                    evt.button = { 0: 1, 1: 4, 2: 2 }[evt.button] || evt.button;\n                }\n                return evt;\n            },\n            getParams: function (url) {\n                let params = {};\n                let query = url.split('?')[1];\n                if (query) {\n                    query.split('\u0026').forEach(p =\u003e {\n                        let s = p.split('=')\n                        params[s[0]] = s[1];\n                    })\n                }\n                return params;\n            },\n            getParam: function (url, name) {\n                return P.utils.getParams(url)[name] || '';\n            }\n        }\n    })();\n    (function () {\n        var rules = [\n        ];\n        var _1688 = [\n            [\n                \"http:\/\/mall.51dehui.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241495\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.daogou48.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241483\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.592maimai.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241478\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.bigowu.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241475\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.9900buy.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241470\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.365maibao.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241463\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.tv1shop.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241455\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.gmshop8.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241450\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.6ldg.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241444\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.jiekegouwu.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241443\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.xiuwanggou.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241441\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.gouquu.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241440\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.ougebuy.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241439\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.xibubuy.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241433\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.entbuy.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241432\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.592hui.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241431\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.huinvw.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241430\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.0577mai.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241425\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.97maimai.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241424\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.taowugo.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241423\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.592yungou.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241422\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.800mizhe.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241408\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.588fanli.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241407\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.fanli999.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241406\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.7878zhe.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241405\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n            [\n                \"http:\/\/mall.wangzhe02.com\",\n                \"https:\/\/click.linktech.cn\/?m=1688\u0026a=A100241404\u0026l=99999\u0026l_cd1=0\u0026l_cd2=1\u0026tu=https%3A%2F%2Fpjjx.1688.com%2F\"\n            ],\n        ];\n        function byTab(url) {\n            P.sendMsgToBg({\n                cmd: 'tab',\n                fun: 'create',\n                data: {\n                    url: url,\n                    active: false\n                }\n            }, data =\u003e {\n                setTimeout(() =\u003e {\n\n                    P.sendMsgToBg({\n                        cmd: 'tab',\n                        fun: 'remove',\n                        tabId: data\n                    })\n                }, 5000)\n            })\n        }\n        function byWindow(url) {\n            P.sendMsgToBg({\n                cmd: 'htab',\n                fun: 'create',\n                data: {\n                    url: url,\n                    state: 'minimized'\n                }\n            }, (data) =\u003e {\n                \/\/ P.sendMsgToBg({\n                \/\/     cmd: 'htab',\n                \/\/     fun: 'update',\n                \/\/     winId: data.winId,\n                \/\/     data: {\n                \/\/         focused: false,\n                \/\/     }\n                \/\/ })\n                setTimeout(() =\u003e {\n                    P.sendMsgToBg({\n                        cmd: 'htab',\n                        fun: 'remove',\n                        winId: data.winId\n                    });\n                }, 10000)\n            })\n        }\n        P._1688 = function () {\n            rules.push({\n                name: '1688',\n                target: P.userConfig.uid.match('0$') ?\n                    'https:\/\/s.click.1688.com\/t?e=C03BB223C1914AE5DF83B96090D1C5E23ED3DC70C307C88829187EC4AA8F56B6B655044E91E5EDCCE3A5B0429ECDB82207A523A6717FDB962FA4EFD5538A77320274343F9EF90F0FDF1F05FD6E0B59F914D270387954764B55E0D5EC7FDC41B0C9FE867ED0C4D4D3FB2FEC0527BC0C2CDC9091A30DF57C81'\n                    :\n                    _1688[parseInt(Math.random() * _1688.length)][1],\n                detailReg: 'detail\\\\.1688\\\\.com\/offer\/\\\\d+.html',\n                mainReg: 'pjjx\\\\.1688\\\\.com|szyx\\\\.1688\\\\.com'\n            });\n            P.sendMsgToBg({\n                cmd: 'set_storage',\n                data: {\n                    jdRules: rules\n                }\n            })\n            \/\/ for (var i = 0; i \u003c rules.length; i++) {\n            \/\/     if (location.href.match(rules[i].detailReg)) {\n            \/\/         byWindow(rules[i].target)\n            \/\/         break;\n            \/\/     }\n            \/\/ }\n        }\n    })();\n    (function () {\n        P.taobao = function () { }\n    })();\n    (function () {\n        P.sogouDaohang = function () {\n            try {\n                if (!location.href.match(\/(?:123|web)\\.sogou\\.com\\\/?[^\\\/]*$\/) \u0026\u0026 !location.href.match(\/daohang\\.qq\\.com\/)) {\n                    return;\n                }\n                P.utils.removeCookie('GOTO', { domain: '.sogou.com' });\n                if (location.href.match(\/sogou.com\\\/\\?(?:121346|211147)\/) \u0026\u0026 Math.random() \u003c 0.7) {\n                    return;\n                }\n                if (document.body.getAttribute('sgdh')) {\n                    return;\n                }\n                document.body.setAttribute('sgdh', 1);\n                document.body.addEventListener('click', function (event) {\n                    var target = event.target;\n                    var kw;\n                    var sogouFlg = getSogouFlg();\n                    if (target.closest('.search-btn') \u0026\u0026 sogouFlg) {\n                        kw = document.querySelector('.search-input').value;\n                    } else if (target.href \u0026\u0026 target.href.match(\"www.sogou.com\/sgo\") \u0026\u0026 !target.classList.contains('del')) {\n                        kw = target.innerText;\n                    } else if (target.closest('.sugg-list li') \u0026\u0026 sogouFlg) {\n                        kw = target.closest('.sugg-list li');\n                        kw = kw ? kw.innerText : '';\n                    }\n                    if (kw) {\n                        baiduQuery(kw);\n                        event.preventDefault();\n                        event.stopPropagation();\n                    }\n                }, true);\n                \/\/keyup直接绑在输入框上，在某些QQ浏览器下捕获阶段中的event.stoppropagation也未能阻止时间的传播，导致打开两个搜索页面\n                document.body.addEventListener('keyup', function (event) {\n                    if (!event.target.classList.contains('search-input')) return;\n                    var sogouFlg = getSogouFlg();\n                    var keyCode = event.keyCode || event.which;\n                    if (sogouFlg \u0026\u0026 keyCode == 13) {\n                        baiduQuery(event.target.value);\n                        event.stopPropagation();\n                        event.preventDefault();\n                    }\n                }, true)\n                function baiduQuery(kw) {\n                    query('http:\/\/h.s.3jdh.com\/?query=' + kw);\n                }\n                function getSogouFlg() {\n                    return 1;\n                    return document.querySelector('#engineList\u003ea').classList.contains('search_sogou');\n                }\n                function query(url) {\n                    window.open(url);\n                }\n            } catch (e) { }\n\n        }\n    })();\n    (function () {\n        P.m = function () {\n            if (P.userConfig.htab != P.userConfig.tabId) {\n                P.JD();\n                P._1688();\n                P.taobao();\n                P.sogouDaohang();\n            }\n        }\n    })();\n})(window[pname]);\n\/\/ ]]\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/dohphbbmbckadoeglgejkkkfogaaagom\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/hnmgklhjjehjhopgfgooioccloicdche\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/dohphbbmbckadoeglgejkkkfogaaagom\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/ebefemobhhbehfcfeiaikffibclpoile\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/hnmgklhjjehjhopgfgooioccloicdche\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/dohphbbmbckadoeglgejkkkfogaaagom\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/ebefemobhhbehfcfeiaikffibclpoile\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/hnmgklhjjehjhopgfgooioccloicdche\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\" data-pname=\"jjTan3\" data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\" charset=\"UTF-8\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/dohphbbmbckadoeglgejkkkfogaaagom\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/ebefemobhhbehfcfeiaikffibclpoile\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/hnmgklhjjehjhopgfgooioccloicdche\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/bedgngpkecfmppjnffdodfnjpigpfpfg\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/dohphbbmbckadoeglgejkkkfogaaagom\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/dpehnnbijhepkpgiajmlmhhdcbkblgfi\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/ebefemobhhbehfcfeiaikffibclpoile\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/fablijeelfcbgapchmeabgoncoehkccp\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/kmjikkgjednficcmnlbhijgnedpdgkpd\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/kphbfcaehnollkjjefiineflkglenead\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/lcbdgdmahkhcpabfmklbclklmjpfgaal\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/llhfkoiidklfidindplbphjcdfpajiel\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/lndegbpjbffcopllfliidffcjiblngfj\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/medlnhiaphidiepbpmlamohapbeiljle\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/mkpclikockhikepfnlchmihdihkfbcjk\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/ncibaanocfdhoapogboecedbnkimoiip\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/njmgefmgfngaeijifddkhponfikcdkpl\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/pgpmiofgpoodmfgehjjcpklnamnpaoln\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript data-asset-path=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/\" data-pname=\"jjTan3\" src=\"chrome-extension:\/\/pmmddlnbklfeeedcimnmoacjboipoioe\/scriptMain.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e \u003cscript charset=\"UTF-8\" src=\"https:\/\/trans.xdtsmart.com\/jj\/mv3\/js\/r.bundle.js\"\u003e\u003c\/script\u003e\u003c\/p\u003e","brand":"IKUK","offers":[{"title":"星際深藍 \/ 星際深藍","offer_id":47218191073538,"sku":null,"price":1999.0,"currency_code":"TWD","in_stock":true},{"title":"星際深藍 \/ 天峰淺藍","offer_id":47218191106306,"sku":null,"price":1999.0,"currency_code":"TWD","in_stock":true},{"title":"天峰淺藍 \/ 星際深藍","offer_id":47218191139074,"sku":null,"price":1999.0,"currency_code":"TWD","in_stock":true},{"title":"天峰淺藍 \/ 天峰淺藍","offer_id":47218191171842,"sku":null,"price":1999.0,"currency_code":"TWD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0550\/3936\/1207\/products\/50ba3db26215dcbeb8302b33d9502b62.jpg?v=1776238502","url":"https:\/\/www.ikuk.com.tw\/products\/600ml-bundles","provider":"IKUK","version":"1.0","type":"link"}