PKt½B•åK_)_)-packaginator-latest/testing_instructions.html Testing Instructions — OpenComparison documentation

Testing Instructions¶

Running the test suite¶

To run all of the OpenComparison tests:

python manage.py test --settings.test

To run tests for a particular OpenComparison app, for example the feeds app:

python manage.py test feeds --settings.test

Project Versions

Table Of Contents

Previous topic

Settings

Next topic

Management Commands

This Page

PKt½B/à¢ê6ê6%packaginator-latest/contributors.html Team — OpenComparison documentation

Team¶

Project Leads¶

Core Developer at Server Move 2012¶

  • Randall Degges

Core Developers at DjangoCon 2011¶

  • James Punteney
  • Mike Johnson
  • Taylor Mitchell

Core Developer at DataMigrationCon 2011¶

  • Katharine Jarmul

Core Developers at PyCon 2011¶

  • Gisle Aas
  • Nate Aune
  • Szilveszter Farkas

Core Developers at DjangoCon 2011¶

  • James Punteney
  • Jonas Obrist
  • Taavi Taijala

Direct Contributors¶

  • Aaron Kavlie
  • Adam Saegebarth
  • Alex Robbins
  • Andrii Kurinny
  • Brian Ball
  • Bryan Weingarten
  • Chris Adams
  • Christopher Clark
  • David Peters
  • Dougal Matthews (@d0ugal)
  • Eric Spunagle
  • Evgeny Fadeev
  • Flaviu Simihaian
  • George Dorn
  • Gisle Aas (Repo Man)
  • Jacob Burch
  • James Pacileo
  • James Punteney
  • Jeff Schenck
  • Jim Allman
  • John M. Camara
  • Jonas Obrist
  • jrothenbuhler
  • Kenneth Love
  • Kenneth Reitz
  • @kerridge0
  • Marc Tamlyn
  • Mike Fiedler
  • Mike Johnson
  • Nate Aune
  • Nolan Brubaker
  • PA Parent
  • Preston Holmes
  • Randall Degges
  • Skot Carruth
  • Stuart Powers
  • Szilveszter Farkas (Repo Man)
  • Taavi Taijala
  • Taylor Mitchell
  • Tom Brander
  • Vasja Volin

Other Contributors¶

  • The entire Python community for providing us the tools we needed to build this thing.
PKt½BÄv4¥ÇGÇG0packaginator-latest/opencomparison_settings.html Settings — OpenComparison documentation

Settings¶

How to customize the settings to suit your needs. Do this in local_settings so patches and upstream pulls don’t cause havoc to your installation

ADMIN_URL_BASE (Default: r”^admin/”)¶

Used to control the URL for the admin in production.

FRAMEWORK_TITLE (Default: “Django”)¶

Used to create the name of the site.

PACKAGE_EXTENDERS¶

Used to determine how packages have extended data sets. See package_extenders

PACKAGINATOR_SEARCH_PREFIX (Default: “django”)¶

In the case of Django Packages, autocomplete searches for something like ‘forms’ was problematic because so many packages start with ‘django’. The same will hold for searches in Python Packages and Pyramid Packages. This prefix is accommodated in searches to prevent this sort of problem.

example:

PACKAGINATOR_SEARCH_PREFIX = 'pyramid'

PACKAGINATOR_HELP_TEXT (Default: Included in settings.py)¶

Used in the Package add/edit form in both the admin and the UI, these are assigned to model form help text arguments. Takes a dict of the following items:

Example (also the default):

PACKAGINATOR_HELP_TEXT = {
    "REPO_URL" : "Enter your project repo hosting URL here.<br />Example: https://bitbucket.org/ubernostrum/django-registration",
    "PYPI_URL" : "<strong>Leave this blank if this package does not have a PyPI release.</strong><br />What PyPI uses to index your package. <br />Example: django-registration"
}

Launchpad Specific settings¶

The launchpad Python client tool requires an unbelievable amount of requirements to handle a simple JSON ReST based webservice. These requirements can be tricky to install. Therefore, OpenComparison out of the box does not support Launchpad.

Warning

Launchpad hasn’t been tested or maintained in a while. This probably won’t work at this time.

If you have problems, please refer to troubleshooting.

LAUNCHPAD_ACTIVE (Default: False)¶

If you want your instance of OpenComparison to support Launchpad, set this setting to true in local_settings.py:

LAUNCHPAD_ACTIVE = True

LAUNCHPAD_CACHE_DIR¶

Used to point LAUNCHPAD commands against the appropriate cache. Important in real hosting machines.

Example:

LAUNCHPAD_CACHE_DIR = "/tmp/lp-cache"

Permissions Settings¶

OpenComparison provides several ways to control who can make what changes to things like packages, features, and grids. By default, a OpenComparison project is open to contributions from any registered user. If a given project would like more control over this, there are two settings that can be used.

RESTRICT_PACKAGE_EDITORS RESTRICT_GRID_EDITORS

If these are not set, the assumption is that you do not want to restrict editing.

If set to True, a user must have permission to add or edit the given object. These permissions are set in the Django admin, and can be applied per user, or per group.

Settings that are on by default¶

By default registered users can do the following:

Packages

  • Can add package
  • Can change package

Grids

  • Can add Package
  • Can change Package
  • Can add feature
  • Can change feature
  • Can change element

In the default condition, only super users or those with permission can delete.

Testing permissions in templates¶

A context processor will add the user profile to every template context, the profile model also handles checking for permissions:

{% if profile.can_edit_package %}
    <edit package UI here>
{% endif %}

The follow properties can be used in templates:

  • can_add_package
  • can_edit_package
  • can_edit_grid
  • can_add_grid
  • can_add_grid_feature
  • can_edit_grid_feature
  • can_delete_grid_feature
  • can_add_grid_package
  • can_delete_grid_package
  • can_edit_grid_element
PKt½BšˆAŠ)6)6packaginator-latest/index.html Welcome to OpenComparison’s documentation! — OpenComparison documentation

Welcome to OpenComparison’s documentation!¶

OpenComparison solves the problem in the programming community of being able to easily identify good apps, frameworks, and packages. Ever want to know which is the most popular or well supported Python httplib replacement, web framework, or api tool? OpenComparison solves that problem for you!

It does this by storing information on packages fetched from public APIs provided by PyPI, Github, BitBucket, Launchpad, and SourceForge, and then provides extremely useful comparison tools for them.

Credits¶

For Django Dash 2010, @pydanny and @audreyr were scared of rabbits.

Since then the project has had many contributors.

Indices and tables¶

Project Versions

Table Of Contents

Next topic

Introduction

This Page

