Greasy Fork is available in English.

CC Code

CC Code 是一个贴吧扩展程序/脚本,功能类似于“度伴娘”中的贴吧小工具。

// ==UserScript==
// @name       CC Code
// @version    1.0.28
// @description  CC Code 是一个贴吧扩展程序/脚本,功能类似于“度伴娘”中的贴吧小工具。
// @match      *://tieba.baidu.com/*
// @include      *://tieba.baidu.com/*
// @icon		http://ww2.sinaimg.cn/large/8c5fbe53gw1eah13rn48hj201s01smwx.jpg
// @author		864907600cc
// @grant       none
// @run-at      document-end
// @namespace   http://ext.ccloli.com
// @!updateURL	https://userscripts.org/scripts/source/182770.meta.js
// @!downloadURL	https://userscripts.org/scripts/source/182770.user.js
// ==/UserScript==

// CC Code
// Copyright (c) 864907600cc. Some rights reserved.
// 本扩展程序使用了 Crypto-JS 的 AES 加密脚本, Licence: BSD

if(document.getElementsByClassName('p_postlist')[0]||document.getElementById('thread_list')){

var stylesheet='.cc_code_panel{padding-left:25px;float:left}.cc_code_title{color:#3163b6;padding:5px 0}.cc_code_content span{color:orange;cursor:pointer;margin-right:20px}.cc_cipher,.cc_video{color:green;cursor:pointer}.cc_code_title span{cursor:pointer}.e_inter_wrapper{height:auto!important}.tb-editor-wrapper{float:left}.poster_body .cc_code_panel{width:100%;margin-left:0!important;padding-left:0;margin-bottom:15px;float: none;}body[has_tbbg_extension] .cc_code_panel,html[has_tbbg_extension] .cc_code_panel{margin-left:4px}#list_loading{display:none!important}';
var ss=document.createElement('style');
ss.textContent=stylesheet;
document.head.appendChild(ss);

/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
e)).finalize(b)}}});var n=d.algo={};return d}(Math);
(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
l)}})();
CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();

