From 0eb8fc316962640ac49ab60f5efee093ffabf54a Mon Sep 17 00:00:00 2001 From: myminwang <864443695@qq.com> Date: Wed, 4 Jul 2018 20:07:00 +0800 Subject: [PATCH] DEMO --- blog/__pycache__/__init__.cpython-36.pyc | Bin 194 -> 194 bytes blog/__pycache__/admin.cpython-36.pyc | Bin 192 -> 192 bytes blog/__pycache__/adminx.cpython-36.pyc | Bin 1483 -> 1978 bytes blog/__pycache__/apps.cpython-36.pyc | Bin 400 -> 400 bytes blog/__pycache__/models.cpython-36.pyc | Bin 2210 -> 4333 bytes blog/__pycache__/urls.cpython-36.pyc | Bin 0 -> 768 bytes blog/__pycache__/views.cpython-36.pyc | Bin 558 -> 5307 bytes blog/adminx.py | 45 +- blog/migrations/0002_auto_20180704_0714.py | 107 + blog/migrations/0003_auto_20180704_1744.py | 42 + blog/migrations/0004_auto_20180704_1745.py | 28 + blog/migrations/0005_auto_20180704_1756.py | 17 + blog/migrations/0006_auto_20180704_1759.py | 17 + .../__pycache__/0001_initial.cpython-36.pyc | Bin 3088 -> 3088 bytes .../0002_auto_20180704_0714.cpython-36.pyc | Bin 0 -> 2158 bytes .../0003_auto_20180704_1744.cpython-36.pyc | Bin 0 -> 987 bytes .../0004_auto_20180704_1745.cpython-36.pyc | Bin 0 -> 749 bytes .../0005_auto_20180704_1756.cpython-36.pyc | Bin 0 -> 577 bytes .../0006_auto_20180704_1759.cpython-36.pyc | Bin 0 -> 531 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 162 -> 162 bytes blog/models.py | 76 +- blog/templatetags/__init__.py | 21 + .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 563 bytes .../__pycache__/custom_filter.cpython-36.pyc | Bin 0 -> 2737 bytes blog/templatetags/custom_filter.py | 100 + blog/urls.py | 22 + blog/views.py | 185 +- .../__pycache__/__init__.cpython-36.pyc | Bin 1864 -> 1864 bytes .../xadmin/__pycache__/adminx.cpython-36.pyc | Bin 1383 -> 1383 bytes .../xadmin/__pycache__/apps.cpython-36.pyc | Bin 803 -> 803 bytes .../xadmin/__pycache__/filters.cpython-36.pyc | Bin 18733 -> 18733 bytes .../xadmin/__pycache__/forms.cpython-36.pyc | Bin 1671 -> 1671 bytes .../xadmin/__pycache__/layout.cpython-36.pyc | Bin 4864 -> 4864 bytes .../xadmin/__pycache__/models.cpython-36.pyc | Bin 7155 -> 7155 bytes .../xadmin/__pycache__/sites.cpython-36.pyc | Bin 12603 -> 12603 bytes .../xadmin/__pycache__/util.cpython-36.pyc | Bin 13870 -> 13870 bytes .../xadmin/__pycache__/vendors.cpython-36.pyc | Bin 3397 -> 3397 bytes .../xadmin/__pycache__/widgets.cpython-36.pyc | Bin 10786 -> 10786 bytes .../__pycache__/0001_initial.cpython-36.pyc | Bin 2410 -> 2410 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 175 -> 175 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 1140 -> 1140 bytes .../__pycache__/actions.cpython-36.pyc | Bin 9221 -> 9221 bytes .../__pycache__/aggregation.cpython-36.pyc | Bin 2790 -> 2790 bytes .../plugins/__pycache__/ajax.cpython-36.pyc | Bin 4756 -> 4756 bytes .../plugins/__pycache__/auth.cpython-36.pyc | Bin 9370 -> 9370 bytes .../__pycache__/bookmark.cpython-36.pyc | Bin 8429 -> 8429 bytes .../plugins/__pycache__/chart.cpython-36.pyc | Bin 6437 -> 6437 bytes .../__pycache__/details.cpython-36.pyc | Bin 2110 -> 2110 bytes .../__pycache__/editable.cpython-36.pyc | Bin 6872 -> 6872 bytes .../plugins/__pycache__/export.cpython-36.pyc | Bin 9973 -> 9973 bytes .../__pycache__/filters.cpython-36.pyc | Bin 7156 -> 7156 bytes .../plugins/__pycache__/images.cpython-36.pyc | Bin 6086 -> 6086 bytes .../__pycache__/importexport.cpython-36.pyc | Bin 15439 -> 15439 bytes .../plugins/__pycache__/inline.cpython-36.pyc | Bin 16573 -> 16573 bytes .../__pycache__/language.cpython-36.pyc | Bin 1472 -> 1472 bytes .../plugins/__pycache__/layout.cpython-36.pyc | Bin 2809 -> 2809 bytes .../__pycache__/multiselect.cpython-36.pyc | Bin 4107 -> 4107 bytes .../__pycache__/passwords.cpython-36.pyc | Bin 4678 -> 4678 bytes .../plugins/__pycache__/portal.cpython-36.pyc | Bin 3072 -> 3072 bytes .../__pycache__/quickfilter.cpython-36.pyc | Bin 5165 -> 5165 bytes .../__pycache__/quickform.cpython-36.pyc | Bin 4823 -> 4823 bytes .../__pycache__/refresh.cpython-36.pyc | Bin 1578 -> 1578 bytes .../plugins/__pycache__/relate.cpython-36.pyc | Bin 9148 -> 9148 bytes .../__pycache__/relfield.cpython-36.pyc | Bin 3933 -> 3933 bytes .../__pycache__/sitemenu.cpython-36.pyc | Bin 989 -> 989 bytes .../__pycache__/sortablelist.cpython-36.pyc | Bin 3395 -> 3395 bytes .../plugins/__pycache__/themes.cpython-36.pyc | Bin 3245 -> 3245 bytes .../plugins/__pycache__/topnav.cpython-36.pyc | Bin 2275 -> 2275 bytes .../plugins/__pycache__/utils.cpython-36.pyc | Bin 691 -> 691 bytes .../plugins/__pycache__/wizard.cpython-36.pyc | Bin 11031 -> 11031 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 177 -> 177 bytes .../__pycache__/xadmin_tags.cpython-36.pyc | Bin 2389 -> 2389 bytes .../views/__pycache__/__init__.cpython-36.pyc | Bin 1790 -> 1790 bytes .../views/__pycache__/base.cpython-36.pyc | Bin 20850 -> 20850 bytes .../__pycache__/dashboard.cpython-36.pyc | Bin 26752 -> 26752 bytes .../views/__pycache__/delete.cpython-36.pyc | Bin 3794 -> 3794 bytes .../views/__pycache__/detail.cpython-36.pyc | Bin 9203 -> 9203 bytes .../views/__pycache__/edit.cpython-36.pyc | Bin 16838 -> 16838 bytes .../views/__pycache__/form.cpython-36.pyc | Bin 6145 -> 6145 bytes .../views/__pycache__/list.cpython-36.pyc | Bin 19045 -> 19045 bytes .../views/__pycache__/website.cpython-36.pyc | Bin 3297 -> 3297 bytes media/blog/2018/07/kecheng.jpeg | Bin 0 -> 40878 bytes media/blog/2018/07/kecheng_8q53DC5.jpeg | Bin 0 -> 40878 bytes myblog/__pycache__/__init__.cpython-36.pyc | Bin 153 -> 153 bytes myblog/__pycache__/settings.cpython-36.pyc | Bin 2768 -> 2689 bytes myblog/__pycache__/urls.cpython-36.pyc | Bin 1023 -> 1405 bytes myblog/__pycache__/wsgi.cpython-36.pyc | Bin 554 -> 554 bytes myblog/settings.py | 10 +- myblog/urls.py | 13 +- static/js/jquery.min.js | 4318 +++++++++++++++++ templates/about.html | 2 +- templates/archive.html | 6 +- templates/articles.html | 19 +- templates/base.html | 4 +- templates/detail.html | 23 +- templates/footer.html | 4 +- templates/header.html | 6 +- templates/index.html | 33 +- templates/link.html | 2 +- templates/message_board.html | 4 +- templates/right.html | 14 +- templates/search.html | 17 +- templates/tag.html | 19 +- 103 files changed, 5033 insertions(+), 121 deletions(-) create mode 100644 blog/__pycache__/urls.cpython-36.pyc create mode 100644 blog/migrations/0002_auto_20180704_0714.py create mode 100644 blog/migrations/0003_auto_20180704_1744.py create mode 100644 blog/migrations/0004_auto_20180704_1745.py create mode 100644 blog/migrations/0005_auto_20180704_1756.py create mode 100644 blog/migrations/0006_auto_20180704_1759.py create mode 100644 blog/migrations/__pycache__/0002_auto_20180704_0714.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0003_auto_20180704_1744.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0004_auto_20180704_1745.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0005_auto_20180704_1756.cpython-36.pyc create mode 100644 blog/migrations/__pycache__/0006_auto_20180704_1759.cpython-36.pyc create mode 100755 blog/templatetags/__init__.py create mode 100644 blog/templatetags/__pycache__/__init__.cpython-36.pyc create mode 100644 blog/templatetags/__pycache__/custom_filter.cpython-36.pyc create mode 100755 blog/templatetags/custom_filter.py create mode 100644 blog/urls.py create mode 100644 media/blog/2018/07/kecheng.jpeg create mode 100644 media/blog/2018/07/kecheng_8q53DC5.jpeg create mode 100755 static/js/jquery.min.js diff --git a/blog/__pycache__/__init__.cpython-36.pyc b/blog/__pycache__/__init__.cpython-36.pyc index ed6562edb24335f0a39d7917c3189b22d74679cc..782ec8064467bbd84e8cea77ba00a5d9da2fe237 100644 GIT binary patch delta 14 VcmX@ac!-hBn3tDpujfRzJpdjs1U&!% delta 14 VcmX@ac!-hBn3tDpul+=}JpdjE1Tz2t diff --git a/blog/__pycache__/admin.cpython-36.pyc b/blog/__pycache__/admin.cpython-36.pyc index 9834191bbddaad8d39a8bfa26025ea5af7091a81..51254a4cc47ad00bb19447cf91c4f9f428a445b1 100644 GIT binary patch delta 14 VcmX@Wcz}`3n3tDpujfRzT>u^W1UCQx delta 14 VcmX@Wcz}`3n3tF9k={hMT>u_O1VI1* diff --git a/blog/__pycache__/adminx.cpython-36.pyc b/blog/__pycache__/adminx.cpython-36.pyc index f5f7358f6a0c2e9d7925c5410837a2619725cba3..abc5f4df1f091afe4181a021ddd3772eaac94bc2 100644 GIT binary patch literal 1978 zcmb7FOK%)S5T57GV;^4IvEdM;9C$5~A0db!6d@BM#vbxmVhpfNqrnZeA|2n_sMsgaq1scV?qsg>D*jd_DPX(Mw2CvyWg z^8zpP13zm9OauyDd7v)P z0$T)H1eyoBz?OiPfEKv1x43tKn|n*Vb>GmnDPHC{cZwa}nL#cG%XH7<-5KO_a8CD{ ze1Q-%Z)&~ess(LE-yV+ceKq{;o8eDieA0b&{qh?t>sMFSuUxwP`kSv^9l=A}>gme< zIN^6BCf@s!i?>;p+UdtAyW z=6yQw_@M(fFyyl^T*KXHxEDPznGskRcKw}}YF>{dzsbuo$>Zt;`1+Ud96f$?^yM#q z{c-sB*T0Uw`}Ch5?+p(gj6Qof{Qa=rzqQqCC^roADC1$M{4mT4R;4s=h2ck4lumY> zFl0p^%Wa-V+i)m%dB&ycRFa3=MN!H-QQ6=9SrhZ%uFb#K*GLDsmJPC~zxEE7AC|@b zT9l?C+l%tJ2od-m@0V-a5C>lMPi-R7?(XXTK=?SVjUgK_u4(C(Uay_5(M33&u2Iln z7Vgtlof~Pf9in4iCQ{KK@*JQNLdZmK6C`&k;>H z2}%+{pD8*p%9lwAg_07N+N|e0P>2iV#%^IN$ zNT#;rk?8M+I|)yjRC7d9Lk zI{K}i`Tx6}X7$hL>g-37?tKMY}l<84%G^2>F+^Cy&F^s7qB&NHiI$38iE=7?3 z2ElI-ap6`3*R}OK1n;fHNg_7f!#$^~FX!Cq&)N5A|1e3y-}mpn{3r_Nqb|4N!L%OP&cnJYbv3i%MWapolXcr~^pl@~XOp#W z*ptf=+7u)B0FnzTsFCdt_AU?bP>2vA#O;{(7RxV@yDrCW2cQep;H>2c7=r2$>ijuh z)*X;EDX1a^Q&cgYAQsua^qBM_yomVMYx7=9bxTvz4ASHaT97~I;4^s z)Or`&um1C0>({R)dN?z9Bkm?#B(vA{I|qaR479Re)@nZ0_b_R51pxj8CSe^hyCia% N2f3g7DNSik{{TIOj}8C; diff --git a/blog/__pycache__/apps.cpython-36.pyc b/blog/__pycache__/apps.cpython-36.pyc index 742ac3b7032fc4bd267816b22f0da72f6d37eded..dabd2e4a10e6037ea9b4b965d5ad686bb2559d2a 100644 GIT binary patch delta 15 WcmbQhJb{_bn3tDpujfX#E=B+yMgziVfCf&neb_A;1nEOsc(YE5pzuC4+Z1I{5M0ezmP$#R zA(dv0KE$vc8wEB<+r)8`7I0j&O%c>~fuMn7H2DMl1@l@bWzNR^0ewvDpPj zGnd25J2U5;d-+VIQd;`p`JacLVf@#a`LoeKi7Wmc8fGvvGP;IunAFcjW;f^ORNsoM zuI<~V@k4{zEPv5pd2U~@{5-}5=3wmbT&Dnw151&)u(+wE2uq2TVJW8;7Z#6IV5y{* z5-e3#gQb>Q%B=p1F+Vp(T*ka9i!4ld((ZEf3*A2BQH-9qv=%2KY$iX6xoFbV$)APJ zNnG*MXt?2<%4+2>V0<2{aQQr%K*9Kvf z-tk`NVyz!@HB%m#9R=&rK!nlX4N*o2s`=jwi}cEPvAfX?n~SG-{L7@jz8FSPz&c^C z)eqK1zr&l!;#$;iVV3&QeYKYh>l@OhfGe~#LPgQEO+lk3t(gAkm#$@8aRJS*jgEo! znk#fZ1H7MNN8gTlbY>?wLHjA4Aiz-t!5lrELt~idJhe~hjg|R=Ag{uqrig}~Vf|(h zs5nHO?9(Od9=R5IG-OvnQQTEq*)r!gMfxgcX3ov-&8xr5Nz$bisY=b(ZVB}97P?I(~thHF2tu{C5wE$dtzE1ma~7S0k{SpK7=c# zI2GW`x>?Twc629mAXC_V2X`j0<5tIJCV>tRBMD6<6_6@uIrSY@1f*P9S`Ay^?wNMP z2ZWW;^~+oT_+t3Z=J*MW=1oC3%Dize5UA~V)gZ{Y-WLK$XZM4EViLBL$YCuHLczDm zcZ!0>Oz2Y_6nEo*ARvxVL)-L-<9r-bp2C&tN0kneY?*B(X*x-h{)1+6kd#oM5P5x= zP!LNi2rt6wGNcveY}#5ycsaEdmCeJb!dzC`H2tdTm!Ux(08zuJj?6gMX{hl5HLgy_ z2QfaxYOJpA9#*5dbaVuxqpZOWu!Hb)45Q=xu?wdEI6!uY9Y)$a43K?;9brc=8vYaP z7(jMh+Akn0Xys9w1v%LIDbLPdCn$RH{4iv&9qLiJrQH^{5|$`Tfi> z?}a@sZP$)?YMs}m!oH~UeXL+V)X699BtpV{Aa9n)ampJ{1wCcVle-x+RZdNt6L?gX zUg`_pZuNe|Hrr-6;;~Uq;jK-vvn$&GJx^gw{ z4@8qA(QN%q6H0r_Qke4J=(D@S-(1fWE1Jke{_*d>7`^?M%m(g-VP3kl9g^v{e+`nY zAew!UOb`(sLa`r{+mvFpNz_x8H6G3~X;am#Ug5iX!-F;xlaWrQ5&2&E9s;Y7Tu)#%iFpdExd+4QX*{SjS$vCn&r(Bp65pfdei}^W z`-8u&p2OXr;+mGaq>`%Cr8_J0o|1Iw>d(vtwx+A^dHu!w1B;@fZv-#rnO?qLYE&EL#*s$j|Fvzf@c;k- delta 819 zcmX|<&ubGw6vubA`)f9{+f5p!sj2;8E6u?lD5Bt@tv7?PaBq>V3K*7E>6_^nT}Drac+(b*fQ)OYx1p34{?M;w`=` zR@DOX#0zy~!sLdcDBP4{fy8DI&~_yVVxzrUXO&3&vd1z|O0mI0nQS2q7XMW9s3q>0 zxy`QX8%(R4vQQWK7WkMN%&w=X33CKuhguXT5ge*MNNt*;1m?V(3U#QvrBIip;jkGx zNIf|05KY5vGO>28(XMu6(SG+$|NYM41#k;0$MB2oW_dkmFx;v}Ye|l{O{Oo!CS~`_ zokrA=Ne7QV_Md&;f3?dIL>&Thv{Qfg(c$*ahSy}YRz4>X-bVQZ&1-EuKMrZ33ZkG5 zB9Cx32*QX5!BQbBz7FQ5Vq9D+^Mx8~P(BQ4Fx)jl?URBJ*@K#ER$?Ehrr2#g&v4x>mq_YP*?RdE@vxX|33+14lG;&VTzBa;;U?+ zt}z|dpopq;psV>NMAqMyVDN2dNvckgCOCi{8Uolcn{k1A(h=b9Q3BkZ*eteNO}N8K z!u8SG?0^&Gh^D|o`2sDJm3Sl?IlffD ZqU03~iHT2&J@2$DvxrI%(L6ij{Q;&l!qor( diff --git a/blog/__pycache__/urls.cpython-36.pyc b/blog/__pycache__/urls.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..be59f78ec8acdd0f9ce2f309d387034d3bffde71 GIT binary patch literal 768 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 delta 363 zcmZurJxc>Y5S`iGo;|?I~omNCi@qk0I(wbK1J-1;CHAPFqlD(2_kcm ziCiWU;TViG>KTl(aw!vKdS{^fAEW?{ZQt3#SVv5qr}n;y)n0QXwoe3ov;BnNLn;+K zp}`cElH?+O9Hyjuh~`zEX>`1AVkmrkAh@%k^M9c+#B P($twf;FG$j5JU9^4>m}E diff --git a/blog/adminx.py b/blog/adminx.py index cd32c92..f10be3f 100644 --- a/blog/adminx.py +++ b/blog/adminx.py @@ -7,11 +7,10 @@ import xadmin from xadmin import views from xadmin.plugins.auth import UserAdmin -from .models import Blog, Conment, User +from .models import Blog, Conment, Category, Tagprofile, Message - -class BaseSetting(object): +class BaseSetting: """ 后台修改需要的配置 """ @@ -19,7 +18,7 @@ class BaseSetting(object): use_bootswatch = True -class GlobalSettings(object): +class GlobalSettings: """ 后台修改 """ @@ -27,20 +26,30 @@ class GlobalSettings(object): site_footer = '博客后台管理' menu_style = 'accordion' # 开启分组折叠 - -class BlogAdmin(object): - list_display = ['name', 'content', 'add_time', 'click_nums'] - list_filter = ['name', 'content', 'click_nums'] - search_fields = ['name', 'content', 'add_time', 'click_nums'] +class BlogAdmin: + list_display = ['title', 'category', 'author','add_time', 'read_nums', 'conment_nums', 'tag'] + list_filter = ['title', 'category', 'author','read_nums', 'conment_nums', 'tag'] + search_fields = ['title', 'category', 'author','add_time', 'read_nums', 'conment_nums', 'tag'] + readonly_fields = ['add_time', 'read_nums', 'conment_nums','edit_time'] -class ConmentAdmin(object): - list_display = ['user', 'conment', 'add_time'] - list_filter = ['user', 'conment'] - search_fields = ['user', 'conment', 'add_time'] +class ConmentAdmin: + pass -# xadmin.site.register(User,UsersAdmin) -xadmin.site.register(Blog, BlogAdmin) -xadmin.site.register(Conment, ConmentAdmin) -xadmin.site.register(views.BaseAdminView, BaseSetting) -xadmin.site.register(views.CommAdminView, GlobalSettings) +class CategoryAdmin: + pass + +class TagAdmin: + pass + +class MessageAdmin: + pass + + +xadmin.site.register(views.BaseAdminView,BaseSetting) +xadmin.site.register(views.CommAdminView,GlobalSettings) +xadmin.site.register(Blog,BlogAdmin) +xadmin.site.register(Conment,ConmentAdmin) +xadmin.site.register(Category,CategoryAdmin) +xadmin.site.register(Tagprofile,TagAdmin) +xadmin.site.register(Message,MessageAdmin) \ No newline at end of file diff --git a/blog/migrations/0002_auto_20180704_0714.py b/blog/migrations/0002_auto_20180704_0714.py new file mode 100644 index 0000000..db29eff --- /dev/null +++ b/blog/migrations/0002_auto_20180704_0714.py @@ -0,0 +1,107 @@ +# Generated by Django 2.0.7 on 2018-07-04 07:14 + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20, verbose_name='文档分类')), + ('add_time', models.DateTimeField(default=datetime.datetime.now, verbose_name='创建时间')), + ('edit_time', models.DateTimeField(default=datetime.datetime.now, verbose_name='修改时间')), + ], + options={ + 'verbose_name': '文档分类', + 'verbose_name_plural': '文档分类', + }, + ), + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.TextField(verbose_name='留言')), + ('add_time', models.DateTimeField(default=datetime.datetime.now, verbose_name='时间')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')), + ], + options={ + 'verbose_name': '留言', + 'verbose_name_plural': '留言', + }, + ), + migrations.CreateModel( + name='Tag', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('tag_name', models.CharField(max_length=30, verbose_name='标签名')), + ], + ), + migrations.RemoveField( + model_name='blog', + name='click_nums', + ), + migrations.RemoveField( + model_name='blog', + name='name', + ), + migrations.AddField( + model_name='blog', + name='author', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者'), + ), + migrations.AddField( + model_name='blog', + name='conment_nums', + field=models.IntegerField(default=0, verbose_name='评论数'), + ), + migrations.AddField( + model_name='blog', + name='digest', + field=models.TextField(default='', verbose_name='摘要'), + ), + migrations.AddField( + model_name='blog', + name='edit_time', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='更新时间'), + ), + migrations.AddField( + model_name='blog', + name='read_nums', + field=models.IntegerField(default=0, verbose_name='阅读数'), + ), + migrations.AddField( + model_name='blog', + name='title', + field=models.CharField(default='', max_length=50, verbose_name='博客文章'), + ), + migrations.AddField( + model_name='conment', + name='blog', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.Blog', verbose_name='博客'), + ), + migrations.AlterField( + model_name='blog', + name='add_time', + field=models.DateTimeField(default=datetime.datetime.now, verbose_name='创建时间'), + ), + migrations.AddField( + model_name='blog', + name='category', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.Category', verbose_name='文章分类'), + ), + migrations.AddField( + model_name='blog', + name='tag', + field=models.ManyToManyField(to='blog.Tag'), + ), + ] diff --git a/blog/migrations/0003_auto_20180704_1744.py b/blog/migrations/0003_auto_20180704_1744.py new file mode 100644 index 0000000..28ea6ab --- /dev/null +++ b/blog/migrations/0003_auto_20180704_1744.py @@ -0,0 +1,42 @@ +# Generated by Django 2.0.7 on 2018-07-04 17:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0002_auto_20180704_0714'), + ] + + operations = [ + migrations.RemoveField( + model_name='conment', + name='blog', + ), + migrations.AddField( + model_name='conment', + name='source_id', + field=models.CharField(default='1', max_length=25, verbose_name='文章id或source名称'), + ), + migrations.AddField( + model_name='conment', + name='title', + field=models.CharField(default='', max_length=100, verbose_name='标题'), + ), + migrations.AddField( + model_name='conment', + name='url', + field=models.CharField(default='', max_length=100, verbose_name='链接'), + ), + migrations.AlterField( + model_name='blog', + name='image', + field=models.ImageField(upload_to='blog/%Y/%m', verbose_name='博客封面'), + ), + migrations.AlterField( + model_name='conment', + name='user', + field=models.CharField(max_length=25, verbose_name='评论用户'), + ), + ] diff --git a/blog/migrations/0004_auto_20180704_1745.py b/blog/migrations/0004_auto_20180704_1745.py new file mode 100644 index 0000000..613cd05 --- /dev/null +++ b/blog/migrations/0004_auto_20180704_1745.py @@ -0,0 +1,28 @@ +# Generated by Django 2.0.7 on 2018-07-04 17:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0003_auto_20180704_1744'), + ] + + operations = [ + migrations.AlterField( + model_name='conment', + name='source_id', + field=models.CharField(max_length=25, verbose_name='文章id或source名称'), + ), + migrations.AlterField( + model_name='conment', + name='title', + field=models.CharField(max_length=100, verbose_name='标题'), + ), + migrations.AlterField( + model_name='conment', + name='url', + field=models.CharField(max_length=100, verbose_name='链接'), + ), + ] diff --git a/blog/migrations/0005_auto_20180704_1756.py b/blog/migrations/0005_auto_20180704_1756.py new file mode 100644 index 0000000..eed1ff4 --- /dev/null +++ b/blog/migrations/0005_auto_20180704_1756.py @@ -0,0 +1,17 @@ +# Generated by Django 2.0.7 on 2018-07-04 17:56 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_auto_20180704_1745'), + ] + + operations = [ + migrations.AlterModelOptions( + name='tag', + options={'verbose_name': '标签名', 'verbose_name_plural': '标签名'}, + ), + ] diff --git a/blog/migrations/0006_auto_20180704_1759.py b/blog/migrations/0006_auto_20180704_1759.py new file mode 100644 index 0000000..bca2861 --- /dev/null +++ b/blog/migrations/0006_auto_20180704_1759.py @@ -0,0 +1,17 @@ +# Generated by Django 2.0.7 on 2018-07-04 17:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0005_auto_20180704_1756'), + ] + + operations = [ + migrations.RenameModel( + old_name='Tag', + new_name='Tagprofile', + ), + ] diff --git a/blog/migrations/__pycache__/0001_initial.cpython-36.pyc b/blog/migrations/__pycache__/0001_initial.cpython-36.pyc index 00db6fefbdae76756302d69b27148e6b23ada2d7..b9de7d51db62310dbd10d9f628ae1127bec05177 100644 GIT binary patch delta 15 WcmbOrF+qaOn3tDpujfWKE*=0La|3|@ delta 15 WcmbOrF+qaOn3tDpp5sO~E*=0Kkpo%) diff --git a/blog/migrations/__pycache__/0002_auto_20180704_0714.cpython-36.pyc b/blog/migrations/__pycache__/0002_auto_20180704_0714.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce14f12e6cd3b4f13027e7206ea01182d2561ed8 GIT binary patch literal 2158 zcmZuyS#KLv6rRoYjP2}cy3m$VRUuu=Vm(YEM{h0nmiTJ zB`=mh>IUsY0SOf$(jrwL8Ug>~zS20!U*L&z?;R&5tu3E9=iIZOZ>|q?bY#z}$3HpR zElK}KZ66K!llY5HApr?wS1Plo;>w;G}rV0%N}5`9M!eJ5IU-~>9WUDb58yV^r~t9`Hw zUSRcMo&o%}=h^+-JbN&T4twE6(TAC!Tt^2Nce52fBCtYUtyWyRo)e| zdJU}x;B|O|)!U{opgs?8!dqMP?bCXD%h@|gtidh%BIF2+>RAKv$G9<84f+;e;AIm`Lhm>qRkFC2Jbaw=4p48cfxVR;R$L?wlGJvSvRn0 zzEmm=nU3$oj^$E))QX86g!5E!V0wZor^gB!&0F<2Fe@R!L!h}@=y+B*Z(bnt)QCuk zj?Mz1`HLi+4I*OtmPe?@=z2fGx1LARymh_#-482^*H(XB=Fqn;nJ)3|_#j?Uz&G(7CNZH(9Ed{HY0IX1Y}tG$>w7V9-9Xa3e|`0rzgE6#6ck=n$li6D zt+-C*g6Y>iaXqjrfjcIZ;~LHfBKOlj@2y?FiaqT|M{%6ujnRB1@IB(kJWMFJGOj(m zvbOZ3dGirXgJY8@rjqFD>pN>dej#>r_i^*qqohp(w+%c7FL?dV)wPGq%smx5u}jv6 zSzxx=mBzO#OW)&uSAV{b_4KiNdKlq*%_P+<7z}NLr;zZp!i(ya1aAu+{JaIf7G^M} zzzkJ!hzmM5!kOY;_F#@PI6k(lFoUG9i|QsHmub?hY2uAqcM0-&)BLP%xeSm@0#YMB z5WnJ(C{)pr=0-WRC)vD1cK1_b1Q9>MfI^MY^HwO>jxnru8bK;V9Z+PLrK%r%PK{}D zDHbQ$i6A77?SF)CNE)h^ZwFL?S*mk<;Dt{!qa#zJBV*$sUhNX?8kw2?(43hXKW9#! z9UK3c=FSl>xY)`w0wCh%Py6_KlBAsMh#R-~u1U+EpAHyJN(gEs`E&V63db=EC;xt0 zoI(6XMQ`4-D#bApU5JBP(Q;i=)M?hjph_xnk&POy_(SlmnnkFkszuYbN%LA$+XH_A0qP(w79$I&aCmrh*Y3!is24v^j{loD;)05)I69Gzb9f+)xgRf9Ao~>cV3f dhKJmos^BJAeEqn<-3f-QNJpZ}d2C--{{z@ia)kf@ literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0003_auto_20180704_1744.cpython-36.pyc b/blog/migrations/__pycache__/0003_auto_20180704_1744.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4786c7b11c4fbbd83b5bc0af1c25071bb91e84c8 GIT binary patch literal 987 zcmZ`&&ubGw6rTN+?53%$^+&Bor9v*uj%(gCYL12p%n>G}n2sSuv14?b_ zC7BV$lwlN3onXfPGULY>N5nlXm=a9D893Y42eBLx>zq1Kg!3@j-)|KB5x5{^UF6Q4 zp&o9o(4@g9JaG~`62_t(a!Ld)WBeo!sH}`!0cnvKNL&v|%5<4%uUk)Go>Y(ks-b<6%F>278x|*7sM{f`$+Tqk$YbVNZn{73hM3+l0MFo zmK#utp&7)D1h-hyB=yWyWr;S_)W^dvNL}&%b0^-vI$x{Jv^JRhbENRp6UH_Qrm5*# xL6=t7CjK*z5BAmR<%-Fj{$*xhMHNG-R^&e=eRNr5;r2qmtk-05Qdzxm;}5Ak6gvO_ literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0004_auto_20180704_1745.cpython-36.pyc b/blog/migrations/__pycache__/0004_auto_20180704_1745.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36579c4b86d0988b1d190f3caee9cfe96ca1f50c GIT binary patch literal 749 zcmZWnO>5LZ7@lO3-A%gHy%qfdLM}~eSL&fiMbVSJh?fW*vUy+AtdnFrlZZVl)XRz> zRF6dv5ikA%f5=?LE&CTdIg@npYeL?6zw*rcJd^G9bw7N!`*@8K@}2y#9PRJvS6SDD&~qG+2XOo->YRRv)V2GZd3bA}f;u1FEGk^xH@|Ca2sdIdV{L zo!1oXCCZfkxXgpVW&85YMy zl7@FtKCP=+m~hTunv_|^W}=#6T8Bnc-PLZLztUTVTIuosO5fO=9Sie^8CLSDHUrvo s9Lv_v$o_k8`}PAzdEK#_FljlpJlf*#nLE$msljfi&MiY%8WBeH7Xs1jS5cbdB-QMX^1PXepY?IxD9HEF%kdUa76cNoKVfk*X)g9jTV(&&uLqnug zk!X=9(x%8OU@G?fqcTzhD^c!vJB2et59L^U+M3+&{~*Y)8nZHex&5dX?>>x3#-7 z@w}FKGeq?J%k!VtH+SDI66VJz%Fc{aqLhX5Pak@s(v6iGlcM%>V5)ZP!-Uzez6~QM z10RdFSO`B7qA<{Ch4xs8&yCcfGI*dWRe~z#3*{`sLcjh-*UBCkQ2M9?_9IiNf81OV zyB>N3_2*;y-YM(S;#QeO=;OU^`_}=_g(b)QFOx5v A;s5{u literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/0006_auto_20180704_1759.cpython-36.pyc b/blog/migrations/__pycache__/0006_auto_20180704_1759.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcf4432683d47c6195fb4ceaabaeea4a41b14c7a GIT binary patch literal 531 zcmZWkJx{|h5Vhm9q@hSKv9o1qQofN8VnBk04ty*{!b*Eb)Z)Y;ZiSd(Wn|$W@Rz(Y z@fVmlr&NHjbkFb3zIXRFmX^Yo*Zr##&e%Kqb$sH76lRS87;wdM-shYhGw?t>F%Zbd z-lOPy;GeUo@j?Gs#BG?5vMQa7bYX_BG(Ud?k@Yz+YF)^9U!Xs3fB+vF&mQGXXp&%H zTc>j+>kpL9>}rxETQZ$av|LZRyU9+nDZ4vc+g4npnGFfbO5cnWMxG6{0$HRv+MvMu zn)M>Da$8glf@r}8vMx($Ln(6&Q-#FaQr=Bd(=iSwu`@=$>TAa5rcF$C zxBuJS>y!_bpdn2P6A%QV>HFN{b+s1>+nNpOz@T2auKz4IV=L5XgZ-KB1E*)4y|(xQ D9>R%6 literal 0 HcmV?d00001 diff --git a/blog/migrations/__pycache__/__init__.cpython-36.pyc b/blog/migrations/__pycache__/__init__.cpython-36.pyc index c368824c4b957bde3b610ec7a564941703cbe1d5..67d24300c47460f4cf71cfabf608e3cf42da9d56 100644 GIT binary patch delta 14 VcmZ3)xQLO>n3tDpujfRzIRF~a1Kj`s delta 14 VcmZ3)xQLO>n3tF9k={hMIRG0S1Lpt$ diff --git a/blog/models.py b/blog/models.py index 0670ee5..aceaca5 100644 --- a/blog/models.py +++ b/blog/models.py @@ -5,11 +5,12 @@ from datetime import datetime from django.db import models from django.contrib.auth.models import AbstractUser + # Create your models here. class User(AbstractUser): """用户信息""" - class Meta(object): + class Meta: verbose_name = '用户信息' verbose_name_plural = verbose_name @@ -17,32 +18,81 @@ class User(AbstractUser): return self.username -class Blog(models.Model): - """博客""" - name = models.CharField(verbose_name='博客', max_length=50) - content = models.TextField(verbose_name='内容') - add_time = models.DateTimeField(verbose_name='添加时间',default=datetime.now) - click_nums = models.IntegerField(verbose_name='点击数', default=0) - image = models.ImageField(verbose_name='博客封面', upload_to='media/blog/%Y/%m') +class Category(models.Model): + """博客分类""" + name = models.CharField(verbose_name='文档分类',max_length=20) + add_time = models.DateTimeField(verbose_name='创建时间',default=datetime.now) + edit_time = models.DateTimeField(verbose_name='修改时间',default=datetime.now) - class Meta(object): - verbose_name = '博客信息' + class Meta: + verbose_name = '文档分类' verbose_name_plural = verbose_name def __str__(self): return self.name +class Tagprofile(models.Model): + tag_name = models.CharField('标签名', max_length=30) + + class Meta: + verbose_name = '标签名' + verbose_name_plural = verbose_name + + def __str__(self): + return self.tag_name + + +class Blog(models.Model): + """博客文章""" + title = models.CharField(verbose_name='博客文章', max_length=50,default='') + category = models.ForeignKey(Category,on_delete=models.CASCADE,null=True,verbose_name='文章分类') + author = models.ForeignKey(User,on_delete=models.CASCADE,null=True,verbose_name='作者') + content = models.TextField(verbose_name='内容') + digest = models.TextField(verbose_name='摘要',default='') + add_time = models.DateTimeField(verbose_name='创建时间',default=datetime.now) + edit_time = models.DateTimeField(verbose_name='更新时间',default=datetime.now) + read_nums = models.IntegerField(verbose_name='阅读数', default=0) + conment_nums = models.IntegerField(verbose_name='评论数', default=0) + image = models.ImageField(verbose_name='博客封面', upload_to='blog/%Y/%m') + tag = models.ManyToManyField(Tagprofile) + + + class Meta: + verbose_name = '博客信息' + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + + class Conment(models.Model): - user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,verbose_name='用户') + """对博客评论""" + user = models.CharField(verbose_name='评论用户', max_length=25) + title = models.CharField(verbose_name="标题", max_length=100) + source_id = models.CharField(verbose_name='文章id或source名称', max_length=25) conment = models.TextField(verbose_name='评论内容') add_time = models.DateTimeField(verbose_name='添加时间',default=datetime.now) + url = models.CharField(verbose_name='链接', max_length=100) - class Meta(object): + class Meta: verbose_name = '评论信息' verbose_name_plural = verbose_name def __str__(self): - return self.user + return self.title + +class Message(models.Model): + """留言""" + user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,verbose_name='用户') + message = models.TextField(verbose_name='留言') + add_time = models.DateTimeField(verbose_name='时间',default=datetime.now) + + class Meta: + verbose_name = '留言' + verbose_name_plural = verbose_name + + def __str__(self): + return self.message diff --git a/blog/templatetags/__init__.py b/blog/templatetags/__init__.py new file mode 100755 index 0000000..9c843c8 --- /dev/null +++ b/blog/templatetags/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +""" +------------------------------------------------- + File Name: __init__.py + Description : + Author : JHao + date: 2017/4/14 +------------------------------------------------- + Change Activity: + 2017/4/14: +------------------------------------------------- +""" +__author__ = 'JHao' + +import sys + +# reload(sys) +# sys.setdefaultencoding('utf-8') + +if __name__ == '__main__': + pass \ No newline at end of file diff --git a/blog/templatetags/__pycache__/__init__.cpython-36.pyc b/blog/templatetags/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60e73adb4ddf082ffdb695323ba6ba25e387dde1 GIT binary patch literal 563 zcmbVIy-ve05O#j5MiJc^7`%1>Q>cVgRfr0N5JM$|Si*2JvDLbD;wW~J@&vpCZ@@e7 z0F2C8nV8s_xCE)H*yu_Ad}n{>&-Weodhz?y`2Ni!9m%2yRKgvl?P^y#L>bDW#W6OFHG5{Ca)Hl2QPbD+h2;RFpQ13u)6*6;7F) zj((3OD>pY~Q?+q@#ZAK$+^wH!FOCieCv3Jm4Pt>q7${1!kf~!2+RTvEZY?;O6&j6md}i5(`E@kTj96)Tx`Qe** z+#j>m)roD!QlyDc4p<5Y4sbz2T!1~m1w~QvkF>-o-=|#Bp7_0Lj~y%yus!Ok_o{yV zs_MPpdo@qb&-?HH;a_k5bB?i3*f$;r@(=MAAEFU#zyu#~VF^322A1jVfsNitoU}1$ za0a=NG*frr8o8NxX=~6*{ehp(4d%?4o3zvU!8~WOFpoI` zpEKrP`+pz5)9JhzC$h5BnJCND=B|TV~?M^{2kK`poK6&pg})pT8SsL)p0*>G-W!@2$}qr=Q~` z);bTdNafJpzXAu?MweHfmgzXbDIm8Ct>SE0JELn?tyjWfoP|19)e=Oxk?Wh;Pckis zQdO-N(y`v7VSL$2L$wnW;kJw{vW$m%dY{KzcxWbU!Y?rdkZ=5%b*-xLR+yBsYQ&k4 zyQ&3*X&$_>`g$Q%v6}9sVYG@+?C5;F8YW2~MsQ9Zj8#68kzUFj5s~vxz8kbC zEJ2FTkdPT+f>0ySTcwu8{>A=S$@M;2?L5jA@dLBQLzo@!A@eer^%T*l@@8kREF~*< z8~gz|D*m&|F3PQ{xt*&t)Kw$N-biAIfi zlVwi=;{x;R6AW-3p{PH`SwF{apf&qshsNDLGj=@mEzr>4s2WjT!ey?K_expl${8cf zgLYIZ1y=^7sWUiN)ee=8BM^&{YtRCX>e+$69jha`V%?VdHqeUvQrSOxVY9M_QmaRe z8fRKHX_iv1YJqCTe$j0l#co$ubNLn}e!YrM%fsii!xrSaP#J5dgX$ek%co(x=%8Vi zj|eVVmT4Ezwh_-ZMm)$KS6yJDStX#Jf@&%OkwGAkbYs4YaNaU^8XV@7FJsCS?9cx8 ztIcru<;V9wKm6n8@4a7_)z13kHI=V^@!tI}fA`nN4RmcBsxa-CT3A>6H6?YavRZk- zuO4rM3Kse9HN3?|G(#+ZXNk%Nwu4Pgt>0Mp9BjoxSr3OnhKo*p2f!{@k5Ok;R_}V{ z$S}Hl%100UKE*D|)A9PNWSmm=x;}W>8A?Q66VlfYR)g(aJyh z`lXps=Bn$Ek55I8J$CL@C<0vFT_MNbxqM(vEOPY}_Gi)oe}&!iZ-c)$sa-ycPim+C z{kLEI>BCPyc<0j({(^P?7w;P9sPDqU%tLlvE^HW3*D!wiL`^VuGaPPWs-S|wTnB`q zUz4jF&?_$p(lE|~pnI`$gFxg_5LA8;gys)K5U6uNsj~!a))$(h<5yQ|r8m38dO~i8 zWuoibxKMN*Rp*aDQLbd~g!IIUZ)DGfBUGv5r07xkuOnF3Pxq(smI~EgqX36Xo?yx%NTzPWI%qPTre>^J|GbbCpo^eYsnN)uaBFiOyoLgCf6M9AgerNSDP>M Uw&mFi4OGwN@~ literal 0 HcmV?d00001 diff --git a/blog/templatetags/custom_filter.py b/blog/templatetags/custom_filter.py new file mode 100755 index 0000000..aefb1f9 --- /dev/null +++ b/blog/templatetags/custom_filter.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +""" +------------------------------------------------- + File Name: custom_filter.py + Description : + Author : JHao + date: 2017/4/14 +------------------------------------------------- + Change Activity: + 2017/4/14: +------------------------------------------------- +""" +__author__ = 'JHao' + +import re +import markdown +from django import template +from django.template.defaultfilters import stringfilter +from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage +from django.utils.safestring import mark_safe + +register = template.Library() + + +@register.filter +def slice_list(value, index): + return value[index] + + +@register.filter(is_safe=True) +@stringfilter +def custom_markdown(value): + content = mark_safe(markdown.markdown(value, extensions=['markdown.extensions.fenced_code', + # 'markdown.extensions.codehilite', + 'markdown.extensions.tables'], + safe_mode=True, enable_attributes=False)) + + # Prism 代码高亮查件 需要将所有的 + # markdown转换的代码:
import *** 
+ # 转换为 + #
import *** 
+ code_list = re.findall(r'
', content, re.M)
+    for code in code_list:
+        content = re.sub(r'
',
+                         '
'.format(code=code.lower()), content,
+                         1)
+    content = re.sub(r'
\s?', '
', content)
+    return content
+
+
+@register.simple_tag(takes_context=True)
+def paginate(context, object_list, page_count):
+    context['count'] = object_list.count
+    paginator = Paginator(object_list, page_count)
+    page = context['request'].GET.get('page')
+
+    try:
+        object_list = paginator.page(page)
+        context['current_page'] = int(page)
+
+    except PageNotAnInteger:
+        object_list = paginator.page(1)
+        context['current_page'] = 1
+    except EmptyPage:
+        object_list = paginator.page(paginator.num_pages)
+        context['current_page'] = paginator.num_pages
+
+    context['article_list'] = object_list
+    context['last_page'] = paginator.num_pages
+    context['first_page'] = 1
+    return ''  # 必须加这个,否则首页会显示个None
+
+
+@register.filter
+def tag2string(value):
+    """
+    将Tag转换成string >'python,爬虫'
+    :param value:
+    :return:
+    """
+    return ','.join([each.get('tag_name', '') for each in value])
+
+
+@register.filter
+def getTag(value):
+    """
+    展示一个tag
+    :param value:
+    :return:
+    """
+    tag = ''
+    for each in value:
+        if each.get('tag_name'):
+            tag = each.get("tag_name")
+            break
+    return tag
+
+
+if __name__ == '__main__':
+    pass
diff --git a/blog/urls.py b/blog/urls.py
new file mode 100644
index 0000000..b237e37
--- /dev/null
+++ b/blog/urls.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+__author__ = "问道编程"
+__date__ = "2018-07-04 14:45"
+
+from django.urls import path
+
+from .views import *
+
+urlpatterns = [
+    path('index/', Index.as_view(), name='index'),
+    path('about/', About.as_view(), name='about'),
+    path('archive/', Archive.as_view(), name='archive'),
+    path('link/', Link.as_view(), name='link'),
+    path('message', Message.as_view(), name='message'),
+    path('article//', Articles.as_view(), name='article'),
+    path('get_comment/', GetComment, name='get_comment'),
+    path('detail//', Detail.as_view(), name='detail'),
+    path('search/', Search.as_view(), name='search'),
+    path('tag//', Tagcloud.as_view(), name='tag'),
+
+]
\ No newline at end of file
diff --git a/blog/views.py b/blog/views.py
index ad9b659..3260818 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -1,11 +1,190 @@
 # _*_ coding:utf-8 _*_
-from django.shortcuts import render
+import json
+
+from django.http import JsonResponse
+from django.shortcuts import render, get_object_or_404
 from django.views.generic import View
+from django.views.decorators.csrf import csrf_exempt
+from django.db.models import Q
+
 # Create your views here.
 
+from .models import Blog, Category, Conment, Tagprofile
+
+# 通用模块
+tag_list = Tagprofile.objects.all()  # 标签云
+category_list = Category.objects.all()  # 分类
+article_rank = Blog.objects.all().order_by('-conment_nums')[:10]  # 热门博客
+comment_list = Conment.objects.all().order_by('-add_time')[:20]  # 最新评论
+
 
 class Index(View):
     """首页显示"""
-    def get(self,request):
 
-        return render(request,'index.html',{})
\ No newline at end of file
+    def get(self, request):
+        article_list = Blog.objects.all().order_by('-edit_time')[:5]
+        article_rank = Blog.objects.all().order_by('-conment_nums')[:5]
+
+        return render(request, 'index.html', {
+            'article_list': article_list,
+            'article_rank': article_rank,
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'comment_list': comment_list,
+        })
+
+
+class About(View):
+    """关于"""
+
+    def get(self, request):
+        return render(request, 'about.html', {
+            'article_rank': article_rank,
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'comment_list': comment_list,
+        })
+
+
+class Articles(View):
+    """博客文章"""
+
+    def get(self, request, pk):
+        if pk:
+            category_obj = get_object_or_404(Category, id=pk)
+            category = category_obj.name
+            article_list = Blog.objects.filter(category_id=pk)
+        else:  # pk=0时,获取全部列表
+            article_list = Blog.objects.all()
+            category = ''
+        count = article_list.count()
+
+        return render(request, 'articles.html', {
+            'article_list': article_list,
+            'category': category,
+            'count': count,
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+
+        })
+
+
+class Archive(View):
+    """归档"""
+
+    def get(self, request):
+        article_list = Blog.objects.all().order_by('-edit_time')
+
+        return render(request, 'archive.html', {
+            'article_list': article_list,
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+        })
+
+
+class Link(View):
+    """链接"""
+
+    def get(self, request):
+        return render(request, 'link.html', {
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+        })
+
+    pass
+
+
+class Message(View):
+    """留言"""
+
+    def get(self, request):
+        return render(request, 'message_board.html', {
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+        })
+
+
+class Search(View):
+    """搜索"""
+    def get(self,request):
+        key = request.GET.get('key','')
+        if key:
+            article_list = Blog.objects.filter(Q(title__icontains=key) | Q(content__icontains=key))
+
+        else:
+            article_list = ''
+        count = article_list.count()
+        return render(request,'search.html',{
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+            'article_list':article_list,
+            'count':count,
+            'key':key,
+        })
+
+
+@csrf_exempt
+def GetComment(request):
+    """
+    接收畅言的评论回推, post方式回推
+    :param request:
+    :return:
+    """
+    arg = request.POST
+    data = arg.get('data')
+    data = json.loads(data)
+    title = data.get('title')
+    url = data.get('url')
+    source_id = data.get('sourceid')
+    if source_id not in ['message']:
+        article = Blog.objects.get(id=source_id)
+        article.commenced()
+    comments = data.get('comments')[0]
+    content = comments.get('content')
+    user = comments.get('user').get('nickname')
+    Conment(title=title, source_id=source_id, user=user, url=url, conment=content).save()
+    return JsonResponse({"status": "ok"})
+
+
+class Detail(View):
+    """博客详情页"""
+
+    def get(self, request, pk):
+        article = get_object_or_404(Blog, id=pk)
+        return render(request, 'detail.html', {
+            'article': article,
+            'source_id': article.id,
+            'tag_list': tag_list,
+            'category_list': category_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+
+        })
+
+
+class Tagcloud(View):
+    """标签云"""
+
+    def get(self, request, id):
+        tag = get_object_or_404(Tagprofile, id=id).tag_name
+        article_list = Blog.objects.filter(tag__tag_name=tag)
+        count = article_list.count()
+        return render(request, 'tag.html', {
+            'tag': tag,
+            'article_list': article_list,
+            'category_list': category_list,
+            'tag_list': tag_list,
+            'article_rank': article_rank,
+            'comment_list': comment_list,
+            'count': count,
+        })
diff --git a/extra_apps/xadmin/__pycache__/__init__.cpython-36.pyc b/extra_apps/xadmin/__pycache__/__init__.cpython-36.pyc
index e724dd012e6adb2770e00c6ef5ad3d728eabfeaf..089ad8d939b8f966e26555657bea0568b530784b 100644
GIT binary patch
delta 16
XcmX@XcY=@In3tDpuc!4!c1LyqC_V&C

delta 16
XcmX@XcY=@In3tDpvx)ddc1LyqCdLE_

diff --git a/extra_apps/xadmin/__pycache__/adminx.cpython-36.pyc b/extra_apps/xadmin/__pycache__/adminx.cpython-36.pyc
index d245b5bff90a515c5e2e8d993606f910d0b671d8..9fc1cc5e97e656fa0f1b147c122bdbe1b62468f1 100644
GIT binary patch
delta 16
XcmaFP^_+{{n3tDpuc!4!_5@Y{E35>c

delta 16
XcmaFP^_+{{n3tDpvas1k_5@Y{DJcXx

diff --git a/extra_apps/xadmin/__pycache__/apps.cpython-36.pyc b/extra_apps/xadmin/__pycache__/apps.cpython-36.pyc
index f06f0a4f20efbf5b88c3abef1f4bd32d31b59d66..2cf80b57160b70c265aba3da12f7fa3db881820b 100644
GIT binary patch
delta 16
XcmZ3?wwR6Gn3tDpuc!4!b{S>>BDw>~

delta 16
XcmZ3?wwR6Gn3tDpvx)ddb{S>>AwmO&

diff --git a/extra_apps/xadmin/__pycache__/filters.cpython-36.pyc b/extra_apps/xadmin/__pycache__/filters.cpython-36.pyc
index 59777bf8314f0e09c13fc7f9e09aee7028220ed5..2508e18bfa35ab9ce90300e8e64919afe7141e8d 100644
GIT binary patch
delta 18
ZcmZ2GiE-^DMs{OfUaq~K)*IQ?JOMXs1xEk?

delta 18
ZcmZ2GiE-^DMs{OfUark1;v3o3JOMTI1q1*9

diff --git a/extra_apps/xadmin/__pycache__/forms.cpython-36.pyc b/extra_apps/xadmin/__pycache__/forms.cpython-36.pyc
index 8744582c4d6788d7a6ce88454f9abd426f76c64b..c910349057bc4dc0b1129515db145941beadcefe 100644
GIT binary patch
delta 16
XcmZqYZRce-=H=zu>uJ4_y@3q?Apryi

delta 16
XcmZqYZRce-=H=zuY$Cpqy@3q?ABh9Q

diff --git a/extra_apps/xadmin/__pycache__/layout.cpython-36.pyc b/extra_apps/xadmin/__pycache__/layout.cpython-36.pyc
index 390ecf0758018b21e8a770375e8d336a8f5e4ae1..7efc4f257353abdd13d4c8f54ba49241d2cb1fdf 100644
GIT binary patch
delta 16
XcmZorYfxi1=H=zu>uJ4_{ihHBBk2UM

delta 16
XcmZorYfxi1=H=zuY$Cpq{ihHBB5?$4

diff --git a/extra_apps/xadmin/__pycache__/models.cpython-36.pyc b/extra_apps/xadmin/__pycache__/models.cpython-36.pyc
index 147b736fefcd63bcba0651ead0e25ab95a875721..0560b803967b287646b3f5a7be5f6d53b9225e6d 100644
GIT binary patch
delta 16
Xcmext{@I+}n3tDpuc!4!_BYZ1GcEqbySMon3tDpuc!4!b~|1GDKrFO

delta 16
XcmX>qbySMon3tDpvx)ddb~|1GC%gn6

diff --git a/extra_apps/xadmin/__pycache__/widgets.cpython-36.pyc b/extra_apps/xadmin/__pycache__/widgets.cpython-36.pyc
index 08d01d8025a25ad530fc22fa65503885b9ca30d5..37ee5d7687c14fc731381c4ee8043633f911f594 100644
GIT binary patch
delta 16
XcmZ1!vM7Yzn3tDpuc!4!c4;jDD@g>2

delta 16
XcmZ1!vM7Yzn3tDpvx)ddc4;jDDbWN*

diff --git a/extra_apps/xadmin/migrations/__pycache__/0001_initial.cpython-36.pyc b/extra_apps/xadmin/migrations/__pycache__/0001_initial.cpython-36.pyc
index e616602af06176e455c69f29a90278c2b033de3a..baddcd11403f3694e02c69327e1a560c9f51f1a1 100644
GIT binary patch
delta 15
WcmaDQ^h$`$n3tDpujfX#6ixsrU<7~w

delta 15
WcmaDQ^h$`$n3tEU+I%Bh3MT+2dIT&0

diff --git a/extra_apps/xadmin/migrations/__pycache__/__init__.cpython-36.pyc b/extra_apps/xadmin/migrations/__pycache__/__init__.cpython-36.pyc
index f66697d3e0492ace66eabc01deaaa7eb841b2992..c1c19c57c7a7f65ca03b656460b3c086515605fd 100644
GIT binary patch
delta 15
WcmZ3_xSo;Sn3tDpuc!4y_7wmh>jXdm

delta 15
WcmZ3_xSo;Sn3tDpvx)db_7wmgwgdeD

diff --git a/extra_apps/xadmin/plugins/__pycache__/__init__.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/__init__.cpython-36.pyc
index 85ac1ece70417bf2b21a0721350b1f4199ef3b08..776dcd2e6c3941202728cf01c65590f9065abb5c 100644
GIT binary patch
delta 16
Xcmeyu@r8rkn3tDpuc!4!_FNVKEfWO6

delta 16
Xcmeyu@r8rkn3tDpvx)dd_FNVKE1Lv<

diff --git a/extra_apps/xadmin/plugins/__pycache__/actions.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/actions.cpython-36.pyc
index 724139787218807d0b0219c5f9b84a1d16fe629e..199f6a0ff6d5a3d458d720f77dae4a206c79262d 100644
GIT binary patch
delta 16
XcmZqmX!T$>=H=zu>uJ4_{hu-bC{hIz

delta 16
XcmZqmX!T$>=H=zuY$Cpq{hu-bCfWqh

diff --git a/extra_apps/xadmin/plugins/__pycache__/aggregation.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/aggregation.cpython-36.pyc
index 05cc6cf2e3a583daeb8c678f5ac71e49d6212ae7..8d1a9993833c2684e3dae65b1f1fc674c17187f6 100644
GIT binary patch
delta 16
XcmaDR`b?DFn3tDpuc!4!_WN7_EyV>l

delta 16
XcmaDR`b?DFn3tDpvx)dd_WN7_EKLOT

diff --git a/extra_apps/xadmin/plugins/__pycache__/ajax.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/ajax.cpython-36.pyc
index 2e9e80bb67e7bade15289fd55f81131da4f500e8..4a370f2a37ef07f178669ff01302ce9f4b7e3ac3 100644
GIT binary patch
delta 16
XcmbQDIz^S;n3tDpuc!4!_Ff?XB~1ir

delta 16
XcmbQDIz^S;n3tDpvx)dd_Ff?XBh>^Z

diff --git a/extra_apps/xadmin/plugins/__pycache__/auth.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/auth.cpython-36.pyc
index 2031c16446eb6956318af695f70b5a99ba0b1686..8fd8763a911db0cc7f89bc00412ee2e9b7069f7f 100644
GIT binary patch
delta 16
XcmbQ`Im?sXn3tDpuc!4!_Q@&$Dh~wJ

delta 16
XcmbQ`Im?sXn3tDpvx)dd_Q@&$D3=71

diff --git a/extra_apps/xadmin/plugins/__pycache__/bookmark.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/bookmark.cpython-36.pyc
index 7083248971de5842e9eb25561747cb510a53c582..84755ddcfa5205608d90f54bffa9a7d2f82b1f24 100644
GIT binary patch
delta 16
XcmaFs_|}o#n3tDpuc!4!_GbzJGm8bf

delta 16
XcmaFs_|}o#n3tDpvx)dd_GbzJG7|-N

diff --git a/extra_apps/xadmin/plugins/__pycache__/chart.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/chart.cpython-36.pyc
index dbb598e20f6469100e1bf9c55781c828096c64e4..86dc4daed73744efaa4461dc93a866f2fbe4c9af 100644
GIT binary patch
delta 56
zcmV-80LTBOGNm#HGYt(2y-7Q<2VWEc+LLD#m;q{%75Ncx0002m1!Q4#VRPC8Z(?fN
OlL{6u0cx{47V824;S!+$

delta 56
zcmZ2#wA6^*n3tDpvx)dd_IMG-sLAOfGZ-@`iT)JKXJBBs#hQ{>l309;IX@{YYBHCY
MK4a!)E3wy10NWoCTL1t6

diff --git a/extra_apps/xadmin/plugins/__pycache__/details.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/details.cpython-36.pyc
index 730bae336f5c858fa670ff190d2e8b182c1f378a..cc637266706b7d9d5a54818c734a2b50a74a8266 100644
GIT binary patch
delta 16
Xcmdlduup*9n3tDpuc!4!c5@B@CpQE$

delta 16
Xcmdlduup*9n3tDpvx)ddc5@B@CBFmk

diff --git a/extra_apps/xadmin/plugins/__pycache__/editable.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/editable.cpython-36.pyc
index fb1e0d5267c4193e97863737213cb69183037385..f43b2c1c19cf672f62abc58b9a8e22c2aab98be6 100644
GIT binary patch
delta 16
Xcmca%dc&06n3tDpuc!4!_KQ*gFO>yd

delta 16
Xcmca%dc&06n3tDpvx)dd_KQ*gE*%9L

diff --git a/extra_apps/xadmin/plugins/__pycache__/export.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/export.cpython-36.pyc
index 2b0c2d86d638230da59ea36aefd985bda364d731..76f2079385fc8b28ba52cbf65d6449958b482f1d 100644
GIT binary patch
delta 16
XcmezB`_-4-n3tDpuc!4!_IGLkHQ@#D

delta 16
XcmezB`_-4-n3tDpvx)dd_IGLkG-(B`

diff --git a/extra_apps/xadmin/plugins/__pycache__/filters.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/filters.cpython-36.pyc
index 410dad421aefdfafdda3c67e41e948c72ed3bde9..2ce5bbe14c464d2bafc0fc14b72ae25d5ceaefad 100644
GIT binary patch
delta 16
Xcmexj{>7Z#n3tDpuc!4!_P5diGfoAz

delta 16
Xcmexj{>7Z#n3tDpvx)dd_P5diG1dih

diff --git a/extra_apps/xadmin/plugins/__pycache__/images.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/images.cpython-36.pyc
index 47197968d039ec76ee53ee1345e69150cda4cfc4..f9d99a05f7e4ed9b1a4c774fbbb536d26629ff5e 100644
GIT binary patch
delta 16
XcmX@6e@vg4Mt

diff --git a/extra_apps/xadmin/plugins/__pycache__/importexport.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/importexport.cpython-36.pyc
index 2db9538d67e99b8655e76e51570c5c4abf8c6bcc..66a5e5090eafc36147e7a5112f21399cb330ffa1 100644
GIT binary patch
delta 16
XcmX?KalV4xn3tDpuc!4!b`Ki>H0uRw

delta 16
XcmX?KalV4xn3tDpvx)ddb`Ki>Gjjze

diff --git a/extra_apps/xadmin/plugins/__pycache__/inline.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/inline.cpython-36.pyc
index 7e58b9a3d42aeaca06fe29ca4ade735b7d9c1c5f..75ab967874eac707578b9a808a29f81cb386912e 100644
GIT binary patch
delta 18
Zcmdnn$hfzWk=>Y=mus)5^+xt>4gffW1Y=mus_$_(t|^4gfa{1&IIv

diff --git a/extra_apps/xadmin/plugins/__pycache__/language.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/language.cpython-36.pyc
index ff2134f28192549e428a63ad15ddeedbd1ce6bce..55a79a20e2197c340166d566516635b7b9ecf47a 100644
GIT binary patch
delta 16
XcmX@WeSn+Yn3tDpuc!4!_MNN%C+GyM

delta 16
XcmX@WeSn+Yn3tDpvx)dd_MNN%CU694

diff --git a/extra_apps/xadmin/plugins/__pycache__/layout.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/layout.cpython-36.pyc
index b1e6760c4b62c4bc622e4ad6386430f3db873e56..e3f2d2eedaf75213af64130cd540a5dc22384eb4 100644
GIT binary patch
delta 16
Xcmew<`cstMn3tDpuc!4!_D@^@FeL?W

delta 16
Xcmew<`cstMn3tDpvx)dd_D@^@F0BPE

diff --git a/extra_apps/xadmin/plugins/__pycache__/multiselect.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/multiselect.cpython-36.pyc
index ccc3f9c2c04d42492a6e57c69c58264e57eea249..95ce0c5dabcdf8bb8f3024cec592754157ebca4d 100644
GIT binary patch
delta 16
XcmeBH=vH7i=H=zu>uJ4_okaiuBA)}o

delta 16
XcmeBH=vH7i=H=zuY$CpqokaiuAtwWW

diff --git a/extra_apps/xadmin/plugins/__pycache__/passwords.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/passwords.cpython-36.pyc
index 69540190ada2e57821f63b35c990879ce2f2cfe3..b55598cd3a169af84480417bd3b43277dca8cb89 100644
GIT binary patch
delta 16
XcmX@6a!iHYn3tDpuc!4!c6%WJDscpT

delta 16
XcmX@6a!iHYn3tDpvx)ddc6%WJDES0B

diff --git a/extra_apps/xadmin/plugins/__pycache__/portal.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/portal.cpython-36.pyc
index 6aceef4407ff963d6b158f6fa383eb6c24dbb878..9c57e98c73741cc66b0d86cade679339a5b61474 100644
GIT binary patch
delta 16
XcmZpWXpmqx=H=zu>uJ4_{U*>n3tDpuc!4!_6tG)Ev*GI

delta 16
XcmcbvdR>*>n3tDpvx)dd_6tG)EHwo0

diff --git a/extra_apps/xadmin/plugins/__pycache__/refresh.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/refresh.cpython-36.pyc
index a7b993f1446e56c65fe0d52704e88a219e978019..adc51edfe7f27ea70f72318c81890b3a9670a7b3 100644
GIT binary patch
delta 16
XcmZ3*vx*2n3tDpuc!4!_N~eQE*1qg

delta 16
XcmdnvzQ>*2n3tDpvx)dd_N~eQES?1O

diff --git a/extra_apps/xadmin/plugins/__pycache__/relfield.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/relfield.cpython-36.pyc
index 3e8a1ef9f50dd669ad656db45508d69bfa6f8436..a3bd4fd36b866acefa9c7e9faf63051cfaf3349f 100644
GIT binary patch
delta 16
XcmcaBcUO+xn3tDpuc!4!_Aq_`ET#mr

delta 16
XcmcaBcUO+xn3tDpvx)dd_Aq_`D=q|Z

diff --git a/extra_apps/xadmin/plugins/__pycache__/sitemenu.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/sitemenu.cpython-36.pyc
index 13e257911a9167fb379ee68c16b46312b6281679..a4815d3a6301c01bc32cb95fc7ab240e8c5f9fed 100644
GIT binary patch
delta 16
Xcmcc1ewUryn3tDpuc!4!_G`=lD;5O#

delta 16
Xcmcc1ewUryn3tDpvx)dd_G`=lDV_wj

diff --git a/extra_apps/xadmin/plugins/__pycache__/sortablelist.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/sortablelist.cpython-36.pyc
index de9bd3f1178ed34b498fc04f9f0f5dc8ba4a81b6..f8703e3399fd89f09ba7e0fdba91a35845ba7486 100644
GIT binary patch
delta 16
XcmX>sby$ksn3tDpuc!4!b{k#*DD(td

delta 16
XcmX>sby$ksn3tDpvx)ddb{k#*Cwv4L

diff --git a/extra_apps/xadmin/plugins/__pycache__/themes.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/themes.cpython-36.pyc
index aa70de263b5aa9476b26d9111c81968ada2ef66c..112966859ab3d02d1d7633627a77cf5a8fe786a5 100644
GIT binary patch
delta 16
XcmZ20xmJ?hn3tDpuc!4!_GLT(Cl>^k

delta 16
XcmZ20xmJ?hn3tDpvx)dd_GLT(C7%RS

diff --git a/extra_apps/xadmin/plugins/__pycache__/topnav.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/topnav.cpython-36.pyc
index 0b209dff4097602bc54c420cc0f4eb366f1eb3e6..15dd49d8fe671c4e3933263fd9a0461819c5b594 100644
GIT binary patch
delta 16
XcmaDX_*jtLn3tDpuc!4!_B$K^Eb|2<

delta 16
XcmaDX_*jtLn3tDpvx)dd_B$K^D|-at

diff --git a/extra_apps/xadmin/plugins/__pycache__/utils.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/utils.cpython-36.pyc
index 8c4f21285c4694dbd33d4a4a44a43d4f49b72ecc..31acb259a98503e9c6ac56849a2b529e220ef5b4 100644
GIT binary patch
delta 16
XcmdnYx|x;Tn3tDpuc!4!_BBiZC7lFz

delta 16
XcmdnYx|x;Tn3tDpvx)dd_BBiZBqanh

diff --git a/extra_apps/xadmin/plugins/__pycache__/wizard.cpython-36.pyc b/extra_apps/xadmin/plugins/__pycache__/wizard.cpython-36.pyc
index e8b9f1b8eda52bf34de0c82a5d48cf5282267f59..fe8e8118e31414d6d34c976628495dc4d465285e 100644
GIT binary patch
delta 16
XcmbOpHa(2pn3tDpuc!4!b^&bwDk21J

delta 16
XcmbOpHa(2pn3tDpvx)ddb^&bwD5?Z1

diff --git a/extra_apps/xadmin/templatetags/__pycache__/__init__.cpython-36.pyc b/extra_apps/xadmin/templatetags/__pycache__/__init__.cpython-36.pyc
index dc324a203568c85dfa8a5d2a2bc3c06e5e6aee24..521dd25b60835d92c638a9d54e327df585262ea9 100644
GIT binary patch
delta 15
WcmdnUxRH_Fn3tDpuc!4y_Ei8NB?LwQ

delta 15
WcmdnUxRH_Fn3tDpvx)db_Ei8L@B{+@

diff --git a/extra_apps/xadmin/templatetags/__pycache__/xadmin_tags.cpython-36.pyc b/extra_apps/xadmin/templatetags/__pycache__/xadmin_tags.cpython-36.pyc
index 3e34e39677061874d0b96796bae662253a314ee8..ce5422ee87ea43350e2868167943551d83f58cf9 100644
GIT binary patch
delta 16
XcmcaAbXADmn3tDpuc!4!c0W!4Do_M{

delta 16
XcmcaAbXADmn3tDpvx)ddc0W!4DA)u#

diff --git a/extra_apps/xadmin/views/__pycache__/__init__.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/__init__.cpython-36.pyc
index edc76a002524d4338a633073ef073ac307e9c8a6..f7e962430cc58d7e940b4ce52a4c4dbb9d5ef0bc 100644
GIT binary patch
delta 16
Xcmeyz`;V91n3tDpuc!4!_U~)}FX07i