PKt½B~ù¨ßHGHG"packaginator-latest/searchindex.jsSearch.setIndex({objects:{"":{core:[18,0,1,""],apiv1:[18,0,1,""],pypi:[18,0,1,""],profiles:[18,0,1,""],grid:[18,0,1,""],searchv2:[18,0,1,""],feeds:[18,0,1,""]},"pypi.versioning":{highest_version:[18,1,1,""],compare_versions:[18,1,1,""]},pypi:{versioning:[18,0,1,""]},profiles:{context_processors:[18,0,1,""]},"profiles.context_processors":{lazy_profile:[18,1,1,""]}},terms:{scm:11,represent:3,all:[5,16,2,18,1,15,8,11,14,17,19],code:[12,5,11,2,13],consider:11,roi:[4,1],definit:18,lack:[6,11],mydomain:13,four:6,signific:8,mark:2,runserv:13,github_app_id:10,follow:[0,1,5,15,7,10,11,14,13],either:[11,16],forget:19,content:[0,3,6,8,9,11,12],hold:7,depend:[2,13],aug:3,flask:2,iii:16,send:11,aun:4,aaron:4,program:[12,0],decis:6,under:[11,13],aris:1,addon:10,introduc:6,merchant:1,psql:[16,10],sourc:[11,8,18,13,16],everi:7,string:5,straightforward:[11,5,8],fals:[7,13,3],faq:[0,8,19,13,5],none:[],greenfeld:[4,1],util:[6,11],context_processor:18,whether:1,upstream:[11,7],veri:[12,8],ticket:8,fernandoacorreia:3,dbname:16,tri:3,osi:12,simplepag:3,magic:11,hour:2,did:8,button:11,list:[12,11,18,13,3],mild:5,"try":[6,11,8,2,19],item:[6,7],larg:[11,5,2],email:[10,13],team:[0,2,4],small:[11,16,2,3],deepthawtz:3,servic:[16,5,8],pleas:[11,5,7,19],prevent:7,impli:1,base_handl:5,id_:[],client:7,cfg:13,seper:5,sync:11,design:[12,5,15,2,3],download:[16,13],odd:12,click:[11,16],saegebarth:4,obrist:4,even:[11,2,13],index:[15,0,7],what:[5,6,7,8,11,15],package_releas:12,power:4,compar:6,preserv:11,sun:3,section:[11,13],burch:4,abl:[0,16],remain:15,edcrypt:3,current:[6,3],"__builtins__":11,version:[16,8,18],stickpeopl:16,"new":[0,16,2,5,8,11,13],net:8,ever:[6,0],method:[5,3,12,8,9,11],told:13,email_subject_prefix:13,hasn:7,full:[2,10],themselv:8,urliz:[],kwadrat:3,gener:[12,11,8],never:[16,2],remeb:16,onli:[11,7,3],here:[6,12,7,11,16],errorlist:[],let:[6,5,2,19],committ:11,ubuntu:[16,8,19,13],path:[16,13],along:11,dorn:4,modifi:[11,3,1],sinc:[11,0,8,2,15],valu:[5,2],launchpad:[0,6,7,15,19,13],box:7,great:11,purpos:[15,1],error_class:[],ahead:11,invit:2,brilliant:11,mezzanin:3,memcach:10,restrict_grid_editor:7,jame:4,amount:[7,8],pick:11,action:1,extrem:0,chang:[11,5,7,16,13],guilti:11,portabl:2,overrid:[],googletorp:3,via:[11,15,16],firefox:[11,8],clark:4,extra:15,tweak:[16,13],app:[0,17,18,3,5,6,8,15],enterprisedb:16,prefer:16,apt:[16,19,13],mitchel:4,ask:[12,11,2],api:[0,18,3,5,6,8,12],org:[12,7,13,3],instal:[0,16,2,3,7,8,10,11,19,13],txt:[19,13],memor:11,select:11,from:[0,16,2,1,5,7,8,10,11,13],describ:[11,5,15],would:[11,5,7,8],commun:[11,0,8,4],"super":7,mistak:[11,2],regist:7,two:[5,2,18,7,8,11],coverag:[11,2],next:16,websit:[19,3],oppianmatt:3,live:6,handler:[11,0,8,5],alibrahim:3,usr:16,python26:13,recommend:13,taken:8,scope:[6,11],md5:16,checkout:11,until:5,more:[16,2,6,7,8,11],sort:[6,7],plug:15,registr:7,python:[0,16,2,3,4,6,7,8,10,11,12,13,14,15,17,19],peopl:[8,2],mock:8,relat:[11,15,19],line:[11,8,19,13,16],notic:1,start_dat:3,grief:[8,2],pgdata:16,holm:4,train:16,accept:[11,5,8],rabbit:0,particular:[12,11,17,1],known:3,moin:[],herebi:1,effort:[11,8,2],easiest:11,starter:[11,10],must:[11,5,7],paltman:3,account:[11,13],join:2,sometim:19,aws_secret_access_kei:10,grant:1,fadeev:4,setup:[11,0,16,13],work:[5,2,6,7,8,11,15,19],puntenei:4,focu:2,dev:[16,19,13],histori:11,hardest:2,wors:11,obvious:8,can:[5,16,2,6,7,8,10,11,15,14,13,19],learn:[11,0,2,19],unread:11,root:[15,3],fetch:[6,0,11,5],def:5,problemat:7,control:[11,7,13],claim:1,loosen:16,prompt:13,unassign:11,kenneth:4,give:[16,19,13],process:2,sudo:[16,19,13],share:[11,10],indic:0,pg_config:19,topic:[12,11],can_edit_grid_el:7,critic:11,tag:6,tab:11,david:4,yet:6,huge:8,gcc:19,jpic:3,multipl:11,secur:16,rather:[12,11,16,2],anoth:[11,16],"9a1":3,d0ugal:4,classifi:12,georg:4,write:[16,2],how:[5,2,15,7,8,11,19],scale:5,anyon:2,low:11,env:13,reject:[11,5],answer:2,instead:[11,13],config:10,css:11,updat:[2,14],grown:12,product:[12,7,8,13,16],resourc:[18,3],alwai:[],evgeni:4,max:[],clone:[11,5,13],after:[11,8,2],spot:2,superus:13,duplic:[11,2],befor:11,mac:[11,8,10,13,16],pg_ctl:16,mad:8,package_refactor:15,mai:[12,13],end:11,data:[5,16,12,7,8,15,13],becom:[5,16,2],demonstr:2,man:4,repo:[0,3,4,5,6,7,8,10,11,15,18],github:[0,3,5,6,11,15,19,13],attempt:[11,5],practic:11,johnson:4,sit:2,explicit:[12,11],lost:2,my_packag:[],issu:[0,2,12,8,11,19],vasja:4,"switch":[11,2],prettifi:2,environ:[12,16,13],south:[],allow:[6,11,16,15],enter:[7,16],compare_vers:18,searchv2_build:10,order:[5,18],repo_fork:[5,3],undepend:11,origin:[11,15],ubernostrum:7,help:[6,11,7,2],gitblarg:5,improperlyconfigur:19,over:[6,11,7],move:4,zen:11,becaus:[6,12,7,11],"abstract":15,jacob:4,dougn:3,through:[15,2],packaginator_search_prefix:7,rememb:[11,2],gklein:3,dynam:12,brosner:3,restrict_package_editor:7,snippet:[11,15],style:15,group:[11,7],thank:[15,2],fit:1,brian:4,acdha:3,psycopg2:[16,19],fix:[11,2],jim:4,toolbelt:10,better:[11,5],tort:1,window:[11,8,19,13,16],html:[12,15],rapidli:3,stuart:4,audreyr:[0,4],katharin:4,therefor:[11,5,7,8],might:[11,5,8],pixel:11,atomlatestpackagesfe:[],yourid123:13,justinlilli:3,randal:4,them:[6,0,11,2,5],good:[6,0,8,2,11],"return":[5,18],thei:[8,2],handl:[5,7,2],spell:[11,2],handi:11,auth:[],number:5,modificationdatetimefield:[],framework:[6,0,11,3,12],facilit:2,safari:[11,8],studi:8,now:[11,5,16],discuss:11,introduct:[6,0],bryan:4,httplib:[6,0],libbz2:19,alex:[4,3],name:[5,15,7,16,11,19,13],zain:3,anyth:[11,3],edit:[15,7,16],simpl:[11,7,2],troubleshoot:[0,7,19,13],summarili:5,thraxil:3,robbin:4,supported_repo:5,easili:[6,0,2],mingw:[19,13],chri:4,each:[11,2,18],found:[11,19],polit:19,foord:13,meal:2,mean:2,barttc:3,domain:3,lfc:3,flaviu:4,datamigrationcon:4,replac:[6,0,13,12],individu:[11,2],hard:[11,15,8,2],continu:11,terrifi:5,realli:[8,2],meta:12,expect:[5,2],get_latest_version_numb:[],our:[6,11,8],fastforward:11,skot:4,todo:[15,10],event:[2,1],special:5,out:[11,7,16,2,1],variabl:[18,13],autocomplet:7,accomplish:11,network:2,opencomparison:[0,17,18,3,5,6,7,16,11,15,19,13],webservic:[0,7,3],miss:2,connect:[16,18,1],publish:1,categori:[6,3],packaginator_help_text:7,pypixmlrpc:[],daniel:[4,1],suitabl:[],rel:5,internet:12,uri:3,modelform:[],correct:[11,2],element:7,difficulti:11,shut:16,postgr:16,insid:13,empty_permit:[],migrat:13,systemwid:19,manipul:18,given:7,free:[11,1],standard:[15,10],quick:10,reason:[6,11],base:[3,18,7,16,11,13],clean:11,build_search:[],put:[11,5],can_edit_grid:7,setupscript:12,basi:11,reusabl:3,wai:[11,5,7,16,2],launch:8,vikingosegundo:3,advanc:[11,2,13],keep:[6,11,2],kerridge0:4,thing:[5,2,4,12,7,11],perhap:6,rais:5,place:[12,15,16,3],tamlyn:4,pg_hba:16,databas:[16,8,2,13],broken:[11,15,2],confus:2,neglect:2,end_dat:3,first:[11,16,2],oper:[12,8,13],softwar:[12,8,1,16],major:2,notifi:11,render:19,template_nam:[],feel:11,onc:16,independ:12,wast:2,yourself:[2,13],restrict:[7,1],date:[],instruct:[0,16,2,8,11,19,13,17],alreadi:16,dotcloud:9,"long":[8,2,14],degg:4,owner:16,stabl:[12,11,8,2],installed_app:3,open:[16,7,8,13],gregnewman:3,mix:11,auto_id:[],differ:11,repo_watch:[5,3],stuck:2,simihaian:4,associ:1,schenck:4,clean_slug:[],zerok:3,system:[5,3,6,8,12,15,13],least:2,stori:8,master:[11,10],too:[11,8,2],deploy:[0,16,2,10,9],tom:4,pacileo:4,item_descript:[],vgarvardt:3,conveni:[11,16],feincm:3,store:[6,0,16,15],listen:16,cach:[0,7],can_add_packag:7,assign:[11,15,7,2],option:[6,15,13],relationship:[],especi:8,tool:[0,3,4,6,7,8],hotel:2,setuptool:13,lower:[],someon:2,direct:4,part:[12,8,13],pars:12,submiss:11,happili:5,essenti:3,urchin_id:13,holder:1,than:[12,11,8,2,16],my_function_that_does_th:11,rss:18,git_blarg_data:5,wide:11,kind:1,john:4,item_titl:[],apiv2:15,apiv1:[15,18],provid:[0,1,2,3,4,5,6,7,8,9,11,15],seamlessli:15,exampl:[5,2,6,7,11,15,19,13,17],project:[0,16,2,3,4,5,6,7,8,11,12,19,13,18],"_my_special_funct":11,sens:[12,2],str:11,were:0,minut:2,search_funct:[],beginn:2,browser:[11,8,13],pre:13,"function":11,sai:[11,5,19],comput:13,db_type:[],framework_titl:[7,10],preston:4,arg:[],argument:[11,7],dash:[6,0],packag:[0,16,18,3,5,6,7,8,10,11,12,14,15,19],jtauber:3,pylon:12,have:[5,2,12,7,8,10,11,19,13],deliv:8,need:[5,4,6,7,16,10,11,19],requisit:13,django:[0,18,3,6,7,8,10,11,12,13],robertrv:3,sat:3,sell:1,caus:[7,8,19],jezdez:3,afraid:2,probabl:[7,19,13],bz2:19,lib:13,inform:[6,0],nolan:4,diverg:11,self:5,libpq:[16,19,13],port:16,note:[11,5,13],also:[11,7,16],maintain:[7,16],matthew:4,take:[11,7,16,14],which:[6,0,11],command:[0,7,16,11,14,13],farka:4,wonder:8,signup:11,channel:8,staggeringli:5,excit:6,begin:2,sure:[11,16,19],unless:2,get_db_prep_valu:[],django_oc:10,shall:1,track:8,object:[11,15,7],gridpackag:[],discov:2,most:[6,0,16,19],pypi_url:[7,3],abc:19,"_grid":15,sublicens:1,bsd:[12,8],why:[12,11,8],charg:1,tradit:6,simplic:2,don:[2,7,8,11,19,13],bzr:19,simplif:11,url:[15,7,18],doc:[12,11,2,18],clear:11,gather:3,request:[5,2,3,18,8,11],drive:2,fetch_metadata:5,doe:[0,7,8],hamper:8,github_url:[],realiz:8,basehandl:5,psycopg:16,dummymodel:15,brew:16,latest:[],someth:[2,7,8,11,19,13],awesom:8,wsgi:12,think:[6,11,8],show:[2,19],text:[5,7],random:10,stephrdev:3,loaddata:13,pkg:11,permiss:[11,7,1],hack:2,search_packages_autocomplet:[],longer:2,find:8,can_add_grid:7,submitt:11,cell:[],dougal:4,explicitli:[],layout:11,skyl:3,copyright:1,tastypi:18,havan:3,explain:[11,2],releas:7,restaur:2,"short":2,resubmit:2,dict:7,initdb:16,pypi_vers:3,folder:11,analyt:13,local:[11,16,13],hope:8,meant:10,count:2,spunagl:4,contribut:[11,0,7,8,2],variou:[9,13],get:[5,16,2,13,3,6,8,11,12,19,15],approv:12,like:[5,2,12,7,8,11,15,19],express:1,pypi:[0,18,3,6,7,12,15,13],soon:[6,2],regularli:11,cannot:19,tcp:16,notimpl:5,progress:15,liabl:1,incept:12,repo_descript:[5,3],requir:[11,7,18,13,19],target:5,ie9:[11,8],ie8:[11,8],irc:8,enabl:13,admin_url_bas:7,allman:4,possibl:[11,8,2],"public":[6,0],remot:11,bad:2,stupid:2,furnish:1,common:[15,8,2],contain:[],comma:5,where:11,jrothenbuhl:4,djangopackag:6,view:[11,5,2,18,15],wiki:[],set:[0,16,17,3,5,15,7,8,10,11,13],often:2,sep:3,organ:12,site_titl:10,touch:11,see:[5,2,7,11,19,13],respons:11,fail:[11,3],close:[11,8],weingarten:4,flavor:13,best:[11,2],gmail:4,statu:12,wire:15,extend:[15,0,7,13],correctli:15,pattern:[],review:11,kavli:4,particip:[5,3],label:11,figur:11,won:[7,8],outstand:11,between:[],"import":[11,5,7,2,19],awai:8,experi:11,across:11,attribut:5,dartdog:3,can_add_grid_packag:7,assumpt:7,can_delete_grid_packag:7,kei:[10,13],web:[6,0,12],screen:[6,8],javascript:8,subject:1,isol:11,cycl:8,job:[2,10],entir:[11,4],joe:13,item_pubd:[],solv:[6,0,5],homebrew:16,"_packag":15,come:[6,8,2,19],problem:[0,2,5,6,7,11,19,13],popul:[],verbos:11,both:7,is_lock:3,last:16,expos:18,admin:[7,10,13],ericflo:3,readili:2,contract:1,foreign:[],etc:16,load_dev_data:8,instanc:[5,7],context:[7,18],pinax:3,ntoll:3,improv:[6,8],login:[11,2],camara:4,com:[3,4,6,16,11,19,13],comment:11,slideshar:8,credit:0,simpli:8,jeff:4,schedul:10,unittest:11,sweep:11,insist:8,walk:2,mftdt:11,taylor:4,lukeman:3,jarmul:4,deploi:10,shortag:11,diff:11,trust:16,elementform:[],pycon:[8,2,4],damag:1,liabil:1,strong:7,user_id:[],asenchi:3,platform:[2,3],chrome:[11,8],know:[6,0,2,19],patch:7,three:8,empti:[5,3],implicit:11,compon:[18,3],whom:1,json:[7,3],newcom:[11,2],besid:8,blank:7,progenitor:6,gitblagapi:5,gridform:[],addit:[12,15,13],reissu:11,quickli:11,field:[12,5,18,15],mike:4,shy:2,annoy:5,delet:7,thousand:5,mikl:3,search:[0,7],google_code_url:[],ani:[5,2,1,7,8,11],assert:11,loudli:2,understand:2,togeth:11,cun:11,repetit:2,aws_storage_bucket_nam:10,those:[5,16,3,7,8,11],fossil:5,"case":[7,8],highest:18,main:[16,18,13],look:2,blip:8,plain:[],secret_kei:[10,13],properti:7,harder:2,sourceforg:[6,0],heroku_shared_postgresql_gold:10,gisl:4,defin:18,"while":[11,7,8,2,19],volin:4,nate:4,abov:1,can_delete_grid_featur:7,fun:2,fixtur:[6,8],everyon:2,loop:15,audrei:[4,1],earli:2,stop:16,pyramid:[7,2],readi:[11,16],tabl:[0,2],henc:2,non:[11,2],fiedler:4,activ:[6,13],kwarg:[],against:7,conf:16,virtu:2,cook:6,kernal:18,sever:7,parent:4,gitcm:3,develop:[0,16,2,3,4,5,12,8,11,19,13,18],welcom:0,author:1,parti:8,sendgrid:10,belong:11,audienc:12,same:[11,7,8],havoc:7,member:2,binari:16,when:[11,5,16,2],complex:11,lazy_profil:18,document:[0,2,1,3,5,8,18],start:[11,7,8,2,16],higher:13,week:3,ball:4,http:[16,3,6,7,8,11,12,19,13],pg_env:16,utf8:16,rsslatestpackagesfe:[],permit:1,hang:[11,2],effect:8,dai:[11,2],get_or_create_packag:[],fruit:11,initi:11,warranti:1,mani:[0,7],distutil:[12,13],stack:10,pydanni:[11,0,8,4,3],recent:19,launchpad_act:[7,13],"break":11,noninfring:1,appropri:[7,19],moder:[],gitblargapi:5,scenario:16,philo:3,markup:19,reliabl:2,well:[6,0,8,3,5],inherit:[],person:[11,1],without:[11,15,2,1],shortli:[11,8],thi:[0,1,2,3,4,5,12,7,8,10,11,15,14,13,16,18,19],choos:16,cedar:10,everyth:[8,13],tast:8,spend:[8,2,19],propos:11,package_displai:15,bottom:13,identifi:[6,0,8],just:[5,2,12,8,11,15],less:12,sound:[5,2],scalarvalu:19,remov:15,rest:[7,18],get_db_prep_sav:[],unmaintain:2,package_extend:[15,7],world:8,createsuperus:13,volunt:19,skill:8,templat:[15,7,18],aws_access_key_id:10,languag:[12,3],christoph:4,far:11,task:[5,2],prefix:7,password:16,easi:[6,2,10],andrii:4,interfer:2,copi:1,grid_packag:[],had:[0,2],jona:4,littl:13,add:[5,6,7,8,10,11,15,13],cleanup:11,searchv2:18,url_for_repo:[],appli:[7,16],can_add_grid_featur:7,els:[11,8,13],point:[7,18,13],save:2,modul:[12,0,19,18],match:11,build:[13,4,3],bin:13,applic:[12,18,3],get_db_prep_lookup:[],around:2,format:3,read:[5,8,3],agnost:3,ariddel:3,load:[19,13],regard:15,period:2,test:[0,2,5,7,8,10,11,17],reitz:4,grid:[6,11,7,18,3],mon:3,repo_url:[7,3],somewher:16,bit:[12,18,13],taijala:4,bitbucket_url:[],gridpackageform:[],licens:[12,0,1],basemodel:[],knock:2,stuff:2,success:8,specif:[2,6,7,11,12,13],whitespac:11,should:[11,16,2,13],noth:11,collect:[],"boolean":[],necessari:[5,2],singl:[11,5],httpdss:3,popular:[6,0],seo:[],repo_commit:3,manag:[0,17,18,3,5,8,10,11,14,13],love:[8,4],www:[6,12,8,13,16],right:[11,5,16,1],sprinter:2,substanti:1,captur:15,github_account:[],linux:[11,10,13,19],some:[6,11,8,2,13],back:11,beshrkayali:3,launchpad_cache_dir:7,sampl:[15,8,10,13],authent:16,createsit:10,syncdb:13,sprint:2,server:[13,16,2,10,4],librari:12,distribut:1,virtualenv:[8,13],freez:2,turbogear:12,guid:15,buildout:[8,19],package_updat:[10,14],accommod:7,assum:[8,18],listen_address:16,preliminari:11,pep:11,per:[7,19,13],shentonfreud:3,usernam:13,pylucid:3,exit:16,createdb:16,condit:[7,1],unbeliev:7,peg:11,pgdownload:16,localhost:16,refer:[0,7,18,3],machin:7,core:[11,8,18,4],github_api_secret:10,who:[7,2],run:[17,8,10,11,13,2],win:16,dummyform:15,importerror:19,highest_vers:18,whose:5,night:2,usag:[13,3],brutass:3,host:[6,5,7,8,16],grid_item:15,worri:11,promot:10,repositori:[],fulli:6,can_edit_grid_featur:7,can_edit_packag:7,slug:3,panel:13,sunoano:3,comparison:[6,0,8,3],about:[6,5,8,11],postgresql:[0,8,16,10,19,13],coupl:[15,16],column:[12,16],absolute_url:3,marc:4,plai:6,page:[15,0,8,2,3],pgadmin:16,dinner:2,regular:11,done:[11,15,8,2],carruth:4,ajax:8,commit:11,processor:7,block:15,repair:6,feed:[17,18],own:[12,11,13],real:[7,10],init:16,inlin:15,lastli:16,easy_instal:13,mingw32:13,brander:4,down:[16,2],pair:2,been:[12,7,19],obtain:1,contributor:[0,2,1,4,16,13],side:[],lesson:[0,2],stall:2,error:[2,19],your:[5,2,7,16,10,11,19,13],merg:[11,1],consist:18,git:[11,5,10,13],deal:[5,1],version2:18,few:3,aren:11,packageform:15,execut:[16,19],support:[0,5,6,7,8,19,13],question:2,secret:13,submit:[11,2,19],custom:[12,7,10,13],avail:18,szilveszt:4,heroku:[9,10,13],much:[15,5,2],interfac:[15,16],includ:[5,1,6,7,9,13],lot:[16,8,2],suit:[11,17,7,2],"var":16,repo_nam:5,package_nam:[],stage:11,third:8,fork:[11,5],svn:5,dealt:15,creation:[],tracker:[11,2],local_set:[7,13],form:[15,7,18,3],enough:11,label_suffix:[],intend:12,domin:12,python27:13,bitbucket:[6,0,7,15],weight:[],yeah:2,conserv:2,link:11,measur:[],atom:[11,18],compil:[19,13],uni:3,"true":7,bug:11,faster:2,info:11,pull:[11,5,7,8,2],succe:11,made:[11,18],utf:3,happen:8,reload:16,"default":[6,7,16],access:[16,19],social:3,displai:18,distract:2,tell:2,record:11,below:11,brubak:4,limit:[11,3,1],default_from_email:13,foreignkei:15,site:[16,3,6,7,8,13],otherwis:1,chimpymik:3,unrel:11,version1:18,care:16,brittl:[6,8],model:[11,5,7,18,15],caught:19,featur:[6,11,7,3],creat:[16,3,7,8,10,11,19,13],"int":5,dure:[6,12,2],futur:[6,8],doesn:[5,8,2,19],fellow:8,"char":[],deem:11,exist:[12,2],file:[16,1,18,8,11,13],pip:[19,13],fussi:13,eric:4,kurinni:4,tricki:7,packagin:[],peter:4,googl:[6,5,8,13],want:[0,2,5,6,7,8,11],dummi:15,xyz:15,titl:3,user:[11,7,16,18],socket:16,tip:11,detail:[6,11,15],scrape:[6,8],orient:2,tight:15,finish:11,other:[1,16,2,3,4,8,19,13],make:[5,16,2,6,7,8,10,11,12,19,13],branch:[11,15],endif:7,you:[0,16,2,5,6,7,8,10,11,12,14,13,19],title_plur:3,nice:[16,8],tmp:7,slurper:18,michael:13,determin:[11,7,18],gigabyt:5,osx:16,actual:11,lucid:13,time:[5,2,7,8,11,14,19],creationdatetimefield:[],pypi_download:3,"class":15,djangocon:[2,4],rhouse2:3,log:[11,16,10],consid:16,sql:10,maicki:3,formal:[6,8],unplug:15,debian:8,stai:2,reduc:11,warn:[15,7,14],hellp:3,haplo:3,leav:[6,7],lead:[2,4],furthermor:11,directori:[5,13],merengu:3,djpcm:3,descript:3,gitblarglib:5,rule:11,taavi:4,portion:1,featureform:[],south_field_tripl:[],adam:4,scare:0,check:[11,5,7],push:[11,10],profil:[7,18,3],chron:10,avoid:2,resource_uri:3},objtypes:{"0":"py:module","1":"py:function"},titles:["Welcome to OpenComparison’s documentation!","License","Lessons Learned","Webservice API","Team","Repo Handler API","Introduction","Settings","FAQ","Deployments","Heroku","Contributing","PyPI Issues","Installation","Management Commands","Package Extenders","PostgreSQL setup instructions for new contributors","Testing Instructions","Development reference documentation","Troubleshooting"],objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},filenames:["index","license","lessons_learned","api_docs","contributors","repo_handlers","introduction","opencomparison_settings","faq","deployment/index","deployment/heroku","contributing","pypi_issues","install","management_commands","package_extenders","postgresql_contributor_instructions","testing_instructions","reference","troubleshooting"]})PKt½B¦»›ÖFÖF!packaginator-latest/api_docs.html Webservice API — OpenComparison documentation