console.log('%cCC Code%c main script start loading.','color:#ff7f3e;text-decoration:underline','color:#ff7f3e');
var t0=new Date().getTime();
//定义加密解密函数
function cc_encode(){
	var pwd=prompt("请输入密码以加密(无密码请留空):");
	if(pwd!=null){
		var text=editor,
			content=text.innerHTML;
		if(!content)return;
		else var result=String(CryptoJS.AES.encrypt(content,pwd)).replace(/\n/g,'');
		var s=document.createElement('span');
		s.innerHTML='#CC_Cipher#'+result+' <br>';
		//text.innerHTML = '';
		text.appendChild(s);
		if(panel.getElementsByClassName('cc_code_cancelcode')[0])var ct=panel.getElementsByClassName('cc_code_cancelcode')[0];
		else {
			var ct=document.createElement('span');
			ct.className='cc_code_cancelcode';
			ct.innerHTML='取消解密';
		}
		ct.onclick=function(){/*text.innerHTML=text.innerHTML.replace('#CC_Cipher#'+result,content);*/s.outerHTML='';ct.outerHTML=''};
		panel.getElementsByClassName('cc_code_content')[0].insertBefore(ct,panel.getElementsByClassName('cc_code_encode')[0]);
	}
}
function cc_decode(){
	try{
		var result=CryptoJS.AES.decrypt(this.getAttribute('ciphertext'),'').toString(CryptoJS.enc.Utf8)||null;
		this.outerHTML=result.replace(/<script/gi,'&lt;script').replace(/<style/gi,'&lt;style').replace(/<link/gi,'&lt;link').replace(/<meta/gi,'&lt;meta').replace(/<iframe/gi,'&lt;iframe').replace(/<frame/gi,'&lt;frame').replace(/<object/gi,'&lt;object').replace(/<embed/gi,'&lt;embed').replace(/on(\w*?)=/gi,"on$1!=").replace(/(=|='|="|=`)javascript:/);
	}
	catch(error){
		var pwd=prompt("请输入密码以解密:");
		if(pwd!=null){
			try{
				var result=CryptoJS.AES.decrypt(this.getAttribute('ciphertext'),pwd).toString(CryptoJS.enc.Utf8)||null;
				this.outerHTML=result.replace(/<script/gi,'&lt;script').replace(/<style/gi,'&lt;style').replace(/<link/gi,'&lt;link').replace(/<meta/gi,'&lt;meta').replace(/<iframe/gi,'&lt;iframe').replace(/<frame/gi,'&lt;frame').replace(/<object/gi,'&lt;object').replace(/<embed/gi,'&lt;embed').replace(/on(\w*?)=/gi,"on$1!=").replace(/(=|='|="|=`)(javascript:)/gi, '$1http://$2');
			}
			catch(error){
				alert('解密失败,请确认密码正确...');
			}
		}
	}
}

//定义插入视频及转换函数
function cc_addvideo(){
	var url=prompt("请输入视频页地址(目前支持 YouTube、AcFun、bilibili、Tucao.cc、SoundCloud、虾米、网易云音乐,尝试性支持 catfun、萌否电台):");
	if(url!=null){
		var text=editor;
		if(url.indexOf('youtu')>=0)result=url.replace(/.*youtu\.?be.*?\/(?:watch\?.*?v=)?([\w-]{11}).*/,'#youtube#$1');
		else if(url.indexOf('acfun')>=0||url.indexOf('ranktv')>=0)result=url.replace(/.*(ac\d+|ac\d+_\d+).*/,'#acfun#$1');
		else if(url.indexOf('bilibili')>=0)result=url.replace(/.*(av\d+)(?:\/index(_\d+))?.*/, '#bilibili#$1$2');
		else if(url.indexOf('loli.my')>=0||url.indexOf('hdslb')>=0)result=url.replace(/.*aid=(\d+)(?:&page=(\d+))?.*/, '#bilibili#av$1_$2');
		else if(url.indexOf('tucao.cc/mini')>=0)result=url.replace(/.*mini\/([\d_]+)\.swf/, '#tucao#$1');
		else if(url.indexOf('tucao.cc/play')>=0)result=url.replace(/\/#/,'_').replace(/.*play\/h(\d+_\d+|\d+).*/, '#tucao#$1');//http://www.tucao.cc/play/h4020744/#8
		else if(url.indexOf('catfun')>=0)result=url.replace(/.*(cat\d+)(?:\/index(_\d+))?.*/, '#catfun#$1$2');
		else if(url.indexOf('soundcloud')>=0)result=url.replace(/%2F/gi,'/').replace(/.*soundcloud.com\/(tracks\/\d+|[-\/\w]+).*/, '#soundcloud#$1');
		else if(url.indexOf('xiami')>=0)result=url.replace(/.*(?:song\/|widget\/\d*_)(\d+).*/, '#xiami#$1');
        else if(url.indexOf('moe.fm')>=0)result=url.replace(/\//gi,'=').replace(/.*((?:song|music)=[\d,]+).*/, '#moefm#$1');
        else if(url.indexOf('moefm.ccloli')>=0)result=url.replace(/\//gi,'=').replace(/.*((?:song|music)=[\d,]+).*/, '#moefm#$1 #moefm#html5?$1');
        else if(url.indexOf('music.163')>=0)result=url.replace(/\//gi,'=').replace(/.*(song|album|playlist)(?:\?id=|\/)(\d+).*/, '#163music#$1/$2');
		else return;
		var s=document.createElement('a');
		text.appendChild(s);
		s.outerHTML=result+' <br>';
		url=null;
	}
}
function cc_devideo(){
	var t=this.getAttribute('type'),
		v=this.getAttribute('mid');
	if(document.getElementById('cc_media_'+t+'_'+v)){
		document.getElementById('cc_media_'+t+'_'+v).outerHTML='';
		this.title="点击展开";
	}
	else {
		var node=document.createElement('div');
		node.id='cc_media_'+t+'_'+v;
		switch(t){
		case 'youtube':
			node.innerHTML='<iframe src="//www.youtube.com/embed/'+v+'" width="560" height="400" frameborder="0" allowfullscreen></iframe>';
			break;
		case 'acfun':
			node.innerHTML='<object type="application/x-shockwave-flash" wmode="direct" allowfullscreeninteractive="true" allowfullscreen="true" allowscriptaccess="always" data="http://www.acfun.tv/player/'+v+'" width="560" height="400"></object>';
			break;
		case 'bilibili':
			node.innerHTML='<embed height="400" width="560" quality="high" allowfullscreen="true" type="application/x-shockwave-flash" src="http://static.hdslb.com/miniloader.swf?aid='+v.replace(/av/,'').replace(/_/,'&page=')+'"></embed>';
			break;
		case 'tucao':
			node.innerHTML='<embed type="application/x-shockwave-flash" allowfullscreen="true" src="http://www.tucao.cc/mini/'+v+'.swf" width="560" height="400" quality="high"></embed>';
			break;
		case 'catfun':
			node.innerHTML='<iframe src="http://catfun.gsksoft.cn/player.html?'+v.replace(/cat/,'').replace(/_/,'|')+'|1" width="590" height="471" frameborder="0" allowfullscreen scrolling="no"></iframe>';
			break;
		case 'soundcloud':
			node.innerHTML='<iframe width="560" height="166" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=http://api.soundcloud.com/'+v+'"></iframe>';
			break;
		case 'xiami':
			node.innerHTML='<embed src="http://www.xiami.com/widget/0_'+v+'/singlePlayer.swf" type="application/x-shockwave-flash" width="257" height="33" wmode="transparent"></embed>';
			break;
		case 'moefm':
			node.innerHTML='<iframe src="http://moe.fm/listen?'+v+'" width="450" height="125"></iframe>';
			break;
		case 'moefm_html5':
			node.innerHTML='<iframe src="http://moefm.ccloli.com/?'+v+'#loop=1,background=0" width="450" height="125"></iframe>';
			break;
		case '163music':
			var vg = v.split('/');
			var vl = {
				playlist: 0,
				album: 1,
				song: 2,
				program: 3,
				djradio: 4
			}
			vg[0] = vl[vg[0]];
			node.innerHTML='<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=' + (vg[0] === 2 || vg[0] === 3 ? '86' : '450') + ' src="http://music.163.com/outchain/player?type=' + vg[0] + '&id=' + vg[1] + '&auto=1&height=' + (vg[0] === 2 || vg[0] === 3 ? '66' : '430') + '"></iframe>';
			break;
		}
		this.parentElement.insertBefore(node,this.nextElementSibling);
		this.title="点击收起";
	}
}

//定义插入音乐函数
function cc_addmusic(){
	var url=prompt('请输入音乐外链地址(百度播放器仅支持 mp3):');
	if(url!=null){
		var title=prompt('请输入歌曲名:');
		if(title==null)title='';
		var artist=prompt('请输入歌手名:');
		if(artist==null)artist='';
		var text=editor;
		var s=document.createElement('a');
		text.appendChild(s);
		//text.innerHTML+='<img unselectable="on" class="BDE_Music" src="/tb/static-common/editor_img/music.png" title="http://box.baidu.com/widget/flash/bdspacesong.swf?from=tieba&url='+encodeURI(url)+'&name='+encodeURI(title)+'&artist='+encodeURI(artist)+'&extra=&autoPlay=true&loop=true" width="400" height="95" data-width="400" data-height="95"><br>';
		s.outerHTML='<img data-height="95" data-width="400" title="http://box.baidu.com/widget/flash/bdspacesong.swf?from=tiebasongwidget&amp;url='+encodeURIComponent(url)+'&amp;name='+encodeURIComponent(title)+'&amp;artist='+encodeURIComponent(artist)+'&amp;extra=&amp;autoPlay=false&amp;loop=true" src="http://tieba.baidu.com/tb/editor/v2/music.png" class="BDE_Music"><br>';
	}
}


//定义扩展介绍函数
function cc_about(){
	var s=document.createElement('script');
	s.innerHTML='$.dialog.alert(\'<style>.dialogJ.dialogJfix{font-size:14px;color:#000;background:rgba(255,255,255,.5)!important;font-family:微软雅黑!important}.dialogJbody{padding:15px;word-break:initial;text-align:justify}</style>CC Code 是一个贴吧扩展程序,功能类似于 <a href="http://www.baidu.com/p/%E6%82%A0%E6%82%A0%E5%A5%88%E4%BD%95" target="_blank">@悠悠奈何</a> 的扩展“<a href="https://chrome.google.com/webstore/detail/ladblhncmdocpacjhapihkgbmamliljn" target="_blank">度伴娘</a>”中的贴吧小工具。扩展开发的起源是由于“度伴娘”久不更新(现该扩展已继续更新),所以 cc 就写了这个扩展程序实现原扩展的某些功能(但可能有所差异)。通过这个扩展程序,您可以实现以下内容:<br><ul><li><b>加密文字</b><br>这里的加密文字功能和“度伴娘”中的百度密语相似(本扩展程序不能解析“度伴娘”的百度密语),但是该扩展的特殊之处是你可以设置密码。你可以将你想说的话在发贴框中输入,然后点击“加密文字”,即可将文字转换为密文(若不设置密码则直接点击确定)。当其他安装了 CC Code 的用户点击你的密文时会被要求输入密码(若无密码则直接点击确定),只有输入了正确的密码才可以显示文字。<br><small>本扩展程序使用了来自 <a href="https://code.google.com/p/crypto-js/" target="_blank">Crypto-JS</a> 的 AES 加密脚本(© 2009–2013 by Jeff Mott.)。</small></li><li><b>插入视频</b><br>这里的插入视频功能和“度伴娘”的 UUCode 功能类似(本扩展程序不能解析“度伴娘”的部分视频代码)。通过该功能,你可以将百度不支持的某些视频网站(目前支持 YouTube、A 站、B 站、C 站、SoundCloud、虾米,尝试性支持 catfun)以代码的形式插入贴子中。当其他安装了 CC Code 的用户点击这段代码时,即可直接在贴吧播放视频。<br><small>同“度伴娘”一样,只有安装了 CC Code 的用户才能直接查看视频,建议插入视频后在贴子中贴上原视频网址。</small></li><li><b>插入音乐</b><br>贴吧又他喵的改版了,不能在贴子中插入音乐外链了,百度的音乐库少的可怜啊=.=……不过通过该功能,你可以像以往一样插入 mp3 外链了哦~~<br><small>任何人都可以看见插入的音乐,即便没有安装本扩展程序——除非百度把这功能封了……</small></li></ul><br>如果你对本扩展有任何疑问、建议或遇到了 bug,请<a href="http://msg.baidu.com/msg/writing?receiver=864907600cc" target="_blank">反馈</a>……\',{title:"CC Code Introduction",width:800})';
	document.body.appendChild(s);
	document.body.removeChild(s);
}


//控制面板函数
function add_panel(){
	panel=document.createElement('div');
	panel.className='cc_code_panel';
	panel.innerHTML='<div class="cc_code_title"><span>CC Code</span></div>'
		+'<div class="cc_code_content">'
			+'<span class="cc_code_encode" title="注意:解密密文仅安装了 CC Code 的用户可用。Powered by Crypto-JS.">加密文字</span>'
			+'<span class="cc_code_addvideo" title="注意:这些代码仅安装了 CC Code 的用户可用。">外站媒体</span>'
			+'<span class="cc_code_addmusic" title="功能已失效"><del>插入音乐</del></span>'
		+'</div>';
	p_node.parentNode.insertBefore(panel,p_node.nextElementSibling);
	
	//触发扩展程序介绍事件函数
	panel.getElementsByClassName('cc_code_title')[0].getElementsByTagName('span')[0].onclick=function(event){cc_about()}
	//触发加密事件函数
	panel.getElementsByClassName('cc_code_encode')[0].onclick=function(event){cc_encode()}
	//触发插入视频函数
	panel.getElementsByClassName('cc_code_addvideo')[0].onclick=function(event){cc_addvideo()}
	//触发插入音乐函数
	panel.getElementsByClassName('cc_code_addmusic')[0].onclick=function(event){cc_addmusic()}
	editor=document.getElementById('editor')?document.getElementById('editor').getElementsByClassName('tb-editor-editarea')[0]:document.getElementById('ueditor_replace');
}


//替换正文内容函数
function kill_tieba_lazyload(){
	if(document.getElementById('pblistCodeArea')){
		//document.getElementById('list_loading').outerHTML=document.getElementById('pblistCodeArea').value;
		//document.getElementById('pblistCodeArea').parentElement.removeChild(document.getElementById('pblistCodeArea'));
		var lazyload_nodes=document.getElementById('pblistCodeArea').childNodes;
		for(var i=0;i<lazyload_nodes.length;i++) {
			if(lazyload_nodes[i].nodeType==8) {
		    	document.getElementById('pblistCodeArea').outerHTML=lazyload_nodes[i].data;
				//lazyload_nodes[i].parentElement.removeChild(lazyload_nodes[i])
		    	break;
		    }
		}
		_.Module.use("pb/widget/ForumListV3", {});
		_.Module.use('pb/component/NoAutoVideo',[{text_videofrom:'视频来自: '}]);
		rebind_image();
	}
}

function rebind_image(){
	var imglist=document.querySelectorAll('.d_post_content img[pic_type="0"]');//.BDE_Image
	$(imglist).unbind();
	Page.bindOpenImg();
}

function bind_pager(){
	var pager=document.getElementsByClassName('l_pager');
	for(var i=0;i<pager.length;i++){
		pager[i].onclick=function(){
			setInterval(function(){
				if(PageData.pager.cur_page!=c_pager){
					bind_pager();
					replace_nodes();
					c_pager=PageData.pager.cur_page;
				}
			},1000)
		}
	}
}

function replace_nodes(){
	if(document.getElementsByClassName('d_post_content')[0]){
		var d=/#(CC_Cipher|youtube|utb|acfun|bilibili|tucao|catfun|soundcloud|xiami|moefm|163music)#/,
		t1=new Date().getTime(),
		list=[],
		xpath = document.evaluate(
			'//cc//text()', //XPath表达式:选择所有文本元素(text node)
			document,//document.body, //筛选环境
			null, //指定命名空间,不用管它
			XPathResult.ORDERED_NODE_ITERATOR_TYPE, //被匹配的元素按出现顺序排列
			null
		),
		k,x;
		while (k = xpath.iterateNext()) {
			if(k.parentElement.hasAttribute('class')&&k.parentElement.className=='cc_video')continue;
			if (!d.test(x = k.textContent.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"))) continue;
			if(x.indexOf('#CC_Cipher#')>=0)x=x.replace(/#CC_Cipher#([a-zA-z0-9+\/=]{20})([a-zA-z0-9+\/=]*)([a-zA-z0-9+\/=]{20})/gi,'<span class="cc_cipher" ciphertext="$1$2$3">#CC_Cipher#$1...$3</span>');
			if(x.indexOf('#youtube#')>=0||x.indexOf('#utb#')>=0)x=x.replace(/#youtube#([\w-]{11})|#utb#([\w-]{11})/gi,'<span class="cc_video" type="youtube" mid="$1$2" titie="点击展开">#youtube#$1$2</span>');
			if(x.indexOf('#acfun#')>=0)x=x.replace(/#acfun#(ac\d+_\d+|ac\d+)/gi,'<span class="cc_video" type="acfun" mid="$1" titie="点击展开">#acfun#$1</span>');
			if(x.indexOf('#bilibili#')>=0)x=x.replace(/#bilibili#(av)?(\d+_\d+|\d+)/gi,'<span class="cc_video" type="bilibili" mid="$1$2" titie="点击展开">#bilibili#$1$2</span>');
			if(x.indexOf('#tucao#')>=0)x=x.replace(/#tucao#([\d_]+)/gi,'<span class="cc_video" type="tucao" mid="$1" titie="点击展开">#tucao#$1</span>');
			if(x.indexOf('#catfun#')>=0)x=x.replace(/#catfun#(cat[\d_]+)/gi,'<span class="cc_video" type="catfun" mid="$1" titie="点击展开">#catfun#$1</span>');
			if(x.indexOf('#soundcloud#')>=0)x=x.replace(/#soundcloud#(tracks(?:\/|%2F)\d+|[-\/\w]+)/gi,'<span class="cc_video" type="soundcloud" mid="$1" titie="点击展开">#soundcloud#$1</span>');
			if(x.indexOf('#xiami#')>=0)x=x.replace(/#xiami#(\d+)/gi,'<span class="cc_video" type="xiami" mid="$1" titie="点击展开">#xiami#$1</span>');
	        if(x.indexOf('#moefm#html5?')>=0)x=x.replace(/#moefm#html5\?((?:song|music|radio)=[\d,]+)/gi,'<span class="cc_video" type="moefm_html5" mid="$1" titie="点击展开">#moefm#html5?$1</span>');
	        if(x.indexOf('#moefm#')>=0)x=x.replace(/#moefm#((?:song|music|radio)=[\d,]+)/gi,'<span class="cc_video" type="moefm" mid="$1" titie="点击展开">#moefm#$1</span>');
	        if(x.indexOf('#163music#')>=0)x=x.replace(/#163music#((?:song|album|playlist|djradio)(?:\/|=)\d+)/gi,'<span class="cc_video" type="163music" mid="$1" titie="点击展开">#163music#$1</span>');
			list.push([k,x]);
		}
		while (e = list.shift()){
			var node = document.createElement('a');
			e[0].parentElement.replaceChild(node,e[0]);
			node.outerHTML = e[1];
		}
		var ciphertext=document.getElementsByClassName('p_postlist')[0].getElementsByClassName('cc_cipher'),
			pvideo=document.getElementsByClassName('p_postlist')[0].getElementsByClassName('cc_video');
		for(var j=0;j<ciphertext.length;j++)ciphertext[j].onclick=cc_decode;
		for(var j=0;j<pvideo.length;j++)pvideo[j].onclick=cc_devideo;
		console.log('%cCC Code%c 替换正文节点时间统计:'+(new Date().getTime()-t1)+'ms','color:#4a82f0;text-decoration:underline','color:#4a82f0');
	}
}

var c_pager=PageData.pager ? PageData.pager.cur_page : 1;
if(document.getElementsByClassName('tb_preload_notification')[0]){
	var tpn=document.getElementsByClassName('tb_preload_notification')[0];
	tpn.addEventListener('DOMSubtreeModified',function(){
		if(tpn.hasAttribute('show')==false)replace_nodes();
	})
}/*
else{
	//kill_tieba_lazyload();
}*/
replace_nodes();
bind_pager();


//在网页中插入伪·控制面板.
var editor,panel,p_node;
if(document.getElementsByClassName('e_inter_wrapper')[0]){
	p_node=document.getElementsByClassName('e_inter_wrapper')[0];
	add_panel();
}
else if(document.getElementsByClassName('tb-editor-wrapper')[0]){
	p_node=document.getElementsByClassName('tb-editor-wrapper')[0];
	add_panel();
}
else if(document.getElementsByClassName('editor_content_wrapper')[0]){
	p_node=document.getElementsByClassName('editor_content_wrapper')[0];
	add_panel();
}
else {
	var editor_wait=window.setInterval(function(){
		if(document.getElementsByClassName('editor_content_wrapper')[0]){
			p_node=document.getElementsByClassName('editor_content_wrapper')[0];
			window.clearInterval(editor_wait);
			add_panel();
		}
	},100)
}

console.log('%cCC Code%c 脚本载入时间统计:'+(new Date().getTime()-t0)+'ms','color:#4a82f0;text-decoration:underline','color:#4a82f0')
}