delta 16
Xcmeyz`;V91n3tDpvx)dd_U~)}E@=fQ

diff --git a/extra_apps/xadmin/views/__pycache__/base.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/base.cpython-36.pyc
index 0983e0a1974a15711f6c89c23b639d21c42099bb..2d37eadf4ff5af1b9e20c0c9840cdb34bd08ebda 100644
GIT binary patch
delta 18
Zcmeygi1E`RMs{OfUaq~K)*IQg0|7$Q20j1)

delta 18
Zcmeygi1E`RMs{OfUark1;v3ns0|7x>1^WO1

diff --git a/extra_apps/xadmin/views/__pycache__/dashboard.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/dashboard.cpython-36.pyc
index 381d54a091c1cd2079d628b02ecf0abf1e73c393..ab73a203347b98fd899d6afcbbd0690723fa2e44 100644
GIT binary patch
delta 18
ZcmZp;$k=d^k=>Y=mus)5^+xu}3;;R>1>FDu

delta 18
ZcmZp;$k=d^k=>Y=mus_$_(t~13;;Nd1)2Z=

diff --git a/extra_apps/xadmin/views/__pycache__/delete.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/delete.cpython-36.pyc
index c39fe98e66b72eb37914890bb94463e6dc71c0d9..5c3caeb466223f22ab5f01d467a2f331caebea58 100644
GIT binary patch
delta 16
Xcmca4dr6kvn3tDpuc!4!_S1X-EGY#K

delta 16
Xcmca4dr6kvn3tDpvx)dd_S1X-DzOC2

diff --git a/extra_apps/xadmin/views/__pycache__/detail.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/detail.cpython-36.pyc
index 4ba630657afd1a886cc2c80dc62005105c999753..ec824a761fffb6cb3c48a6b9188cbfd8ec79be54 100644
GIT binary patch
delta 16
XcmezD{@I<~n3tDpuc!4!_BYA^H1-AC

delta 16
XcmezD{@I<~n3tDpvx)dd_BYA^Gkyh_

diff --git a/extra_apps/xadmin/views/__pycache__/edit.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/edit.cpython-36.pyc
index 5bfceaa49fcfb32cd06518540343066a8c8c94ca..d086429349e2fb5822f7909a3297e1148b1ae057 100644
GIT binary patch
delta 18
ZcmX@s%y_Jsk=>Y=mus)5^+xvnjsQ9S1?&I-

delta 18
ZcmX@s%y_Jsk=>Y=mus_$_(t~qjsQ4@1*rf4

diff --git a/extra_apps/xadmin/views/__pycache__/form.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/form.cpython-36.pyc
index b4b47bbb6c4ae30de667a3fe60dc7d257b52d403..00bf14b4f3ee40a58f12cfd16ad7dd02d60599b9 100644
GIT binary patch
delta 16
XcmZoPXf$9q=H=zu>uJ4_{g*fZB_;&R

delta 16
XcmZoPXf$9q=H=zuY$Cpq{g*fZBd!F9

diff --git a/extra_apps/xadmin/views/__pycache__/list.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/list.cpython-36.pyc
index d30f891fba20b406f2ab2b4452c0c2220b51482a..f70d98c47df784beb25dca4c4fc7da1717154ff8 100644
GIT binary patch
delta 18
ZcmaDlh4JYWMs{OfUaq~K)*IR5yZ}E_1@r&_

delta 18
ZcmaDlh4JYWMs{OfUark1;v3oHyZ}Ah1+f4C

diff --git a/extra_apps/xadmin/views/__pycache__/website.cpython-36.pyc b/extra_apps/xadmin/views/__pycache__/website.cpython-36.pyc
index f2f4a7f19a9c3b95cdfc8d63cd1dc4e8a7753ff8..191f469c5a8dc8277ebb488764c866ff4f9bb4ec 100644
GIT binary patch
delta 16
XcmaDT`B0MGn3tDpuc!4!_FFsvEtdr{

delta 16
XcmaDT`B0MGn3tDpvx)dd_FFsvEFT2#

diff --git a/media/blog/2018/07/kecheng.jpeg b/media/blog/2018/07/kecheng.jpeg
new file mode 100644
index 0000000000000000000000000000000000000000..db9c41f98356bdf6e3d459d89ffd9c79cae712c8
GIT binary patch
literal 40878
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

i zv1L{4gNOL3x~!!~+Zg??`Ef{o+8vpo8?zl4AD=Sstpv#z1{rjjon=JK%k9JH1S?}z z+ieWbs!*j4Fh-oqn)ZWSKh3rkKmZ{6wZ#XmqTzsmd7Eiu&_-vi&$!gr92rT#wT@eZ zqtH?I_2a)kG=Ht1Xo@`lM^hA$mDP#{!niR%ed9}Zt;hdt*+&CDcKHQwP1|C3;b+#Y znYn?aZgRA4H;{UN=f6ve*nWU)k>B}GM5u*s9?N||hlcgf4vo^a0k`|Ga2FRNU=jty?24ENADko} zc>U#c!pa1dvpyVsy;E}1lkv0=Dh->0)HGg;GXNT`&u%;eWT(kAMd% zES!~DwruJ3fn=eaEj8_>+IZG>WK^zoqhsSm=;TU>72CRmz;}>E`i1?zN_bYTnq_;~ zwkXPHw~_ck=fr7^r@6&)uw<`DfLFT0brkter*tU~A+Xcwm!w)mbq+|ZW z?Br#D8u+Qc@AEHjlaeN$gTDX6F8}Gpsbww6IrEDS#Xe(FtxwL^sAKLw-;sp(9?+%) zdJx9D{l;hwf?!Xl)wY0K4W~e8sg|;2wTh_yt4IC5_3S~ z(x1^!gWcOFx_yPJf z)dMaSAo#R3hi~Qk+}+*Ts3K>2(e9pz1D|zQJq%pycXJ5|RyJ1lQ2|SF&>sW(n+w-X z3YQa)dXdq<7;i8dSjTt*=H4ANkhLARWtoI~X^LxKT@JR184AbS2W{REah5WD-)cv0 zz+N)ex$&y%Wct2)^&a%bREwXHcuEBR}eGduICz6&fXBOIEnXh|myKe0B6iZXP}&dqJUV#(D&r=Ol5 z7k&gfC7ez`#;S5CB(X>~=R+-*wOwB!>t7#W9ZePrgvEs%+8x^cX@Ndfw3X&GVe`Dz z)+6HlxUuTn_&h=%4VR>&5jwNOXfGUr1aE;apC2wv0kl=l+vB#U8FJ!&dfWZe5dE(& z|F5p3Tm`=D?ySjI=J4;XI-&%&s}o^sYB>dfZ+xxIAFV|&QULh$?|}JCjAqXHTaC}& zr8`8tFk;ux#DI+>KL2!$w>k0L`>zXa*%PPwqJiWbp*>k|9a5Dv26|+@ar}jU)LAz4 z-4H$?Vd<;a%w5%7abhj(#u+lkgBO-w=GB9a%v5o&;@2GSNHy`NC@@ujbqH`_j19Xa zf5}hpKGTD?VBZDmT0N~7mH{ZNp8xy~;_pTz`?iQ@O~p-4u#B!lOIywc&gnT%f|^A| z-`hS|9ufHwy50E3*R720BpIU{0L(6pEgvXr2(V~~MP^K#l*5Oj&&6bwf6Cye@>g$u zuw^%TkI55?Ar)hi%2TJuM&|=v-Eht^P`VqyQ}~nrGB|d1b8cy=Q-fd6p{>}!>QAU1 z#F%ScLFI|^R0kfsOv1J7o`;ZFlGsgM8Ii`+%mRloR_)B_7x7GN&r%|5{m8i1avm$Z zBzA~^L(jI5;<7HiLPiE49nvzkCcKM#?7DL9Aq?KJFjey-4N zj?Aq#uyNC_1aYKZJgrRGADL%U@l|AXRVJt&*^tb$M>OS?7i+;HbVx#7WY<1#r4z1!S1rzrOd=EIL3JzaL*5=%?5Yp}Qx*)S_ z{El+dFbA?3Cf#8=S6d!;Kd50FuDNq!qa=s|3vgae0{ja3ixovvs~`056_1w7)7Tm_ z7%z765?kK1ptK=~HZHCS^GxFj6FISMTYl1lgbHx1BX8MN22(86D)uG-PM=<$H7|2t zytLHlRV%)vr@yX601ddaIHfR~zPhjv!vR3D?K%b(Hov6v#7E8}3a~19LD^ML~UyJWX5B?nRHWCZi53BX{dlrve;+rNhhR7wCicvVE6UbnaA zTP&*T9Dy^@_j+}A-o*qw+?Mq<154tNLB`L#WYOLQL(c z_X2S6y66`Yyk@YK?2|_ykk*tF#Z&?NT+wi0!5Y`=a@7+-QcPvV5*L1e00!6NF^gzBzx1u$5x1<}_v@H*Q>scz zZqJUqEXpM0HT*2L1Wdr+>mO;`v50>1E!wY2pSjoJus50J6`+zeQG|(D#eTVxJxe_2 z2K}5S)^${Td)n;TzQ0w}Atvk(%hJ)Sy=%l9YW;G%)}8i?LMS!EhD3mw7S`#}VePp- z3GtYo?(J}lBZV?lu@bg-;QNoC+yBIbp8uEe{GZ;-d#>)lE5of5zNy*`s=a5B|j z=IfZ`*|`M#g!sJ1Pr`-(m%yeJVM{01Je*=X*mPLzUV0_pBC=^;ddtker(722jbOgnamF4v(}N;_ZtPi!kI9e7e@d2bJW5N>R0wpQp)924q;t z_BzfDPon}=0dDS*>R*6759{W%d!8-ml%Kx3_>e_*we21D8NBM`4-nWz6PhpjsD`sA zt73q6wox_LOUHriO8HW`=GD@W^tPvbYZmY+1k&CfEIw{asJ8)~(a2NxQ%5J=IsNej zH~)WI{_{PZU-u~dWTuvM$x_r4ASll6?)>b|7D9`C`cCAJ_ieVk%B$lykcWD~MiN7S zQ=Xm`VNDDo-bxva!sl8=JV5!L8nnONkZU{gt|pQrKwHs0_?p)`5{1ZjI3#^5+Wxm-39JZx)uPEi48m{0ls4{PV@Lm17r-p7*ZCjgwc3dqsu>eTki#;IqG1mX5?oSvo;TD#Qcv9&PcEoOXA zvorfjR(0>BjbXd0y_^?3NNLoG^U7oLng66p6reYL1sSv++chA3X|{6xK1gXkvGe$RV(0Py zzDPU<1>E_UKfn0g!uqM{durkqXDj7&tgJaQv6^wZHERv6N5e`!l`lR7(nYe;#K1jGU zM_}FN?APktj6sI2HkrQjwtw)`Ir~g~IsXC2ROirqbEzigA!-t!IaYm1?Tb~Zu3@yE zz5v8xxTUhLB*XMZU&)LM4aWNxwS+<>##%ix8rSNxb~b~-x|tGE?9mTEq9D+(Mc=X) zkJt*w#|&l}rR>Du`X}n+V;g-t$;$Y`m4G6!N;WR`Awj|^K(!JT0lzEnDWV|zhLeGh z%B~olqqwpm@qKKctqF8ZW~aikjB?H@LF+dHjYLgL=%DBhV%>}7qU2TFfSA)>nn;1{1TeYIf|b5YbA(9Nn|(NLVbHZ88EThcc4$7OElM)!ap z%daQ(k>%ApXU(mg|9@9$zkH639L~T4nS~k8WtV&6i`1;fADMQ+R@vo{0eQty!8^mf z8E4i)JOw$;0$d&ryX_>0JMV^~yn$++E0DID2*_(6aWdXx#PP3%|9`bzeK?bA9G<>E zm26RQii*&P6X|PCb<7D-G-O!$tZ8V+kY;qHIz^nsnavO`9~qm5XxK>dF&{A{Mm{#J z*?h}}=)Ag4U03JSInE#b_rA~bzR&x6-s^Wg*YCZb`@Qej9mTPZ{d+^g)G(v%K5)Z( zjl35n54+E}X4d!4B_oDL0btZr$qlK^&|)O0%lsI+1}Jc2;cnd8t(L7bY*hKPI(|jh zX^-kRVB{KWzy4$0ii(>1)Rkqi$Pg|b4ymeT*N9d~FnKw4P{nnn$y&x(w%+0&uV?n2 zwWC%(P5WVW>YbCPQ1{_`2q#(Xk_6j&hLPC7!9h$7cZ`dX2CKU@Pf(y+Rw)O8;bgbA z@KO|2N-WpSRcFP4mXxnk$szlVN@{8thPF;uS}4gYw;le4Um)Ldp}BLSORbF%sABc{ z@^ut3lKn8(w~?FMn&Oj?8kk*0%s+IqjxsINGo8NsyJu}eAKfw{w}!=`0W1dh5-tUh z5VWla)z@HVSah1GD6k~El-%D04H4kX$M)MEO&0*fScT(t_2j;LBjTNXILDDA)a8Ko z%KcsMH`#C;I8n>uNFkZ0ymUKpgIW8OsiUW}KQQtpK9-8_G zJ^o*_@XOA>yNJo1s=(d3<^y%@`YOayK_X6I0v*-TeOlSy}yYnjbB4aV9*n%Ha3bq zr(%V=$f=|wpB!T39!;Lfu&{X@598qY`|urOL$Xk*pTFyNLe*Z)YbiXcv%GF25%P$c z&F`IJp=vk$gsF5f1i*x>^Idt~TPuwce} zr9JyI*zyb^j|iKL0Z=V%4hE49TD*Q?Z~UuQeX%ZO!3Jmn4R8ev8z_DXfa0f#D6@U5 zP}s+MHLX8bLxfZniUl5*=574!LJeHrJui)P1E+!0Ac6($ID9pL&y7k7vyF81 zuC~uLVLU6kvyH5&O6ss8(c#MNjm8JAiMjxL4ma_n$Jhvg<-TZ9ojaK+c+kKL4E0&N zOrJ(czZVUT$`=PLh{em?ivV2ys(JMuO^dydu06abE%K1TBkP~s!}mX z<6(h2m&50!TF+pigZAi(eJYfQ&0}{qh^Iyrg(%MDC8(?bPDU%af@|PQbWvs8@$Ty7 z7&_Y*=2nna>r~w^0`Dlc33tjU6S0!-!?7aCdrGdLmN`HN0o?hDkad~ zapfSm$L z?iejz4;5(g0R$3?U+fM@X1W#mYuWzX(!{X>r}LKzO^8yj!$v#|3pwsFnV&Oo;I$`;9a4C){TDzJG<`X+jEAN_VVElcWs+oCfh3~X87C;%=0{}Fue zJ3f9Ze}ql@0oe2`iCbU%>}iqOjDDZVt&g%SkWn2+3Lwiuh_MJSc2U{ZgdbH!ct>14 zF<*R^IqHV3nJnNv{%=*5?>&)kjE@$!s%h22^|8Ls%c{5+^KT&={AMlF!3gud;`HJ1 vwM7k(fsM*cB;H(DJ(0F^#nIxdCt7AbAt26`j@RW20M)+n-0$8j_o4kyd*bld literal 0 HcmV?d00001 diff --git a/media/blog/2018/07/kecheng_8q53DC5.jpeg b/media/blog/2018/07/kecheng_8q53DC5.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..db9c41f98356bdf6e3d459d89ffd9c79cae712c8 GIT binary patch literal 40878 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

i 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 literal 0 HcmV?d00001 diff --git a/myblog/__pycache__/__init__.cpython-36.pyc b/myblog/__pycache__/__init__.cpython-36.pyc index a478f5cceb40101850b83b6347ff2880f28f42ff..70e9049ec98e717a9e8512ece7bc0bb1b58246da 100644 GIT binary patch delta 14 VcmbQqIFpghn3tDpujfRz$p9JM1Hu3R delta 14 VcmbQqIFpghn3tF9l+Hx9$p9Iu1F`@B diff --git a/myblog/__pycache__/settings.cpython-36.pyc b/myblog/__pycache__/settings.cpython-36.pyc index 605e788fdd063271bb207191b3e03bdbb6b10014..598bc6977517bb63a90778c426036ef31b67f836 100644 GIT binary patch delta 244 zcmca0+9;}Q%*)H=*=ZA9!^gnzm;niJ0@)5gTx>K^d3}9~TsmteV~YG7mUPA_p%jHE z;S|Lbr4;29l@!$!wG{OfjX7+Yj8P&fnkia9b($&KU{VK6>Si*gvqXue=tYU8=tqgC zutrG$v1E!tlvIjglyoX%7HbxFDrbsOGgBI4luU|olq_7#q?sv7E``%HNF)1i^Ga>@-9vrHZ7pDi?k;H;f!J|njFsM QK6wt82AcpY3nL#30Ab2G=Kufz delta 358 zcmZn^y&$S=%*)Gl$iX@~hM$4qF#{6d1hO4~xVUPf^7{I8mQ2PJxj8K9j8Q@<@=?Mm z3Mq;yN-4@IDk-WdYANb-*fJTTL{c3&K5=+sG5>H`` zk^o}K6#Xcv6oV+~RK_gUEbdg!6vJkwD47%^C?CjbX3COHF-|dQW=acWN->2?m?B9q zrI^9R&5*^@n4{!U%%kMt##;c5S4gppQcPhAX3(_S9L2bRWwQ#~7e?_Y=H%kyUyL!o z812-d!6?Bf!^* zS3f?lKUx%es6&7u)^ejTL$k0#tBv*CE}YP5wUN7_D?DcIjR7&SMciy9TWyfgHu1Ag z1F(bLD@DW}v2YKsV*d&?XrhE`1Z7?JovdX&;@}QZvCQ;S*eDHz1F!_$CAhN$02{|3 z=zqJoL<_Sbb)C{l6+o_4gq;&9VqBy&KwO>1^+#@`G|6XJ5@p8n*J6YlbG4FckiZt5OPXNnTCkgv@&<1;J^&7(IS=v@KV8I@|~zau1iu ztRS?GSXtKd{z+BGb(;L|3J`O}B{NTS!Ch`dk(d=l+`(B)C*?3H=?8`cHk+j?wX0m1x%M||5oAlM9jE8Qg)tjZEyei+m~FAr&B^P zw_ok=9qdML4iCrNIUeth4_>svSHK3c*x>q$^6tTXAyw$M%@@6iOvOb$?5R4s2mb=4 CA*Tue delta 198 zcmey%^`BkYn3tE!-PtA3gd9v9%sh+$I~Faa diff --git a/myblog/__pycache__/wsgi.cpython-36.pyc b/myblog/__pycache__/wsgi.cpython-36.pyc index cb16baac8bda52657275d3a97af4243cb137b1f6..1c1d6a1c5cfdf320236f16fe1349d2ddc2fdf53c 100644 GIT binary patch delta 15 WcmZ3*vWkVxn3tDpujfWK6(#^5Z3CSE delta 15 WcmZ3*vWkVxn3tF9l+H#r6(#^5Dg%uG diff --git a/myblog/settings.py b/myblog/settings.py index 7828930..9aff6e1 100644 --- a/myblog/settings.py +++ b/myblog/settings.py @@ -71,6 +71,7 @@ TEMPLATES = [ 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', + 'django.template.context_processors.media', ], }, }, @@ -131,16 +132,9 @@ USE_TZ = False # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),) -# 解决:配置正确,而网页中文件无法加载的问题 -STATICFILES_DIRS = ( - ('css', os.path.join(STATIC_ROOT, 'css').replace('\\', '/')), - ('js', os.path.join(STATIC_ROOT, 'js').replace('\\', '/')), - ('images', os.path.join(STATIC_ROOT, 'images').replace('\\', '/')), -) - # 配置用户上传的文件 MEDIA_URL = '/media/' diff --git a/myblog/urls.py b/myblog/urls.py index 3025801..2acfabc 100644 --- a/myblog/urls.py +++ b/myblog/urls.py @@ -13,13 +13,24 @@ Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ +from django.conf import settings +from django.views.static import serve # 处理静态文件 from django.contrib import admin -from django.urls import path +from django.urls import path,include +from django.conf.urls import url import xadmin from blog.views import * urlpatterns = [ path('admin/', xadmin.site.urls), + path('',Index.as_view(),name='index'), + path('blog/', include(('blog.urls', 'blog'), namespace='blog')), + ] + +if settings.DEBUG: + # 配置静态文件访问处理 + urlpatterns.append(url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT})) + urlpatterns.append(url(r'^static/(?P.*)$', serve, {'document_root': settings.STATIC_ROOT})) diff --git a/static/js/jquery.min.js b/static/js/jquery.min.js new file mode 100755 index 0000000..96c3d6a --- /dev/null +++ b/static/js/jquery.min.js @@ -0,0 +1,4318 @@ +/*! jQuery v1.10.0 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery.min.map +*/ +(function(e, t) { + var n, r, i = typeof t, o = e.location, a = e.document, s = a.documentElement, l = e.jQuery, u = e.$, c = {}, p = [], f = "1.10.0", d = p.concat, h = p.push, g = p.slice, m = p.indexOf, y = c.toString, v = c.hasOwnProperty, b = f.trim, x = function(e, t) { + return new x.fn.init(e,t,r) + }, w = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, T = /\S+/g, C = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, N = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, k = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, E = /^[\],:{}\s]*$/, S = /(?:^|:|,)(?:\s*\[)+/g, A = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, j = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, D = /^-ms-/, L = /-([\da-z])/gi, H = function(e, t) { + return t.toUpperCase() + }, q = function(e) { + (a.addEventListener || "load" === e.type || "complete" === a.readyState) && (_(), + x.ready()) + }, _ = function() { + a.addEventListener ? (a.removeEventListener("DOMContentLoaded", q, !1), + e.removeEventListener("load", q, !1)) : (a.detachEvent("onreadystatechange", q), + e.detachEvent("onload", q)) + }; + x.fn = x.prototype = { + jquery: f, + constructor: x, + init: function(e, n, r) { + var i, o; + if (!e) + return this; + if ("string" == typeof e) { + if (i = "<" === e.charAt(0) && ">" === e.charAt(e.length - 1) && e.length >= 3 ? [null, e, null] : N.exec(e), + !i || !i[1] && n) + return !n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e); + if (i[1]) { + if (n = n instanceof x ? n[0] : n, + x.merge(this, x.parseHTML(i[1], n && n.nodeType ? n.ownerDocument || n : a, !0)), + k.test(i[1]) && x.isPlainObject(n)) + for (i in n) + x.isFunction(this[i]) ? this[i](n[i]) : this.attr(i, n[i]); + return this + } + if (o = a.getElementById(i[2]), + o && o.parentNode) { + if (o.id !== i[2]) + return r.find(e); + this.length = 1, + this[0] = o + } + return this.context = a, + this.selector = e, + this + } + return e.nodeType ? (this.context = this[0] = e, + this.length = 1, + this) : x.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, + this.context = e.context), + x.makeArray(e, this)) + }, + selector: "", + length: 0, + toArray: function() { + return g.call(this) + }, + get: function(e) { + return null == e ? this.toArray() : 0 > e ? this[this.length + e] : this[e] + }, + pushStack: function(e) { + var t = x.merge(this.constructor(), e); + return t.prevObject = this, + t.context = this.context, + t + }, + each: function(e, t) { + return x.each(this, e, t) + }, + ready: function(e) { + return x.ready.promise().done(e), + this + }, + slice: function() { + return this.pushStack(g.apply(this, arguments)) + }, + first: function() { + return this.eq(0) + }, + last: function() { + return this.eq(-1) + }, + eq: function(e) { + var t = this.length + , n = +e + (0 > e ? t : 0); + return this.pushStack(n >= 0 && t > n ? [this[n]] : []) + }, + map: function(e) { + return this.pushStack(x.map(this, function(t, n) { + return e.call(t, n, t) + })) + }, + end: function() { + return this.prevObject || this.constructor(null) + }, + push: h, + sort: [].sort, + splice: [].splice + }, + x.fn.init.prototype = x.fn, + x.extend = x.fn.extend = function() { + var e, n, r, i, o, a, s = arguments[0] || {}, l = 1, u = arguments.length, c = !1; + for ("boolean" == typeof s && (c = s, + s = arguments[1] || {}, + l = 2), + "object" == typeof s || x.isFunction(s) || (s = {}), + u === l && (s = this, + --l); u > l; l++) + if (null != (o = arguments[l])) + for (i in o) + e = s[i], + r = o[i], + s !== r && (c && r && (x.isPlainObject(r) || (n = x.isArray(r))) ? (n ? (n = !1, + a = e && x.isArray(e) ? e : []) : a = e && x.isPlainObject(e) ? e : {}, + s[i] = x.extend(c, a, r)) : r !== t && (s[i] = r)); + return s + } + , + x.extend({ + expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), + noConflict: function(t) { + return e.$ === x && (e.$ = u), + t && e.jQuery === x && (e.jQuery = l), + x + }, + isReady: !1, + readyWait: 1, + holdReady: function(e) { + e ? x.readyWait++ : x.ready(!0) + }, + ready: function(e) { + if (e === !0 ? !--x.readyWait : !x.isReady) { + if (!a.body) + return setTimeout(x.ready); + x.isReady = !0, + e !== !0 && --x.readyWait > 0 || (n.resolveWith(a, [x]), + x.fn.trigger && x(a).trigger("ready").off("ready")) + } + }, + isFunction: function(e) { + return "function" === x.type(e) + }, + isArray: Array.isArray || function(e) { + return "array" === x.type(e) + } + , + isWindow: function(e) { + return null != e && e == e.window + }, + isNumeric: function(e) { + return !isNaN(parseFloat(e)) && isFinite(e) + }, + type: function(e) { + return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? c[y.call(e)] || "object" : typeof e + }, + isPlainObject: function(e) { + var n; + if (!e || "object" !== x.type(e) || e.nodeType || x.isWindow(e)) + return !1; + try { + if (e.constructor && !v.call(e, "constructor") && !v.call(e.constructor.prototype, "isPrototypeOf")) + return !1 + } catch (r) { + return !1 + } + if (x.support.ownLast) + for (n in e) + return v.call(e, n); + for (n in e) + ; + return n === t || v.call(e, n) + }, + isEmptyObject: function(e) { + var t; + for (t in e) + return !1; + return !0 + }, + error: function(e) { + throw Error(e) + }, + parseHTML: function(e, t, n) { + if (!e || "string" != typeof e) + return null; + "boolean" == typeof t && (n = t, + t = !1), + t = t || a; + var r = k.exec(e) + , i = !n && []; + return r ? [t.createElement(r[1])] : (r = x.buildFragment([e], t, i), + i && x(i).remove(), + x.merge([], r.childNodes)) + }, + parseJSON: function(n) { + return e.JSON && e.JSON.parse ? e.JSON.parse(n) : null === n ? n : "string" == typeof n && (n = x.trim(n), + n && E.test(n.replace(A, "@").replace(j, "]").replace(S, ""))) ? Function("return " + n)() : (x.error("Invalid JSON: " + n), + t) + }, + parseXML: function(n) { + var r, i; + if (!n || "string" != typeof n) + return null; + try { + e.DOMParser ? (i = new DOMParser, + r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), + r.async = "false", + r.loadXML(n)) + } catch (o) { + r = t + } + return r && r.documentElement && !r.getElementsByTagName("parsererror").length || x.error("Invalid XML: " + n), + r + }, + noop: function() {}, + globalEval: function(t) { + t && x.trim(t) && (e.execScript || function(t) { + e.eval.call(e, t) + } + )(t) + }, + camelCase: function(e) { + return e.replace(D, "ms-").replace(L, H) + }, + nodeName: function(e, t) { + return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() + }, + each: function(e, t, n) { + var r, i = 0, o = e.length, a = M(e); + if (n) { + if (a) { + for (; o > i; i++) + if (r = t.apply(e[i], n), + r === !1) + break + } else + for (i in e) + if (r = t.apply(e[i], n), + r === !1) + break + } else if (a) { + for (; o > i; i++) + if (r = t.call(e[i], i, e[i]), + r === !1) + break + } else + for (i in e) + if (r = t.call(e[i], i, e[i]), + r === !1) + break; + return e + }, + trim: b && !b.call("\ufeff\u00a0") ? function(e) { + return null == e ? "" : b.call(e) + } + : function(e) { + return null == e ? "" : (e + "").replace(C, "") + } + , + makeArray: function(e, t) { + var n = t || []; + return null != e && (M(Object(e)) ? x.merge(n, "string" == typeof e ? [e] : e) : h.call(n, e)), + n + }, + inArray: function(e, t, n) { + var r; + if (t) { + if (m) + return m.call(t, e, n); + for (r = t.length, + n = n ? 0 > n ? Math.max(0, r + n) : n : 0; r > n; n++) + if (n in t && t[n] === e) + return n + } + return -1 + }, + merge: function(e, n) { + var r = n.length + , i = e.length + , o = 0; + if ("number" == typeof r) + for (; r > o; o++) + e[i++] = n[o]; + else + while (n[o] !== t) + e[i++] = n[o++]; + return e.length = i, + e + }, + grep: function(e, t, n) { + var r, i = [], o = 0, a = e.length; + for (n = !!n; a > o; o++) + r = !!t(e[o], o), + n !== r && i.push(e[o]); + return i + }, + map: function(e, t, n) { + var r, i = 0, o = e.length, a = M(e), s = []; + if (a) + for (; o > i; i++) + r = t(e[i], i, n), + null != r && (s[s.length] = r); + else + for (i in e) + r = t(e[i], i, n), + null != r && (s[s.length] = r); + return d.apply([], s) + }, + guid: 1, + proxy: function(e, n) { + var r, i, o; + return "string" == typeof n && (o = e[n], + n = e, + e = o), + x.isFunction(e) ? (r = g.call(arguments, 2), + i = function() { + return e.apply(n || this, r.concat(g.call(arguments))) + } + , + i.guid = e.guid = e.guid || x.guid++, + i) : t + }, + access: function(e, n, r, i, o, a, s) { + var l = 0 + , u = e.length + , c = null == r; + if ("object" === x.type(r)) { + o = !0; + for (l in r) + x.access(e, n, l, r[l], !0, a, s) + } else if (i !== t && (o = !0, + x.isFunction(i) || (s = !0), + c && (s ? (n.call(e, i), + n = null) : (c = n, + n = function(e, t, n) { + return c.call(x(e), n) + } + )), + n)) + for (; u > l; l++) + n(e[l], r, s ? i : i.call(e[l], l, n(e[l], r))); + return o ? e : c ? n.call(e) : u ? n(e[0], r) : a + }, + now: function() { + return (new Date).getTime() + }, + swap: function(e, t, n, r) { + var i, o, a = {}; + for (o in t) + a[o] = e.style[o], + e.style[o] = t[o]; + i = n.apply(e, r || []); + for (o in t) + e.style[o] = a[o]; + return i + } + }), + x.ready.promise = function(t) { + if (!n) + if (n = x.Deferred(), + "complete" === a.readyState) + setTimeout(x.ready); + else if (a.addEventListener) + a.addEventListener("DOMContentLoaded", q, !1), + e.addEventListener("load", q, !1); + else { + a.attachEvent("onreadystatechange", q), + e.attachEvent("onload", q); + var r = !1; + try { + r = null == e.frameElement && a.documentElement + } catch (i) {} + r && r.doScroll && function o() { + if (!x.isReady) { + try { + r.doScroll("left") + } catch (e) { + return setTimeout(o, 50) + } + _(), + x.ready() + } + }() + } + return n.promise(t) + } + , + x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(e, t) { + c["[object " + t + "]"] = t.toLowerCase() + }); + function M(e) { + var t = e.length + , n = x.type(e); + return x.isWindow(e) ? !1 : 1 === e.nodeType && t ? !0 : "array" === n || "function" !== n && (0 === t || "number" == typeof t && t > 0 && t - 1 in e) + } + r = x(a), + function(e, t) { + var n, r, i, o, a, s, l, u, c, p, f, d, h, g, m, y, v, b = "sizzle" + -new Date, w = e.document, T = 0, C = 0, N = lt(), k = lt(), E = lt(), S = !1, A = function() { + return 0 + }, j = typeof t, D = 1 << 31, L = {}.hasOwnProperty, H = [], q = H.pop, _ = H.push, M = H.push, O = H.slice, F = H.indexOf || function(e) { + var t = 0 + , n = this.length; + for (; n > t; t++) + if (this[t] === e) + return t; + return -1 + } + , B = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", P = "[\\x20\\t\\r\\n\\f]", R = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", W = R.replace("w", "w#"), $ = "\\[" + P + "*(" + R + ")" + P + "*(?:([*^$|!~]?=)" + P + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + W + ")|)|)" + P + "*\\]", I = ":(" + R + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + $.replace(3, 8) + ")*)|.*)\\)|)", z = RegExp("^" + P + "+|((?:^|[^\\\\])(?:\\\\.)*)" + P + "+$", "g"), X = RegExp("^" + P + "*," + P + "*"), U = RegExp("^" + P + "*([>+~]|" + P + ")" + P + "*"), V = RegExp(P + "*[+~]"), Y = RegExp("=" + P + "*([^\\]'\"]*)" + P + "*\\]", "g"), J = RegExp(I), G = RegExp("^" + W + "$"), Q = { + ID: RegExp("^#(" + R + ")"), + CLASS: RegExp("^\\.(" + R + ")"), + TAG: RegExp("^(" + R.replace("w", "w*") + ")"), + ATTR: RegExp("^" + $), + PSEUDO: RegExp("^" + I), + CHILD: RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + P + "*(even|odd|(([+-]|)(\\d*)n|)" + P + "*(?:([+-]|)" + P + "*(\\d+)|))" + P + "*\\)|)", "i"), + bool: RegExp("^(?:" + B + ")$", "i"), + needsContext: RegExp("^" + P + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + P + "*((?:-\\d)?\\d*)" + P + "*\\)|)(?=[^-]|$)", "i") + }, K = /^[^{]+\{\s*\[native \w/, Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, et = /^(?:input|select|textarea|button)$/i, tt = /^h\d$/i, nt = /'|\\/g, rt = RegExp("\\\\([\\da-f]{1,6}" + P + "?|(" + P + ")|.)", "ig"), it = function(e, t, n) { + var r = "0x" + t - 65536; + return r !== r || n ? t : 0 > r ? String.fromCharCode(r + 65536) : String.fromCharCode(55296 | r >> 10, 56320 | 1023 & r) + }; + try { + M.apply(H = O.call(w.childNodes), w.childNodes), + H[w.childNodes.length].nodeType + } catch (ot) { + M = { + apply: H.length ? function(e, t) { + _.apply(e, O.call(t)) + } + : function(e, t) { + var n = e.length + , r = 0; + while (e[n++] = t[r++]) + ; + e.length = n - 1 + } + } + } + function at(e, t, n, i) { + var o, a, s, l, u, c, d, m, y, x; + if ((t ? t.ownerDocument || t : w) !== f && p(t), + t = t || f, + n = n || [], + !e || "string" != typeof e) + return n; + if (1 !== (l = t.nodeType) && 9 !== l) + return []; + if (h && !i) { + if (o = Z.exec(e)) + if (s = o[1]) { + if (9 === l) { + if (a = t.getElementById(s), + !a || !a.parentNode) + return n; + if (a.id === s) + return n.push(a), + n + } else if (t.ownerDocument && (a = t.ownerDocument.getElementById(s)) && v(t, a) && a.id === s) + return n.push(a), + n + } else { + if (o[2]) + return M.apply(n, t.getElementsByTagName(e)), + n; + if ((s = o[3]) && r.getElementsByClassName && t.getElementsByClassName) + return M.apply(n, t.getElementsByClassName(s)), + n + } + if (r.qsa && (!g || !g.test(e))) { + if (m = d = b, + y = t, + x = 9 === l && e, + 1 === l && "object" !== t.nodeName.toLowerCase()) { + c = bt(e), + (d = t.getAttribute("id")) ? m = d.replace(nt, "\\$&") : t.setAttribute("id", m), + m = "[id='" + m + "'] ", + u = c.length; + while (u--) + c[u] = m + xt(c[u]); + y = V.test(e) && t.parentNode || t, + x = c.join(",") + } + if (x) + try { + return M.apply(n, y.querySelectorAll(x)), + n + } catch (T) {} finally { + d || t.removeAttribute("id") + } + } + } + return At(e.replace(z, "$1"), t, n, i) + } + function st(e) { + return K.test(e + "") + } + function lt() { + var e = []; + function t(n, r) { + return e.push(n += " ") > o.cacheLength && delete t[e.shift()], + t[n] = r + } + return t + } + function ut(e) { + return e[b] = !0, + e + } + function ct(e) { + var t = f.createElement("div"); + try { + return !!e(t) + } catch (n) { + return !1 + } finally { + t.parentNode && t.parentNode.removeChild(t), + t = null + } + } + function pt(e, t, n) { + e = e.split("|"); + var r, i = e.length, a = n ? null : t; + while (i--) + (r = o.attrHandle[e[i]]) && r !== t || (o.attrHandle[e[i]] = a) + } + function ft(e, t) { + var n = e.getAttributeNode(t); + return n && n.specified ? n.value : e[t] === !0 ? t.toLowerCase() : null + } + function dt(e, t) { + return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) + } + function ht(e) { + return "input" === e.nodeName.toLowerCase() ? e.defaultValue : t + } + function gt(e, t) { + var n = t && e + , r = n && 1 === e.nodeType && 1 === t.nodeType && (~t.sourceIndex || D) - (~e.sourceIndex || D); + if (r) + return r; + if (n) + while (n = n.nextSibling) + if (n === t) + return -1; + return e ? 1 : -1 + } + function mt(e) { + return function(t) { + var n = t.nodeName.toLowerCase(); + return "input" === n && t.type === e + } + } + function yt(e) { + return function(t) { + var n = t.nodeName.toLowerCase(); + return ("input" === n || "button" === n) && t.type === e + } + } + function vt(e) { + return ut(function(t) { + return t = +t, + ut(function(n, r) { + var i, o = e([], n.length, t), a = o.length; + while (a--) + n[i = o[a]] && (n[i] = !(r[i] = n[i])) + }) + }) + } + s = at.isXML = function(e) { + var t = e && (e.ownerDocument || e).documentElement; + return t ? "HTML" !== t.nodeName : !1 + } + , + r = at.support = {}, + p = at.setDocument = function(e) { + var n = e ? e.ownerDocument || e : w; + return n !== f && 9 === n.nodeType && n.documentElement ? (f = n, + d = n.documentElement, + h = !s(n), + r.attributes = ct(function(e) { + return e.innerHTML = "", + pt("type|href|height|width", dt, "#" === e.firstChild.getAttribute("href")), + pt(B, ft, null == e.getAttribute("disabled")), + e.className = "i", + !e.getAttribute("className") + }), + r.input = ct(function(e) { + return e.innerHTML = "", + e.firstChild.setAttribute("value", ""), + "" === e.firstChild.getAttribute("value") + }), + pt("value", ht, r.attributes && r.input), + r.getElementsByTagName = ct(function(e) { + return e.appendChild(n.createComment("")), + !e.getElementsByTagName("*").length + }), + r.getElementsByClassName = ct(function(e) { + return e.innerHTML = "

", + e.firstChild.className = "i", + 2 === e.getElementsByClassName("i").length + }), + r.getById = ct(function(e) { + return d.appendChild(e).id = b, + !n.getElementsByName || !n.getElementsByName(b).length + }), + r.getById ? (o.find.ID = function(e, t) { + if (typeof t.getElementById !== j && h) { + var n = t.getElementById(e); + return n && n.parentNode ? [n] : [] + } + } + , + o.filter.ID = function(e) { + var t = e.replace(rt, it); + return function(e) { + return e.getAttribute("id") === t + } + } + ) : (delete o.find.ID, + o.filter.ID = function(e) { + var t = e.replace(rt, it); + return function(e) { + var n = typeof e.getAttributeNode !== j && e.getAttributeNode("id"); + return n && n.value === t + } + } + ), + o.find.TAG = r.getElementsByTagName ? function(e, n) { + return typeof n.getElementsByTagName !== j ? n.getElementsByTagName(e) : t + } + : function(e, t) { + var n, r = [], i = 0, o = t.getElementsByTagName(e); + if ("*" === e) { + while (n = o[i++]) + 1 === n.nodeType && r.push(n); + return r + } + return o + } + , + o.find.CLASS = r.getElementsByClassName && function(e, n) { + return typeof n.getElementsByClassName !== j && h ? n.getElementsByClassName(e) : t + } + , + m = [], + g = [], + (r.qsa = st(n.querySelectorAll)) && (ct(function(e) { + e.innerHTML = "", + e.querySelectorAll("[selected]").length || g.push("\\[" + P + "*(?:value|" + B + ")"), + e.querySelectorAll(":checked").length || g.push(":checked") + }), + ct(function(e) { + var t = n.createElement("input"); + t.setAttribute("type", "hidden"), + e.appendChild(t).setAttribute("t", ""), + e.querySelectorAll("[t^='']").length && g.push("[*^$]=" + P + "*(?:''|\"\")"), + e.querySelectorAll(":enabled").length || g.push(":enabled", ":disabled"), + e.querySelectorAll("*,:x"), + g.push(",.*:") + })), + (r.matchesSelector = st(y = d.webkitMatchesSelector || d.mozMatchesSelector || d.oMatchesSelector || d.msMatchesSelector)) && ct(function(e) { + r.disconnectedMatch = y.call(e, "div"), + y.call(e, "[s!='']:x"), + m.push("!=", I) + }), + g = g.length && RegExp(g.join("|")), + m = m.length && RegExp(m.join("|")), + v = st(d.contains) || d.compareDocumentPosition ? function(e, t) { + var n = 9 === e.nodeType ? e.documentElement : e + , r = t && t.parentNode; + return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) + } + : function(e, t) { + if (t) + while (t = t.parentNode) + if (t === e) + return !0; + return !1 + } + , + r.sortDetached = ct(function(e) { + return 1 & e.compareDocumentPosition(n.createElement("div")) + }), + A = d.compareDocumentPosition ? function(e, t) { + if (e === t) + return S = !0, + 0; + var i = t.compareDocumentPosition && e.compareDocumentPosition && e.compareDocumentPosition(t); + return i ? 1 & i || !r.sortDetached && t.compareDocumentPosition(e) === i ? e === n || v(w, e) ? -1 : t === n || v(w, t) ? 1 : c ? F.call(c, e) - F.call(c, t) : 0 : 4 & i ? -1 : 1 : e.compareDocumentPosition ? -1 : 1 + } + : function(e, t) { + var r, i = 0, o = e.parentNode, a = t.parentNode, s = [e], l = [t]; + if (e === t) + return S = !0, + 0; + if (!o || !a) + return e === n ? -1 : t === n ? 1 : o ? -1 : a ? 1 : c ? F.call(c, e) - F.call(c, t) : 0; + if (o === a) + return gt(e, t); + r = e; + while (r = r.parentNode) + s.unshift(r); + r = t; + while (r = r.parentNode) + l.unshift(r); + while (s[i] === l[i]) + i++; + return i ? gt(s[i], l[i]) : s[i] === w ? -1 : l[i] === w ? 1 : 0 + } + , + n) : f + } + , + at.matches = function(e, t) { + return at(e, null, null, t) + } + , + at.matchesSelector = function(e, t) { + if ((e.ownerDocument || e) !== f && p(e), + t = t.replace(Y, "='$1']"), + !(!r.matchesSelector || !h || m && m.test(t) || g && g.test(t))) + try { + var n = y.call(e, t); + if (n || r.disconnectedMatch || e.document && 11 !== e.document.nodeType) + return n + } catch (i) {} + return at(t, f, null, [e]).length > 0 + } + , + at.contains = function(e, t) { + return (e.ownerDocument || e) !== f && p(e), + v(e, t) + } + , + at.attr = function(e, n) { + (e.ownerDocument || e) !== f && p(e); + var i = o.attrHandle[n.toLowerCase()] + , a = i && L.call(o.attrHandle, n.toLowerCase()) ? i(e, n, !h) : t; + return a === t ? r.attributes || !h ? e.getAttribute(n) : (a = e.getAttributeNode(n)) && a.specified ? a.value : null : a + } + , + at.error = function(e) { + throw Error("Syntax error, unrecognized expression: " + e) + } + , + at.uniqueSort = function(e) { + var t, n = [], i = 0, o = 0; + if (S = !r.detectDuplicates, + c = !r.sortStable && e.slice(0), + e.sort(A), + S) { + while (t = e[o++]) + t === e[o] && (i = n.push(o)); + while (i--) + e.splice(n[i], 1) + } + return e + } + , + a = at.getText = function(e) { + var t, n = "", r = 0, i = e.nodeType; + if (i) { + if (1 === i || 9 === i || 11 === i) { + if ("string" == typeof e.textContent) + return e.textContent; + for (e = e.firstChild; e; e = e.nextSibling) + n += a(e) + } else if (3 === i || 4 === i) + return e.nodeValue + } else + for (; t = e[r]; r++) + n += a(t); + return n + } + , + o = at.selectors = { + cacheLength: 50, + createPseudo: ut, + match: Q, + attrHandle: {}, + find: {}, + relative: { + ">": { + dir: "parentNode", + first: !0 + }, + " ": { + dir: "parentNode" + }, + "+": { + dir: "previousSibling", + first: !0 + }, + "~": { + dir: "previousSibling" + } + }, + preFilter: { + ATTR: function(e) { + return e[1] = e[1].replace(rt, it), + e[3] = (e[4] || e[5] || "").replace(rt, it), + "~=" === e[2] && (e[3] = " " + e[3] + " "), + e.slice(0, 4) + }, + CHILD: function(e) { + return e[1] = e[1].toLowerCase(), + "nth" === e[1].slice(0, 3) ? (e[3] || at.error(e[0]), + e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), + e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && at.error(e[0]), + e + }, + PSEUDO: function(e) { + var n, r = !e[5] && e[2]; + return Q.CHILD.test(e[0]) ? null : (e[3] && e[4] !== t ? e[2] = e[4] : r && J.test(r) && (n = bt(r, !0)) && (n = r.indexOf(")", r.length - n) - r.length) && (e[0] = e[0].slice(0, n), + e[2] = r.slice(0, n)), + e.slice(0, 3)) + } + }, + filter: { + TAG: function(e) { + var t = e.replace(rt, it).toLowerCase(); + return "*" === e ? function() { + return !0 + } + : function(e) { + return e.nodeName && e.nodeName.toLowerCase() === t + } + }, + CLASS: function(e) { + var t = N[e + " "]; + return t || (t = RegExp("(^|" + P + ")" + e + "(" + P + "|$)")) && N(e, function(e) { + return t.test("string" == typeof e.className && e.className || typeof e.getAttribute !== j && e.getAttribute("class") || "") + }) + }, + ATTR: function(e, t, n) { + return function(r) { + var i = at.attr(r, e); + return null == i ? "!=" === t : t ? (i += "", + "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i + " ").indexOf(n) > -1 : "|=" === t ? i === n || i.slice(0, n.length + 1) === n + "-" : !1) : !0 + } + }, + CHILD: function(e, t, n, r, i) { + var o = "nth" !== e.slice(0, 3) + , a = "last" !== e.slice(-4) + , s = "of-type" === t; + return 1 === r && 0 === i ? function(e) { + return !!e.parentNode + } + : function(t, n, l) { + var u, c, p, f, d, h, g = o !== a ? "nextSibling" : "previousSibling", m = t.parentNode, y = s && t.nodeName.toLowerCase(), v = !l && !s; + if (m) { + if (o) { + while (g) { + p = t; + while (p = p[g]) + if (s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) + return !1; + h = g = "only" === e && !h && "nextSibling" + } + return !0 + } + if (h = [a ? m.firstChild : m.lastChild], + a && v) { + c = m[b] || (m[b] = {}), + u = c[e] || [], + d = u[0] === T && u[1], + f = u[0] === T && u[2], + p = d && m.childNodes[d]; + while (p = ++d && p && p[g] || (f = d = 0) || h.pop()) + if (1 === p.nodeType && ++f && p === t) { + c[e] = [T, d, f]; + break + } + } else if (v && (u = (t[b] || (t[b] = {}))[e]) && u[0] === T) + f = u[1]; + else + while (p = ++d && p && p[g] || (f = d = 0) || h.pop()) + if ((s ? p.nodeName.toLowerCase() === y : 1 === p.nodeType) && ++f && (v && ((p[b] || (p[b] = {}))[e] = [T, f]), + p === t)) + break; + return f -= i, + f === r || 0 === f % r && f / r >= 0 + } + } + }, + PSEUDO: function(e, t) { + var n, r = o.pseudos[e] || o.setFilters[e.toLowerCase()] || at.error("unsupported pseudo: " + e); + return r[b] ? r(t) : r.length > 1 ? (n = [e, e, "", t], + o.setFilters.hasOwnProperty(e.toLowerCase()) ? ut(function(e, n) { + var i, o = r(e, t), a = o.length; + while (a--) + i = F.call(e, o[a]), + e[i] = !(n[i] = o[a]) + }) : function(e) { + return r(e, 0, n) + } + ) : r + } + }, + pseudos: { + not: ut(function(e) { + var t = [] + , n = [] + , r = l(e.replace(z, "$1")); + return r[b] ? ut(function(e, t, n, i) { + var o, a = r(e, null, i, []), s = e.length; + while (s--) + (o = a[s]) && (e[s] = !(t[s] = o)) + }) : function(e, i, o) { + return t[0] = e, + r(t, null, o, n), + !n.pop() + } + }), + has: ut(function(e) { + return function(t) { + return at(e, t).length > 0 + } + }), + contains: ut(function(e) { + return function(t) { + return (t.textContent || t.innerText || a(t)).indexOf(e) > -1 + } + }), + lang: ut(function(e) { + return G.test(e || "") || at.error("unsupported lang: " + e), + e = e.replace(rt, it).toLowerCase(), + function(t) { + var n; + do + if (n = h ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang")) + return n = n.toLowerCase(), + n === e || 0 === n.indexOf(e + "-"); + while ((t = t.parentNode) && 1 === t.nodeType);return !1 + } + }), + target: function(t) { + var n = e.location && e.location.hash; + return n && n.slice(1) === t.id + }, + root: function(e) { + return e === d + }, + focus: function(e) { + return e === f.activeElement && (!f.hasFocus || f.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) + }, + enabled: function(e) { + return e.disabled === !1 + }, + disabled: function(e) { + return e.disabled === !0 + }, + checked: function(e) { + var t = e.nodeName.toLowerCase(); + return "input" === t && !!e.checked || "option" === t && !!e.selected + }, + selected: function(e) { + return e.parentNode && e.parentNode.selectedIndex, + e.selected === !0 + }, + empty: function(e) { + for (e = e.firstChild; e; e = e.nextSibling) + if (e.nodeName > "@" || 3 === e.nodeType || 4 === e.nodeType) + return !1; + return !0 + }, + parent: function(e) { + return !o.pseudos.empty(e) + }, + header: function(e) { + return tt.test(e.nodeName) + }, + input: function(e) { + return et.test(e.nodeName) + }, + button: function(e) { + var t = e.nodeName.toLowerCase(); + return "input" === t && "button" === e.type || "button" === t + }, + text: function(e) { + var t; + return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || t.toLowerCase() === e.type) + }, + first: vt(function() { + return [0] + }), + last: vt(function(e, t) { + return [t - 1] + }), + eq: vt(function(e, t, n) { + return [0 > n ? n + t : n] + }), + even: vt(function(e, t) { + var n = 0; + for (; t > n; n += 2) + e.push(n); + return e + }), + odd: vt(function(e, t) { + var n = 1; + for (; t > n; n += 2) + e.push(n); + return e + }), + lt: vt(function(e, t, n) { + var r = 0 > n ? n + t : n; + for (; --r >= 0; ) + e.push(r); + return e + }), + gt: vt(function(e, t, n) { + var r = 0 > n ? n + t : n; + for (; t > ++r; ) + e.push(r); + return e + }) + } + }; + for (n in { + radio: !0, + checkbox: !0, + file: !0, + password: !0, + image: !0 + }) + o.pseudos[n] = mt(n); + for (n in { + submit: !0, + reset: !0 + }) + o.pseudos[n] = yt(n); + function bt(e, t) { + var n, r, i, a, s, l, u, c = k[e + " "]; + if (c) + return t ? 0 : c.slice(0); + s = e, + l = [], + u = o.preFilter; + while (s) { + (!n || (r = X.exec(s))) && (r && (s = s.slice(r[0].length) || s), + l.push(i = [])), + n = !1, + (r = U.exec(s)) && (n = r.shift(), + i.push({ + value: n, + type: r[0].replace(z, " ") + }), + s = s.slice(n.length)); + for (a in o.filter) + !(r = Q[a].exec(s)) || u[a] && !(r = u[a](r)) || (n = r.shift(), + i.push({ + value: n, + type: a, + matches: r + }), + s = s.slice(n.length)); + if (!n) + break + } + return t ? s.length : s ? at.error(e) : k(e, l).slice(0) + } + function xt(e) { + var t = 0 + , n = e.length + , r = ""; + for (; n > t; t++) + r += e[t].value; + return r + } + function wt(e, t, n) { + var r = t.dir + , o = n && "parentNode" === r + , a = C++; + return t.first ? function(t, n, i) { + while (t = t[r]) + if (1 === t.nodeType || o) + return e(t, n, i) + } + : function(t, n, s) { + var l, u, c, p = T + " " + a; + if (s) { + while (t = t[r]) + if ((1 === t.nodeType || o) && e(t, n, s)) + return !0 + } else + while (t = t[r]) + if (1 === t.nodeType || o) + if (c = t[b] || (t[b] = {}), + (u = c[r]) && u[0] === p) { + if ((l = u[1]) === !0 || l === i) + return l === !0 + } else if (u = c[r] = [p], + u[1] = e(t, n, s) || i, + u[1] === !0) + return !0 + } + } + function Tt(e) { + return e.length > 1 ? function(t, n, r) { + var i = e.length; + while (i--) + if (!e[i](t, n, r)) + return !1; + return !0 + } + : e[0] + } + function Ct(e, t, n, r, i) { + var o, a = [], s = 0, l = e.length, u = null != t; + for (; l > s; s++) + (o = e[s]) && (!n || n(o, r, i)) && (a.push(o), + u && t.push(s)); + return a + } + function Nt(e, t, n, r, i, o) { + return r && !r[b] && (r = Nt(r)), + i && !i[b] && (i = Nt(i, o)), + ut(function(o, a, s, l) { + var u, c, p, f = [], d = [], h = a.length, g = o || St(t || "*", s.nodeType ? [s] : s, []), m = !e || !o && t ? g : Ct(g, f, e, s, l), y = n ? i || (o ? e : h || r) ? [] : a : m; + if (n && n(m, y, s, l), + r) { + u = Ct(y, d), + r(u, [], s, l), + c = u.length; + while (c--) + (p = u[c]) && (y[d[c]] = !(m[d[c]] = p)) + } + if (o) { + if (i || e) { + if (i) { + u = [], + c = y.length; + while (c--) + (p = y[c]) && u.push(m[c] = p); + i(null, y = [], u, l) + } + c = y.length; + while (c--) + (p = y[c]) && (u = i ? F.call(o, p) : f[c]) > -1 && (o[u] = !(a[u] = p)) + } + } else + y = Ct(y === a ? y.splice(h, y.length) : y), + i ? i(null, a, y, l) : M.apply(a, y) + }) + } + function kt(e) { + var t, n, r, i = e.length, a = o.relative[e[0].type], s = a || o.relative[" "], l = a ? 1 : 0, c = wt(function(e) { + return e === t + }, s, !0), p = wt(function(e) { + return F.call(t, e) > -1 + }, s, !0), f = [function(e, n, r) { + return !a && (r || n !== u) || ((t = n).nodeType ? c(e, n, r) : p(e, n, r)) + } + ]; + for (; i > l; l++) + if (n = o.relative[e[l].type]) + f = [wt(Tt(f), n)]; + else { + if (n = o.filter[e[l].type].apply(null, e[l].matches), + n[b]) { + for (r = ++l; i > r; r++) + if (o.relative[e[r].type]) + break; + return Nt(l > 1 && Tt(f), l > 1 && xt(e.slice(0, l - 1).concat({ + value: " " === e[l - 2].type ? "*" : "" + })).replace(z, "$1"), n, r > l && kt(e.slice(l, r)), i > r && kt(e = e.slice(r)), i > r && xt(e)) + } + f.push(n) + } + return Tt(f) + } + function Et(e, t) { + var n = 0 + , r = t.length > 0 + , a = e.length > 0 + , s = function(s, l, c, p, d) { + var h, g, m, y = [], v = 0, b = "0", x = s && [], w = null != d, C = u, N = s || a && o.find.TAG("*", d && l.parentNode || l), k = T += null == C ? 1 : Math.random() || .1; + for (w && (u = l !== f && l, + i = n); null != (h = N[b]); b++) { + if (a && h) { + g = 0; + while (m = e[g++]) + if (m(h, l, c)) { + p.push(h); + break + } + w && (T = k, + i = ++n) + } + r && ((h = !m && h) && v--, + s && x.push(h)) + } + if (v += b, + r && b !== v) { + g = 0; + while (m = t[g++]) + m(x, y, l, c); + if (s) { + if (v > 0) + while (b--) + x[b] || y[b] || (y[b] = q.call(p)); + y = Ct(y) + } + M.apply(p, y), + w && !s && y.length > 0 && v + t.length > 1 && at.uniqueSort(p) + } + return w && (T = k, + u = C), + x + }; + return r ? ut(s) : s + } + l = at.compile = function(e, t) { + var n, r = [], i = [], o = E[e + " "]; + if (!o) { + t || (t = bt(e)), + n = t.length; + while (n--) + o = kt(t[n]), + o[b] ? r.push(o) : i.push(o); + o = E(e, Et(i, r)) + } + return o + } + ; + function St(e, t, n) { + var r = 0 + , i = t.length; + for (; i > r; r++) + at(e, t[r], n); + return n + } + function At(e, t, n, i) { + var a, s, u, c, p, f = bt(e); + if (!i && 1 === f.length) { + if (s = f[0] = f[0].slice(0), + s.length > 2 && "ID" === (u = s[0]).type && r.getById && 9 === t.nodeType && h && o.relative[s[1].type]) { + if (t = (o.find.ID(u.matches[0].replace(rt, it), t) || [])[0], + !t) + return n; + e = e.slice(s.shift().value.length) + } + a = Q.needsContext.test(e) ? 0 : s.length; + while (a--) { + if (u = s[a], + o.relative[c = u.type]) + break; + if ((p = o.find[c]) && (i = p(u.matches[0].replace(rt, it), V.test(s[0].type) && t.parentNode || t))) { + if (s.splice(a, 1), + e = i.length && xt(s), + !e) + return M.apply(n, i), + n; + break + } + } + } + return l(e, f)(i, t, !h, n, V.test(e)), + n + } + o.pseudos.nth = o.pseudos.eq; + function jt() {} + jt.prototype = o.filters = o.pseudos, + o.setFilters = new jt, + r.sortStable = b.split("").sort(A).join("") === b, + p(), + [0, 0].sort(A), + r.detectDuplicates = S, + x.find = at, + x.expr = at.selectors, + x.expr[":"] = x.expr.pseudos, + x.unique = at.uniqueSort, + x.text = at.getText, + x.isXMLDoc = at.isXML, + x.contains = at.contains + }(e); + var O = {}; + function F(e) { + var t = O[e] = {}; + return x.each(e.match(T) || [], function(e, n) { + t[n] = !0 + }), + t + } + x.Callbacks = function(e) { + e = "string" == typeof e ? O[e] || F(e) : x.extend({}, e); + var n, r, i, o, a, s, l = [], u = !e.once && [], c = function(t) { + for (r = e.memory && t, + i = !0, + a = s || 0, + s = 0, + o = l.length, + n = !0; l && o > a; a++) + if (l[a].apply(t[0], t[1]) === !1 && e.stopOnFalse) { + r = !1; + break + } + n = !1, + l && (u ? u.length && c(u.shift()) : r ? l = [] : p.disable()) + }, p = { + add: function() { + if (l) { + var t = l.length; + (function i(t) { + x.each(t, function(t, n) { + var r = x.type(n); + "function" === r ? e.unique && p.has(n) || l.push(n) : n && n.length && "string" !== r && i(n) + }) + } + )(arguments), + n ? o = l.length : r && (s = t, + c(r)) + } + return this + }, + remove: function() { + return l && x.each(arguments, function(e, t) { + var r; + while ((r = x.inArray(t, l, r)) > -1) + l.splice(r, 1), + n && (o >= r && o--, + a >= r && a--) + }), + this + }, + has: function(e) { + return e ? x.inArray(e, l) > -1 : !(!l || !l.length) + }, + empty: function() { + return l = [], + o = 0, + this + }, + disable: function() { + return l = u = r = t, + this + }, + disabled: function() { + return !l + }, + lock: function() { + return u = t, + r || p.disable(), + this + }, + locked: function() { + return !u + }, + fireWith: function(e, t) { + return t = t || [], + t = [e, t.slice ? t.slice() : t], + !l || i && !u || (n ? u.push(t) : c(t)), + this + }, + fire: function() { + return p.fireWith(this, arguments), + this + }, + fired: function() { + return !!i + } + }; + return p + } + , + x.extend({ + Deferred: function(e) { + var t = [["resolve", "done", x.Callbacks("once memory"), "resolved"], ["reject", "fail", x.Callbacks("once memory"), "rejected"], ["notify", "progress", x.Callbacks("memory")]] + , n = "pending" + , r = { + state: function() { + return n + }, + always: function() { + return i.done(arguments).fail(arguments), + this + }, + then: function() { + var e = arguments; + return x.Deferred(function(n) { + x.each(t, function(t, o) { + var a = o[0] + , s = x.isFunction(e[t]) && e[t]; + i[o[1]](function() { + var e = s && s.apply(this, arguments); + e && x.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[a + "With"](this === r ? n.promise() : this, s ? [e] : arguments) + }) + }), + e = null + }).promise() + }, + promise: function(e) { + return null != e ? x.extend(e, r) : r + } + } + , i = {}; + return r.pipe = r.then, + x.each(t, function(e, o) { + var a = o[2] + , s = o[3]; + r[o[1]] = a.add, + s && a.add(function() { + n = s + }, t[1 ^ e][2].disable, t[2][2].lock), + i[o[0]] = function() { + return i[o[0] + "With"](this === i ? r : this, arguments), + this + } + , + i[o[0] + "With"] = a.fireWith + }), + r.promise(i), + e && e.call(i, i), + i + }, + when: function(e) { + var t = 0, n = g.call(arguments), r = n.length, i = 1 !== r || e && x.isFunction(e.promise) ? r : 0, o = 1 === i ? e : x.Deferred(), a = function(e, t, n) { + return function(r) { + t[e] = this, + n[e] = arguments.length > 1 ? g.call(arguments) : r, + n === s ? o.notifyWith(t, n) : --i || o.resolveWith(t, n) + } + }, s, l, u; + if (r > 1) + for (s = Array(r), + l = Array(r), + u = Array(r); r > t; t++) + n[t] && x.isFunction(n[t].promise) ? n[t].promise().done(a(t, u, n)).fail(o.reject).progress(a(t, l, s)) : --i; + return i || o.resolveWith(u, n), + o.promise() + } + }), + x.support = function(t) { + var n, r, o, s, l, u, c, p, f, d = a.createElement("div"); + if (d.setAttribute("className", "t"), + d.innerHTML = "
a", + n = d.getElementsByTagName("*") || [], + r = d.getElementsByTagName("a")[0], + !r || !r.style || !n.length) + return t; + s = a.createElement("select"), + u = s.appendChild(a.createElement("option")), + o = d.getElementsByTagName("input")[0], + r.style.cssText = "top:1px;float:left;opacity:.5", + t.getSetAttribute = "t" !== d.className, + t.leadingWhitespace = 3 === d.firstChild.nodeType, + t.tbody = !d.getElementsByTagName("tbody").length, + t.htmlSerialize = !!d.getElementsByTagName("link").length, + t.style = /top/.test(r.getAttribute("style")), + t.hrefNormalized = "/a" === r.getAttribute("href"), + t.opacity = /^0.5/.test(r.style.opacity), + t.cssFloat = !!r.style.cssFloat, + t.checkOn = !!o.value, + t.optSelected = u.selected, + t.enctype = !!a.createElement("form").enctype, + t.html5Clone = "<:nav>" !== a.createElement("nav").cloneNode(!0).outerHTML, + t.inlineBlockNeedsLayout = !1, + t.shrinkWrapBlocks = !1, + t.pixelPosition = !1, + t.deleteExpando = !0, + t.noCloneEvent = !0, + t.reliableMarginRight = !0, + t.boxSizingReliable = !0, + o.checked = !0, + t.noCloneChecked = o.cloneNode(!0).checked, + s.disabled = !0, + t.optDisabled = !u.disabled; + try { + delete d.test + } catch (h) { + t.deleteExpando = !1 + } + o = a.createElement("input"), + o.setAttribute("value", ""), + t.input = "" === o.getAttribute("value"), + o.value = "t", + o.setAttribute("type", "radio"), + t.radioValue = "t" === o.value, + o.setAttribute("checked", "t"), + o.setAttribute("name", "t"), + l = a.createDocumentFragment(), + l.appendChild(o), + t.appendChecked = o.checked, + t.checkClone = l.cloneNode(!0).cloneNode(!0).lastChild.checked, + d.attachEvent && (d.attachEvent("onclick", function() { + t.noCloneEvent = !1 + }), + d.cloneNode(!0).click()); + for (f in { + submit: !0, + change: !0, + focusin: !0 + }) + d.setAttribute(c = "on" + f, "t"), + t[f + "Bubbles"] = c in e || d.attributes[c].expando === !1; + d.style.backgroundClip = "content-box", + d.cloneNode(!0).style.backgroundClip = "", + t.clearCloneStyle = "content-box" === d.style.backgroundClip; + for (f in x(t)) + break; + return t.ownLast = "0" !== f, + x(function() { + var n, r, o, s = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", l = a.getElementsByTagName("body")[0]; + l && (n = a.createElement("div"), + n.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", + l.appendChild(n).appendChild(d), + d.innerHTML = "
t
", + o = d.getElementsByTagName("td"), + o[0].style.cssText = "padding:0;margin:0;border:0;display:none", + p = 0 === o[0].offsetHeight, + o[0].style.display = "", + o[1].style.display = "none", + t.reliableHiddenOffsets = p && 0 === o[0].offsetHeight, + d.innerHTML = "", + d.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", + x.swap(l, null != l.style.zoom ? { + zoom: 1 + } : {}, function() { + t.boxSizing = 4 === d.offsetWidth + }), + e.getComputedStyle && (t.pixelPosition = "1%" !== (e.getComputedStyle(d, null) || {}).top, + t.boxSizingReliable = "4px" === (e.getComputedStyle(d, null) || { + width: "4px" + }).width, + r = d.appendChild(a.createElement("div")), + r.style.cssText = d.style.cssText = s, + r.style.marginRight = r.style.width = "0", + d.style.width = "1px", + t.reliableMarginRight = !parseFloat((e.getComputedStyle(r, null) || {}).marginRight)), + typeof d.style.zoom !== i && (d.innerHTML = "", + d.style.cssText = s + "width:1px;padding:1px;display:inline;zoom:1", + t.inlineBlockNeedsLayout = 3 === d.offsetWidth, + d.style.display = "block", + d.innerHTML = "
", + d.firstChild.style.width = "5px", + t.shrinkWrapBlocks = 3 !== d.offsetWidth, + t.inlineBlockNeedsLayout && (l.style.zoom = 1)), + l.removeChild(n), + n = d = o = r = null) + }), + n = s = l = u = r = o = null, + t + }({}); + var B = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/ + , P = /([A-Z])/g; + function R(e, n, r, i) { + if (x.acceptData(e)) { + var o, a, s = x.expando, l = e.nodeType, u = l ? x.cache : e, c = l ? e[s] : e[s] && s; + if (c && u[c] && (i || u[c].data) || r !== t || "string" != typeof n) + return c || (c = l ? e[s] = p.pop() || x.guid++ : s), + u[c] || (u[c] = l ? {} : { + toJSON: x.noop + }), + ("object" == typeof n || "function" == typeof n) && (i ? u[c] = x.extend(u[c], n) : u[c].data = x.extend(u[c].data, n)), + a = u[c], + i || (a.data || (a.data = {}), + a = a.data), + r !== t && (a[x.camelCase(n)] = r), + "string" == typeof n ? (o = a[n], + null == o && (o = a[x.camelCase(n)])) : o = a, + o + } + } + function W(e, t, n) { + if (x.acceptData(e)) { + var r, i, o = e.nodeType, a = o ? x.cache : e, s = o ? e[x.expando] : x.expando; + if (a[s]) { + if (t && (r = n ? a[s] : a[s].data)) { + x.isArray(t) ? t = t.concat(x.map(t, x.camelCase)) : t in r ? t = [t] : (t = x.camelCase(t), + t = t in r ? [t] : t.split(" ")), + i = t.length; + while (i--) + delete r[t[i]]; + if (n ? !I(r) : !x.isEmptyObject(r)) + return + } + (n || (delete a[s].data, + I(a[s]))) && (o ? x.cleanData([e], !0) : x.support.deleteExpando || a != a.window ? delete a[s] : a[s] = null) + } + } + } + x.extend({ + cache: {}, + noData: { + applet: !0, + embed: !0, + object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + hasData: function(e) { + return e = e.nodeType ? x.cache[e[x.expando]] : e[x.expando], + !!e && !I(e) + }, + data: function(e, t, n) { + return R(e, t, n) + }, + removeData: function(e, t) { + return W(e, t) + }, + _data: function(e, t, n) { + return R(e, t, n, !0) + }, + _removeData: function(e, t) { + return W(e, t, !0) + }, + acceptData: function(e) { + if (e.nodeType && 1 !== e.nodeType && 9 !== e.nodeType) + return !1; + var t = e.nodeName && x.noData[e.nodeName.toLowerCase()]; + return !t || t !== !0 && e.getAttribute("classid") === t + } + }), + x.fn.extend({ + data: function(e, n) { + var r, i, o = null, a = 0, s = this[0]; + if (e === t) { + if (this.length && (o = x.data(s), + 1 === s.nodeType && !x._data(s, "parsedAttrs"))) { + for (r = s.attributes; r.length > a; a++) + i = r[a].name, + 0 === i.indexOf("data-") && (i = x.camelCase(i.slice(5)), + $(s, i, o[i])); + x._data(s, "parsedAttrs", !0) + } + return o + } + return "object" == typeof e ? this.each(function() { + x.data(this, e) + }) : arguments.length > 1 ? this.each(function() { + x.data(this, e, n) + }) : s ? $(s, e, x.data(s, e)) : null + }, + removeData: function(e) { + return this.each(function() { + x.removeData(this, e) + }) + } + }); + function $(e, n, r) { + if (r === t && 1 === e.nodeType) { + var i = "data-" + n.replace(P, "-$1").toLowerCase(); + if (r = e.getAttribute(i), + "string" == typeof r) { + try { + r = "true" === r ? !0 : "false" === r ? !1 : "null" === r ? null : +r + "" === r ? +r : B.test(r) ? x.parseJSON(r) : r + } catch (o) {} + x.data(e, n, r) + } else + r = t + } + return r + } + function I(e) { + var t; + for (t in e) + if (("data" !== t || !x.isEmptyObject(e[t])) && "toJSON" !== t) + return !1; + return !0 + } + x.extend({ + queue: function(e, n, r) { + var i; + return e ? (n = (n || "fx") + "queue", + i = x._data(e, n), + r && (!i || x.isArray(r) ? i = x._data(e, n, x.makeArray(r)) : i.push(r)), + i || []) : t + }, + dequeue: function(e, t) { + t = t || "fx"; + var n = x.queue(e, t) + , r = n.length + , i = n.shift() + , o = x._queueHooks(e, t) + , a = function() { + x.dequeue(e, t) + }; + "inprogress" === i && (i = n.shift(), + r--), + o.cur = i, + i && ("fx" === t && n.unshift("inprogress"), + delete o.stop, + i.call(e, a, o)), + !r && o && o.empty.fire() + }, + _queueHooks: function(e, t) { + var n = t + "queueHooks"; + return x._data(e, n) || x._data(e, n, { + empty: x.Callbacks("once memory").add(function() { + x._removeData(e, t + "queue"), + x._removeData(e, n) + }) + }) + } + }), + x.fn.extend({ + queue: function(e, n) { + var r = 2; + return "string" != typeof e && (n = e, + e = "fx", + r--), + r > arguments.length ? x.queue(this[0], e) : n === t ? this : this.each(function() { + var t = x.queue(this, e, n); + x._queueHooks(this, e), + "fx" === e && "inprogress" !== t[0] && x.dequeue(this, e) + }) + }, + dequeue: function(e) { + return this.each(function() { + x.dequeue(this, e) + }) + }, + delay: function(e, t) { + return e = x.fx ? x.fx.speeds[e] || e : e, + t = t || "fx", + this.queue(t, function(t, n) { + var r = setTimeout(t, e); + n.stop = function() { + clearTimeout(r) + } + }) + }, + clearQueue: function(e) { + return this.queue(e || "fx", []) + }, + promise: function(e, n) { + var r, i = 1, o = x.Deferred(), a = this, s = this.length, l = function() { + --i || o.resolveWith(a, [a]) + }; + "string" != typeof e && (n = e, + e = t), + e = e || "fx"; + while (s--) + r = x._data(a[s], e + "queueHooks"), + r && r.empty && (i++, + r.empty.add(l)); + return l(), + o.promise(n) + } + }); + var z, X, U = /[\t\r\n\f]/g, V = /\r/g, Y = /^(?:input|select|textarea|button|object)$/i, J = /^(?:a|area)$/i, G = /^(?:checked|selected)$/i, Q = x.support.getSetAttribute, K = x.support.input; + x.fn.extend({ + attr: function(e, t) { + return x.access(this, x.attr, e, t, arguments.length > 1) + }, + removeAttr: function(e) { + return this.each(function() { + x.removeAttr(this, e) + }) + }, + prop: function(e, t) { + return x.access(this, x.prop, e, t, arguments.length > 1) + }, + removeProp: function(e) { + return e = x.propFix[e] || e, + this.each(function() { + try { + this[e] = t, + delete this[e] + } catch (n) {} + }) + }, + addClass: function(e) { + var t, n, r, i, o, a = 0, s = this.length, l = "string" == typeof e && e; + if (x.isFunction(e)) + return this.each(function(t) { + x(this).addClass(e.call(this, t, this.className)) + }); + if (l) + for (t = (e || "").match(T) || []; s > a; a++) + if (n = this[a], + r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(U, " ") : " ")) { + o = 0; + while (i = t[o++]) + 0 > r.indexOf(" " + i + " ") && (r += i + " "); + n.className = x.trim(r) + } + return this + }, + removeClass: function(e) { + var t, n, r, i, o, a = 0, s = this.length, l = 0 === arguments.length || "string" == typeof e && e; + if (x.isFunction(e)) + return this.each(function(t) { + x(this).removeClass(e.call(this, t, this.className)) + }); + if (l) + for (t = (e || "").match(T) || []; s > a; a++) + if (n = this[a], + r = 1 === n.nodeType && (n.className ? (" " + n.className + " ").replace(U, " ") : "")) { + o = 0; + while (i = t[o++]) + while (r.indexOf(" " + i + " ") >= 0) + r = r.replace(" " + i + " ", " "); + n.className = e ? x.trim(r) : "" + } + return this + }, + toggleClass: function(e, t) { + var n = typeof e + , r = "boolean" == typeof t; + return x.isFunction(e) ? this.each(function(n) { + x(this).toggleClass(e.call(this, n, this.className, t), t) + }) : this.each(function() { + if ("string" === n) { + var o, a = 0, s = x(this), l = t, u = e.match(T) || []; + while (o = u[a++]) + l = r ? l : !s.hasClass(o), + s[l ? "addClass" : "removeClass"](o) + } else + (n === i || "boolean" === n) && (this.className && x._data(this, "__className__", this.className), + this.className = this.className || e === !1 ? "" : x._data(this, "__className__") || "") + }) + }, + hasClass: function(e) { + var t = " " + e + " " + , n = 0 + , r = this.length; + for (; r > n; n++) + if (1 === this[n].nodeType && (" " + this[n].className + " ").replace(U, " ").indexOf(t) >= 0) + return !0; + return !1 + }, + val: function(e) { + var n, r, i, o = this[0]; + { + if (arguments.length) + return i = x.isFunction(e), + this.each(function(n) { + var o; + 1 === this.nodeType && (o = i ? e.call(this, n, x(this).val()) : e, + null == o ? o = "" : "number" == typeof o ? o += "" : x.isArray(o) && (o = x.map(o, function(e) { + return null == e ? "" : e + "" + })), + r = x.valHooks[this.type] || x.valHooks[this.nodeName.toLowerCase()], + r && "set"in r && r.set(this, o, "value") !== t || (this.value = o)) + }); + if (o) + return r = x.valHooks[o.type] || x.valHooks[o.nodeName.toLowerCase()], + r && "get"in r && (n = r.get(o, "value")) !== t ? n : (n = o.value, + "string" == typeof n ? n.replace(V, "") : null == n ? "" : n) + } + } + }), + x.extend({ + valHooks: { + option: { + get: function(e) { + var t = x.find.attr(e, "value"); + return null != t ? t : e.text + } + }, + select: { + get: function(e) { + var t, n, r = e.options, i = e.selectedIndex, o = "select-one" === e.type || 0 > i, a = o ? null : [], s = o ? i + 1 : r.length, l = 0 > i ? s : o ? i : 0; + for (; s > l; l++) + if (n = r[l], + !(!n.selected && l !== i || (x.support.optDisabled ? n.disabled : null !== n.getAttribute("disabled")) || n.parentNode.disabled && x.nodeName(n.parentNode, "optgroup"))) { + if (t = x(n).val(), + o) + return t; + a.push(t) + } + return a + }, + set: function(e, t) { + var n, r, i = e.options, o = x.makeArray(t), a = i.length; + while (a--) + r = i[a], + (r.selected = x.inArray(x(r).val(), o) >= 0) && (n = !0); + return n || (e.selectedIndex = -1), + o + } + } + }, + attr: function(e, n, r) { + var o, a, s = e.nodeType; + if (e && 3 !== s && 8 !== s && 2 !== s) + return typeof e.getAttribute === i ? x.prop(e, n, r) : (1 === s && x.isXMLDoc(e) || (n = n.toLowerCase(), + o = x.attrHooks[n] || (x.expr.match.bool.test(n) ? X : z)), + r === t ? o && "get"in o && null !== (a = o.get(e, n)) ? a : (a = x.find.attr(e, n), + null == a ? t : a) : null !== r ? o && "set"in o && (a = o.set(e, r, n)) !== t ? a : (e.setAttribute(n, r + ""), + r) : (x.removeAttr(e, n), + t)) + }, + removeAttr: function(e, t) { + var n, r, i = 0, o = t && t.match(T); + if (o && 1 === e.nodeType) + while (n = o[i++]) + r = x.propFix[n] || n, + x.expr.match.bool.test(n) ? K && Q || !G.test(n) ? e[r] = !1 : e[x.camelCase("default-" + n)] = e[r] = !1 : x.attr(e, n, ""), + e.removeAttribute(Q ? n : r) + }, + attrHooks: { + type: { + set: function(e, t) { + if (!x.support.radioValue && "radio" === t && x.nodeName(e, "input")) { + var n = e.value; + return e.setAttribute("type", t), + n && (e.value = n), + t + } + } + } + }, + propFix: { + "for": "htmlFor", + "class": "className" + }, + prop: function(e, n, r) { + var i, o, a, s = e.nodeType; + if (e && 3 !== s && 8 !== s && 2 !== s) + return a = 1 !== s || !x.isXMLDoc(e), + a && (n = x.propFix[n] || n, + o = x.propHooks[n]), + r !== t ? o && "set"in o && (i = o.set(e, r, n)) !== t ? i : e[n] = r : o && "get"in o && null !== (i = o.get(e, n)) ? i : e[n] + }, + propHooks: { + tabIndex: { + get: function(e) { + var t = x.find.attr(e, "tabindex"); + return t ? parseInt(t, 10) : Y.test(e.nodeName) || J.test(e.nodeName) && e.href ? 0 : -1 + } + } + } + }), + X = { + set: function(e, t, n) { + return t === !1 ? x.removeAttr(e, n) : K && Q || !G.test(n) ? e.setAttribute(!Q && x.propFix[n] || n, n) : e[x.camelCase("default-" + n)] = e[n] = !0, + n + } + }, + x.each(x.expr.match.bool.source.match(/\w+/g), function(e, n) { + var r = x.expr.attrHandle[n] || x.find.attr; + x.expr.attrHandle[n] = K && Q || !G.test(n) ? function(e, n, i) { + var o = x.expr.attrHandle[n] + , a = i ? t : (x.expr.attrHandle[n] = t) != r(e, n, i) ? n.toLowerCase() : null; + return x.expr.attrHandle[n] = o, + a + } + : function(e, n, r) { + return r ? t : e[x.camelCase("default-" + n)] ? n.toLowerCase() : null + } + }), + K && Q || (x.attrHooks.value = { + set: function(e, n, r) { + return x.nodeName(e, "input") ? (e.defaultValue = n, + t) : z && z.set(e, n, r) + } + }), + Q || (z = { + set: function(e, n, r) { + var i = e.getAttributeNode(r); + return i || e.setAttributeNode(i = e.ownerDocument.createAttribute(r)), + i.value = n += "", + "value" === r || n === e.getAttribute(r) ? n : t + } + }, + x.expr.attrHandle.id = x.expr.attrHandle.name = x.expr.attrHandle.coords = function(e, n, r) { + var i; + return r ? t : (i = e.getAttributeNode(n)) && "" !== i.value ? i.value : null + } + , + x.valHooks.button = { + get: function(e, n) { + var r = e.getAttributeNode(n); + return r && r.specified ? r.value : t + }, + set: z.set + }, + x.attrHooks.contenteditable = { + set: function(e, t, n) { + z.set(e, "" === t ? !1 : t, n) + } + }, + x.each(["width", "height"], function(e, n) { + x.attrHooks[n] = { + set: function(e, r) { + return "" === r ? (e.setAttribute(n, "auto"), + r) : t + } + } + })), + x.support.hrefNormalized || x.each(["href", "src"], function(e, t) { + x.propHooks[t] = { + get: function(e) { + return e.getAttribute(t, 4) + } + } + }), + x.support.style || (x.attrHooks.style = { + get: function(e) { + return e.style.cssText || t + }, + set: function(e, t) { + return e.style.cssText = t + "" + } + }), + x.support.optSelected || (x.propHooks.selected = { + get: function(e) { + var t = e.parentNode; + return t && (t.selectedIndex, + t.parentNode && t.parentNode.selectedIndex), + null + } + }), + x.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() { + x.propFix[this.toLowerCase()] = this + }), + x.support.enctype || (x.propFix.enctype = "encoding"), + x.each(["radio", "checkbox"], function() { + x.valHooks[this] = { + set: function(e, n) { + return x.isArray(n) ? e.checked = x.inArray(x(e).val(), n) >= 0 : t + } + }, + x.support.checkOn || (x.valHooks[this].get = function(e) { + return null === e.getAttribute("value") ? "on" : e.value + } + ) + }); + var Z = /^(?:input|select|textarea)$/i + , et = /^key/ + , tt = /^(?:mouse|contextmenu)|click/ + , nt = /^(?:focusinfocus|focusoutblur)$/ + , rt = /^([^.]*)(?:\.(.+)|)$/; + function it() { + return !0 + } + function ot() { + return !1 + } + function at() { + try { + return a.activeElement + } catch (e) {} + } + x.event = { + global: {}, + add: function(e, n, r, o, a) { + var s, l, u, c, p, f, d, h, g, m, y, v = x._data(e); + if (v) { + r.handler && (c = r, + r = c.handler, + a = c.selector), + r.guid || (r.guid = x.guid++), + (l = v.events) || (l = v.events = {}), + (f = v.handle) || (f = v.handle = function(e) { + return typeof x === i || e && x.event.triggered === e.type ? t : x.event.dispatch.apply(f.elem, arguments) + } + , + f.elem = e), + n = (n || "").match(T) || [""], + u = n.length; + while (u--) + s = rt.exec(n[u]) || [], + g = y = s[1], + m = (s[2] || "").split(".").sort(), + g && (p = x.event.special[g] || {}, + g = (a ? p.delegateType : p.bindType) || g, + p = x.event.special[g] || {}, + d = x.extend({ + type: g, + origType: y, + data: o, + handler: r, + guid: r.guid, + selector: a, + needsContext: a && x.expr.match.needsContext.test(a), + namespace: m.join(".") + }, c), + (h = l[g]) || (h = l[g] = [], + h.delegateCount = 0, + p.setup && p.setup.call(e, o, m, f) !== !1 || (e.addEventListener ? e.addEventListener(g, f, !1) : e.attachEvent && e.attachEvent("on" + g, f))), + p.add && (p.add.call(e, d), + d.handler.guid || (d.handler.guid = r.guid)), + a ? h.splice(h.delegateCount++, 0, d) : h.push(d), + x.event.global[g] = !0); + e = null + } + }, + remove: function(e, t, n, r, i) { + var o, a, s, l, u, c, p, f, d, h, g, m = x.hasData(e) && x._data(e); + if (m && (c = m.events)) { + t = (t || "").match(T) || [""], + u = t.length; + while (u--) + if (s = rt.exec(t[u]) || [], + d = g = s[1], + h = (s[2] || "").split(".").sort(), + d) { + p = x.event.special[d] || {}, + d = (r ? p.delegateType : p.bindType) || d, + f = c[d] || [], + s = s[2] && RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), + l = o = f.length; + while (o--) + a = f[o], + !i && g !== a.origType || n && n.guid !== a.guid || s && !s.test(a.namespace) || r && r !== a.selector && ("**" !== r || !a.selector) || (f.splice(o, 1), + a.selector && f.delegateCount--, + p.remove && p.remove.call(e, a)); + l && !f.length && (p.teardown && p.teardown.call(e, h, m.handle) !== !1 || x.removeEvent(e, d, m.handle), + delete c[d]) + } else + for (d in c) + x.event.remove(e, d + t[u], n, r, !0); + x.isEmptyObject(c) && (delete m.handle, + x._removeData(e, "events")) + } + }, + trigger: function(n, r, i, o) { + var s, l, u, c, p, f, d, h = [i || a], g = v.call(n, "type") ? n.type : n, m = v.call(n, "namespace") ? n.namespace.split(".") : []; + if (u = f = i = i || a, + 3 !== i.nodeType && 8 !== i.nodeType && !nt.test(g + x.event.triggered) && (g.indexOf(".") >= 0 && (m = g.split("."), + g = m.shift(), + m.sort()), + l = 0 > g.indexOf(":") && "on" + g, + n = n[x.expando] ? n : new x.Event(g,"object" == typeof n && n), + n.isTrigger = o ? 2 : 3, + n.namespace = m.join("."), + n.namespace_re = n.namespace ? RegExp("(^|\\.)" + m.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, + n.result = t, + n.target || (n.target = i), + r = null == r ? [n] : x.makeArray(r, [n]), + p = x.event.special[g] || {}, + o || !p.trigger || p.trigger.apply(i, r) !== !1)) { + if (!o && !p.noBubble && !x.isWindow(i)) { + for (c = p.delegateType || g, + nt.test(c + g) || (u = u.parentNode); u; u = u.parentNode) + h.push(u), + f = u; + f === (i.ownerDocument || a) && h.push(f.defaultView || f.parentWindow || e) + } + d = 0; + while ((u = h[d++]) && !n.isPropagationStopped()) + n.type = d > 1 ? c : p.bindType || g, + s = (x._data(u, "events") || {})[n.type] && x._data(u, "handle"), + s && s.apply(u, r), + s = l && u[l], + s && x.acceptData(u) && s.apply && s.apply(u, r) === !1 && n.preventDefault(); + if (n.type = g, + !o && !n.isDefaultPrevented() && (!p._default || p._default.apply(h.pop(), r) === !1) && x.acceptData(i) && l && i[g] && !x.isWindow(i)) { + f = i[l], + f && (i[l] = null), + x.event.triggered = g; + try { + i[g]() + } catch (y) {} + x.event.triggered = t, + f && (i[l] = f) + } + return n.result + } + }, + dispatch: function(e) { + e = x.event.fix(e); + var n, r, i, o, a, s = [], l = g.call(arguments), u = (x._data(this, "events") || {})[e.type] || [], c = x.event.special[e.type] || {}; + if (l[0] = e, + e.delegateTarget = this, + !c.preDispatch || c.preDispatch.call(this, e) !== !1) { + s = x.event.handlers.call(this, e, u), + n = 0; + while ((o = s[n++]) && !e.isPropagationStopped()) { + e.currentTarget = o.elem, + a = 0; + while ((i = o.handlers[a++]) && !e.isImmediatePropagationStopped()) + (!e.namespace_re || e.namespace_re.test(i.namespace)) && (e.handleObj = i, + e.data = i.data, + r = ((x.event.special[i.origType] || {}).handle || i.handler).apply(o.elem, l), + r !== t && (e.result = r) === !1 && (e.preventDefault(), + e.stopPropagation())) + } + return c.postDispatch && c.postDispatch.call(this, e), + e.result + } + }, + handlers: function(e, n) { + var r, i, o, a, s = [], l = n.delegateCount, u = e.target; + if (l && u.nodeType && (!e.button || "click" !== e.type)) + for (; u != this; u = u.parentNode || this) + if (1 === u.nodeType && (u.disabled !== !0 || "click" !== e.type)) { + for (o = [], + a = 0; l > a; a++) + i = n[a], + r = i.selector + " ", + o[r] === t && (o[r] = i.needsContext ? x(r, this).index(u) >= 0 : x.find(r, this, null, [u]).length), + o[r] && o.push(i); + o.length && s.push({ + elem: u, + handlers: o + }) + } + return n.length > l && s.push({ + elem: this, + handlers: n.slice(l) + }), + s + }, + fix: function(e) { + if (e[x.expando]) + return e; + var t, n, r, i = e.type, o = e, s = this.fixHooks[i]; + s || (this.fixHooks[i] = s = tt.test(i) ? this.mouseHooks : et.test(i) ? this.keyHooks : {}), + r = s.props ? this.props.concat(s.props) : this.props, + e = new x.Event(o), + t = r.length; + while (t--) + n = r[t], + e[n] = o[n]; + return e.target || (e.target = o.srcElement || a), + 3 === e.target.nodeType && (e.target = e.target.parentNode), + e.metaKey = !!e.metaKey, + s.filter ? s.filter(e, o) : e + }, + props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + fixHooks: {}, + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function(e, t) { + return null == e.which && (e.which = null != t.charCode ? t.charCode : t.keyCode), + e + } + }, + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function(e, n) { + var r, i, o, s = n.button, l = n.fromElement; + return null == e.pageX && null != n.clientX && (i = e.target.ownerDocument || a, + o = i.documentElement, + r = i.body, + e.pageX = n.clientX + (o && o.scrollLeft || r && r.scrollLeft || 0) - (o && o.clientLeft || r && r.clientLeft || 0), + e.pageY = n.clientY + (o && o.scrollTop || r && r.scrollTop || 0) - (o && o.clientTop || r && r.clientTop || 0)), + !e.relatedTarget && l && (e.relatedTarget = l === e.target ? n.toElement : l), + e.which || s === t || (e.which = 1 & s ? 1 : 2 & s ? 3 : 4 & s ? 2 : 0), + e + } + }, + special: { + load: { + noBubble: !0 + }, + focus: { + trigger: function() { + if (this !== at() && this.focus) + try { + return this.focus(), + !1 + } catch (e) {} + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + return this === at() && this.blur ? (this.blur(), + !1) : t + }, + delegateType: "focusout" + }, + click: { + trigger: function() { + return x.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), + !1) : t + }, + _default: function(e) { + return x.nodeName(e.target, "a") + } + }, + beforeunload: { + postDispatch: function(e) { + e.result !== t && (e.originalEvent.returnValue = e.result) + } + } + }, + simulate: function(e, t, n, r) { + var i = x.extend(new x.Event, n, { + type: e, + isSimulated: !0, + originalEvent: {} + }); + r ? x.event.trigger(i, null, t) : x.event.dispatch.call(t, i), + i.isDefaultPrevented() && n.preventDefault() + } + }, + x.removeEvent = a.removeEventListener ? function(e, t, n) { + e.removeEventListener && e.removeEventListener(t, n, !1) + } + : function(e, t, n) { + var r = "on" + t; + e.detachEvent && (typeof e[r] === i && (e[r] = null), + e.detachEvent(r, n)) + } + , + x.Event = function(e, n) { + return this instanceof x.Event ? (e && e.type ? (this.originalEvent = e, + this.type = e.type, + this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? it : ot) : this.type = e, + n && x.extend(this, n), + this.timeStamp = e && e.timeStamp || x.now(), + this[x.expando] = !0, + t) : new x.Event(e,n) + } + , + x.Event.prototype = { + isDefaultPrevented: ot, + isPropagationStopped: ot, + isImmediatePropagationStopped: ot, + preventDefault: function() { + var e = this.originalEvent; + this.isDefaultPrevented = it, + e && (e.preventDefault ? e.preventDefault() : e.returnValue = !1) + }, + stopPropagation: function() { + var e = this.originalEvent; + this.isPropagationStopped = it, + e && (e.stopPropagation && e.stopPropagation(), + e.cancelBubble = !0) + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = it, + this.stopPropagation() + } + }, + x.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" + }, function(e, t) { + x.event.special[e] = { + delegateType: t, + bindType: t, + handle: function(e) { + var n, r = this, i = e.relatedTarget, o = e.handleObj; + return (!i || i !== r && !x.contains(r, i)) && (e.type = o.origType, + n = o.handler.apply(this, arguments), + e.type = t), + n + } + } + }), + x.support.submitBubbles || (x.event.special.submit = { + setup: function() { + return x.nodeName(this, "form") ? !1 : (x.event.add(this, "click._submit keypress._submit", function(e) { + var n = e.target + , r = x.nodeName(n, "input") || x.nodeName(n, "button") ? n.form : t; + r && !x._data(r, "submitBubbles") && (x.event.add(r, "submit._submit", function(e) { + e._submit_bubble = !0 + }), + x._data(r, "submitBubbles", !0)) + }), + t) + }, + postDispatch: function(e) { + e._submit_bubble && (delete e._submit_bubble, + this.parentNode && !e.isTrigger && x.event.simulate("submit", this.parentNode, e, !0)) + }, + teardown: function() { + return x.nodeName(this, "form") ? !1 : (x.event.remove(this, "._submit"), + t) + } + }), + x.support.changeBubbles || (x.event.special.change = { + setup: function() { + return Z.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (x.event.add(this, "propertychange._change", function(e) { + "checked" === e.originalEvent.propertyName && (this._just_changed = !0) + }), + x.event.add(this, "click._change", function(e) { + this._just_changed && !e.isTrigger && (this._just_changed = !1), + x.event.simulate("change", this, e, !0) + })), + !1) : (x.event.add(this, "beforeactivate._change", function(e) { + var t = e.target; + Z.test(t.nodeName) && !x._data(t, "changeBubbles") && (x.event.add(t, "change._change", function(e) { + !this.parentNode || e.isSimulated || e.isTrigger || x.event.simulate("change", this.parentNode, e, !0) + }), + x._data(t, "changeBubbles", !0)) + }), + t) + }, + handle: function(e) { + var n = e.target; + return this !== n || e.isSimulated || e.isTrigger || "radio" !== n.type && "checkbox" !== n.type ? e.handleObj.handler.apply(this, arguments) : t + }, + teardown: function() { + return x.event.remove(this, "._change"), + !Z.test(this.nodeName) + } + }), + x.support.focusinBubbles || x.each({ + focus: "focusin", + blur: "focusout" + }, function(e, t) { + var n = 0 + , r = function(e) { + x.event.simulate(t, e.target, x.event.fix(e), !0) + }; + x.event.special[t] = { + setup: function() { + 0 === n++ && a.addEventListener(e, r, !0) + }, + teardown: function() { + 0 === --n && a.removeEventListener(e, r, !0) + } + } + }), + x.fn.extend({ + on: function(e, n, r, i, o) { + var a, s; + if ("object" == typeof e) { + "string" != typeof n && (r = r || n, + n = t); + for (a in e) + this.on(a, n, r, e[a], o); + return this + } + if (null == r && null == i ? (i = n, + r = n = t) : null == i && ("string" == typeof n ? (i = r, + r = t) : (i = r, + r = n, + n = t)), + i === !1) + i = ot; + else if (!i) + return this; + return 1 === o && (s = i, + i = function(e) { + return x().off(e), + s.apply(this, arguments) + } + , + i.guid = s.guid || (s.guid = x.guid++)), + this.each(function() { + x.event.add(this, e, i, r, n) + }) + }, + one: function(e, t, n, r) { + return this.on(e, t, n, r, 1) + }, + off: function(e, n, r) { + var i, o; + if (e && e.preventDefault && e.handleObj) + return i = e.handleObj, + x(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), + this; + if ("object" == typeof e) { + for (o in e) + this.off(o, n, e[o]); + return this + } + return (n === !1 || "function" == typeof n) && (r = n, + n = t), + r === !1 && (r = ot), + this.each(function() { + x.event.remove(this, e, r, n) + }) + }, + trigger: function(e, t) { + return this.each(function() { + x.event.trigger(e, t, this) + }) + }, + triggerHandler: function(e, n) { + var r = this[0]; + return r ? x.event.trigger(e, n, r, !0) : t + } + }); + var st = /^.[^:#\[\.,]*$/ + , lt = /^(?:parents|prev(?:Until|All))/ + , ut = x.expr.match.needsContext + , ct = { + children: !0, + contents: !0, + next: !0, + prev: !0 + }; + x.fn.extend({ + find: function(e) { + var t, n = [], r = this, i = r.length; + if ("string" != typeof e) + return this.pushStack(x(e).filter(function() { + for (t = 0; i > t; t++) + if (x.contains(r[t], this)) + return !0 + })); + for (t = 0; i > t; t++) + x.find(e, r[t], n); + return n = this.pushStack(i > 1 ? x.unique(n) : n), + n.selector = this.selector ? this.selector + " " + e : e, + n + }, + has: function(e) { + var t, n = x(e, this), r = n.length; + return this.filter(function() { + for (t = 0; r > t; t++) + if (x.contains(this, n[t])) + return !0 + }) + }, + not: function(e) { + return this.pushStack(ft(this, e || [], !0)) + }, + filter: function(e) { + return this.pushStack(ft(this, e || [], !1)) + }, + is: function(e) { + return !!ft(this, "string" == typeof e && ut.test(e) ? x(e) : e || [], !1).length + }, + closest: function(e, t) { + var n, r = 0, i = this.length, o = [], a = ut.test(e) || "string" != typeof e ? x(e, t || this.context) : 0; + for (; i > r; r++) + for (n = this[r]; n && n !== t; n = n.parentNode) + if (11 > n.nodeType && (a ? a.index(n) > -1 : 1 === n.nodeType && x.find.matchesSelector(n, e))) { + n = o.push(n); + break + } + return this.pushStack(o.length > 1 ? x.unique(o) : o) + }, + index: function(e) { + return e ? "string" == typeof e ? x.inArray(this[0], x(e)) : x.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 + }, + add: function(e, t) { + var n = "string" == typeof e ? x(e, t) : x.makeArray(e && e.nodeType ? [e] : e) + , r = x.merge(this.get(), n); + return this.pushStack(x.unique(r)) + }, + addBack: function(e) { + return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) + } + }); + function pt(e, t) { + do + e = e[t]; + while (e && 1 !== e.nodeType);return e + } + x.each({ + parent: function(e) { + var t = e.parentNode; + return t && 11 !== t.nodeType ? t : null + }, + parents: function(e) { + return x.dir(e, "parentNode") + }, + parentsUntil: function(e, t, n) { + return x.dir(e, "parentNode", n) + }, + next: function(e) { + return pt(e, "nextSibling") + }, + prev: function(e) { + return pt(e, "previousSibling") + }, + nextAll: function(e) { + return x.dir(e, "nextSibling") + }, + prevAll: function(e) { + return x.dir(e, "previousSibling") + }, + nextUntil: function(e, t, n) { + return x.dir(e, "nextSibling", n) + }, + prevUntil: function(e, t, n) { + return x.dir(e, "previousSibling", n) + }, + siblings: function(e) { + return x.sibling((e.parentNode || {}).firstChild, e) + }, + children: function(e) { + return x.sibling(e.firstChild) + }, + contents: function(e) { + return x.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : x.merge([], e.childNodes) + } + }, function(e, t) { + x.fn[e] = function(n, r) { + var i = x.map(this, t, n); + return "Until" !== e.slice(-5) && (r = n), + r && "string" == typeof r && (i = x.filter(r, i)), + this.length > 1 && (ct[e] || (i = x.unique(i)), + lt.test(e) && (i = i.reverse())), + this.pushStack(i) + } + }), + x.extend({ + filter: function(e, t, n) { + var r = t[0]; + return n && (e = ":not(" + e + ")"), + 1 === t.length && 1 === r.nodeType ? x.find.matchesSelector(r, e) ? [r] : [] : x.find.matches(e, x.grep(t, function(e) { + return 1 === e.nodeType + })) + }, + dir: function(e, n, r) { + var i = [] + , o = e[n]; + while (o && 9 !== o.nodeType && (r === t || 1 !== o.nodeType || !x(o).is(r))) + 1 === o.nodeType && i.push(o), + o = o[n]; + return i + }, + sibling: function(e, t) { + var n = []; + for (; e; e = e.nextSibling) + 1 === e.nodeType && e !== t && n.push(e); + return n + } + }); + function ft(e, t, n) { + if (x.isFunction(t)) + return x.grep(e, function(e, r) { + return !!t.call(e, r, e) !== n + }); + if (t.nodeType) + return x.grep(e, function(e) { + return e === t !== n + }); + if ("string" == typeof t) { + if (st.test(t)) + return x.filter(t, e, n); + t = x.filter(t, e) + } + return x.grep(e, function(e) { + return x.inArray(e, t) >= 0 !== n + }) + } + function dt(e) { + var t = ht.split("|") + , n = e.createDocumentFragment(); + if (n.createElement) + while (t.length) + n.createElement(t.pop()); + return n + } + var ht = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video" + , gt = / jQuery\d+="(?:null|\d+)"/g + , mt = RegExp("<(?:" + ht + ")[\\s/>]", "i") + , yt = /^\s+/ + , vt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi + , bt = /<([\w:]+)/ + , xt = /\s*$/g + , At = { + option: [1, ""], + legend: [1, "
", "
"], + area: [1, "", ""], + param: [1, "", ""], + thead: [1, "", "
"], + tr: [2, "", "
"], + col: [2, "", "
"], + td: [3, "", "
"], + _default: x.support.htmlSerialize ? [0, "", ""] : [1, "X
", "
"] + } + , jt = dt(a) + , Dt = jt.appendChild(a.createElement("div")); + At.optgroup = At.option, + At.tbody = At.tfoot = At.colgroup = At.caption = At.thead, + At.th = At.td, + x.fn.extend({ + text: function(e) { + return x.access(this, function(e) { + return e === t ? x.text(this) : this.empty().append((this[0] && this[0].ownerDocument || a).createTextNode(e)) + }, null, e, arguments.length) + }, + append: function() { + return this.domManip(arguments, function(e) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var t = Lt(this, e); + t.appendChild(e) + } + }) + }, + prepend: function() { + return this.domManip(arguments, function(e) { + if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { + var t = Lt(this, e); + t.insertBefore(e, t.firstChild) + } + }) + }, + before: function() { + return this.domManip(arguments, function(e) { + this.parentNode && this.parentNode.insertBefore(e, this) + }) + }, + after: function() { + return this.domManip(arguments, function(e) { + this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) + }) + }, + remove: function(e, t) { + var n, r = e ? x.filter(e, this) : this, i = 0; + for (; null != (n = r[i]); i++) + t || 1 !== n.nodeType || x.cleanData(Ft(n)), + n.parentNode && (t && x.contains(n.ownerDocument, n) && _t(Ft(n, "script")), + n.parentNode.removeChild(n)); + return this + }, + empty: function() { + var e, t = 0; + for (; null != (e = this[t]); t++) { + 1 === e.nodeType && x.cleanData(Ft(e, !1)); + while (e.firstChild) + e.removeChild(e.firstChild); + e.options && x.nodeName(e, "select") && (e.options.length = 0) + } + return this + }, + clone: function(e, t) { + return e = null == e ? !1 : e, + t = null == t ? e : t, + this.map(function() { + return x.clone(this, e, t) + }) + }, + html: function(e) { + return x.access(this, function(e) { + var n = this[0] || {} + , r = 0 + , i = this.length; + if (e === t) + return 1 === n.nodeType ? n.innerHTML.replace(gt, "") : t; + if (!("string" != typeof e || Tt.test(e) || !x.support.htmlSerialize && mt.test(e) || !x.support.leadingWhitespace && yt.test(e) || At[(bt.exec(e) || ["", ""])[1].toLowerCase()])) { + e = e.replace(vt, "<$1>"); + try { + for (; i > r; r++) + n = this[r] || {}, + 1 === n.nodeType && (x.cleanData(Ft(n, !1)), + n.innerHTML = e); + n = 0 + } catch (o) {} + } + n && this.empty().append(e) + }, null, e, arguments.length) + }, + replaceWith: function() { + var e = x.map(this, function(e) { + return [e.nextSibling, e.parentNode] + }) + , t = 0; + return this.domManip(arguments, function(n) { + var r = e[t++] + , i = e[t++]; + i && (r && r.parentNode !== i && (r = this.nextSibling), + x(this).remove(), + i.insertBefore(n, r)) + }, !0), + t ? this : this.remove() + }, + detach: function(e) { + return this.remove(e, !0) + }, + domManip: function(e, t, n) { + e = d.apply([], e); + var r, i, o, a, s, l, u = 0, c = this.length, p = this, f = c - 1, h = e[0], g = x.isFunction(h); + if (g || !(1 >= c || "string" != typeof h || x.support.checkClone) && Nt.test(h)) + return this.each(function(r) { + var i = p.eq(r); + g && (e[0] = h.call(this, r, i.html())), + i.domManip(e, t, n) + }); + if (c && (l = x.buildFragment(e, this[0].ownerDocument, !1, !n && this), + r = l.firstChild, + 1 === l.childNodes.length && (l = r), + r)) { + for (a = x.map(Ft(l, "script"), Ht), + o = a.length; c > u; u++) + i = l, + u !== f && (i = x.clone(i, !0, !0), + o && x.merge(a, Ft(i, "script"))), + t.call(this[u], i, u); + if (o) + for (s = a[a.length - 1].ownerDocument, + x.map(a, qt), + u = 0; o > u; u++) + i = a[u], + kt.test(i.type || "") && !x._data(i, "globalEval") && x.contains(s, i) && (i.src ? x._evalUrl(i.src) : x.globalEval((i.text || i.textContent || i.innerHTML || "").replace(St, ""))); + l = r = null + } + return this + } + }); + function Lt(e, t) { + return x.nodeName(e, "table") && x.nodeName(1 === t.nodeType ? t : t.firstChild, "tr") ? e.getElementsByTagName("tbody")[0] || e.appendChild(e.ownerDocument.createElement("tbody")) : e + } + function Ht(e) { + return e.type = (null !== x.find.attr(e, "type")) + "/" + e.type, + e + } + function qt(e) { + var t = Et.exec(e.type); + return t ? e.type = t[1] : e.removeAttribute("type"), + e + } + function _t(e, t) { + var n, r = 0; + for (; null != (n = e[r]); r++) + x._data(n, "globalEval", !t || x._data(t[r], "globalEval")) + } + function Mt(e, t) { + if (1 === t.nodeType && x.hasData(e)) { + var n, r, i, o = x._data(e), a = x._data(t, o), s = o.events; + if (s) { + delete a.handle, + a.events = {}; + for (n in s) + for (r = 0, + i = s[n].length; i > r; r++) + x.event.add(t, n, s[n][r]) + } + a.data && (a.data = x.extend({}, a.data)) + } + } + function Ot(e, t) { + var n, r, i; + if (1 === t.nodeType) { + if (n = t.nodeName.toLowerCase(), + !x.support.noCloneEvent && t[x.expando]) { + i = x._data(t); + for (r in i.events) + x.removeEvent(t, r, i.handle); + t.removeAttribute(x.expando) + } + "script" === n && t.text !== e.text ? (Ht(t).text = e.text, + qt(t)) : "object" === n ? (t.parentNode && (t.outerHTML = e.outerHTML), + x.support.html5Clone && e.innerHTML && !x.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : "input" === n && Ct.test(e.type) ? (t.defaultChecked = t.checked = e.checked, + t.value !== e.value && (t.value = e.value)) : "option" === n ? t.defaultSelected = t.selected = e.defaultSelected : ("input" === n || "textarea" === n) && (t.defaultValue = e.defaultValue) + } + } + x.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function(e, t) { + x.fn[e] = function(e) { + var n, r = 0, i = [], o = x(e), a = o.length - 1; + for (; a >= r; r++) + n = r === a ? this : this.clone(!0), + x(o[r])[t](n), + h.apply(i, n.get()); + return this.pushStack(i) + } + }); + function Ft(e, n) { + var r, o, a = 0, s = typeof e.getElementsByTagName !== i ? e.getElementsByTagName(n || "*") : typeof e.querySelectorAll !== i ? e.querySelectorAll(n || "*") : t; + if (!s) + for (s = [], + r = e.childNodes || e; null != (o = r[a]); a++) + !n || x.nodeName(o, n) ? s.push(o) : x.merge(s, Ft(o, n)); + return n === t || n && x.nodeName(e, n) ? x.merge([e], s) : s + } + function Bt(e) { + Ct.test(e.type) && (e.defaultChecked = e.checked) + } + x.extend({ + clone: function(e, t, n) { + var r, i, o, a, s, l = x.contains(e.ownerDocument, e); + if (x.support.html5Clone || x.isXMLDoc(e) || !mt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (Dt.innerHTML = e.outerHTML, + Dt.removeChild(o = Dt.firstChild)), + !(x.support.noCloneEvent && x.support.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || x.isXMLDoc(e))) + for (r = Ft(o), + s = Ft(e), + a = 0; null != (i = s[a]); ++a) + r[a] && Ot(i, r[a]); + if (t) + if (n) + for (s = s || Ft(e), + r = r || Ft(o), + a = 0; null != (i = s[a]); a++) + Mt(i, r[a]); + else + Mt(e, o); + return r = Ft(o, "script"), + r.length > 0 && _t(r, !l && Ft(e, "script")), + r = s = i = null, + o + }, + buildFragment: function(e, t, n, r) { + var i, o, a, s, l, u, c, p = e.length, f = dt(t), d = [], h = 0; + for (; p > h; h++) + if (o = e[h], + o || 0 === o) + if ("object" === x.type(o)) + x.merge(d, o.nodeType ? [o] : o); + else if (wt.test(o)) { + s = s || f.appendChild(t.createElement("div")), + l = (bt.exec(o) || ["", ""])[1].toLowerCase(), + c = At[l] || At._default, + s.innerHTML = c[1] + o.replace(vt, "<$1>") + c[2], + i = c[0]; + while (i--) + s = s.lastChild; + if (!x.support.leadingWhitespace && yt.test(o) && d.push(t.createTextNode(yt.exec(o)[0])), + !x.support.tbody) { + o = "table" !== l || xt.test(o) ? "" !== c[1] || xt.test(o) ? 0 : s : s.firstChild, + i = o && o.childNodes.length; + while (i--) + x.nodeName(u = o.childNodes[i], "tbody") && !u.childNodes.length && o.removeChild(u) + } + x.merge(d, s.childNodes), + s.textContent = ""; + while (s.firstChild) + s.removeChild(s.firstChild); + s = f.lastChild + } else + d.push(t.createTextNode(o)); + s && f.removeChild(s), + x.support.appendChecked || x.grep(Ft(d, "input"), Bt), + h = 0; + while (o = d[h++]) + if ((!r || -1 === x.inArray(o, r)) && (a = x.contains(o.ownerDocument, o), + s = Ft(f.appendChild(o), "script"), + a && _t(s), + n)) { + i = 0; + while (o = s[i++]) + kt.test(o.type || "") && n.push(o) + } + return s = null, + f + }, + cleanData: function(e, t) { + var n, r, o, a, s = 0, l = x.expando, u = x.cache, c = x.support.deleteExpando, f = x.event.special; + for (; null != (n = e[s]); s++) + if ((t || x.acceptData(n)) && (o = n[l], + a = o && u[o])) { + if (a.events) + for (r in a.events) + f[r] ? x.event.remove(n, r) : x.removeEvent(n, r, a.handle); + u[o] && (delete u[o], + c ? delete n[l] : typeof n.removeAttribute !== i ? n.removeAttribute(l) : n[l] = null, + p.push(o)) + } + }, + _evalUrl: function(e) { + return x.ajax({ + url: e, + type: "GET", + dataType: "script", + async: !1, + global: !1, + "throws": !0 + }) + } + }), + x.fn.extend({ + wrapAll: function(e) { + if (x.isFunction(e)) + return this.each(function(t) { + x(this).wrapAll(e.call(this, t)) + }); + if (this[0]) { + var t = x(e, this[0].ownerDocument).eq(0).clone(!0); + this[0].parentNode && t.insertBefore(this[0]), + t.map(function() { + var e = this; + while (e.firstChild && 1 === e.firstChild.nodeType) + e = e.firstChild; + return e + }).append(this) + } + return this + }, + wrapInner: function(e) { + return x.isFunction(e) ? this.each(function(t) { + x(this).wrapInner(e.call(this, t)) + }) : this.each(function() { + var t = x(this) + , n = t.contents(); + n.length ? n.wrapAll(e) : t.append(e) + }) + }, + wrap: function(e) { + var t = x.isFunction(e); + return this.each(function(n) { + x(this).wrapAll(t ? e.call(this, n) : e) + }) + }, + unwrap: function() { + return this.parent().each(function() { + x.nodeName(this, "body") || x(this).replaceWith(this.childNodes) + }).end() + } + }); + var Pt, Rt, Wt, $t = /alpha\([^)]*\)/i, It = /opacity\s*=\s*([^)]*)/, zt = /^(top|right|bottom|left)$/, Xt = /^(none|table(?!-c[ea]).+)/, Ut = /^margin/, Vt = RegExp("^(" + w + ")(.*)$", "i"), Yt = RegExp("^(" + w + ")(?!px)[a-z%]+$", "i"), Jt = RegExp("^([+-])=(" + w + ")", "i"), Gt = { + BODY: "block" + }, Qt = { + position: "absolute", + visibility: "hidden", + display: "block" + }, Kt = { + letterSpacing: 0, + fontWeight: 400 + }, Zt = ["Top", "Right", "Bottom", "Left"], en = ["Webkit", "O", "Moz", "ms"]; + function tn(e, t) { + if (t in e) + return t; + var n = t.charAt(0).toUpperCase() + t.slice(1) + , r = t + , i = en.length; + while (i--) + if (t = en[i] + n, + t in e) + return t; + return r + } + function nn(e, t) { + return e = t || e, + "none" === x.css(e, "display") || !x.contains(e.ownerDocument, e) + } + function rn(e, t) { + var n, r, i, o = [], a = 0, s = e.length; + for (; s > a; a++) + r = e[a], + r.style && (o[a] = x._data(r, "olddisplay"), + n = r.style.display, + t ? (o[a] || "none" !== n || (r.style.display = ""), + "" === r.style.display && nn(r) && (o[a] = x._data(r, "olddisplay", ln(r.nodeName)))) : o[a] || (i = nn(r), + (n && "none" !== n || !i) && x._data(r, "olddisplay", i ? n : x.css(r, "display")))); + for (a = 0; s > a; a++) + r = e[a], + r.style && (t && "none" !== r.style.display && "" !== r.style.display || (r.style.display = t ? o[a] || "" : "none")); + return e + } + x.fn.extend({ + css: function(e, n) { + return x.access(this, function(e, n, r) { + var i, o, a = {}, s = 0; + if (x.isArray(n)) { + for (o = Rt(e), + i = n.length; i > s; s++) + a[n[s]] = x.css(e, n[s], !1, o); + return a + } + return r !== t ? x.style(e, n, r) : x.css(e, n) + }, e, n, arguments.length > 1) + }, + show: function() { + return rn(this, !0) + }, + hide: function() { + return rn(this) + }, + toggle: function(e) { + var t = "boolean" == typeof e; + return this.each(function() { + (t ? e : nn(this)) ? x(this).show() : x(this).hide() + }) + } + }), + x.extend({ + cssHooks: { + opacity: { + get: function(e, t) { + if (t) { + var n = Wt(e, "opacity"); + return "" === n ? "1" : n + } + } + } + }, + cssNumber: { + columnCount: !0, + fillOpacity: !0, + fontWeight: !0, + lineHeight: !0, + opacity: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0 + }, + cssProps: { + "float": x.support.cssFloat ? "cssFloat" : "styleFloat" + }, + style: function(e, n, r, i) { + if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { + var o, a, s, l = x.camelCase(n), u = e.style; + if (n = x.cssProps[l] || (x.cssProps[l] = tn(u, l)), + s = x.cssHooks[n] || x.cssHooks[l], + r === t) + return s && "get"in s && (o = s.get(e, !1, i)) !== t ? o : u[n]; + if (a = typeof r, + "string" === a && (o = Jt.exec(r)) && (r = (o[1] + 1) * o[2] + parseFloat(x.css(e, n)), + a = "number"), + !(null == r || "number" === a && isNaN(r) || ("number" !== a || x.cssNumber[l] || (r += "px"), + x.support.clearCloneStyle || "" !== r || 0 !== n.indexOf("background") || (u[n] = "inherit"), + s && "set"in s && (r = s.set(e, r, i)) === t))) + try { + u[n] = r + } catch (c) {} + } + }, + css: function(e, n, r, i) { + var o, a, s, l = x.camelCase(n); + return n = x.cssProps[l] || (x.cssProps[l] = tn(e.style, l)), + s = x.cssHooks[n] || x.cssHooks[l], + s && "get"in s && (a = s.get(e, !0, r)), + a === t && (a = Wt(e, n, i)), + "normal" === a && n in Kt && (a = Kt[n]), + "" === r || r ? (o = parseFloat(a), + r === !0 || x.isNumeric(o) ? o || 0 : a) : a + } + }), + e.getComputedStyle ? (Rt = function(t) { + return e.getComputedStyle(t, null) + } + , + Wt = function(e, n, r) { + var i, o, a, s = r || Rt(e), l = s ? s.getPropertyValue(n) || s[n] : t, u = e.style; + return s && ("" !== l || x.contains(e.ownerDocument, e) || (l = x.style(e, n)), + Yt.test(l) && Ut.test(n) && (i = u.width, + o = u.minWidth, + a = u.maxWidth, + u.minWidth = u.maxWidth = u.width = l, + l = s.width, + u.width = i, + u.minWidth = o, + u.maxWidth = a)), + l + } + ) : a.documentElement.currentStyle && (Rt = function(e) { + return e.currentStyle + } + , + Wt = function(e, n, r) { + var i, o, a, s = r || Rt(e), l = s ? s[n] : t, u = e.style; + return null == l && u && u[n] && (l = u[n]), + Yt.test(l) && !zt.test(n) && (i = u.left, + o = e.runtimeStyle, + a = o && o.left, + a && (o.left = e.currentStyle.left), + u.left = "fontSize" === n ? "1em" : l, + l = u.pixelLeft + "px", + u.left = i, + a && (o.left = a)), + "" === l ? "auto" : l + } + ); + function on(e, t, n) { + var r = Vt.exec(t); + return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t + } + function an(e, t, n, r, i) { + var o = n === (r ? "border" : "content") ? 4 : "width" === t ? 1 : 0 + , a = 0; + for (; 4 > o; o += 2) + "margin" === n && (a += x.css(e, n + Zt[o], !0, i)), + r ? ("content" === n && (a -= x.css(e, "padding" + Zt[o], !0, i)), + "margin" !== n && (a -= x.css(e, "border" + Zt[o] + "Width", !0, i))) : (a += x.css(e, "padding" + Zt[o], !0, i), + "padding" !== n && (a += x.css(e, "border" + Zt[o] + "Width", !0, i))); + return a + } + function sn(e, t, n) { + var r = !0 + , i = "width" === t ? e.offsetWidth : e.offsetHeight + , o = Rt(e) + , a = x.support.boxSizing && "border-box" === x.css(e, "boxSizing", !1, o); + if (0 >= i || null == i) { + if (i = Wt(e, t, o), + (0 > i || null == i) && (i = e.style[t]), + Yt.test(i)) + return i; + r = a && (x.support.boxSizingReliable || i === e.style[t]), + i = parseFloat(i) || 0 + } + return i + an(e, t, n || (a ? "border" : "content"), r, o) + "px" + } + function ln(e) { + var t = a + , n = Gt[e]; + return n || (n = un(e, t), + "none" !== n && n || (Pt = (Pt || x("