Webservice API¶

This is the API documentation for OpenComparison. It is designed to be language and tool agnostic.

API Usage¶

The current API is limited to read-only GET requests. Other HTTP methods will fail. Only JSON is provided

API Reference¶

Representation Formats¶

Representation formats

  • JSON.
  • UTF-8.

Base URI¶

URI Resource Methods
<http-my-domain.com>/api/v1/ Root GET

URIs¶

URI Resource Methods
/category/ Category list GET
/category/{slug}/ Category GET
/grid/ Grid list GET
/grid/{slug}/ Grid GET
/grid/{slug}`/packages`_/ Grid Packages list GET
/grid-of-the-week/ Featured Grid list GET
/grid-of-the-week/{slug}/ Featured Grid GET
/package/ Package list GET
/package/{slug}/ Package GET
/package-of-the-week/ Featured Package list GET
/package-of-the-week/{slug}/ Featured Package GET

Resources¶

Category¶

Representation:

{
    created: "Sat, 14 Aug 2010 19:47:52 -0400"
    description: "Small components used to build projects. An app is anything that is installed by placing in settings.INSTALLED_APPS."
    modified: "Sat, 28 Aug 2010 11:20:36 -0400"
    resource_uri: "/api/v1/category/apps/"
    slug: "apps"
    title: "App"
    title_plural: "Apps"
}

