├── .gitignore ├── .gitmodules ├── Dockerfile ├── LICENSE.txt ├── README.md ├── app ├── gen_names.sh ├── manage.py ├── search │ ├── __init__.py │ ├── engine.py │ ├── static │ │ ├── URI.min.js │ │ ├── css │ │ │ ├── bootstrap.min.css │ │ │ └── jquery-ui.css │ │ ├── js │ │ │ ├── bootstrap.min.js │ │ │ ├── jquery-1.12.4.min.js │ │ │ └── jquery-ui.min.js │ │ └── main.js │ ├── templates │ │ └── index.html │ └── views.py └── uwsgi.ini ├── build.sh ├── cron.conf ├── crontab ├── nginx.conf ├── run.sh └── screenshot.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | .venv/ 83 | venv/ 84 | ENV/ 85 | 86 | # Spyder project settings 87 | .spyderproject 88 | 89 | # Rope project settings 90 | .ropeproject 91 | 92 | app/search/static/names.js 93 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "libc-database"] 2 | path = libc-database 3 | url = https://github.com/niklasb/libc-database 4 | branch = master 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM tiangolo/uwsgi-nginx-flask:python3.8 2 | 3 | # Remove sample application included in the base image. 4 | RUN rm /app/main.py /app/uwsgi.ini 5 | 6 | # Install packages 7 | # TODO: install zstd 8 | RUN apt-get update \ 9 | && apt-get install -y \ 10 | binutils \ 11 | cpio \ 12 | cron \ 13 | file \ 14 | jq \ 15 | rpm2cpio \ 16 | wget \ 17 | zstd \ 18 | && rm -rf /var/lib/apt/lists/* 19 | 20 | # Install cron job 21 | COPY crontab /etc/cron.d/libc-update 22 | RUN chmod 0644 /etc/cron.d/libc-update \ 23 | && touch /var/log/libcdb.log 24 | 25 | # Register cron to supervisor 26 | COPY cron.conf /etc/supervisor/conf.d/cron.conf 27 | 28 | # Copy application 29 | COPY app /app 30 | COPY libc-database /libc-database 31 | 32 | # Generate autocomplete symbols list 33 | RUN /app/gen_names.sh 34 | 35 | # nginx.conf of the base image aliases /static to /app/static. 36 | RUN ln -s /app/search/static /app/static 37 | # Enable download link 38 | COPY nginx.conf /etc/nginx/conf.d/download.conf 39 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2020 Yunjong Jeong 2 | 3 | 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: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | 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. 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # search-libc 2 | 3 | Web wrapper of [libc-database](https://github.com/niklasb/libc-database) 4 | 5 | ![screenshot](https://raw.githubusercontent.com/blukat29/search-libc/master/screenshot.png) 6 | 7 | ## Use existing Docker image 8 | 9 | docker pull blukat29/libc 10 | docker run -p 8080:80 -d blukat29/libc 11 | 12 | ## Run as Docker container 13 | 14 | git submodule update --init 15 | cd libc-database 16 | ./get all 17 | cd .. 18 | docker build -t libc:latest . 19 | docker run -p 31337:80 -it libc:latest 20 | 21 | ## Run in debug mode 22 | 23 | git submodule update --init 24 | cd libc-database 25 | ./get all 26 | cd .. 27 | cd app 28 | pip install Flask 29 | python manage.py 30 | -------------------------------------------------------------------------------- /app/gen_names.sh: -------------------------------------------------------------------------------- 1 | dbdir=/libc-database/db 2 | outfile=/app/search/static/names.js 3 | 4 | cat $dbdir/*.symbols \ 5 | | cut -d ' ' -f 1 \ 6 | | sort \ 7 | | uniq \ 8 | | awk ' \ 9 | BEGIN { print "var names = [" } 10 | { printf "\"%s\",\n", $1 } 11 | END { print "];" }' \ 12 | > $outfile 13 | wc -l $outfile 14 | -------------------------------------------------------------------------------- /app/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from search import app 4 | 5 | if __name__ == '__main__': 6 | app.run(host='0.0.0.0', port=31337, debug=True) 7 | -------------------------------------------------------------------------------- /app/search/__init__.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from .views import search_view 3 | 4 | app = Flask(__name__) 5 | app.register_blueprint(search_view) 6 | 7 | -------------------------------------------------------------------------------- /app/search/engine.py: -------------------------------------------------------------------------------- 1 | from subprocess import Popen, PIPE 2 | import os 3 | import re 4 | import operator 5 | 6 | info_re = re.compile(r'[^(]+\((.*)\)') 7 | ofs_re = re.compile(r'offset_([^\s]+) = 0x([0-9a-fA-F]+)') 8 | 9 | class Engine(object): 10 | 11 | def __init__(self, libcdb): 12 | self.libcdb = libcdb 13 | 14 | def _run_database_tool(self, name, args): 15 | program = os.path.abspath(os.path.join(self.libcdb, name)) 16 | argv = [program] + args 17 | 18 | p = Popen(argv, cwd=self.libcdb, stdout=PIPE, stderr=PIPE) 19 | out, err = p.communicate() 20 | if len(err) == 0: 21 | return out.decode('utf-8') 22 | else: 23 | return None 24 | 25 | def _find_database(self, query): 26 | 27 | args = [] 28 | for key, value in query.items(): 29 | args.append(key) 30 | args.append(value) 31 | 32 | found = self._run_database_tool('find', args) 33 | if not found: 34 | return [] 35 | 36 | libs = [] 37 | for line in found.splitlines(): 38 | m = info_re.match(line) 39 | if m: 40 | libs.append(m.group(1)) 41 | return libs 42 | 43 | def find(self, query): 44 | if len(query) == 0: 45 | return [] 46 | return self._find_database(query) 47 | 48 | def dump(self, lib, names=[]): 49 | default_names = ['system', 'open', 'read', 'write', 'str_bin_sh'] 50 | argv = [lib] + default_names + names 51 | 52 | dumped = self._run_database_tool('dump', argv) 53 | if not dumped: 54 | return None 55 | 56 | symbols = {} 57 | for line in dumped.splitlines(): 58 | m = ofs_re.match(line) 59 | if m: 60 | symbol = m.group(1) 61 | ofs = int(m.group(2), 16) 62 | symbols[symbol] = ofs 63 | 64 | symbols_list = sorted(symbols.items(), key=operator.itemgetter(1)) 65 | return symbols_list 66 | 67 | 68 | engine = Engine('../libc-database') 69 | -------------------------------------------------------------------------------- /app/search/static/URI.min.js: -------------------------------------------------------------------------------- 1 | /*! URI.js v1.18.5 http://medialize.github.io/URI.js/ */ 2 | /* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URITemplate.js */ 3 | (function(f,l){"object"===typeof module&&module.exports?module.exports=l():"function"===typeof define&&define.amd?define(l):f.IPv6=l(f)})(this,function(f){var l=f&&f.IPv6;return{best:function(g){g=g.toLowerCase().split(":");var k=g.length,b=8;""===g[0]&&""===g[1]&&""===g[2]?(g.shift(),g.shift()):""===g[0]&&""===g[1]?g.shift():""===g[k-1]&&""===g[k-2]&&g.pop();k=g.length;-1!==g[k-1].indexOf(".")&&(b=7);var m;for(m=0;mf;f++)if("0"===k[0]&&1f&&(k=h,f=l)):"0"===g[m]&&(q=!0,h=m,l=1);l>f&&(k=h,f=l);1=f&&h>>10&1023|55296),b=56320|b&1023);return e+=r(b)}).join("")}function z(b,e){return b+22+75*(26>b)-((0!=e)<<5)}function v(b,e,h){var g=0;b=h?p(b/700):b>>1;for(b+=p(b/e);455d&&(d=0);for(n=0;n=h&&l("invalid-input");w=b.charCodeAt(d++); 7 | w=10>w-48?w-22:26>w-65?w-65:26>w-97?w-97:36;(36<=w||w>p((2147483647-f)/g))&&l("overflow");f+=w*g;k=t<=c?1:t>=c+26?26:t-c;if(wp(2147483647/w)&&l("overflow");g*=w}g=e.length+1;c=v(f-n,g,0==n);p(f/g)>2147483647-a&&l("overflow");a+=p(f/g);f%=g;e.splice(f++,0,a)}return m(e)}function q(e){var h,g,f,k,a,c,d,n,t,w=[],q,m,A;e=b(e);q=e.length;h=128;g=0;a=72;for(c=0;ct&&w.push(r(t));for((f=k=w.length)&&w.push("-");f=h&&tp((2147483647-g)/m)&&l("overflow");g+=(d-h)*m;h=d;for(c=0;c=a+26?26:d-a;if(n= 0x80 (not a basic code point)","invalid-input":"Invalid input"},p=Math.floor,r=String.fromCharCode,B;x={version:"1.3.2",ucs2:{decode:b,encode:m},decode:h,encode:q,toASCII:function(b){return k(b,function(b){return y.test(b)?"xn--"+q(b):b})},toUnicode:function(b){return k(b,function(b){return E.test(b)?h(b.slice(4).toLowerCase()):b})}};if("function"== 10 | typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return x});else if(A&&C)if(module.exports==A)C.exports=x;else for(B in x)x.hasOwnProperty(B)&&(A[B]=x[B]);else f.punycode=x})(this); 11 | (function(f,l){"object"===typeof module&&module.exports?module.exports=l():"function"===typeof define&&define.amd?define(l):f.SecondLevelDomains=l(f)})(this,function(f){var l=f&&f.SecondLevelDomains,g={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ", 12 | bb:" biz co com edu gov info net org store tv ",bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ", 13 | ck:" biz co edu gen gov info net org ",cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ","do":" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ", 14 | es:" com edu gob nom org ",et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",hu:" 2000 agrar bolt casino city co erotica erotika film forum games hotel info ingatlan jogasz konyvelo lakas media news org priv reklam sex shop sport suli szex tm tozsde utazas video ", 15 | id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ","in":" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ", 16 | kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ", 17 | mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ", 18 | ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ", 19 | ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ", 20 | tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ", 21 | rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ", 22 | tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ", 23 | us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch "},has:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return!1; 24 | var k=f.lastIndexOf(".",b-1);if(0>=k||k>=b-1)return!1;var l=g.list[f.slice(b+1)];return l?0<=l.indexOf(" "+f.slice(k+1,b)+" "):!1},is:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1||0<=f.lastIndexOf(".",b-1))return!1;var k=g.list[f.slice(b+1)];return k?0<=k.indexOf(" "+f.slice(0,b)+" "):!1},get:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return null;var k=f.lastIndexOf(".",b-1);if(0>=k||k>=b-1)return null;var l=g.list[f.slice(b+1)];return!l||0>l.indexOf(" "+f.slice(k+ 25 | 1,b)+" ")?null:f.slice(k+1)},noConflict:function(){f.SecondLevelDomains===this&&(f.SecondLevelDomains=l);return this}};return g}); 26 | (function(f,l){"object"===typeof module&&module.exports?module.exports=l(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],l):f.URI=l(f.punycode,f.IPv6,f.SecondLevelDomains,f)})(this,function(f,l,g,k){function b(a,c){var d=1<=arguments.length,n=2<=arguments.length;if(!(this instanceof b))return d?n?new b(a,c):new b(a):new b;if(void 0===a){if(d)throw new TypeError("undefined is not a valid argument for URI"); 27 | a="undefined"!==typeof location?location.href+"":""}if(null===a&&d)throw new TypeError("null is not a valid argument for URI");this.href(a);return void 0!==c?this.absoluteTo(c):this}function m(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function z(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function v(a){return"Array"===z(a)}function h(a,c){var d={},b,t;if("RegExp"===z(c))d=null;else if(v(c))for(b=0,t=c.length;b]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;b.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/,parens:/(\([^\)]*\)|\[[^\]]*\]|\{[^}]*\}|<[^>]*>)/g};b.defaultPorts={http:"80",https:"443",ftp:"21", 32 | gopher:"70",ws:"80",wss:"443"};b.invalid_hostname_characters=/[^a-zA-Z0-9\.-]/;b.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src",audio:"src",video:"src"};b.getDomAttribute=function(a){if(a&&a.nodeName){var c=a.nodeName.toLowerCase();if("input"!==c||"image"===a.type)return b.domAttributes[c]}};b.encode=x;b.decode=decodeURIComponent;b.iso8859=function(){b.encode=escape;b.decode= 33 | unescape};b.unicode=function(){b.encode=x;b.decode=decodeURIComponent};b.characters={pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'", 34 | "%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}},urnpath:{encode:{expression:/%(21|24|27|28|29|2A|2B|2C|3B|3D|40)/ig,map:{"%21":"!","%24":"$","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"=","%40":"@"}},decode:{expression:/[\/\?#:]/g,map:{"/":"%2F","?":"%3F","#":"%23",":":"%3A"}}}};b.encodeQuery=function(a,c){var d=b.encode(a+"");void 0===c&&(c=b.escapeQuerySpace);return c?d.replace(/%20/g,"+"):d};b.decodeQuery=function(a,c){a+="";void 0===c&& 35 | (c=b.escapeQuerySpace);try{return b.decode(c?a.replace(/\+/g,"%20"):a)}catch(d){return a}};var r={encode:"encode",decode:"decode"},B,F=function(a,c){return function(d){try{return b[c](d+"").replace(b.characters[a][c].expression,function(d){return b.characters[a][c].map[d]})}catch(n){return d}}};for(B in r)b[B+"PathSegment"]=F("pathname",r[B]),b[B+"UrnPathSegment"]=F("urnpath",r[B]);r=function(a,c,d){return function(n){var t;t=d?function(a){return b[c](b[d](a))}:b[c];n=(n+"").split(a);for(var e=0, 36 | f=n.length;eb)return a.charAt(0)===c.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(b)||"/"!==c.charAt(b))b=a.substring(0,b).lastIndexOf("/");return a.substring(0,b+1)};b.withinString=function(a,c,d){d||(d={}); 47 | var e=d.start||b.findUri.start,f=d.end||b.findUri.end,h=d.trim||b.findUri.trim,g=d.parens||b.findUri.parens,q=/[a-z0-9-]=["']?$/i;for(e.lastIndex=0;;){var k=e.exec(a);if(!k)break;k=k.index;if(d.ignoreHtml){var l=a.slice(Math.max(k-3,0),k);if(l&&q.test(l))continue}for(var p=k+a.slice(k).search(f),l=a.slice(k,p),p=-1;;){var m=g.exec(l);if(!m)break;p=Math.max(p,m.index+m[0].length)}l=-1d.length)return this._parts.hostname;d=this._parts.hostname.length-this.tld(c).length-1;d=this._parts.hostname.lastIndexOf(".",d-1)+1;return this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");b.ensureValidHostname(a); 60 | !this._parts.hostname||this.is("IP")?this._parts.hostname=a:(d=new RegExp(m(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a));this.build(!c);return this};e.tld=function(a,c){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf("."),d=this._parts.hostname.substring(d+1);return!0!==c&&g&&g.list[d.toLowerCase()]?g.get(this._parts.hostname)||d:d}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(g&& 61 | g.is(a))d=new RegExp(m(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a);else throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");d=new RegExp(m(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(d,a)}else throw new TypeError("cannot set TLD empty");this.build(!c);return this};e.directory=function(a,c){if(this._parts.urn)return void 0=== 62 | a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var d=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,d)||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}d=this._parts.path.length-this.filename().length;d=this._parts.path.substring(0,d);d=new RegExp("^"+m(d));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=b.recodePath(a);this._parts.path= 63 | this._parts.path.replace(d,a);this.build(!c);return this};e.filename=function(a,c){if(this._parts.urn)return void 0===a?"":this;if("string"!==typeof a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this._parts.path.lastIndexOf("/"),d=this._parts.path.substring(d+1);return a?b.decodePathSegment(d):d}d=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&(d=!0);var e=new RegExp(m(this.filename())+"$");a=b.recodePath(a);this._parts.path=this._parts.path.replace(e,a);d?this.normalizePath(c): 64 | this.build(!c);return this};e.suffix=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this.filename(),e=d.lastIndexOf(".");if(-1===e)return"";d=d.substring(e+1);d=/^[a-z0-9%]+$/i.test(d)?d:"";return a?b.decodePathSegment(d):d}"."===a.charAt(0)&&(a=a.substring(1));if(d=this.suffix())e=a?new RegExp(m(d)+"$"):new RegExp(m("."+d)+"$");else{if(!a)return this;this._parts.path+="."+b.recodePath(a)}e&&(a=b.recodePath(a), 65 | this._parts.path=this._parts.path.replace(e,a));this.build(!c);return this};e.segment=function(a,c,d){var b=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),e=e.split(b);void 0!==a&&"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');f&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===c)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(v(c)){e=[];a=0;for(var h=c.length;a{}'"`^| \\]/;g.expand=function(b,f){var h=v[b.operator],k=h.named?"Named":"Unnamed",l=b.variables,q=[],m,y,u;for(u=0;y=l[u];u++)if(m=f.get(y.name),m.val.length){if(1 .ui-controlgroup-item { 243 | float: left; 244 | margin-left: 0; 245 | margin-right: 0; 246 | } 247 | .ui-controlgroup > .ui-controlgroup-item:focus, 248 | .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { 249 | z-index: 9999; 250 | } 251 | .ui-controlgroup-vertical > .ui-controlgroup-item { 252 | display: block; 253 | float: none; 254 | width: 100%; 255 | margin-top: 0; 256 | margin-bottom: 0; 257 | text-align: left; 258 | } 259 | .ui-controlgroup-vertical .ui-controlgroup-item { 260 | box-sizing: border-box; 261 | } 262 | .ui-controlgroup .ui-controlgroup-label { 263 | padding: .4em 1em; 264 | } 265 | .ui-controlgroup .ui-controlgroup-label span { 266 | font-size: 80%; 267 | } 268 | .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { 269 | border-left: none; 270 | } 271 | .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { 272 | border-top: none; 273 | } 274 | .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { 275 | border-right: none; 276 | } 277 | .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { 278 | border-bottom: none; 279 | } 280 | 281 | /* Spinner specific style fixes */ 282 | .ui-controlgroup-vertical .ui-spinner-input { 283 | 284 | /* Support: IE8 only, Android < 4.4 only */ 285 | width: 75%; 286 | width: calc( 100% - 2.4em ); 287 | } 288 | .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { 289 | border-top-style: solid; 290 | } 291 | 292 | .ui-checkboxradio-label .ui-icon-background { 293 | box-shadow: inset 1px 1px 1px #ccc; 294 | border-radius: .12em; 295 | border: none; 296 | } 297 | .ui-checkboxradio-radio-label .ui-icon-background { 298 | width: 16px; 299 | height: 16px; 300 | border-radius: 1em; 301 | overflow: visible; 302 | border: none; 303 | } 304 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, 305 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { 306 | background-image: none; 307 | width: 8px; 308 | height: 8px; 309 | border-width: 4px; 310 | border-style: solid; 311 | } 312 | .ui-checkboxradio-disabled { 313 | pointer-events: none; 314 | } 315 | .ui-datepicker { 316 | width: 17em; 317 | padding: .2em .2em 0; 318 | display: none; 319 | } 320 | .ui-datepicker .ui-datepicker-header { 321 | position: relative; 322 | padding: .2em 0; 323 | } 324 | .ui-datepicker .ui-datepicker-prev, 325 | .ui-datepicker .ui-datepicker-next { 326 | position: absolute; 327 | top: 2px; 328 | width: 1.8em; 329 | height: 1.8em; 330 | } 331 | .ui-datepicker .ui-datepicker-prev-hover, 332 | .ui-datepicker .ui-datepicker-next-hover { 333 | top: 1px; 334 | } 335 | .ui-datepicker .ui-datepicker-prev { 336 | left: 2px; 337 | } 338 | .ui-datepicker .ui-datepicker-next { 339 | right: 2px; 340 | } 341 | .ui-datepicker .ui-datepicker-prev-hover { 342 | left: 1px; 343 | } 344 | .ui-datepicker .ui-datepicker-next-hover { 345 | right: 1px; 346 | } 347 | .ui-datepicker .ui-datepicker-prev span, 348 | .ui-datepicker .ui-datepicker-next span { 349 | display: block; 350 | position: absolute; 351 | left: 50%; 352 | margin-left: -8px; 353 | top: 50%; 354 | margin-top: -8px; 355 | } 356 | .ui-datepicker .ui-datepicker-title { 357 | margin: 0 2.3em; 358 | line-height: 1.8em; 359 | text-align: center; 360 | } 361 | .ui-datepicker .ui-datepicker-title select { 362 | font-size: 1em; 363 | margin: 1px 0; 364 | } 365 | .ui-datepicker select.ui-datepicker-month, 366 | .ui-datepicker select.ui-datepicker-year { 367 | width: 45%; 368 | } 369 | .ui-datepicker table { 370 | width: 100%; 371 | font-size: .9em; 372 | border-collapse: collapse; 373 | margin: 0 0 .4em; 374 | } 375 | .ui-datepicker th { 376 | padding: .7em .3em; 377 | text-align: center; 378 | font-weight: bold; 379 | border: 0; 380 | } 381 | .ui-datepicker td { 382 | border: 0; 383 | padding: 1px; 384 | } 385 | .ui-datepicker td span, 386 | .ui-datepicker td a { 387 | display: block; 388 | padding: .2em; 389 | text-align: right; 390 | text-decoration: none; 391 | } 392 | .ui-datepicker .ui-datepicker-buttonpane { 393 | background-image: none; 394 | margin: .7em 0 0 0; 395 | padding: 0 .2em; 396 | border-left: 0; 397 | border-right: 0; 398 | border-bottom: 0; 399 | } 400 | .ui-datepicker .ui-datepicker-buttonpane button { 401 | float: right; 402 | margin: .5em .2em .4em; 403 | cursor: pointer; 404 | padding: .2em .6em .3em .6em; 405 | width: auto; 406 | overflow: visible; 407 | } 408 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { 409 | float: left; 410 | } 411 | 412 | /* with multiple calendars */ 413 | .ui-datepicker.ui-datepicker-multi { 414 | width: auto; 415 | } 416 | .ui-datepicker-multi .ui-datepicker-group { 417 | float: left; 418 | } 419 | .ui-datepicker-multi .ui-datepicker-group table { 420 | width: 95%; 421 | margin: 0 auto .4em; 422 | } 423 | .ui-datepicker-multi-2 .ui-datepicker-group { 424 | width: 50%; 425 | } 426 | .ui-datepicker-multi-3 .ui-datepicker-group { 427 | width: 33.3%; 428 | } 429 | .ui-datepicker-multi-4 .ui-datepicker-group { 430 | width: 25%; 431 | } 432 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, 433 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { 434 | border-left-width: 0; 435 | } 436 | .ui-datepicker-multi .ui-datepicker-buttonpane { 437 | clear: left; 438 | } 439 | .ui-datepicker-row-break { 440 | clear: both; 441 | width: 100%; 442 | font-size: 0; 443 | } 444 | 445 | /* RTL support */ 446 | .ui-datepicker-rtl { 447 | direction: rtl; 448 | } 449 | .ui-datepicker-rtl .ui-datepicker-prev { 450 | right: 2px; 451 | left: auto; 452 | } 453 | .ui-datepicker-rtl .ui-datepicker-next { 454 | left: 2px; 455 | right: auto; 456 | } 457 | .ui-datepicker-rtl .ui-datepicker-prev:hover { 458 | right: 1px; 459 | left: auto; 460 | } 461 | .ui-datepicker-rtl .ui-datepicker-next:hover { 462 | left: 1px; 463 | right: auto; 464 | } 465 | .ui-datepicker-rtl .ui-datepicker-buttonpane { 466 | clear: right; 467 | } 468 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { 469 | float: left; 470 | } 471 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, 472 | .ui-datepicker-rtl .ui-datepicker-group { 473 | float: right; 474 | } 475 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, 476 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { 477 | border-right-width: 0; 478 | border-left-width: 1px; 479 | } 480 | 481 | /* Icons */ 482 | .ui-datepicker .ui-icon { 483 | display: block; 484 | text-indent: -99999px; 485 | overflow: hidden; 486 | background-repeat: no-repeat; 487 | left: .5em; 488 | top: .3em; 489 | } 490 | .ui-dialog { 491 | position: absolute; 492 | top: 0; 493 | left: 0; 494 | padding: .2em; 495 | outline: 0; 496 | } 497 | .ui-dialog .ui-dialog-titlebar { 498 | padding: .4em 1em; 499 | position: relative; 500 | } 501 | .ui-dialog .ui-dialog-title { 502 | float: left; 503 | margin: .1em 0; 504 | white-space: nowrap; 505 | width: 90%; 506 | overflow: hidden; 507 | text-overflow: ellipsis; 508 | } 509 | .ui-dialog .ui-dialog-titlebar-close { 510 | position: absolute; 511 | right: .3em; 512 | top: 50%; 513 | width: 20px; 514 | margin: -10px 0 0 0; 515 | padding: 1px; 516 | height: 20px; 517 | } 518 | .ui-dialog .ui-dialog-content { 519 | position: relative; 520 | border: 0; 521 | padding: .5em 1em; 522 | background: none; 523 | overflow: auto; 524 | } 525 | .ui-dialog .ui-dialog-buttonpane { 526 | text-align: left; 527 | border-width: 1px 0 0 0; 528 | background-image: none; 529 | margin-top: .5em; 530 | padding: .3em 1em .5em .4em; 531 | } 532 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { 533 | float: right; 534 | } 535 | .ui-dialog .ui-dialog-buttonpane button { 536 | margin: .5em .4em .5em 0; 537 | cursor: pointer; 538 | } 539 | .ui-dialog .ui-resizable-n { 540 | height: 2px; 541 | top: 0; 542 | } 543 | .ui-dialog .ui-resizable-e { 544 | width: 2px; 545 | right: 0; 546 | } 547 | .ui-dialog .ui-resizable-s { 548 | height: 2px; 549 | bottom: 0; 550 | } 551 | .ui-dialog .ui-resizable-w { 552 | width: 2px; 553 | left: 0; 554 | } 555 | .ui-dialog .ui-resizable-se, 556 | .ui-dialog .ui-resizable-sw, 557 | .ui-dialog .ui-resizable-ne, 558 | .ui-dialog .ui-resizable-nw { 559 | width: 7px; 560 | height: 7px; 561 | } 562 | .ui-dialog .ui-resizable-se { 563 | right: 0; 564 | bottom: 0; 565 | } 566 | .ui-dialog .ui-resizable-sw { 567 | left: 0; 568 | bottom: 0; 569 | } 570 | .ui-dialog .ui-resizable-ne { 571 | right: 0; 572 | top: 0; 573 | } 574 | .ui-dialog .ui-resizable-nw { 575 | left: 0; 576 | top: 0; 577 | } 578 | .ui-draggable .ui-dialog-titlebar { 579 | cursor: move; 580 | } 581 | .ui-draggable-handle { 582 | -ms-touch-action: none; 583 | touch-action: none; 584 | } 585 | .ui-resizable { 586 | position: relative; 587 | } 588 | .ui-resizable-handle { 589 | position: absolute; 590 | font-size: 0.1px; 591 | display: block; 592 | -ms-touch-action: none; 593 | touch-action: none; 594 | } 595 | .ui-resizable-disabled .ui-resizable-handle, 596 | .ui-resizable-autohide .ui-resizable-handle { 597 | display: none; 598 | } 599 | .ui-resizable-n { 600 | cursor: n-resize; 601 | height: 7px; 602 | width: 100%; 603 | top: -5px; 604 | left: 0; 605 | } 606 | .ui-resizable-s { 607 | cursor: s-resize; 608 | height: 7px; 609 | width: 100%; 610 | bottom: -5px; 611 | left: 0; 612 | } 613 | .ui-resizable-e { 614 | cursor: e-resize; 615 | width: 7px; 616 | right: -5px; 617 | top: 0; 618 | height: 100%; 619 | } 620 | .ui-resizable-w { 621 | cursor: w-resize; 622 | width: 7px; 623 | left: -5px; 624 | top: 0; 625 | height: 100%; 626 | } 627 | .ui-resizable-se { 628 | cursor: se-resize; 629 | width: 12px; 630 | height: 12px; 631 | right: 1px; 632 | bottom: 1px; 633 | } 634 | .ui-resizable-sw { 635 | cursor: sw-resize; 636 | width: 9px; 637 | height: 9px; 638 | left: -5px; 639 | bottom: -5px; 640 | } 641 | .ui-resizable-nw { 642 | cursor: nw-resize; 643 | width: 9px; 644 | height: 9px; 645 | left: -5px; 646 | top: -5px; 647 | } 648 | .ui-resizable-ne { 649 | cursor: ne-resize; 650 | width: 9px; 651 | height: 9px; 652 | right: -5px; 653 | top: -5px; 654 | } 655 | .ui-progressbar { 656 | height: 2em; 657 | text-align: left; 658 | overflow: hidden; 659 | } 660 | .ui-progressbar .ui-progressbar-value { 661 | margin: -1px; 662 | height: 100%; 663 | } 664 | .ui-progressbar .ui-progressbar-overlay { 665 | background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); 666 | height: 100%; 667 | filter: alpha(opacity=25); /* support: IE8 */ 668 | opacity: 0.25; 669 | } 670 | .ui-progressbar-indeterminate .ui-progressbar-value { 671 | background-image: none; 672 | } 673 | .ui-selectable { 674 | -ms-touch-action: none; 675 | touch-action: none; 676 | } 677 | .ui-selectable-helper { 678 | position: absolute; 679 | z-index: 100; 680 | border: 1px dotted black; 681 | } 682 | .ui-selectmenu-menu { 683 | padding: 0; 684 | margin: 0; 685 | position: absolute; 686 | top: 0; 687 | left: 0; 688 | display: none; 689 | } 690 | .ui-selectmenu-menu .ui-menu { 691 | overflow: auto; 692 | overflow-x: hidden; 693 | padding-bottom: 1px; 694 | } 695 | .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { 696 | font-size: 1em; 697 | font-weight: bold; 698 | line-height: 1.5; 699 | padding: 2px 0.4em; 700 | margin: 0.5em 0 0 0; 701 | height: auto; 702 | border: 0; 703 | } 704 | .ui-selectmenu-open { 705 | display: block; 706 | } 707 | .ui-selectmenu-text { 708 | display: block; 709 | margin-right: 20px; 710 | overflow: hidden; 711 | text-overflow: ellipsis; 712 | } 713 | .ui-selectmenu-button.ui-button { 714 | text-align: left; 715 | white-space: nowrap; 716 | width: 14em; 717 | } 718 | .ui-selectmenu-icon.ui-icon { 719 | float: right; 720 | margin-top: 0; 721 | } 722 | .ui-slider { 723 | position: relative; 724 | text-align: left; 725 | } 726 | .ui-slider .ui-slider-handle { 727 | position: absolute; 728 | z-index: 2; 729 | width: 1.2em; 730 | height: 1.2em; 731 | cursor: default; 732 | -ms-touch-action: none; 733 | touch-action: none; 734 | } 735 | .ui-slider .ui-slider-range { 736 | position: absolute; 737 | z-index: 1; 738 | font-size: .7em; 739 | display: block; 740 | border: 0; 741 | background-position: 0 0; 742 | } 743 | 744 | /* support: IE8 - See #6727 */ 745 | .ui-slider.ui-state-disabled .ui-slider-handle, 746 | .ui-slider.ui-state-disabled .ui-slider-range { 747 | filter: inherit; 748 | } 749 | 750 | .ui-slider-horizontal { 751 | height: .8em; 752 | } 753 | .ui-slider-horizontal .ui-slider-handle { 754 | top: -.3em; 755 | margin-left: -.6em; 756 | } 757 | .ui-slider-horizontal .ui-slider-range { 758 | top: 0; 759 | height: 100%; 760 | } 761 | .ui-slider-horizontal .ui-slider-range-min { 762 | left: 0; 763 | } 764 | .ui-slider-horizontal .ui-slider-range-max { 765 | right: 0; 766 | } 767 | 768 | .ui-slider-vertical { 769 | width: .8em; 770 | height: 100px; 771 | } 772 | .ui-slider-vertical .ui-slider-handle { 773 | left: -.3em; 774 | margin-left: 0; 775 | margin-bottom: -.6em; 776 | } 777 | .ui-slider-vertical .ui-slider-range { 778 | left: 0; 779 | width: 100%; 780 | } 781 | .ui-slider-vertical .ui-slider-range-min { 782 | bottom: 0; 783 | } 784 | .ui-slider-vertical .ui-slider-range-max { 785 | top: 0; 786 | } 787 | .ui-sortable-handle { 788 | -ms-touch-action: none; 789 | touch-action: none; 790 | } 791 | .ui-spinner { 792 | position: relative; 793 | display: inline-block; 794 | overflow: hidden; 795 | padding: 0; 796 | vertical-align: middle; 797 | } 798 | .ui-spinner-input { 799 | border: none; 800 | background: none; 801 | color: inherit; 802 | padding: .222em 0; 803 | margin: .2em 0; 804 | vertical-align: middle; 805 | margin-left: .4em; 806 | margin-right: 2em; 807 | } 808 | .ui-spinner-button { 809 | width: 1.6em; 810 | height: 50%; 811 | font-size: .5em; 812 | padding: 0; 813 | margin: 0; 814 | text-align: center; 815 | position: absolute; 816 | cursor: default; 817 | display: block; 818 | overflow: hidden; 819 | right: 0; 820 | } 821 | /* more specificity required here to override default borders */ 822 | .ui-spinner a.ui-spinner-button { 823 | border-top-style: none; 824 | border-bottom-style: none; 825 | border-right-style: none; 826 | } 827 | .ui-spinner-up { 828 | top: 0; 829 | } 830 | .ui-spinner-down { 831 | bottom: 0; 832 | } 833 | .ui-tabs { 834 | position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 835 | padding: .2em; 836 | } 837 | .ui-tabs .ui-tabs-nav { 838 | margin: 0; 839 | padding: .2em .2em 0; 840 | } 841 | .ui-tabs .ui-tabs-nav li { 842 | list-style: none; 843 | float: left; 844 | position: relative; 845 | top: 0; 846 | margin: 1px .2em 0 0; 847 | border-bottom-width: 0; 848 | padding: 0; 849 | white-space: nowrap; 850 | } 851 | .ui-tabs .ui-tabs-nav .ui-tabs-anchor { 852 | float: left; 853 | padding: .5em 1em; 854 | text-decoration: none; 855 | } 856 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { 857 | margin-bottom: -1px; 858 | padding-bottom: 1px; 859 | } 860 | .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, 861 | .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, 862 | .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { 863 | cursor: text; 864 | } 865 | .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { 866 | cursor: pointer; 867 | } 868 | .ui-tabs .ui-tabs-panel { 869 | display: block; 870 | border-width: 0; 871 | padding: 1em 1.4em; 872 | background: none; 873 | } 874 | .ui-tooltip { 875 | padding: 8px; 876 | position: absolute; 877 | z-index: 9999; 878 | max-width: 300px; 879 | } 880 | body .ui-tooltip { 881 | border-width: 2px; 882 | } 883 | /* Component containers 884 | ----------------------------------*/ 885 | .ui-widget { 886 | font-family: Arial,Helvetica,sans-serif; 887 | font-size: 1em; 888 | } 889 | .ui-widget .ui-widget { 890 | font-size: 1em; 891 | } 892 | .ui-widget input, 893 | .ui-widget select, 894 | .ui-widget textarea, 895 | .ui-widget button { 896 | font-family: Arial,Helvetica,sans-serif; 897 | font-size: 1em; 898 | } 899 | .ui-widget.ui-widget-content { 900 | border: 1px solid #c5c5c5; 901 | } 902 | .ui-widget-content { 903 | border: 1px solid #dddddd; 904 | background: #ffffff; 905 | color: #333333; 906 | } 907 | .ui-widget-content a { 908 | color: #333333; 909 | } 910 | .ui-widget-header { 911 | border: 1px solid #dddddd; 912 | background: #e9e9e9; 913 | color: #333333; 914 | font-weight: bold; 915 | } 916 | .ui-widget-header a { 917 | color: #333333; 918 | } 919 | 920 | /* Interaction states 921 | ----------------------------------*/ 922 | .ui-state-default, 923 | .ui-widget-content .ui-state-default, 924 | .ui-widget-header .ui-state-default, 925 | .ui-button, 926 | 927 | /* We use html here because we need a greater specificity to make sure disabled 928 | works properly when clicked or hovered */ 929 | html .ui-button.ui-state-disabled:hover, 930 | html .ui-button.ui-state-disabled:active { 931 | border: 1px solid #c5c5c5; 932 | background: #f6f6f6; 933 | font-weight: normal; 934 | color: #454545; 935 | } 936 | .ui-state-default a, 937 | .ui-state-default a:link, 938 | .ui-state-default a:visited, 939 | a.ui-button, 940 | a:link.ui-button, 941 | a:visited.ui-button, 942 | .ui-button { 943 | color: #454545; 944 | text-decoration: none; 945 | } 946 | .ui-state-hover, 947 | .ui-widget-content .ui-state-hover, 948 | .ui-widget-header .ui-state-hover, 949 | .ui-state-focus, 950 | .ui-widget-content .ui-state-focus, 951 | .ui-widget-header .ui-state-focus, 952 | .ui-button:hover, 953 | .ui-button:focus { 954 | border: 1px solid #cccccc; 955 | background: #ededed; 956 | font-weight: normal; 957 | color: #2b2b2b; 958 | } 959 | .ui-state-hover a, 960 | .ui-state-hover a:hover, 961 | .ui-state-hover a:link, 962 | .ui-state-hover a:visited, 963 | .ui-state-focus a, 964 | .ui-state-focus a:hover, 965 | .ui-state-focus a:link, 966 | .ui-state-focus a:visited, 967 | a.ui-button:hover, 968 | a.ui-button:focus { 969 | color: #2b2b2b; 970 | text-decoration: none; 971 | } 972 | 973 | .ui-visual-focus { 974 | box-shadow: 0 0 3px 1px rgb(94, 158, 214); 975 | } 976 | .ui-state-active, 977 | .ui-widget-content .ui-state-active, 978 | .ui-widget-header .ui-state-active, 979 | a.ui-button:active, 980 | .ui-button:active, 981 | .ui-button.ui-state-active:hover { 982 | border: 1px solid #003eff; 983 | background: #007fff; 984 | font-weight: normal; 985 | color: #ffffff; 986 | } 987 | .ui-icon-background, 988 | .ui-state-active .ui-icon-background { 989 | border: #003eff; 990 | background-color: #ffffff; 991 | } 992 | .ui-state-active a, 993 | .ui-state-active a:link, 994 | .ui-state-active a:visited { 995 | color: #ffffff; 996 | text-decoration: none; 997 | } 998 | 999 | /* Interaction Cues 1000 | ----------------------------------*/ 1001 | .ui-state-highlight, 1002 | .ui-widget-content .ui-state-highlight, 1003 | .ui-widget-header .ui-state-highlight { 1004 | border: 1px solid #dad55e; 1005 | background: #fffa90; 1006 | color: #777620; 1007 | } 1008 | .ui-state-checked { 1009 | border: 1px solid #dad55e; 1010 | background: #fffa90; 1011 | } 1012 | .ui-state-highlight a, 1013 | .ui-widget-content .ui-state-highlight a, 1014 | .ui-widget-header .ui-state-highlight a { 1015 | color: #777620; 1016 | } 1017 | .ui-state-error, 1018 | .ui-widget-content .ui-state-error, 1019 | .ui-widget-header .ui-state-error { 1020 | border: 1px solid #f1a899; 1021 | background: #fddfdf; 1022 | color: #5f3f3f; 1023 | } 1024 | .ui-state-error a, 1025 | .ui-widget-content .ui-state-error a, 1026 | .ui-widget-header .ui-state-error a { 1027 | color: #5f3f3f; 1028 | } 1029 | .ui-state-error-text, 1030 | .ui-widget-content .ui-state-error-text, 1031 | .ui-widget-header .ui-state-error-text { 1032 | color: #5f3f3f; 1033 | } 1034 | .ui-priority-primary, 1035 | .ui-widget-content .ui-priority-primary, 1036 | .ui-widget-header .ui-priority-primary { 1037 | font-weight: bold; 1038 | } 1039 | .ui-priority-secondary, 1040 | .ui-widget-content .ui-priority-secondary, 1041 | .ui-widget-header .ui-priority-secondary { 1042 | opacity: .7; 1043 | filter:Alpha(Opacity=70); /* support: IE8 */ 1044 | font-weight: normal; 1045 | } 1046 | .ui-state-disabled, 1047 | .ui-widget-content .ui-state-disabled, 1048 | .ui-widget-header .ui-state-disabled { 1049 | opacity: .35; 1050 | filter:Alpha(Opacity=35); /* support: IE8 */ 1051 | background-image: none; 1052 | } 1053 | .ui-state-disabled .ui-icon { 1054 | filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ 1055 | } 1056 | 1057 | /* Icons 1058 | ----------------------------------*/ 1059 | 1060 | /* states and images */ 1061 | .ui-icon { 1062 | width: 16px; 1063 | height: 16px; 1064 | } 1065 | .ui-icon, 1066 | .ui-widget-content .ui-icon { 1067 | background-image: url("images/ui-icons_444444_256x240.png"); 1068 | } 1069 | .ui-widget-header .ui-icon { 1070 | background-image: url("images/ui-icons_444444_256x240.png"); 1071 | } 1072 | .ui-state-hover .ui-icon, 1073 | .ui-state-focus .ui-icon, 1074 | .ui-button:hover .ui-icon, 1075 | .ui-button:focus .ui-icon { 1076 | background-image: url("images/ui-icons_555555_256x240.png"); 1077 | } 1078 | .ui-state-active .ui-icon, 1079 | .ui-button:active .ui-icon { 1080 | background-image: url("images/ui-icons_ffffff_256x240.png"); 1081 | } 1082 | .ui-state-highlight .ui-icon, 1083 | .ui-button .ui-state-highlight.ui-icon { 1084 | background-image: url("images/ui-icons_777620_256x240.png"); 1085 | } 1086 | .ui-state-error .ui-icon, 1087 | .ui-state-error-text .ui-icon { 1088 | background-image: url("images/ui-icons_cc0000_256x240.png"); 1089 | } 1090 | .ui-button .ui-icon { 1091 | background-image: url("images/ui-icons_777777_256x240.png"); 1092 | } 1093 | 1094 | /* positioning */ 1095 | .ui-icon-blank { background-position: 16px 16px; } 1096 | .ui-icon-caret-1-n { background-position: 0 0; } 1097 | .ui-icon-caret-1-ne { background-position: -16px 0; } 1098 | .ui-icon-caret-1-e { background-position: -32px 0; } 1099 | .ui-icon-caret-1-se { background-position: -48px 0; } 1100 | .ui-icon-caret-1-s { background-position: -65px 0; } 1101 | .ui-icon-caret-1-sw { background-position: -80px 0; } 1102 | .ui-icon-caret-1-w { background-position: -96px 0; } 1103 | .ui-icon-caret-1-nw { background-position: -112px 0; } 1104 | .ui-icon-caret-2-n-s { background-position: -128px 0; } 1105 | .ui-icon-caret-2-e-w { background-position: -144px 0; } 1106 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 1107 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 1108 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 1109 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 1110 | .ui-icon-triangle-1-s { background-position: -65px -16px; } 1111 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 1112 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 1113 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 1114 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 1115 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 1116 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 1117 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 1118 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 1119 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 1120 | .ui-icon-arrow-1-s { background-position: -65px -32px; } 1121 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 1122 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 1123 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 1124 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 1125 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 1126 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 1127 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 1128 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 1129 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 1130 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 1131 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 1132 | .ui-icon-arrowthick-1-n { background-position: 1px -48px; } 1133 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 1134 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 1135 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 1136 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 1137 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 1138 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 1139 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 1140 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 1141 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 1142 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 1143 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 1144 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 1145 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 1146 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 1147 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 1148 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 1149 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 1150 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 1151 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 1152 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 1153 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 1154 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 1155 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 1156 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 1157 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 1158 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 1159 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 1160 | .ui-icon-arrow-4 { background-position: 0 -80px; } 1161 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 1162 | .ui-icon-extlink { background-position: -32px -80px; } 1163 | .ui-icon-newwin { background-position: -48px -80px; } 1164 | .ui-icon-refresh { background-position: -64px -80px; } 1165 | .ui-icon-shuffle { background-position: -80px -80px; } 1166 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 1167 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 1168 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 1169 | .ui-icon-folder-open { background-position: -16px -96px; } 1170 | .ui-icon-document { background-position: -32px -96px; } 1171 | .ui-icon-document-b { background-position: -48px -96px; } 1172 | .ui-icon-note { background-position: -64px -96px; } 1173 | .ui-icon-mail-closed { background-position: -80px -96px; } 1174 | .ui-icon-mail-open { background-position: -96px -96px; } 1175 | .ui-icon-suitcase { background-position: -112px -96px; } 1176 | .ui-icon-comment { background-position: -128px -96px; } 1177 | .ui-icon-person { background-position: -144px -96px; } 1178 | .ui-icon-print { background-position: -160px -96px; } 1179 | .ui-icon-trash { background-position: -176px -96px; } 1180 | .ui-icon-locked { background-position: -192px -96px; } 1181 | .ui-icon-unlocked { background-position: -208px -96px; } 1182 | .ui-icon-bookmark { background-position: -224px -96px; } 1183 | .ui-icon-tag { background-position: -240px -96px; } 1184 | .ui-icon-home { background-position: 0 -112px; } 1185 | .ui-icon-flag { background-position: -16px -112px; } 1186 | .ui-icon-calendar { background-position: -32px -112px; } 1187 | .ui-icon-cart { background-position: -48px -112px; } 1188 | .ui-icon-pencil { background-position: -64px -112px; } 1189 | .ui-icon-clock { background-position: -80px -112px; } 1190 | .ui-icon-disk { background-position: -96px -112px; } 1191 | .ui-icon-calculator { background-position: -112px -112px; } 1192 | .ui-icon-zoomin { background-position: -128px -112px; } 1193 | .ui-icon-zoomout { background-position: -144px -112px; } 1194 | .ui-icon-search { background-position: -160px -112px; } 1195 | .ui-icon-wrench { background-position: -176px -112px; } 1196 | .ui-icon-gear { background-position: -192px -112px; } 1197 | .ui-icon-heart { background-position: -208px -112px; } 1198 | .ui-icon-star { background-position: -224px -112px; } 1199 | .ui-icon-link { background-position: -240px -112px; } 1200 | .ui-icon-cancel { background-position: 0 -128px; } 1201 | .ui-icon-plus { background-position: -16px -128px; } 1202 | .ui-icon-plusthick { background-position: -32px -128px; } 1203 | .ui-icon-minus { background-position: -48px -128px; } 1204 | .ui-icon-minusthick { background-position: -64px -128px; } 1205 | .ui-icon-close { background-position: -80px -128px; } 1206 | .ui-icon-closethick { background-position: -96px -128px; } 1207 | .ui-icon-key { background-position: -112px -128px; } 1208 | .ui-icon-lightbulb { background-position: -128px -128px; } 1209 | .ui-icon-scissors { background-position: -144px -128px; } 1210 | .ui-icon-clipboard { background-position: -160px -128px; } 1211 | .ui-icon-copy { background-position: -176px -128px; } 1212 | .ui-icon-contact { background-position: -192px -128px; } 1213 | .ui-icon-image { background-position: -208px -128px; } 1214 | .ui-icon-video { background-position: -224px -128px; } 1215 | .ui-icon-script { background-position: -240px -128px; } 1216 | .ui-icon-alert { background-position: 0 -144px; } 1217 | .ui-icon-info { background-position: -16px -144px; } 1218 | .ui-icon-notice { background-position: -32px -144px; } 1219 | .ui-icon-help { background-position: -48px -144px; } 1220 | .ui-icon-check { background-position: -64px -144px; } 1221 | .ui-icon-bullet { background-position: -80px -144px; } 1222 | .ui-icon-radio-on { background-position: -96px -144px; } 1223 | .ui-icon-radio-off { background-position: -112px -144px; } 1224 | .ui-icon-pin-w { background-position: -128px -144px; } 1225 | .ui-icon-pin-s { background-position: -144px -144px; } 1226 | .ui-icon-play { background-position: 0 -160px; } 1227 | .ui-icon-pause { background-position: -16px -160px; } 1228 | .ui-icon-seek-next { background-position: -32px -160px; } 1229 | .ui-icon-seek-prev { background-position: -48px -160px; } 1230 | .ui-icon-seek-end { background-position: -64px -160px; } 1231 | .ui-icon-seek-start { background-position: -80px -160px; } 1232 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 1233 | .ui-icon-seek-first { background-position: -80px -160px; } 1234 | .ui-icon-stop { background-position: -96px -160px; } 1235 | .ui-icon-eject { background-position: -112px -160px; } 1236 | .ui-icon-volume-off { background-position: -128px -160px; } 1237 | .ui-icon-volume-on { background-position: -144px -160px; } 1238 | .ui-icon-power { background-position: 0 -176px; } 1239 | .ui-icon-signal-diag { background-position: -16px -176px; } 1240 | .ui-icon-signal { background-position: -32px -176px; } 1241 | .ui-icon-battery-0 { background-position: -48px -176px; } 1242 | .ui-icon-battery-1 { background-position: -64px -176px; } 1243 | .ui-icon-battery-2 { background-position: -80px -176px; } 1244 | .ui-icon-battery-3 { background-position: -96px -176px; } 1245 | .ui-icon-circle-plus { background-position: 0 -192px; } 1246 | .ui-icon-circle-minus { background-position: -16px -192px; } 1247 | .ui-icon-circle-close { background-position: -32px -192px; } 1248 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 1249 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 1250 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 1251 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 1252 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 1253 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 1254 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 1255 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 1256 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 1257 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 1258 | .ui-icon-circle-check { background-position: -208px -192px; } 1259 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 1260 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 1261 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 1262 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 1263 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 1264 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 1265 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 1266 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 1267 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 1268 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 1269 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 1270 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 1271 | 1272 | 1273 | /* Misc visuals 1274 | ----------------------------------*/ 1275 | 1276 | /* Corner radius */ 1277 | .ui-corner-all, 1278 | .ui-corner-top, 1279 | .ui-corner-left, 1280 | .ui-corner-tl { 1281 | border-top-left-radius: 3px; 1282 | } 1283 | .ui-corner-all, 1284 | .ui-corner-top, 1285 | .ui-corner-right, 1286 | .ui-corner-tr { 1287 | border-top-right-radius: 3px; 1288 | } 1289 | .ui-corner-all, 1290 | .ui-corner-bottom, 1291 | .ui-corner-left, 1292 | .ui-corner-bl { 1293 | border-bottom-left-radius: 3px; 1294 | } 1295 | .ui-corner-all, 1296 | .ui-corner-bottom, 1297 | .ui-corner-right, 1298 | .ui-corner-br { 1299 | border-bottom-right-radius: 3px; 1300 | } 1301 | 1302 | /* Overlays */ 1303 | .ui-widget-overlay { 1304 | background: #aaaaaa; 1305 | opacity: .3; 1306 | filter: Alpha(Opacity=30); /* support: IE8 */ 1307 | } 1308 | .ui-widget-shadow { 1309 | -webkit-box-shadow: 0px 0px 5px #666666; 1310 | box-shadow: 0px 0px 5px #666666; 1311 | } 1312 | -------------------------------------------------------------------------------- /app/search/static/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.7 (http://getbootstrap.com) 3 | * Copyright 2011-2016 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); -------------------------------------------------------------------------------- /app/search/static/main.js: -------------------------------------------------------------------------------- 1 | "use strict" 2 | 3 | function add_query(name, addr) { 4 | name = name || ""; 5 | addr = addr || ""; 6 | 7 | var form = $('
'); 8 | var e_name = $(''); 10 | var e_addr = $(''); 12 | var del_btn = $(''); 13 | form.append(e_name); 14 | form.append(e_addr); 15 | form.append(del_btn); 16 | $('#queries').append(form); 17 | } 18 | 19 | function get_query() { 20 | var query = []; 21 | $('.query-item').each(function(i,e) { 22 | var $e = $(e); 23 | var name = $e.find('.query-name').val(); 24 | var addr = $e.find('.query-addr').val(); 25 | if (name && addr) 26 | query.push(name + ':' + addr) 27 | }); 28 | return query.join(','); 29 | } 30 | 31 | $('body').on('click', '.query-del', function(e) { 32 | $(this).parent('form').remove(); 33 | }); 34 | 35 | $('#query-add').click(function() { 36 | add_query(); 37 | }); 38 | 39 | $('#query-find').click(function() { 40 | location.href = URI(window.location).query({q: get_query()}); 41 | }); 42 | 43 | $('.lib-item').click(function() { 44 | location.href = URI(window.location).query({ 45 | q: get_query(), 46 | l: $.trim($(this).text()) 47 | }); 48 | }); 49 | 50 | function get_ofs($e) { 51 | return parseInt($e.find('.symbol-ofs').text(), 16); 52 | } 53 | 54 | function set_ofs($e, d) { 55 | var s = '' 56 | if (d < 0) 57 | s = '-0x' + (-d).toString(16); 58 | else 59 | s = '0x' + (+d).toString(16); 60 | $e.find('.symbol-diff').text(s); 61 | } 62 | 63 | function show_offset_diffs($radio) { 64 | var $row = $radio.parents('tr.symbol-row'); 65 | $('.symbol-row').removeClass('info'); 66 | $row.addClass('info'); 67 | 68 | var base = get_ofs($row); 69 | $('.symbol-row').each(function(i, e) { 70 | var $e = $(e); 71 | set_ofs($e, get_ofs($e) - base); 72 | }); 73 | } 74 | 75 | function set_autocomplete(names) { 76 | $('.query-name').autocomplete({ 77 | source: names, 78 | minLength: 2, 79 | }); 80 | } 81 | 82 | $('.symbol-radio').change(function() { 83 | show_offset_diffs($(this)); 84 | }); 85 | 86 | $(document).ready(function() { 87 | var $first = $('.symbol-radio').first(); 88 | $first.prop('checked', true); 89 | show_offset_diffs($first); 90 | }); 91 | -------------------------------------------------------------------------------- /app/search/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | libc database search 7 | 8 | 9 | 64 | 65 | 66 |
67 | 78 |
79 | 80 |
81 |
82 |
83 |