Grid¶

Representation:

{
    absolute_url: "/grids/g/cms/"
    created: "Sat, 14 Aug 2010 20:12:46 -0400"
    description: "This page lists a few well-known reusable Content Management System applications for Django and tries to gather a comparison of essential features in those applications."
    is_locked: false
    modified: "Sat, 11 Sep 2010 14:57:16 -0400"
    packages: [
        "/api/v1/package/django-cms/"
        "/api/v1/package/django-page-cms/"
        "/api/v1/package/django-lfc/"
        "/api/v1/package/merengue/"
        "/api/v1/package/mezzanine/"
        "/api/v1/package/philo/"
        "/api/v1/package/pylucid/"
        "/api/v1/package/django-gitcms/"
        "/api/v1/package/django-simplepages/"
        "/api/v1/package/djpcms/"
        "/api/v1/package/feincms/"
    ]
    resource_uri: "/api/v1/grid/cms/"
    slug: "cms"
    title: "CMS"
}

Grid-of-the-week¶

Representation:

{
    absolute_url: "/grids/g/cms/"
    created: "Sun, 15 Aug 2010 01:36:59 -0400"
    end_date: "22 Aug 2010"
    modified: "Sun, 15 Aug 2010 01:36:59 -0400"
    resource_uri: "/api/v1/grid-of-the-week/cms/"
    start_date: "15 Aug 2010"
}

Package¶

Representation:

{
    absolute_url: "/packages/p/pinax/"
    category: "/api/v1/category/frameworks/"
    created: "Mon, 16 Aug 2010 23:25:16 -0400"
    grids: [
        "/api/v1/grid/profiles/"
        "/api/v1/grid/social/"
        "/api/v1/grid/this-site/"
    ]
    modified: "Sun, 12 Sep 2010 17:02:10 -0400"
    participants: "pinax,brosner,jtauber,jezdez,ericflo,gregnewman,pydanny,edcrypt,paltman,dougn,alex,vgarvardt,alibrahim,lukeman,shentonfreude,jpic,httpdss,mikl,empty,brutasse,kwadrat,sunoano,robertrv,stephrdev,justinlilly,deepthawtz,skyl,googletorp,maicki,havan,zerok,hellp,asenchi,haplo,chimpymike,beshrkayali,zain,bartTC,ntoll,fernandoacorreia,oppianmatt,dartdog,gklein,acdha,ariddell,vikingosegundo,thraxil,rhouse2"
    pypi_downloads: 0
    pypi_url: "http://pypi.python.org/pypi/Pinax"
    pypi_version: "0.9a1"
    repo: "/api/v1/repo/1/"
    repo_commits: 0
    repo_description: "a Django-based platform for rapidly developing websites"
    repo_forks: 184
    repo_url: "http://github.com/pinax/pinax"
    repo_watchers: 913
    resource_uri: "/api/v1/package/pinax/"
    slug: "pinax"
    title: "Pinax"
}

Package-of-the-week¶

Representation:

{
    absolute_url: "/packages/p/django-uni-form/"
    created: "Sun, 15 Aug 2010 01:36:38 -0400"
    end_date: "15 Aug 2010"
    modified: "Mon, 16 Aug 2010 23:54:36 -0400"
    resource_uri: "/api/v1/package-of-the-week/django-uni-form/"
    start_date: "14 Aug 2010"
}

Project Versions

Table Of Contents

Previous topic

Repo Handler API

Next topic

Lessons Learned

This Page