Query

84 | 85 | show all libs 86 | / 87 | start over 88 | 89 |
90 |
91 |
92 |
93 | 94 | 95 |
96 |
97 |
98 |
99 | 100 |
101 | 102 | {% if libs %} 103 |
104 |

Matches

105 |
106 | {% for lib_name in libs %} 107 | 112 | {% endfor %} 113 |
114 |
115 | {% elif notfound %} 116 |
117 |

Matches

118 |
119 | Not found. Sorry! 120 |
121 |
122 | {% endif %} 123 | 124 | {% if symbols %} 125 |
126 |
127 |

{{ lib }}

128 | Download 129 |
130 |
131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | {% for name, ofs in symbols %} 139 | 140 | 141 | 142 | 143 | 144 | 145 | {% endfor %} 146 |
SymbolOffsetDifference
{{ name }}{{ '0x%06x' | format(ofs) }}
147 |
148 | All symbols 149 |
150 |
151 |
152 | {% endif %} 153 |
154 |
155 |
156 | 157 |
158 |
159 |
160 |
161 | 162 | 163 | 164 | 165 | 166 | 259 | 260 | 263 | 264 | 265 | -------------------------------------------------------------------------------- /app/search/views.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import json 3 | 4 | logger = logging.getLogger('views') 5 | logger.setLevel(logging.INFO) 6 | 7 | from flask import Blueprint, jsonify, render_template, request 8 | 9 | from .engine import engine 10 | 11 | search_view = Blueprint('search_view', __name__) 12 | 13 | def decode_query(query): 14 | decoded = {} 15 | for hint in query.split(','): 16 | splitted = hint.split(':') 17 | if len(splitted) == 2: 18 | key, value = splitted 19 | decoded[key] = value 20 | return decoded 21 | 22 | def log_query(query, libs, lib): 23 | ip = request.environ.get('X-Forwarded-For') or \ 24 | request.environ.get('X-Real-IP') or \ 25 | request.environ.get('REMOTE_ADDR') 26 | err = [] 27 | if len(libs) == 0: 28 | err.append('No hit') 29 | if lib and (lib not in libs): 30 | err.append('Lib not in result') 31 | 32 | msg = {'query': query, 'ip': ip, 'error': err} 33 | logger.warning('VIEWS: {}'.format(json.dumps(msg))) 34 | 35 | @search_view.route('/') 36 | def index(): 37 | ''' 38 | / 39 | fill the query form with demo query 40 | ?q=n1:o1,n2:o2 41 | fill in query form 42 | search libs 43 | ?q=n1:o1,n2:o2&l=libc_1.2.3 44 | fill in query form 45 | search libs 46 | show symbols in the lib 47 | ''' 48 | query = decode_query(request.args.get('q', '')) 49 | if len(query) == 0: 50 | demo_query = {'__libc_start_main_ret':'e81', '_IO_2_1_stdin_':'5c0'} 51 | return render_template('index.html', query=demo_query) 52 | else: 53 | libs = engine.find(query) 54 | 55 | lib = request.args.get('l') 56 | log_query(query, libs, lib) 57 | if not lib: 58 | return render_template('index.html', query=query, libs=libs, notfound=True) 59 | 60 | symbols = engine.dump(lib, list(query.keys())) 61 | return render_template('index.html', query=query, libs=libs, lib=lib, symbols=symbols) 62 | -------------------------------------------------------------------------------- /app/uwsgi.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | module = search 3 | callable = app 4 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | TAG=$(git rev-parse --short HEAD || echo 'latest') 4 | 5 | docker build -t libc:$TAG . 6 | docker tag libc:$TAG libc:latest 7 | -------------------------------------------------------------------------------- /cron.conf: -------------------------------------------------------------------------------- 1 | [program:cron] 2 | command = /usr/sbin/cron -f 3 | user = root 4 | autostart = true 5 | 6 | [program:cron_output] 7 | command = tail -f /var/log/libcdb.log 8 | autostart = true 9 | stdout_logfile=/dev/stdout 10 | stdout_logfile_maxbytes=0 11 | stderr_logfile=/dev/stderr 12 | stderr_logfile_maxbytes=0 13 | -------------------------------------------------------------------------------- /crontab: -------------------------------------------------------------------------------- 1 | # Update libc-database every day 2 | # min hour day mon week user cmd 3 | 0 12 * * * root cd /libc-database && (./get all; echo -n "### Update done "; date) >> /var/log/libcdb.log 2>&1 4 | -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | location / { 3 | try_files $uri @app; 4 | } 5 | location @app { 6 | include uwsgi_params; 7 | uwsgi_param Host $host; 8 | uwsgi_param X-Real-IP $remote_addr; 9 | uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for; 10 | uwsgi_pass unix:///tmp/uwsgi.sock; 11 | } 12 | location /static { 13 | alias /app/static; 14 | } 15 | location /d { 16 | alias /libc-database/db; 17 | 18 | location ~ \.symbols$ { 19 | default_type text/plain; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker run --name libc -p 31337:80 -it libc:latest 4 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blukat29/search-libc/64121b8e885cc68310a0d8627d05ea97fc88aabd/screenshot.png --------------------------------------------------------------------------------