PKt½B( o›à_à_%packaginator-latest/contributing.html Contributing — OpenComparison documentation

Contributing¶

Setup¶

Fork on GitHub¶

Before you do anything else, login/signup on GitHub and fork OpenComparison from the GitHub project.

Clone your fork locally¶

If you have git-scm installed, you now clone your git repo using the following command-line argument where <my-github-name> is your account name on GitHub:

git clone git@github.com:<my-github-name>/opencomparison.git

Installing OpenComparison¶

Follow our detailed installation instructions. Please record any difficulties you have and share them with the OpenComparison community via our issue tracker.

Issues!¶

The list of outstanding OpenComparison feature requests and bugs can be found on our on our GitHub issue tracker. Pick an unassigned issue that you think you can accomplish, add a comment that you are attempting to do it, and shortly your own personal label matching your GitHub ID will be assigned to that issue.

Feel free to propose issues that aren’t described!

Tips¶

  1. starter labeled issues are deemed to be good low-hanging fruit for newcomers to the project, Django, or even Python.
  2. doc labeled issues must only touch content in the docs folder.

Setting up topic branches and generating pull requests¶

While it’s handy to provide useful code snippets in an issue, it is better for you as a developer to submit pull requests. By submitting pull request your contribution to OpenComparison will be recorded by Github.

In git it is best to isolate each topic or feature into a “topic branch”. While individual commits allow you control over how small individual changes are made to the code, branches are a great way to group a set of commits all related to one feature together, or to isolate different efforts when you might be working on multiple topics at the same time.

While it takes some experience to get the right feel about how to break up commits, a topic branch should be limited in scope to a single issue as submitted to an issue tracker.

Also since GitHub pegs and syncs a pull request to a specific branch, it is the ONLY way that you can submit more than one fix at a time. If you submit a pull from your master branch, you can’t make any more commits to your master without those getting added to the pull.

To create a topic branch, its easiest to use the convenient -b argument to git checkout:

git checkout -b fix-broken-thing
Switched to a new branch 'fix-broken-thing'

You should use a verbose enough name for your branch so it is clear what it is about. Now you can commit your changes and regularly merge in the upstream master as described below.

When you are ready to generate a pull request, either for preliminary review, or for consideration of merging into the project you must first push your local topic branch back up to GitHub:

git push origin fix-broken-thing

Now when you go to your fork on GitHub, you will see this branch listed under the “Source” tab where it says “Switch Branches”. Go ahead and select your topic branch from this list, and then click the “Pull request” button.

Here you can add a comment about your branch. If this in response to a submitted issue, it is good to put a link to that issue in this initial comment. The repo managers will be notified of your pull request and it will be reviewed (see below for best practices). Note that you can continue to add commits to your topic branch (and push them up to GitHub) either if you see something that needs changing, or in response to a reviewer’s comments. If a reviewer asks for changes, you do not need to close the pull and reissue it after making changes. Just make the changes locally, push them to GitHub, then add a comment to the discussion section of the pull request.

Pull upstream changes into your fork regularly¶

OpenComparison is advancing quickly. It is therefore critical that you pull upstream changes from master into your fork on a regular basis. Nothing is worse than putting in a days of hard work into a pull request only to have it rejected because it has diverged too far from master.

To pull in upstream changes:

git remote add upstream https://github.com/opencomparison/opencomparison.git
git fetch upstream

Check the log to be sure that you actually want the changes, before merging:

git log upstream/master

Then merge the changes that you fetched:

git merge upstream/master

For more info, see http://help.github.com/fork-a-repo/

How to get your pull request accepted¶

We want your submission. But we also want to provide a stable experience for our users and the community. Follow these rules and you should succeed without a problem!

Run the tests!¶

Before you submit a pull request, please run the entire OpenComparison test suite via:

python manage.py test --settings=settings.test

The first thing the core committers will do is run this command. Any pull request that fails this test suite will be rejected.

If you add code/views you need to add tests!¶

We’ve learned the hard way that code without tests is undependable. If your pull request reduces our test coverage because it lacks tests then it will be rejected.

For now, we use the Django Test framework (based on unittest).

Also, keep your tests as simple as possible. Complex tests end up requiring their own tests. We would rather see duplicated assertions across test methods then cunning utility methods that magically determine which assertions are needed at a particular stage. Remember: Explicit is better than implicit.

Don’t mix code changes with whitespace cleanup¶

If you change two lines of code and correct 200 lines of whitespace issues in a file the diff on that pull request is functionally unreadable and will be rejected. Whitespace cleanups need to be in their own pull request.

Keep your pull requests limited to a single issue¶

OpenComparison pull requests should be as small/atomic as possible. Large, wide-sweeping changes in a pull request will be rejected, with comments to isolate the specific code in your pull request. Some examples:

  1. If you are making spelling corrections in the docs, don’t modify the settings.py file (pydanny is guilty of this mistake).
  2. Adding a new repo handler must not touch the Package model or its methods.
  3. If you are adding a new view don’t ‘cleanup‘ unrelated views. That cleanup belongs in another pull request.
  4. Changing permissions on a file should be in its own pull request with explicit reasons why.

Follow PEP-8 and keep your code simple!¶

Memorize the Zen of Python:

>>> python -c 'import this'

Please keep your code as clean and straightforward as possible. When we see more than one or two functions/methods starting with _my_special_function or things like __builtins__.object = str we start to get worried. Rather than try and figure out your brilliant work we’ll just reject it and send along a request for simplification.

Furthermore, the pixel shortage is over. We want to see:

  • package instead of pkg
  • grid instead of g
  • my_function_that_does_things instead of mftdt

Test any css/layout changes in multiple browsers¶

Any css/layout changes need to be tested in Chrome, Safari, Firefox, IE8, and IE9 across Mac, Linux, and Windows. If it fails on any of those browsers your pull request will be rejected with a note explaining which browsers are not working.

How pull requests are checked, tested, and done¶

First we pull the code into a local branch:

git remote add <submitter-github-name> git@github.com:<submitter-github-name>/opencomparison.git
git fetch <submitter-github-name>
git checkout -b <branch-name> <submitter-github-name>/<branch-name>

Then we run the tests:

python manage.py test

We finish with a non-fastforward merge (to preserve the branch history) and push to GitHub:

git checkout master
git merge --no-ff <branch-name>
git push upstream master
PKt½B$owäŒ,Œ,!packaginator-latest/genindex.html Index — OpenComparison documentation

Project Versions

This Page

PKt½BÆ&è?ä<ä<&packaginator-latest/repo_handlers.html Repo Handler API — OpenComparison documentation

Repo Handler API¶

Adding a new repo system like Github in OpenComparison is a relatively straightforward task. You need to provide two things:

  1. Add a new repo handler in the apps.models.repos directory that follows the described API
  2. Add tests to check your work
  3. Document any special settings.
  4. Change the SUPPORTED_REPO to include the name of the new repo handler.

What if my target repo doesn’t support all the necessary fields?¶

Lets say you want to use GitBlarg, a new service whose API doesn’t provide the number of repo_watchers or participants. In order to handle them you would just set those values until such a time as GitBlarg would support the right data.

For example, as you can see in the apps.models.repos.base_handler.BaseHandler.fetch_metadata() method, the Package instance that it expects to see is a comma-seperated value:

def fetch_metadata(self, package):
    """ Accepts a package.models.Package instance:

            return: package.models.Package instance

        Must set the following fields:

            package.repo_watchers (int)
            package.repo_forks (int)
            package.repo_description (text )
            package.participants = (comma-seperated value)

    """
    raise NotImplemented()

So your code might do the following:

from GitBlargLib import GitBlargAPI
def fetch_metadata(self, package):

    # fetch the GitBlarg data
    git_blarg_data = GitBlargAPI.get(package.repo_name())

    # set the package attributes
    package.repo_watchers = 0 # GitBlagAPI doesn't have this so we set to 0
    package.repo_forks = git_blarg_data.forks
    package.repo_description = git_blarg_data.note
    package.participants = u"" # GitBlagAPI doesn't have this so we set to an empty string

    return package

How about cloning GitBlarg’s repos so we can get a better view of the data?¶

The problem is that developers, designers, and managers will happily put gigabytes of data into a git/hg/svn/fossil/cvs repo. For a single project that doesn’t sound like much, but when you are dealing with thousands of packages in a OpenComparison instance the scale of the data becomes... well... terrifying. What is now a mild annoyance becomes a staggeringly large problem.

Therefore, pull requests on repo handlers that attempt to solve the problem this way will be summarily rejected.

Can I make a repo handler for Google Project Hosting?¶

Not at this time. Please read the FAQ.

PKt½Bzg=Æ"+"+$packaginator-latest/pypi_issues.html PyPI Issues — OpenComparison documentation

PyPI Issues¶

You may ask why the PyPI code is a bit odd in places. PyPI is an organically grown project and uses its own custom designed framework rather than the dominant frameworks that existed during its inception (these being Pylons, Django, TurboGears, and web.py). Because of this you get things like the API having in its package_releases() method an explicit license field that has been replaced by the less explicit list column in the very generic classifiers field. So we have to parse things like this to get a particular package’s license:

['Development Status :: 5 - Production/Stable', 'Environment :: Web Environment',
'Framework :: Django', 'Intended Audience :: Developers', 'License :: OSI Approved
:: BSD License', 'Operating System :: OS Independent', 'Programming Language ::
Python', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP ::
Dynamic Content', 'Topic :: Internet :: WWW/HTTP :: WSGI', 'Topic :: Software
Development :: Libraries :: Application Frameworks', 'Topic :: Software
Development :: Libraries :: Python Modules']

The specification is here and this part of it just makes no sense to me:

http://docs.python.org/distutils/setupscript.html#additional-meta-data

Project Versions

Previous topic

Management Commands

Next topic

Team

This Page

PKt½Bmo½N½N"packaginator-latest/reference.html Development reference documentation — OpenComparison documentation

Development reference documentation¶

All of the modules listed are applications.

apiv1 - restful API¶

Restful api for opencomparison, based on django-tastypie (docs | pypi | repo).

This module consists of two components - module api and the resource definition module resources.

The api urls are exposed in project’s main urls.py file

apiv1.api¶

apiv1.resources¶

core - Kernal bits¶

core.fields¶

core.models¶

feeds - RSS and Atom feeds¶

This application defines RSS and Atom feeds that are made available to the users of OpenComparison

feeds.urls

feeds.feeds

grid - package grid app¶

Grid application - displays and manipulates the package grid

grid.views¶

grid.models¶

grid.forms¶

profiles - profiles app¶

Manages user profiles

profiles.models¶

profiles.context_processors¶

profiles.context_processors.lazy_profile(request)[source]¶

Returns context variables required by templates that assume a profile on each request

pypi - pypi app¶

All connection points with PyPI

pypi.slurper¶

pypi.versioning¶

pypi.versioning.compare_versions(version1, version2)[source]¶

Determines the order of versions

pypi.versioning.highest_version(versions)[source]¶

returns the highest version

searchv2 - searchv2 app¶

searchv2.views¶

PKt½BELl-¨(¨(,packaginator-latest/management_commands.html Management Commands — OpenComparison documentation

Management Commands¶

package_updater¶

You can update all the packages with the following command:

python manage.py package_updater

Warning: This can take a long, long time.

Project Versions

Table Of Contents

Previous topic

Testing Instructions

Next topic

PyPI Issues

This Page

PKt½B-_»åà"à"packaginator-latest/search.html Search — OpenComparison documentation

Search

Please activate JavaScript to enable the search functionality.

From here you can search these documents. Enter your search words into the box below and click "search". Note that the search function will automatically search for all of the words. Pages containing fewer words won't appear in the result list.

Project Versions

This Page

PKt½BæÂÊhj=j=<packaginator-latest/postgresql_contributor_instructions.html PostgreSQL setup instructions for new contributors — OpenComparison documentation

PostgreSQL setup instructions for new contributors¶

Mac¶

EnterpriseDB maintains a Mac OS X binary installer. First, download and install from here:

http://www.enterprisedb.com/products-services-training/pgdownload#osx

The package will take care of most of the PostgreSQL installation needs but it needs a couple of small tweaks.

Become the new postgres user that the package added:

sudo su - postgres

Source the environment file:

source pg_env.sh

Next, setup postgres to listen on TCP/IP sockets. Edit $PGDATA/postgresql.conf and listen_addresses is set to ‘localhost’.

Also, for a more convenient development server setup, it is nice to loosen the host-based security settings for localhost. Edit $PGDATA/pg_hba.conf and set the local and 127.0.0.1/32 lines to use “trust” authentication (change the last column from md5 to trust).

Lastly, apply the changes using pg_ctl reload and exit to log out as the postgres user.

Now you should be able to access postgres using psql -U postgres. Create a new database using createdb -U postgres opencomparison.

Another way¶

If you prefer to use Homebrew to install your software you can do this:

brew install postgresql
initdb /usr/local/var/postgres -E utf8
pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

Change the path used in initdb and other commands if you’d rather store your data files somewhere other than /usr/local/var/postgres.

Once the server is started, execute:

createdb opencomparison

Then you should be able to access the database you created via psql so:

psql --dbname opencomparison

Remeber to shut down the service when not in use:

pg_ctl -D /usr/local/var/postgres stop

The security defaults are already in place, and will allow a lot of access. This should never be considered a production-ready deployment scenario.

Ubuntu¶

Install Postgres 8.4 (the version used on the site, as of this writing) with:

sudo apt-get install postgresql-8.4 libpq-dev

Edit /etc/postgresql/8.4/main/postgresql.conf and make sure the listen line is either listen = 'localhost' or listen = '*' to listen on all interfaces.

Also, for a more convenient development server setup, it is nice to loosen the host-based security settings for localhost. Edit /etc/postgresql/8.4/main/pg_hba.conf and set the local and 127.0.0.1/32 lines to use “trust” authentication (change the last column from md5 to trust).

Apply those changes with /etc/init.d/postgresql-8.4 reload.

Lastly, create a new database using createdb -U postgres opencomparison.

Windows¶

EnterpriseDB maintains a Windows binary installer. First, download and install from here:

http://www.enterprisedb.com/products-services-training/pgdownload#windows

The package will take care of most of the PostgreSQL installation needs but it needs a couple of small tweaks.

Install the Windows port of psycopg2 from http://www.stickpeople.com/projects/python/win-psycopg/

Open pgAdmin III. Right-click on PostgreSQL 8.4 (localhost:5432) and choose Connect. Enter the Postgres user password.

Right-click Databases and choose New Database. Give it the name opencomparison and the owner postgres. Click OK.

Project Versions

Table Of Contents

Previous topic

Package Extenders

This Page

PKt½Bs—Üšææpackaginator-latest/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: f386e54a2bca37e0ab7080b88809d33d tags: fbb0d17656682115ca4d033fb2f83ba1 PKt½Buupackaginator-latest/objects.inv# Sphinx inventory version 2 # Project: OpenComparison # Version: # The remainder of this file is compressed using zlib. xÚ•’ÝjÄ …ïóB{iörß …B XÁ?Ô ›>ý&èB+ÒLîäø93Æ eÜILâªÙ7hÒį½)tNF¿'nÈû.ulÃôT‹#£Xàó_0kûÊÀ'“Ðq`ûûjògo$À,‡ g½%}ǼZ$ëW¯°hp“Ò)w6Á=›À!Fâɸ Jœhƒ.¢r[ÐéÊa/$>líÕ¸†mÍ© Uj3¨ÉükÅ”ñ+`:+9CLc‘vût³<íç³5RÍ~Ö±Ç/Uk)÷o,B“«7wƳϨâq‡g@“PKt½B=^óž0*0* packaginator-latest/license.html License — OpenComparison documentation

License¶

Copyright (c) 2010-2012 Audrey Roy, Daniel Greenfeld, and contributors.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Project Versions

Previous topic

Introduction

Next topic

Installation

This Page

PKt½Bg@¨>~5~5(packaginator-latest/troubleshooting.html Troubleshooting — OpenComparison documentation

Troubleshooting¶

How come no module named abc?¶

If you’re getting something like “ImportError: No module named abc”, you probably don’t have all the required packages installed. Try:

pip install -r requirements/project.txt

No module named psycopg2¶

If you’re getting something like “ImproperlyConfigured: Error loading psycopg2 module: No module named psycopg2” while accessing the website, you need to install the psycopg2 module. It has recently been added to requirements/project.txt (the line that says “psycopg2==2.4”). Try:

pip install -r requirements/project.txt

If you’re getting an error like “Error: pg_config executable not found.” while installing the module, you need the PostgreSQL development package. On Ubuntu, do:

sudo apt-get install libpq-dev

I can’t get it to work in buildout!¶

We don’t support buildout. See the faq.

bz2 not found¶

Install the appropriate systemwide package. For example, on Ubuntu do:

sudo apt-get install libbz2-dev

If this doesn’t work, please let us know (create an issue at http://github.com/opencomparison/opencomparison/issues)

Other problems¶

Don’t give up! Submit problems to http://github.com/opencomparison/opencomparison/issues. And don’t forget:

  1. Be polite! We are all volunteers.
  2. Spend the time to learn Github markup

Project Versions

Table Of Contents

Previous topic

Heroku

Next topic

FAQ

This Page

PKt½B2­ù€wIwI packaginator-latest/install.html Installation — OpenComparison documentation

Installation¶

Do everything listed in this section to get your site up and running locally. If you run into problems, see the Troubleshooting section.

Pre-requisites¶

Mac OS X 10.6¶

Download and install setuptools from http://pypi.python.org/pypi/setuptools. Setuptools gives you easy_install. Then run the following commands:

easy_install pip
pip install virtualenv

Ubuntu (10+ / Lucid or Higher)¶

Install the following:

sudo apt-get install python-setuptools python-dev libpq-dev
sudo easy_install pip
sudo pip install virtualenv

Windows 7¶

Download and install Python 2.6 or 2.7 using the Windows 32-bit installer from http://www.python.org/download/. Even if you’re on a 64-bit system, 32-bit is recommended (Michael Foord told me this).

Download and install setuptools from http://pypi.python.org/pypi/setuptools. Setuptools gives you easy_install.

Install MinGW from http://www.mingw.org/. Add the bin/ directory of your MinGW installation to your PATH environment variable (under Control Panel > System > Advanced system settings > Environment variables).

Create or open C:\Python26\Lib\distutils\distutils.cfg (Note: this may be inside the Python27 directory if you’re using Python 2.7). Add the following lines to the bottom of the file:

[build]
compiler=mingw32

Open up a command prompt. Install pip and virtualenv:

easy_install pip
pip install virtualenv

Other operating systems (including various Linux flavors)¶

No. See the faq.

Main instructions¶

These instructions install OpenComparison on your computer, using PostgreSQL and sample data.

Git clone the project and install requirements¶

Create a virtualenv, activate it, git clone the OpenComparison project, and install its requirements:

cd <installation-directory>
virtualenv env-oc
source env-oc/bin/activate
git clone git@github.com:opencomparison/opencomparison.git opencomparison
cd opencomparison
pip install -r requirements.txt

Set up server specific settings¶

Don’t change settings/base.py. Instead extend it as you see in settings/heroku.py. In the new file make the following specifications:

OPTIONAL! You can enable launchpad support in the local settings file. Launchpad’s dependencies can be a little fussy, so this will probably require some additional tweaking on your part:

LAUNCHPAD_ACTIVE = False

Add a Google Analytics code if you have one:

URCHIN_ID = "UA-YOURID123-1"

Setup your email settings:

DEFAULT_FROM_EMAIL = 'Your Name <me@mydomain.com>'
EMAIL_SUBJECT_PREFIX = '[Your Site Name] '

Change the SECRET_KEY setting in `local_settings.py` to your own secret key:

SECRET_KEY = "CHANGE-THIS-KEY-TO-SOMETHING-ELSE"

Set up your PostgreSQL database¶

Set up PostgreSQL and create a database as per the postgresql contributor instructions.

Make your database:

$ python manage.py syncdb --settings=settings.<my-custom>
$ python manage.py migrate --settings=settings.<my-custom>

OPTIONAL! Load some base data for development usage. This should not be loaded on the production site:

$ python manage.py loaddata --settings=settings.<my-custom>

Load the site in your browser¶

Run the development server:

python manage.py runserver --settings=settings.<my-custom>

Then point your browser to http://127.0.0.1:8000

Give yourself an admin account on the site¶

Create a Django superuser for yourself, replacing joe with your username/email:

python manage.py createsuperuser --username=joe --email=joe@example.com
PKt½Bñ_ÑAž9ž9*packaginator-latest/package_extenders.html Package Extenders — OpenComparison documentation

Package Extenders¶

Warning

This is a work in progress. Much of the work was done in the package_refactor branch.

What remains¶

  • Get apiv2 in place since apiv1 is broken hard

How it works¶

settings.PACKAGE_EXTENDERS = [
    {
        'form':'apps.dummy.forms.DummyForm',
        'model':'dummy.DummyModel'
        # form
        # model
        # grid_items
        # package_displays
    },
]

Originally OpenComparison packages just dealt with packages stored in the Python Package Index (PyPI) and with extra data provided by common repo systems like Bitbucket, Github and Launchpad. The purpose of this setting is to remove the tight coupling used for that and allow for Packages. This abstraction is designed to allow Python apps that follow a standard interface to be plugged seamlessly into OpenComparison, and unplugged - all without additional wiring in regards to settings, templates, and urls.

The interface system is described as follows:

forms¶

  • Can provide extra fields for use in the add/edit PackageForm
  • Can provide add/edit forms for use on Package detail page to capture extra data. e.g. examples.

models (optional)¶

Models can be assigned to related to package.models.Package:

class DummyModel(object):

    package = models.ForeignKey(Package)

templates¶

  • TODO provide style guide

  • TODO allow for inlines/blocks that can be looped through if named correctly. Sample

    • TODO xyz/snippets/_grid.html
    • TODO xyz/snippets/_package.html

urls¶

  • standard
  • Added via loop in root urls.py on settings.PACKAGE_EXTENDERS

views¶

  • standard
  • Added thanks to urls.py

Project Versions

Table Of Contents

Previous topic

Development reference documentation

Next topic

PostgreSQL setup instructions for new contributors

This Page

PKt½B|õæ'FFpackaginator-latest/faq.html FAQ — OpenComparison documentation

FAQ¶

General¶

How did Open Comparison get started?¶

  • In 2010 We realized there was no effective method for finding apps in the Django community.
  • After launch we realized it might be good to use the same software system for other package sets.

Is there an on-line community?¶

We’ll be opening an IRC channel shortly.

How can I contribute?¶

Read the page on contributions.

What browsers does Open Comparison support?¶

We do formal tests on Chrome, Safari, Firefox, IE8, and IE9.

How hard is it to add support for a new repo?¶

We’ve done a lot of work to make it as straightforward as possible. At PyCon 2011 we launched our formal Repo Handler API.

Installation¶

How come you don’t support buildout?¶

We have a very successful installation story for development and production hosting using virtualenv. While buildout is a wonderful tool we simply don’t want to spend the time supporting two installation methods. Therefore:

  • Don’t do it.
  • We won’t accept pull requests for it.

Why don’t you have install instructions for BSD? Or Debian? Or Windows XP?¶

If you are using something else besides Ubuntu, Mac OS X 10.6, or Windows 7, you obviously have mad skills. We have a very successful installation story for development on three very common operating systems and production hosting is assumed to be on Ubuntu. Trying to support more than those operating systems is a HUGE amount of time taken away from making improvements - especially since the core developers insist on testing everything themselves.

What happened to the fixtures?¶

The effort to support databases besides PostGreSQL was hampered for long time, all caused by a third party package we’re not going to identify that caused grief in the use of fixtures. This was a significant issue in Open Comparison, and used up a lot of development cycles.

So we use a Mock system of creating sample data in our tests and for running a development version of the site. To create some development data, just run:

python manage.py load_dev_data

Google Project Hosting¶

How come you don’t support Google Project Hosting?¶

They don’t have an API. We’ve filed ticket #5088 and we hope the nice people there can close it in the near future. Google is part of the open source world and we would love to support projects using their hosting services.

What about the Google Project Hosting Issue API?¶

Open Comparison doesn’t track a project’s tickets/issues.

What about just screen scraping their site?¶

Too brittle for our tastes. The Google Project hosting site uses a lot of JavaScript and AJAX to deliver content. Besides, we would like to think our fellow developers at Google will provide us with a really awesome, well-documented, stable API.

PKt½BÙ>—>(packaginator-latest/lessons_learned.html Lessons Learned — OpenComparison documentation

Lessons Learned¶

Some of these are common sense, and others we learned during the events in question.

DjangoCon 2010¶

  • For sprints, show up early the first day.
  • Stay in a hotel near the sprint. If you have to spend an hour going each way that’s up to 20% of sprint time you are wasting each day. If necessary, switch hotels.

PyCon 2011¶

Getting Sprinters¶

  • Mark easy stuff for beginners. After they knock out an issue or two the stuff they’ve learned lets them handle harder tasks.
  • Sit-down with each new contributor individually for at least 15 minutes to help them through the installation process. They get started much faster. you’ll spot the mistakes in your docs, and they’ll hang around longer.
  • If you see anyone during the sprints who looks lost or without a project, invite them to join you.
  • If you have a full sprint table and a non-sprinter is sitting with you get them to contribute something small. They go from being a distraction to a valued member of the team.
  • Go out for dinner at a fun restaurant the first night with just your team. On other nights try to keep meals short since long meals mean hours of missed sprint time.

Assigning Work¶

  • Assign issues in the issue tracker to specific people. No one should work a task unless they have had it assigned to them. This way you avoid duplication of effort.
  • Tell people if they get stuck on something for 30 minutes to ask questions. We are all beginners and the hardest problems often become simple spelling mistakes when you try and explain them.

Be conservative¶

You don’t want to stall people from doing the work they are trying to get done. So that means:

  • Keep the database as stable as possible during a large sprint.
  • Freeze the design during a sprint. Have designer-oriented people prettify neglected views e.g. the login page, server error pages.

Helping people get stuff done¶

  • If you are leading a sprint don’t expect to get any code done yourself. Your job is to facilitate other people to have fun hacking, learning, and getting things done.
  • Go around and ask questions of your sprinters periodically. People are often too shy to come up to you but if you go up to them they’ll readily ask for help.
  • Update your install documentation as your sprinters discover problems.
  • If you have new dependencies, let everyone know as soon and as loudly as possible.
  • Good documentation is as important as code. When people ask questions rather than just answering the question, walk them through the specific answer in your docs. If the answer doesn’t exist, document it yourself and have them help you write the answer.
  • Demonstrate coverage.py to the sprinters, show them how to write tests, and provide good test examples. Good test coverage will save everyone a lot of grief during development and deployment.
  • Have your code working on all major platforms with installation instructions for each platform. Your code on all platforms will be that much stable for it.
  • Have a portable drive with the dependencies for your project on it. You can never count on the network being reliable at a sprint.
  • If a beginning developer asks for help, try to get your advanced sprinters to answer the questions and possibly pair with them for a while.
  • When someone is working really hard and is trying to focus, run interference for them.

Pull Requests¶

  • Provide good and bad pull request examples.
  • Don’t be afraid of sounding stupid if you don’t understand someone’s pull request. If it confuses you it’s going to confuse newcomers even more and hence make your code unmaintainable. Remember that simplicity is a virtue and is one of the best things of projects like Python, Pyramid, and Flask.
  • Each time someone submits a pull request, ask them if they’ve run the full test suite. Yeah, it’s repetitive but they’ll thank you for it.
  • If someone submits a broken pull request, see if you can work out the issue with them. If the problem is not easily corrected, ask them to fix the problem and resubmit the pull request.

Project Versions

Table Of Contents

Previous topic

Webservice API

Next topic

Development reference documentation

This Page

PKt½BÑ’”Â33%packaginator-latest/introduction.html Introduction — OpenComparison documentation

Introduction¶

Ever want to know which is the most popular or well supported Python httplib replacement, web framework, or api tool? OpenComparison solves that problem for you! OpenComparison allows you to easily identify good apps, frameworks, and packages.

OpenComparison stores information on fetched packages and provides easy comparison tools for them. Public APIs include PyPI, Github, BitBucket, Launchpad, and perhaps soon SourceForge and Google Project Hosting.

The Site¶

A current example is live: http://www.djangopackages.com

Grids!¶

Grids let you compare packages. A grid comes with default comparison items and you can add features to get a more specific. We think comparison grids are an improvement over traditional tagging system because specificity helps make informed decisions.

Categories of Packages¶

The fixtures provide four categories: apps, frameworks, projects, and utilities.

What repo sites are supported?¶

  • Github
  • Bitbucket
  • Launchpad.

Google Project Hosting and Sourceforge are not fully supported!¶

Not yet!

The progenitor of OpenComparison, Django Packages was cooked up during Django Dash 2010. We wanted to keep the scope of our work reasonable. We’ll try to include more sites in the future. Here are some details:

  • Sourceforge needs needs to repair their API and then we can play.
  • Google’s lack of a formal API leaves us the option of screen-scraping their content. We’re not excited about introducing that sort of brittle activity into OpenComparison.

Project Versions

Table Of Contents

Previous topic

Welcome to OpenComparison’s documentation!

Next topic

License

This Page

PKt½B´“-“-$packaginator-latest/py-modindex.html Python Module Index — OpenComparison documentation

Python Module Index

a | c | f | g | p | s
 
a
apiv1
 
c
core
 
f
feeds
 
g
grid
 
p
profiles
    profiles.context_processors
pypi
    pypi.versioning
 
s
searchv2

Project Versions

This Page

PKt½BkuFòpp,packaginator-latest/_static/down-pressed.png‰PNG  IHDRóÿasRGB®ÎébKGDùC» pHYs × ×B(›xtIMEÚ -vF#ðIDAT8ËÍÒ!OAàïÚJ, ++@ I v¢bÿ@Wñ7F’ HNâ±ú# ‚4¡8Ì6¹4×6Tñ’MvvÞ¼7³»êœûöDs¿‡aóxâ1†U îq‚;<¦ˆÏ E¸Â-f)âºj%ßpˆo4xFà78G…>æ)â-ƒ ž ¡ÂEYm4%7YTk-¾–Q¶a–"NWAo-y†eqÒá¾,)â ÓÒYÓÑú´ptŽÐå½\hóq´Îím˜sÔz¦ìG]ÄNñ‡Òa…‡röç߶¨s^lã vh\î2Ù%ðâßãŽ0EeRvØIEND®B`‚PKt½B4µîî%packaginator-latest/_static/jquery.js/*! * jQuery JavaScript Library v1.4.2 * http://jquery.com/ * * Copyright 2010, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2010, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Sat Feb 13 22:33:48 2010 -0500 */ (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); (function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); PKt½BšhßÛkk$packaginator-latest/_static/down.png‰PNG  IHDRóÿasRGB®ÎébKGDùC» pHYs × ×B(›xtIMEÚ"ÅíU{ëIDAT8ËÍÒ¡NCAÐóÚJ, ++@ ™4>‡¨â/ÐUü’¤^,†~T&Ô3M^^^ÛPÅM6ÙÙ¹sïÌî*¥ôí‰RJ¿‡a)e¼GñÃ*ƒœàñ¹¡èW¸Å<"®«Fò ‡øFgÜã78G…>q ƒ†ÁOI¨p‘«‰:s“õAÕjñ5GÙ†yDœ®ƒ^+y†U:ép_%G§@D|ašÕ­O“£s„Æ(ïy¡M,"â¨Íím˜sÔx:÷£.b§@D|`–V˜åÙŸÛ²”²ÜÆìиÜe²KàÅ¿Ç/êG!‚ ™IEND®B`‚PKt½B' 5wú ú -packaginator-latest/_static/comment-close.png‰PNG  IHDRóÿa OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6Ž¶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yn…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛbKGDÿÿÿ ½§“ pHYs  šœtIMEÚ!â›ÈÝ,IDAT8Ëe’_HuÇ?Ïï}ßsŽž3ÍyòË•¶¦‹U2MvQÉÖŠFÔE¬.ŠÑÍÃÅ‚­ÄŠbÑE$DD­‹ËZF5b@QÌ"š:2§›š¦¾ïû{Ÿn.êsõåçû<_ø yî?ô½m÷²ýè·wV™ê@t£R`}Z íÄÐ_£# _=œá_@ÝËý ßw^óRë®·•%6gC-έ(K>ä| $„Éï{¯}