]>
Commit | Line | Data |
---|---|---|
ebd8d4e8 IC |
1 | <!DOCTYPE html> |
2 | <html> | |
3 | <head lang="en"> | |
4 | <meta charset="utf-8" /> | |
5 | <title>BIP39 - Mnemonic Code</title> | |
ab78acc6 | 6 | <style>/*! |
ebd8d4e8 IC |
7 | * Bootstrap v3.2.0 (http://getbootstrap.com) |
8 | * Copyright 2011-2014 Twitter, Inc. | |
9 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
ab78acc6 IC |
10 | *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}</style> |
11 | <meta content="Mnemonic code for generating deterministic keys" name="description"/> | |
12 | <meta content="width=device-width, initial-scale=1.0" name="viewport" /> | |
13 | <meta content="bitcoin mnemonic converter" name="description" /> | |
14 | <meta content="DC POS" name="author" /> | |
3af2954a | 15 | |
ab78acc6 IC |
16 | <style> |
17 | body { | |
18 | padding-bottom: 32px; | |
19 | } | |
20 | .form-control[readonly] { | |
21 | cursor: text; | |
22 | } | |
23 | .feedback-container { | |
24 | position: fixed; | |
25 | top: 0; | |
26 | width: 100%; | |
27 | text-align: center; | |
28 | z-index: 4; | |
29 | } | |
30 | .feedback { | |
31 | display: table; | |
32 | padding: 0.5em 1em; | |
33 | background-color: orange; | |
34 | margin: 0 auto; | |
35 | font-size: 2em; | |
36 | color: #444; | |
37 | border: 2px solid #555; | |
38 | border-top: 0; | |
39 | border-bottom-left-radius: 20px 20px; | |
40 | border-bottom-right-radius: 20px 20px; | |
41 | } | |
d5dc92fd IC |
42 | .no-border { |
43 | border: 0; | |
44 | box-shadow: inset 0 1px 1px rgba(0,0,0,.0); | |
45 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.0); | |
46 | } | |
ab78acc6 IC |
47 | </style> |
48 | </head> | |
49 | <body> | |
50 | <div class="container"> | |
3af2954a | 51 | |
ab78acc6 IC |
52 | <h1 class="text-center">Mnemonic Code Converter</h1> |
53 | <hr> | |
54 | <div class="row"> | |
55 | <div class="col-md-12"> | |
56 | <h2>Mnemonic</h2> | |
57 | <form class="form-horizontal" role="form"> | |
58 | <div class="col-sm-2"></div> | |
59 | <div class="col-sm-10"> | |
60 | <p>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum)</p> | |
61 | <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target="_blank">BIP39 spec</a></p> | |
62 | </div> | |
63 | <div class="form-group"> | |
64 | <label for="phrase" class="col-sm-2 control-label">BIP39 Mnemonic</label> | |
65 | <div class="col-sm-10"> | |
66 | <textarea id="phrase" class="phrase form-control"></textarea> | |
67 | </div> | |
68 | </div> | |
69 | <div class="form-group"> | |
70 | <label for="strength" class="col-sm-2 control-label">Number of words</label> | |
71 | <div class="col-sm-10"> | |
72 | <div class="input-group"> | |
18531979 | 73 | <select id="strength" class="strength form-control"> |
54563907 IC |
74 | <option value="3">3</option> |
75 | <option value="6">6</option> | |
76 | <option value="9">9</option> | |
77 | <option value="12">12</option> | |
78 | <option value="15" selected>15</option> | |
79 | <option value="18">18</option> | |
80 | <option value="21">21</option> | |
81 | <option value="24">24</option> | |
18531979 | 82 | </select> |
ab78acc6 IC |
83 | <span class="input-group-btn"> |
84 | <button class="btn generate">Generate Random Mnemonic</button> | |
85 | </span> | |
86 | </div> | |
87 | </div> | |
88 | </div> | |
89 | <div class="form-group"> | |
90 | <label for="passphrase" class="col-sm-2 control-label">BIP39 Passphrase (optional)</label> | |
91 | <div class="col-sm-10"> | |
92 | <textarea id="passphrase" class="passphrase form-control"></textarea> | |
93 | </div> | |
94 | </div> | |
73161a92 IC |
95 | <div class="form-group"> |
96 | <label for="seed" class="col-sm-2 control-label">BIP39 Seed</label> | |
97 | <div class="col-sm-10"> | |
98 | <textarea id="seed" class="seed form-control" readonly="readonly"></textarea> | |
99 | </div> | |
100 | </div> | |
ab78acc6 IC |
101 | <div class="form-group"> |
102 | <label for="network-phrase" class="col-sm-2 control-label">Coin</label> | |
103 | <div class="col-sm-10"> | |
104 | <select id="network-phrase" class="network form-control"> | |
105 | <!-- populated by javascript --> | |
106 | </select> | |
107 | </div> | |
108 | </div> | |
109 | <div class="form-group"> | |
110 | <label for="root-key" class="col-sm-2 control-label">BIP32 Root Key</label> | |
111 | <div class="col-sm-10"> | |
efe41586 | 112 | <textarea id="root-key" class="root-key form-control"></textarea> |
ab78acc6 IC |
113 | </div> |
114 | </div> | |
115 | </form> | |
116 | </div> | |
117 | </div> | |
3af2954a | 118 | |
ab78acc6 | 119 | <hr> |
3af2954a | 120 | |
ab78acc6 IC |
121 | <div class="row"> |
122 | <div class="col-md-12"> | |
123 | <h2>Derivation Path</h2> | |
124 | <ul class="derivation-type nav nav-tabs" role="tablist"> | |
d5dc92fd | 125 | <li id="bip44-tab" class="active"> |
ab78acc6 IC |
126 | <a href="#bip44" role="tab" data-toggle="tab">BIP44</a> |
127 | </li> | |
128 | <li id="bip32-tab"> | |
129 | <a href="#bip32" role="tab" data-toggle="tab">BIP32</a> | |
130 | </li> | |
131 | </ul> | |
132 | <div class="derivation-type tab-content"> | |
d5dc92fd | 133 | <div id="bip44" class="tab-pane active"> |
ab78acc6 IC |
134 | <form class="form-horizontal" role="form"> |
135 | <br> | |
136 | <div class="col-sm-2"></div> | |
137 | <div class="col-sm-10"> | |
138 | <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">BIP44 spec</a></p> | |
139 | </div> | |
140 | <div class="form-group"> | |
141 | <label for="purpose" class="col-sm-2 control-label"> | |
142 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target="_blank">Purpose</a> | |
143 | </label> | |
144 | <div class="col-sm-10"> | |
145 | <input id="purpose" type="text" class="purpose form-control" value="44"> | |
146 | </div> | |
147 | </div> | |
148 | <div class="form-group"> | |
149 | <label for="coin" class="col-sm-2 control-label"> | |
150 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target="_blank">Coin</a> | |
151 | </label> | |
152 | <div class="col-sm-10"> | |
153 | <input id="coin" type="text" class="coin form-control" value="0"> | |
154 | </div> | |
155 | </div> | |
156 | <div class="form-group"> | |
157 | <label for="account" class="col-sm-2 control-label"> | |
158 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target="_blank">Account</a> | |
159 | </label> | |
160 | <div class="col-sm-10"> | |
161 | <input id="account" type="text" class="account form-control" value="0"> | |
162 | </div> | |
163 | </div> | |
164 | <div class="form-group"> | |
165 | <label for="change" class="col-sm-2 control-label"> | |
166 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target="_blank">External / Internal</a> | |
167 | </label> | |
168 | <div class="col-sm-10"> | |
169 | <input id="change" type="text" class="change form-control" value="0"> | |
170 | </div> | |
171 | </div> | |
172 | <div class="form-group"> | |
173 | <label for="bip44-path" class="col-sm-2 control-label">BIP32 Derivation Path</label> | |
174 | <div class="col-sm-10"> | |
175 | <input id="bip44-path" type="text" class="path form-control" value="m/44'/0'/0'/0" readonly="readonly"> | |
176 | </div> | |
177 | </div> | |
178 | </form> | |
179 | </div> | |
180 | <div id="bip32" class="tab-pane"> | |
181 | <form class="form-horizontal" role="form"> | |
182 | <br> | |
183 | <div class="col-sm-2"></div> | |
184 | <div class="col-sm-10"> | |
185 | <p>For more info see the <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">BIP32 spec</a></p> | |
186 | </div> | |
187 | <div class="form-group"> | |
188 | <label for="bip32-path" class="col-sm-2 control-label">BIP32 Derivation Path</label> | |
189 | <div class="col-sm-10"> | |
190 | <input id="bip32-path" type="text" class="path form-control" value="m/0"> | |
191 | </div> | |
192 | </div> | |
1975bfbc IC |
193 | <div class="form-group"> |
194 | <div class="col-sm-2"></div> | |
195 | <label class="col-sm-10"> | |
196 | <input class="hardened-addresses" type="checkbox"> | |
197 | Use hardened addresses | |
198 | </label> | |
199 | </div> | |
d5dc92fd IC |
200 | <div class="form-group"> |
201 | <label class="col-sm-2 control-label">Hive Wallet</label> | |
202 | <div class="col-sm-10"> | |
203 | <p class="form-control no-border"> | |
204 | Use path <code>m/0'/0</code>. | |
205 | For more info see the <a href="https://www.hivewallet.com/" target="_blank">Hive Wallet homepage</a> | |
206 | </p> | |
207 | </div> | |
208 | </div> | |
209 | <div class="form-group"> | |
210 | <label for="mycelium-path" class="col-sm-2 control-label">Mycelium Wallet</label> | |
211 | <div class="col-sm-10"> | |
212 | <p class="form-control no-border"> | |
213 | Use path <code>m/44'/0'/0'/0</code>. | |
214 | For more info see the <a href="http://www.mycelium.com/" target="_blank">Mycelium Wallet homepage</a> | |
215 | </p> | |
216 | </div> | |
217 | </div> | |
1975bfbc IC |
218 | <div class="form-group"> |
219 | <label for="core-path" class="col-sm-2 control-label">Bitcoin Core</label> | |
220 | <div class="col-sm-10"> | |
221 | <p class="form-control no-border"> | |
222 | Use path <code>m/0'/0'</code> with hardened addresses. | |
223 | For more info see the <a href="https://github.com/bitcoin/bitcoin/pull/8035" target="_blank">Bitcoin Core BIP32 implementation</a> | |
224 | </p> | |
225 | </div> | |
226 | </div> | |
ab78acc6 IC |
227 | </form> |
228 | </div> | |
229 | </div> | |
230 | <form class="form-horizontal" role="form"> | |
231 | <div class="form-group"> | |
232 | <label for="extended-priv-key" class="col-sm-2 control-label">BIP32 Extended Key</label> | |
233 | <div class="col-sm-10"> | |
234 | <textarea id="extended-priv-key" class="extended-priv-key form-control" readonly="readonly"></textarea> | |
235 | </div> | |
236 | </div> | |
237 | <div class="form-group"> | |
238 | <label for="extended-pub-key" class="col-sm-2 control-label">BIP32 Extended Key (addresses only)</label> | |
239 | <div class="col-sm-10"> | |
240 | <textarea id="extended-pub-key" class="extended-pub-key form-control" readonly="readonly"></textarea> | |
241 | </div> | |
242 | </div> | |
243 | </form> | |
244 | </div> | |
245 | </div> | |
3af2954a | 246 | |
ab78acc6 | 247 | <hr> |
3af2954a | 248 | |
ab78acc6 IC |
249 | <div class="row"> |
250 | <div class="col-md-12"> | |
251 | <h2>Derived Addresses</h2> | |
252 | <p>Note these addreses are derived from the <strong>BIP32 Extended Key</strong></p> | |
253 | <table class="table table-striped"> | |
254 | <thead> | |
255 | <th> | |
256 | <div class="input-group"> | |
ae30fed8 | 257 | Path |
ab78acc6 IC |
258 | <button class="index-toggle">Toggle</button> |
259 | </div> | |
260 | </th> | |
261 | <th> | |
262 | <div class="input-group"> | |
263 | Address | |
264 | <button class="address-toggle">Toggle</button> | |
265 | </div> | |
266 | </th> | |
267 | <th> | |
268 | <div class="input-group"> | |
269 | Private Key | |
270 | <button class="private-key-toggle">Toggle</button> | |
271 | </div> | |
272 | </th> | |
273 | </thead> | |
274 | <tbody class="addresses"> | |
275 | <tr><td> </td><td> </td><td> </td></tr> | |
276 | <tr><td> </td><td> </td><td> </td></tr> | |
277 | <tr><td> </td><td> </td><td> </td></tr> | |
278 | <tr><td> </td><td> </td><td> </td></tr> | |
279 | <tr><td> </td><td> </td><td> </td></tr> | |
280 | </tbody> | |
281 | </table> | |
282 | </div> | |
283 | </div> | |
284 | <span>Show next </button> | |
285 | <input type="number" class="rows-to-add" value="20"> | |
286 | <button class="more">Show</button> | |
3af2954a | 287 | |
ab78acc6 | 288 | <hr> |
3af2954a | 289 | |
ab78acc6 IC |
290 | <div class="row"> |
291 | <div class="col-md-12"> | |
292 | <h2>More info</h2> | |
293 | <h3>BIP39 <span class="small">Mnemonic code for generating deterministic keys</span></h3> | |
294 | <p> | |
295 | Read more at the | |
296 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec</a> | |
297 | </p> | |
298 | <h3>BIP32 <span class="small">Hierarchical Deterministic Wallets</span></h3> | |
299 | <p> | |
300 | Read more at the | |
301 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target="_blank">official BIP32 spec</a> | |
302 | and see the demo at | |
303 | <a href="http://bip32.org/" target="_blank">bip32.org</a> | |
304 | </p> | |
305 | <h3>BIP44 <span class="small">Multi-Account Hierarchy for Deterministic Wallets</span></h3> | |
306 | <p> | |
307 | Read more at the | |
308 | <a href="https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target="_blank">official BIP44 spec</a> | |
309 | </p> | |
310 | <h3>Private Keys</h3> | |
311 | <p> | |
312 | Use private keys at | |
313 | <a href="https://web.archive.org/web/20150707020924/https://brainwallet.org/" target="_blank">brainwallet.org</a>, | |
314 | but be careful - it can be easy to make mistakes if you | |
315 | don't know what you're doing | |
316 | </p> | |
317 | </div> | |
318 | </div> | |
3af2954a | 319 | |
ab78acc6 | 320 | <hr> |
3af2954a | 321 | |
ab78acc6 IC |
322 | <div class="row"> |
323 | <div class="col-md-12"> | |
3af2954a | 324 | |
ab78acc6 | 325 | <h2>Offline Usage</h2> |
3af2954a | 326 | |
ab78acc6 IC |
327 | <p> |
328 | You can use this tool without having to be online. | |
329 | </p> | |
330 | <p> | |
331 | In your browser, select file save-as, and save this page | |
332 | as a file. | |
333 | </p> | |
334 | <p> | |
335 | Double-click that file to open it in a browser | |
336 | on any offline computer. | |
337 | </p> | |
338 | <p> | |
339 | Alternatively, download it from | |
340 | <a href="https://github.com/dcpos/bip39"> | |
341 | https://github.com/dcpos/bip39 | |
342 | </a> | |
3af2954a | 343 | |
ab78acc6 IC |
344 | </div> |
345 | </div> | |
3af2954a | 346 | |
ab78acc6 | 347 | <hr> |
3af2954a | 348 | |
ab78acc6 IC |
349 | <div class="row"> |
350 | <div class="col-md-12"> | |
3af2954a | 351 | |
ab78acc6 | 352 | <h2>This project is 100% open-source code</h2> |
3af2954a | 353 | |
ab78acc6 IC |
354 | <p> |
355 | <span>Get the source code at - </span> | |
356 | <a href="https://github.com/dcpos/bip39" target="_blank"> | |
357 | https://github.com/dcpos/bip39 | |
358 | </a> | |
359 | </p> | |
3af2954a | 360 | |
ab78acc6 | 361 | <h3>Libraries</h3> |
3af2954a | 362 | |
ab78acc6 IC |
363 | <p> |
364 | <span>BitcoinJS - </span> | |
365 | <a href="https://github.com/bitcoinjs/bitcoinjs-lib" target="_blank"> | |
366 | https://github.com/bitcoinjs/bitcoinjs-lib | |
367 | </a> | |
368 | </p> | |
3af2954a | 369 | |
ab78acc6 IC |
370 | <p> |
371 | <span>jsBIP39 - </span> | |
372 | <a href="https://github.com/iancoleman/jsbip39" target="_blank"> | |
373 | https://github.com/iancoleman/jsbip39 | |
374 | </a> | |
375 | </p> | |
3af2954a | 376 | |
ab78acc6 IC |
377 | <p> |
378 | <span>sjcl - </span> | |
379 | <a href="https://github.com/bitwiseshiftleft/sjcl" target="_blank"> | |
380 | https://github.com/bitwiseshiftleft/sjcl | |
381 | </a> | |
382 | </p> | |
3af2954a | 383 | |
ab78acc6 IC |
384 | <p> |
385 | <span>jQuery - </span> | |
386 | <a href="https://jquery.com/" target="_blank"> | |
387 | https://jquery.com/ | |
388 | </a> | |
389 | </p> | |
3af2954a | 390 | |
ab78acc6 IC |
391 | <p> |
392 | <span>Twitter Bootstrap - </span> | |
393 | <a href="http://getbootstrap.com/" target="_blank"> | |
394 | http://getbootstrap.com/ | |
395 | </a> | |
396 | </p> | |
3af2954a | 397 | |
ab78acc6 IC |
398 | </div> |
399 | </div> | |
3af2954a | 400 | |
ab78acc6 | 401 | </div> |
3af2954a | 402 | |
ab78acc6 IC |
403 | <div class="feedback-container"> |
404 | <div class="feedback">Loading...</div> | |
405 | </div> | |
3af2954a | 406 | |
ab78acc6 IC |
407 | <script type="text/template" id="address-row-template"> |
408 | <tr> | |
409 | <td class="index"><span></span></td> | |
410 | <td class="address"><span></span></td> | |
411 | <td class="privkey"><span></span></td> | |
412 | </tr> | |
413 | </script> | |
414 | <script>/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ | |
415 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+Math.random()}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b) | |
416 | },_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ab=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bb=/<([\w:]+)/,cb=/<|&#?\w+;/,db=/<(?:script|style|link)/i,eb=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/^$|\/(?:java|ecma)script/i,gb=/^true\/(.*)/,hb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ib={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ib.optgroup=ib.option,ib.tbody=ib.tfoot=ib.colgroup=ib.caption=ib.thead,ib.th=ib.td;function jb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function kb(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function lb(a){var b=gb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function mb(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function nb(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function ob(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pb(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=ob(h),f=ob(a),d=0,e=f.length;e>d;d++)pb(f[d],g[d]);if(b)if(c)for(f=f||ob(a),g=g||ob(h),d=0,e=f.length;e>d;d++)nb(f[d],g[d]);else nb(a,h);return g=ob(h,"script"),g.length>0&&mb(g,!i&&ob(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(cb.test(e)){f=f||k.appendChild(b.createElement("div")),g=(bb.exec(e)||["",""])[1].toLowerCase(),h=ib[g]||ib._default,f.innerHTML=h[1]+e.replace(ab,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=ob(k.appendChild(e),"script"),i&&mb(f),c)){j=0;while(e=f[j++])fb.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=jb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(ob(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&mb(ob(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(ob(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!db.test(a)&&!ib[(bb.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ab,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ob(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(ob(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&eb.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(ob(c,"script"),kb),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,ob(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,lb),j=0;g>j;j++)h=f[j],fb.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(hb,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qb,rb={};function sb(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function tb(a){var b=l,c=rb[a];return c||(c=sb(a,b),"none"!==c&&c||(qb=(qb||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qb[0].contentDocument,b.write(),b.close(),c=sb(a,b),qb.detach()),rb[a]=c),c}var ub=/^margin/,vb=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)};function xb(a,b,c){var d,e,f,g,h=a.style;return c=c||wb(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),vb.test(g)&&ub.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function yb(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var zb=/^(none|table(?!-c[ea]).+)/,Ab=new RegExp("^("+Q+")(.*)$","i"),Bb=new RegExp("^([+-])=("+Q+")","i"),Cb={position:"absolute",visibility:"hidden",display:"block"},Db={letterSpacing:"0",fontWeight:"400"},Eb=["Webkit","O","Moz","ms"];function Fb(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Eb.length;while(e--)if(b=Eb[e]+c,b in a)return b;return d}function Gb(a,b,c){var d=Ab.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Hb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ib(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wb(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xb(a,b,f),(0>e||null==e)&&(e=a.style[b]),vb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Hb(a,b,c||(g?"border":"content"),d,f)+"px"}function Jb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",tb(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Bb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xb(a,b,d)),"normal"===e&&b in Db&&(e=Db[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?zb.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Cb,function(){return Ib(a,b,d)}):Ib(a,b,d):void 0},set:function(a,c,d){var e=d&&wb(a);return Gb(a,c,d?Hb(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=yb(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ub.test(a)||(n.cssHooks[a+b].set=Gb)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Jb(this,!0)},hide:function(){return Jb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Kb(a,b,c,d,e){return new Kb.prototype.init(a,b,c,d,e)}n.Tween=Kb,Kb.prototype={constructor:Kb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Kb.propHooks[this.prop];return a&&a.get?a.get(this):Kb.propHooks._default.get(this)},run:function(a){var b,c=Kb.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Kb.propHooks._default.set(this),this}},Kb.prototype.init.prototype=Kb.prototype,Kb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Kb.propHooks.scrollTop=Kb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Kb.prototype.init,n.fx.step={};var Lb,Mb,Nb=/^(?:toggle|show|hide)$/,Ob=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pb=/queueHooks$/,Qb=[Vb],Rb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Ob.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Ob.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sb(){return setTimeout(function(){Lb=void 0}),Lb=n.now()}function Tb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ub(a,b,c){for(var d,e=(Rb[b]||[]).concat(Rb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Vb(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||tb(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Nb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?tb(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ub(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xb(a,b,c){var d,e,f=0,g=Qb.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Lb||Sb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:Lb||Sb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wb(k,j.opts.specialEasing);g>f;f++)if(d=Qb[f].call(j,a,k,j.opts))return d;return n.map(k,Ub,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xb,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Rb[c]=Rb[c]||[],Rb[c].unshift(b)},prefilter:function(a,b){b?Qb.unshift(a):Qb.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xb(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Tb(b,!0),a,d,e)}}),n.each({slideDown:Tb("show"),slideUp:Tb("hide"),slideToggle:Tb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Lb=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Lb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Mb||(Mb=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Mb),Mb=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Yb,Zb,$b=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Zb:Yb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b)) | |
417 | },removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$b[b]=function(a,b,d){var e,f;return d||(f=$b[b],$b[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$b[b]=f),e}});var _b=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_b.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ac=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ac," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ac," ").indexOf(b)>=0)return!0;return!1}});var bc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cc=n.now(),dc=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var ec,fc,gc=/#.*$/,hc=/([?&])_=[^&]*/,ic=/^(.*?):[ \t]*([^\r\n]*)$/gm,jc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,kc=/^(?:GET|HEAD)$/,lc=/^\/\//,mc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,nc={},oc={},pc="*/".concat("*");try{fc=location.href}catch(qc){fc=l.createElement("a"),fc.href="",fc=fc.href}ec=mc.exec(fc.toLowerCase())||[];function rc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function sc(a,b,c,d){var e={},f=a===oc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function tc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function uc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function vc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:fc,type:"GET",isLocal:jc.test(ec[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":pc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?tc(tc(a,n.ajaxSettings),b):tc(n.ajaxSettings,a)},ajaxPrefilter:rc(nc),ajaxTransport:rc(oc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=ic.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||fc)+"").replace(gc,"").replace(lc,ec[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=mc.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===ec[1]&&h[2]===ec[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(ec[3]||("http:"===ec[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),sc(nc,k,b,v),2===t)return v;i=k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!kc.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(dc.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=hc.test(d)?d.replace(hc,"$1_="+cc++):d+(dc.test(d)?"&":"?")+"_="+cc++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+pc+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=sc(oc,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=uc(k,v,f)),u=vc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var wc=/%20/g,xc=/\[\]$/,yc=/\r?\n/g,zc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Bc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||xc.test(a)?d(a,e):Bc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Bc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Bc(c,a[c],b,e);return d.join("&").replace(wc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Ac.test(this.nodeName)&&!zc.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(yc,"\r\n")}}):{name:b.name,value:c.replace(yc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cc=0,Dc={},Ec={0:200,1223:204},Fc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Dc)Dc[a]()}),k.cors=!!Fc&&"withCredentials"in Fc,k.ajax=Fc=!!Fc,n.ajaxTransport(function(a){var b;return k.cors||Fc&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Cc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Dc[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Ec[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Dc[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Gc=[],Hc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Gc.pop()||n.expando+"_"+cc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Hc.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Hc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Hc,"$1"+e):b.jsonp!==!1&&(b.url+=(dc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Gc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Ic=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Ic)return Ic.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Jc=a.document.documentElement;function Kc(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Kc(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Jc;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Jc})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Kc(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=yb(k.pixelPosition,function(a,c){return c?(c=xb(a,b),vb.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Lc=a.jQuery,Mc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Mc),b&&a.jQuery===n&&(a.jQuery=Lc),n},typeof b===U&&(a.jQuery=a.$=n),n}); | |
418 | </script> | |
419 | <script>/*! | |
420 | * Bootstrap v3.2.0 (http://getbootstrap.com) | |
3af2954a IC |
421 | * Copyright 2011-2014 Twitter, Inc. |
422 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
ab78acc6 IC |
423 | */ |
424 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires 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){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(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.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):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.2.0",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]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},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")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&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);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(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).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){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.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},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(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&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},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",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(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){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.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").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(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 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.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);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)),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.leave=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)),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 c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(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(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},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))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};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"!=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.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),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").empty()[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")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};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){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("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",e),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.2.0",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="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.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[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.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},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(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=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},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=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};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||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);</script> | |
563e401a IC |
425 | <script>(function() { |
426 | 'use strict'; | |
427 | ||
428 | /** | |
429 | * Extend an Object with another Object's properties. | |
430 | * | |
431 | * The source objects are specified as additional arguments. | |
432 | * | |
433 | * @param dst Object the object to extend. | |
434 | * | |
435 | * @return Object the final object. | |
436 | */ | |
437 | var _extend = function(dst) { | |
438 | var sources = Array.prototype.slice.call(arguments, 1); | |
439 | for (var i=0; i<sources.length; ++i) { | |
440 | var src = sources[i]; | |
441 | for (var p in src) { | |
442 | if (src.hasOwnProperty(p)) dst[p] = src[p]; | |
443 | } | |
444 | } | |
445 | return dst; | |
446 | }; | |
447 | ||
448 | ||
449 | /** | |
450 | * Defer execution of given function. | |
451 | * @param {Function} func | |
452 | */ | |
453 | var _defer = function(func) { | |
454 | if (typeof setImmediate === 'function') { | |
455 | return setImmediate(func); | |
456 | } else { | |
457 | return setTimeout(func, 0); | |
458 | } | |
459 | }; | |
460 | ||
461 | /** | |
462 | * Based on the algorithm at http://en.wikipedia.org/wiki/Levenshtein_distance. | |
463 | */ | |
464 | var Levenshtein = { | |
465 | /** | |
466 | * Calculate levenshtein distance of the two strings. | |
467 | * | |
468 | * @param str1 String the first string. | |
469 | * @param str2 String the second string. | |
470 | * @return Integer the levenshtein distance (0 and above). | |
471 | */ | |
472 | get: function(str1, str2) { | |
473 | // base cases | |
474 | if (str1 === str2) return 0; | |
475 | if (str1.length === 0) return str2.length; | |
476 | if (str2.length === 0) return str1.length; | |
477 | ||
478 | // two rows | |
479 | var prevRow = new Array(str2.length + 1), | |
480 | curCol, nextCol, i, j, tmp; | |
481 | ||
482 | // initialise previous row | |
483 | for (i=0; i<prevRow.length; ++i) { | |
484 | prevRow[i] = i; | |
485 | } | |
486 | ||
487 | // calculate current row distance from previous row | |
488 | for (i=0; i<str1.length; ++i) { | |
489 | nextCol = i + 1; | |
490 | ||
491 | for (j=0; j<str2.length; ++j) { | |
492 | curCol = nextCol; | |
493 | ||
494 | // substution | |
495 | nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 ); | |
496 | // insertion | |
497 | tmp = curCol + 1; | |
498 | if (nextCol > tmp) { | |
499 | nextCol = tmp; | |
500 | } | |
501 | // deletion | |
502 | tmp = prevRow[j + 1] + 1; | |
503 | if (nextCol > tmp) { | |
504 | nextCol = tmp; | |
505 | } | |
506 | ||
507 | // copy current col value into previous (in preparation for next iteration) | |
508 | prevRow[j] = curCol; | |
509 | } | |
510 | ||
511 | // copy last col value into previous (in preparation for next iteration) | |
512 | prevRow[j] = nextCol; | |
513 | } | |
514 | ||
515 | return nextCol; | |
516 | }, | |
517 | ||
518 | /** | |
519 | * Asynchronously calculate levenshtein distance of the two strings. | |
520 | * | |
521 | * @param str1 String the first string. | |
522 | * @param str2 String the second string. | |
523 | * @param cb Function callback function with signature: function(Error err, int distance) | |
524 | * @param [options] Object additional options. | |
525 | * @param [options.progress] Function progress callback with signature: function(percentComplete) | |
526 | */ | |
527 | getAsync: function(str1, str2, cb, options) { | |
528 | options = _extend({}, { | |
529 | progress: null | |
530 | }, options); | |
531 | ||
532 | // base cases | |
533 | if (str1 === str2) return cb(null, 0); | |
534 | if (str1.length === 0) return cb(null, str2.length); | |
535 | if (str2.length === 0) return cb(null, str1.length); | |
536 | ||
537 | // two rows | |
538 | var prevRow = new Array(str2.length + 1), | |
539 | curCol, nextCol, | |
540 | i, j, tmp, | |
541 | startTime, currentTime; | |
542 | ||
543 | // initialise previous row | |
544 | for (i=0; i<prevRow.length; ++i) { | |
545 | prevRow[i] = i; | |
546 | } | |
547 | ||
548 | nextCol = 1; | |
549 | i = 0; | |
550 | j = -1; | |
551 | ||
552 | var __calculate = function() { | |
553 | // reset timer | |
554 | startTime = new Date().valueOf(); | |
555 | currentTime = startTime; | |
556 | ||
557 | // keep going until one second has elapsed | |
558 | while (currentTime - startTime < 1000) { | |
559 | // reached end of current row? | |
560 | if (str2.length <= (++j)) { | |
561 | // copy current into previous (in preparation for next iteration) | |
562 | prevRow[j] = nextCol; | |
563 | ||
564 | // if already done all chars | |
565 | if (str1.length <= (++i)) { | |
566 | return cb(null, nextCol); | |
567 | } | |
568 | // else if we have more left to do | |
569 | else { | |
570 | nextCol = i + 1; | |
571 | j = 0; | |
572 | } | |
573 | } | |
574 | ||
575 | // calculation | |
576 | curCol = nextCol; | |
577 | ||
578 | // substution | |
579 | nextCol = prevRow[j] + ( (str1.charAt(i) === str2.charAt(j)) ? 0 : 1 ); | |
580 | // insertion | |
581 | tmp = curCol + 1; | |
582 | if (nextCol > tmp) { | |
583 | nextCol = tmp; | |
584 | } | |
585 | // deletion | |
586 | tmp = prevRow[j + 1] + 1; | |
587 | if (nextCol > tmp) { | |
588 | nextCol = tmp; | |
589 | } | |
590 | ||
591 | // copy current into previous (in preparation for next iteration) | |
592 | prevRow[j] = curCol; | |
593 | ||
594 | // get current time | |
595 | currentTime = new Date().valueOf(); | |
596 | } | |
597 | ||
598 | // send a progress update? | |
599 | if (null !== options.progress) { | |
600 | try { | |
601 | options.progress.call(null, (i * 100.0/ str1.length)); | |
602 | } catch (err) { | |
603 | return cb('Progress callback: ' + err.toString()); | |
604 | } | |
605 | } | |
606 | ||
607 | // next iteration | |
608 | _defer(__calculate); | |
609 | }; | |
610 | ||
611 | __calculate(); | |
612 | } | |
613 | ||
614 | }; | |
615 | ||
616 | // amd | |
617 | if (typeof define !== "undefined" && define !== null && define.amd) { | |
618 | define(function() { | |
619 | return Levenshtein; | |
620 | }); | |
621 | } | |
622 | // commonjs | |
623 | else if (typeof module !== "undefined" && module !== null && typeof exports !== "undefined" && module.exports === exports) { | |
624 | module.exports = Levenshtein; | |
625 | } | |
626 | // web worker | |
627 | else if (typeof self !== "undefined" && typeof self.postMessage === 'function' && typeof self.importScripts === 'function') { | |
628 | self.Levenshtein = Levenshtein; | |
629 | } | |
630 | // browser main thread | |
631 | else if (typeof window !== "undefined" && window !== null) { | |
632 | window.Levenshtein = Levenshtein; | |
633 | } | |
634 | }()); | |
635 | ||
636 | </script> | |
ab78acc6 IC |
637 | <script>(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.bitcoin = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ |
638 | // (public) Constructor | |
639 | function BigInteger(a, b, c) { | |
640 | if (!(this instanceof BigInteger)) | |
641 | return new BigInteger(a, b, c) | |
3af2954a | 642 | |
ab78acc6 IC |
643 | if (a != null) { |
644 | if ("number" == typeof a) this.fromNumber(a, b, c) | |
645 | else if (b == null && "string" != typeof a) this.fromString(a, 256) | |
646 | else this.fromString(a, b) | |
647 | } | |
648 | } | |
3af2954a | 649 | |
ab78acc6 | 650 | var proto = BigInteger.prototype |
3af2954a | 651 | |
ab78acc6 IC |
652 | // duck-typed isBigInteger |
653 | proto.__bigi = require('../package.json').version | |
654 | BigInteger.isBigInteger = function (obj, check_ver) { | |
655 | return obj && obj.__bigi && (!check_ver || obj.__bigi === proto.__bigi) | |
656 | } | |
3af2954a | 657 | |
ab78acc6 IC |
658 | // Bits per digit |
659 | var dbits | |
3af2954a | 660 | |
ab78acc6 IC |
661 | // am: Compute w_j += (x*this_i), propagate carries, |
662 | // c is initial carry, returns final carry. | |
663 | // c < 3*dvalue, x < 2*dvalue, this_i < dvalue | |
664 | // We need to select the fastest one that works in this environment. | |
3af2954a | 665 | |
ab78acc6 IC |
666 | // am1: use a single mult and divide to get the high bits, |
667 | // max digit bits should be 26 because | |
668 | // max internal value = 2*dvalue^2-2*dvalue (< 2^53) | |
669 | function am1(i, x, w, j, c, n) { | |
670 | while (--n >= 0) { | |
671 | var v = x * this[i++] + w[j] + c | |
672 | c = Math.floor(v / 0x4000000) | |
673 | w[j++] = v & 0x3ffffff | |
3af2954a | 674 | } |
ab78acc6 IC |
675 | return c |
676 | } | |
677 | // am2 avoids a big mult-and-extract completely. | |
678 | // Max digit bits should be <= 30 because we do bitwise ops | |
679 | // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) | |
680 | function am2(i, x, w, j, c, n) { | |
681 | var xl = x & 0x7fff, | |
682 | xh = x >> 15 | |
683 | while (--n >= 0) { | |
684 | var l = this[i] & 0x7fff | |
685 | var h = this[i++] >> 15 | |
686 | var m = xh * l + h * xl | |
687 | l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff) | |
688 | c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30) | |
689 | w[j++] = l & 0x3fffffff | |
690 | } | |
691 | return c | |
692 | } | |
693 | // Alternately, set max digit bits to 28 since some | |
694 | // browsers slow down when dealing with 32-bit numbers. | |
695 | function am3(i, x, w, j, c, n) { | |
696 | var xl = x & 0x3fff, | |
697 | xh = x >> 14 | |
698 | while (--n >= 0) { | |
699 | var l = this[i] & 0x3fff | |
700 | var h = this[i++] >> 14 | |
701 | var m = xh * l + h * xl | |
702 | l = xl * l + ((m & 0x3fff) << 14) + w[j] + c | |
703 | c = (l >> 28) + (m >> 14) + xh * h | |
704 | w[j++] = l & 0xfffffff | |
3af2954a | 705 | } |
ab78acc6 IC |
706 | return c |
707 | } | |
3af2954a | 708 | |
ab78acc6 IC |
709 | // wtf? |
710 | BigInteger.prototype.am = am1 | |
711 | dbits = 26 | |
3af2954a | 712 | |
ab78acc6 IC |
713 | BigInteger.prototype.DB = dbits |
714 | BigInteger.prototype.DM = ((1 << dbits) - 1) | |
715 | var DV = BigInteger.prototype.DV = (1 << dbits) | |
3af2954a | 716 | |
ab78acc6 IC |
717 | var BI_FP = 52 |
718 | BigInteger.prototype.FV = Math.pow(2, BI_FP) | |
719 | BigInteger.prototype.F1 = BI_FP - dbits | |
720 | BigInteger.prototype.F2 = 2 * dbits - BI_FP | |
3af2954a | 721 | |
ab78acc6 IC |
722 | // Digit conversions |
723 | var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz" | |
724 | var BI_RC = new Array() | |
725 | var rr, vv | |
726 | rr = "0".charCodeAt(0) | |
727 | for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv | |
728 | rr = "a".charCodeAt(0) | |
729 | for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv | |
730 | rr = "A".charCodeAt(0) | |
731 | for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv | |
3af2954a | 732 | |
ab78acc6 IC |
733 | function int2char(n) { |
734 | return BI_RM.charAt(n) | |
735 | } | |
3af2954a | 736 | |
ab78acc6 IC |
737 | function intAt(s, i) { |
738 | var c = BI_RC[s.charCodeAt(i)] | |
739 | return (c == null) ? -1 : c | |
740 | } | |
3af2954a | 741 | |
ab78acc6 IC |
742 | // (protected) copy this to r |
743 | function bnpCopyTo(r) { | |
744 | for (var i = this.t - 1; i >= 0; --i) r[i] = this[i] | |
745 | r.t = this.t | |
746 | r.s = this.s | |
747 | } | |
3af2954a | 748 | |
ab78acc6 IC |
749 | // (protected) set from integer value x, -DV <= x < DV |
750 | function bnpFromInt(x) { | |
751 | this.t = 1 | |
752 | this.s = (x < 0) ? -1 : 0 | |
753 | if (x > 0) this[0] = x | |
754 | else if (x < -1) this[0] = x + DV | |
755 | else this.t = 0 | |
756 | } | |
3af2954a | 757 | |
ab78acc6 IC |
758 | // return bigint initialized to value |
759 | function nbv(i) { | |
760 | var r = new BigInteger() | |
761 | r.fromInt(i) | |
762 | return r | |
763 | } | |
3af2954a | 764 | |
ab78acc6 IC |
765 | // (protected) set from string and radix |
766 | function bnpFromString(s, b) { | |
767 | var self = this | |
3af2954a | 768 | |
ab78acc6 IC |
769 | var k |
770 | if (b == 16) k = 4 | |
771 | else if (b == 8) k = 3 | |
772 | else if (b == 256) k = 8; // byte array | |
773 | else if (b == 2) k = 1 | |
774 | else if (b == 32) k = 5 | |
775 | else if (b == 4) k = 2 | |
776 | else { | |
777 | self.fromRadix(s, b) | |
778 | return | |
779 | } | |
780 | self.t = 0 | |
781 | self.s = 0 | |
782 | var i = s.length, | |
783 | mi = false, | |
784 | sh = 0 | |
785 | while (--i >= 0) { | |
786 | var x = (k == 8) ? s[i] & 0xff : intAt(s, i) | |
787 | if (x < 0) { | |
788 | if (s.charAt(i) == "-") mi = true | |
789 | continue | |
790 | } | |
791 | mi = false | |
792 | if (sh == 0) | |
793 | self[self.t++] = x | |
794 | else if (sh + k > self.DB) { | |
795 | self[self.t - 1] |= (x & ((1 << (self.DB - sh)) - 1)) << sh | |
796 | self[self.t++] = (x >> (self.DB - sh)) | |
797 | } else | |
798 | self[self.t - 1] |= x << sh | |
799 | sh += k | |
800 | if (sh >= self.DB) sh -= self.DB | |
801 | } | |
802 | if (k == 8 && (s[0] & 0x80) != 0) { | |
803 | self.s = -1 | |
804 | if (sh > 0) self[self.t - 1] |= ((1 << (self.DB - sh)) - 1) << sh | |
805 | } | |
806 | self.clamp() | |
807 | if (mi) BigInteger.ZERO.subTo(self, self) | |
808 | } | |
3af2954a | 809 | |
ab78acc6 IC |
810 | // (protected) clamp off excess high words |
811 | function bnpClamp() { | |
812 | var c = this.s & this.DM | |
813 | while (this.t > 0 && this[this.t - 1] == c)--this.t | |
814 | } | |
3af2954a | 815 | |
ab78acc6 IC |
816 | // (public) return string representation in given radix |
817 | function bnToString(b) { | |
818 | var self = this | |
819 | if (self.s < 0) return "-" + self.negate() | |
820 | .toString(b) | |
821 | var k | |
822 | if (b == 16) k = 4 | |
823 | else if (b == 8) k = 3 | |
824 | else if (b == 2) k = 1 | |
825 | else if (b == 32) k = 5 | |
826 | else if (b == 4) k = 2 | |
827 | else return self.toRadix(b) | |
828 | var km = (1 << k) - 1, | |
829 | d, m = false, | |
830 | r = "", | |
831 | i = self.t | |
832 | var p = self.DB - (i * self.DB) % k | |
833 | if (i-- > 0) { | |
834 | if (p < self.DB && (d = self[i] >> p) > 0) { | |
835 | m = true | |
836 | r = int2char(d) | |
837 | } | |
838 | while (i >= 0) { | |
839 | if (p < k) { | |
840 | d = (self[i] & ((1 << p) - 1)) << (k - p) | |
841 | d |= self[--i] >> (p += self.DB - k) | |
842 | } else { | |
843 | d = (self[i] >> (p -= k)) & km | |
844 | if (p <= 0) { | |
845 | p += self.DB | |
846 | --i | |
847 | } | |
848 | } | |
849 | if (d > 0) m = true | |
850 | if (m) r += int2char(d) | |
3af2954a | 851 | } |
3af2954a | 852 | } |
ab78acc6 IC |
853 | return m ? r : "0" |
854 | } | |
3af2954a | 855 | |
ab78acc6 IC |
856 | // (public) -this |
857 | function bnNegate() { | |
858 | var r = new BigInteger() | |
859 | BigInteger.ZERO.subTo(this, r) | |
860 | return r | |
861 | } | |
3af2954a | 862 | |
ab78acc6 IC |
863 | // (public) |this| |
864 | function bnAbs() { | |
865 | return (this.s < 0) ? this.negate() : this | |
866 | } | |
3af2954a | 867 | |
ab78acc6 IC |
868 | // (public) return + if this > a, - if this < a, 0 if equal |
869 | function bnCompareTo(a) { | |
870 | var r = this.s - a.s | |
871 | if (r != 0) return r | |
872 | var i = this.t | |
873 | r = i - a.t | |
874 | if (r != 0) return (this.s < 0) ? -r : r | |
875 | while (--i >= 0) | |
876 | if ((r = this[i] - a[i]) != 0) return r | |
877 | return 0 | |
878 | } | |
3af2954a | 879 | |
ab78acc6 IC |
880 | // returns bit length of the integer x |
881 | function nbits(x) { | |
882 | var r = 1, | |
883 | t | |
884 | if ((t = x >>> 16) != 0) { | |
885 | x = t | |
886 | r += 16 | |
887 | } | |
888 | if ((t = x >> 8) != 0) { | |
889 | x = t | |
890 | r += 8 | |
891 | } | |
892 | if ((t = x >> 4) != 0) { | |
893 | x = t | |
894 | r += 4 | |
895 | } | |
896 | if ((t = x >> 2) != 0) { | |
897 | x = t | |
898 | r += 2 | |
3af2954a | 899 | } |
ab78acc6 IC |
900 | if ((t = x >> 1) != 0) { |
901 | x = t | |
902 | r += 1 | |
903 | } | |
904 | return r | |
905 | } | |
906 | ||
907 | // (public) return the number of bits in "this" | |
908 | function bnBitLength() { | |
909 | if (this.t <= 0) return 0 | |
910 | return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)) | |
911 | } | |
3af2954a | 912 | |
ab78acc6 IC |
913 | // (public) return the number of bytes in "this" |
914 | function bnByteLength() { | |
915 | return this.bitLength() >> 3 | |
916 | } | |
3af2954a | 917 | |
ab78acc6 IC |
918 | // (protected) r = this << n*DB |
919 | function bnpDLShiftTo(n, r) { | |
920 | var i | |
921 | for (i = this.t - 1; i >= 0; --i) r[i + n] = this[i] | |
922 | for (i = n - 1; i >= 0; --i) r[i] = 0 | |
923 | r.t = this.t + n | |
924 | r.s = this.s | |
925 | } | |
3af2954a | 926 | |
ab78acc6 IC |
927 | // (protected) r = this >> n*DB |
928 | function bnpDRShiftTo(n, r) { | |
929 | for (var i = n; i < this.t; ++i) r[i - n] = this[i] | |
930 | r.t = Math.max(this.t - n, 0) | |
931 | r.s = this.s | |
932 | } | |
3af2954a | 933 | |
ab78acc6 IC |
934 | // (protected) r = this << n |
935 | function bnpLShiftTo(n, r) { | |
936 | var self = this | |
937 | var bs = n % self.DB | |
938 | var cbs = self.DB - bs | |
939 | var bm = (1 << cbs) - 1 | |
940 | var ds = Math.floor(n / self.DB), | |
941 | c = (self.s << bs) & self.DM, | |
942 | i | |
943 | for (i = self.t - 1; i >= 0; --i) { | |
944 | r[i + ds + 1] = (self[i] >> cbs) | c | |
945 | c = (self[i] & bm) << bs | |
946 | } | |
947 | for (i = ds - 1; i >= 0; --i) r[i] = 0 | |
948 | r[ds] = c | |
949 | r.t = self.t + ds + 1 | |
950 | r.s = self.s | |
951 | r.clamp() | |
952 | } | |
3af2954a | 953 | |
ab78acc6 IC |
954 | // (protected) r = this >> n |
955 | function bnpRShiftTo(n, r) { | |
956 | var self = this | |
957 | r.s = self.s | |
958 | var ds = Math.floor(n / self.DB) | |
959 | if (ds >= self.t) { | |
960 | r.t = 0 | |
961 | return | |
3af2954a | 962 | } |
ab78acc6 IC |
963 | var bs = n % self.DB |
964 | var cbs = self.DB - bs | |
965 | var bm = (1 << bs) - 1 | |
966 | r[0] = self[ds] >> bs | |
967 | for (var i = ds + 1; i < self.t; ++i) { | |
968 | r[i - ds - 1] |= (self[i] & bm) << cbs | |
969 | r[i - ds] = self[i] >> bs | |
970 | } | |
971 | if (bs > 0) r[self.t - ds - 1] |= (self.s & bm) << cbs | |
972 | r.t = self.t - ds | |
973 | r.clamp() | |
974 | } | |
3af2954a | 975 | |
ab78acc6 IC |
976 | // (protected) r = this - a |
977 | function bnpSubTo(a, r) { | |
978 | var self = this | |
979 | var i = 0, | |
980 | c = 0, | |
981 | m = Math.min(a.t, self.t) | |
982 | while (i < m) { | |
983 | c += self[i] - a[i] | |
984 | r[i++] = c & self.DM | |
985 | c >>= self.DB | |
986 | } | |
987 | if (a.t < self.t) { | |
988 | c -= a.s | |
989 | while (i < self.t) { | |
990 | c += self[i] | |
991 | r[i++] = c & self.DM | |
992 | c >>= self.DB | |
993 | } | |
994 | c += self.s | |
995 | } else { | |
996 | c += self.s | |
997 | while (i < a.t) { | |
998 | c -= a[i] | |
999 | r[i++] = c & self.DM | |
1000 | c >>= self.DB | |
1001 | } | |
1002 | c -= a.s | |
1003 | } | |
1004 | r.s = (c < 0) ? -1 : 0 | |
1005 | if (c < -1) r[i++] = self.DV + c | |
1006 | else if (c > 0) r[i++] = c | |
1007 | r.t = i | |
1008 | r.clamp() | |
1009 | } | |
3af2954a | 1010 | |
ab78acc6 IC |
1011 | // (protected) r = this * a, r != this,a (HAC 14.12) |
1012 | // "this" should be the larger one if appropriate. | |
1013 | function bnpMultiplyTo(a, r) { | |
1014 | var x = this.abs(), | |
1015 | y = a.abs() | |
1016 | var i = x.t | |
1017 | r.t = i + y.t | |
1018 | while (--i >= 0) r[i] = 0 | |
1019 | for (i = 0; i < y.t; ++i) r[i + x.t] = x.am(0, y[i], r, i, 0, x.t) | |
1020 | r.s = 0 | |
1021 | r.clamp() | |
1022 | if (this.s != a.s) BigInteger.ZERO.subTo(r, r) | |
1023 | } | |
3af2954a | 1024 | |
ab78acc6 IC |
1025 | // (protected) r = this^2, r != this (HAC 14.16) |
1026 | function bnpSquareTo(r) { | |
1027 | var x = this.abs() | |
1028 | var i = r.t = 2 * x.t | |
1029 | while (--i >= 0) r[i] = 0 | |
1030 | for (i = 0; i < x.t - 1; ++i) { | |
1031 | var c = x.am(i, x[i], r, 2 * i, 0, 1) | |
1032 | if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { | |
1033 | r[i + x.t] -= x.DV | |
1034 | r[i + x.t + 1] = 1 | |
1035 | } | |
1036 | } | |
1037 | if (r.t > 0) r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1) | |
1038 | r.s = 0 | |
1039 | r.clamp() | |
1040 | } | |
3af2954a | 1041 | |
ab78acc6 IC |
1042 | // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) |
1043 | // r != q, this != m. q or r may be null. | |
1044 | function bnpDivRemTo(m, q, r) { | |
1045 | var self = this | |
1046 | var pm = m.abs() | |
1047 | if (pm.t <= 0) return | |
1048 | var pt = self.abs() | |
1049 | if (pt.t < pm.t) { | |
1050 | if (q != null) q.fromInt(0) | |
1051 | if (r != null) self.copyTo(r) | |
1052 | return | |
1053 | } | |
1054 | if (r == null) r = new BigInteger() | |
1055 | var y = new BigInteger(), | |
1056 | ts = self.s, | |
1057 | ms = m.s | |
1058 | var nsh = self.DB - nbits(pm[pm.t - 1]); // normalize modulus | |
1059 | if (nsh > 0) { | |
1060 | pm.lShiftTo(nsh, y) | |
1061 | pt.lShiftTo(nsh, r) | |
1062 | } else { | |
1063 | pm.copyTo(y) | |
1064 | pt.copyTo(r) | |
1065 | } | |
1066 | var ys = y.t | |
1067 | var y0 = y[ys - 1] | |
1068 | if (y0 == 0) return | |
1069 | var yt = y0 * (1 << self.F1) + ((ys > 1) ? y[ys - 2] >> self.F2 : 0) | |
1070 | var d1 = self.FV / yt, | |
1071 | d2 = (1 << self.F1) / yt, | |
1072 | e = 1 << self.F2 | |
1073 | var i = r.t, | |
1074 | j = i - ys, | |
1075 | t = (q == null) ? new BigInteger() : q | |
1076 | y.dlShiftTo(j, t) | |
1077 | if (r.compareTo(t) >= 0) { | |
1078 | r[r.t++] = 1 | |
1079 | r.subTo(t, r) | |
1080 | } | |
1081 | BigInteger.ONE.dlShiftTo(ys, t) | |
1082 | t.subTo(y, y); // "negative" y so we can replace sub with am later | |
1083 | while (y.t < ys) y[y.t++] = 0 | |
1084 | while (--j >= 0) { | |
1085 | // Estimate quotient digit | |
1086 | var qd = (r[--i] == y0) ? self.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2) | |
1087 | if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out | |
1088 | y.dlShiftTo(j, t) | |
1089 | r.subTo(t, r) | |
1090 | while (r[i] < --qd) r.subTo(t, r) | |
3af2954a | 1091 | } |
ab78acc6 IC |
1092 | } |
1093 | if (q != null) { | |
1094 | r.drShiftTo(ys, q) | |
1095 | if (ts != ms) BigInteger.ZERO.subTo(q, q) | |
1096 | } | |
1097 | r.t = ys | |
1098 | r.clamp() | |
1099 | if (nsh > 0) r.rShiftTo(nsh, r); // Denormalize remainder | |
1100 | if (ts < 0) BigInteger.ZERO.subTo(r, r) | |
1101 | } | |
3af2954a | 1102 | |
ab78acc6 IC |
1103 | // (public) this mod a |
1104 | function bnMod(a) { | |
1105 | var r = new BigInteger() | |
1106 | this.abs() | |
1107 | .divRemTo(a, null, r) | |
1108 | if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r) | |
1109 | return r | |
1110 | } | |
3af2954a | 1111 | |
ab78acc6 IC |
1112 | // Modular reduction using "classic" algorithm |
1113 | function Classic(m) { | |
1114 | this.m = m | |
1115 | } | |
3af2954a | 1116 | |
ab78acc6 IC |
1117 | function cConvert(x) { |
1118 | if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m) | |
1119 | else return x | |
1120 | } | |
1121 | ||
1122 | function cRevert(x) { | |
1123 | return x | |
1124 | } | |
3af2954a | 1125 | |
ab78acc6 IC |
1126 | function cReduce(x) { |
1127 | x.divRemTo(this.m, null, x) | |
1128 | } | |
3af2954a | 1129 | |
ab78acc6 IC |
1130 | function cMulTo(x, y, r) { |
1131 | x.multiplyTo(y, r) | |
1132 | this.reduce(r) | |
1133 | } | |
3af2954a | 1134 | |
ab78acc6 IC |
1135 | function cSqrTo(x, r) { |
1136 | x.squareTo(r) | |
1137 | this.reduce(r) | |
1138 | } | |
3af2954a | 1139 | |
ab78acc6 IC |
1140 | Classic.prototype.convert = cConvert |
1141 | Classic.prototype.revert = cRevert | |
1142 | Classic.prototype.reduce = cReduce | |
1143 | Classic.prototype.mulTo = cMulTo | |
1144 | Classic.prototype.sqrTo = cSqrTo | |
3af2954a | 1145 | |
ab78acc6 IC |
1146 | // (protected) return "-1/this % 2^DB"; useful for Mont. reduction |
1147 | // justification: | |
1148 | // xy == 1 (mod m) | |
1149 | // xy = 1+km | |
1150 | // xy(2-xy) = (1+km)(1-km) | |
1151 | // x[y(2-xy)] = 1-k^2m^2 | |
1152 | // x[y(2-xy)] == 1 (mod m^2) | |
1153 | // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 | |
1154 | // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. | |
1155 | // JS multiply "overflows" differently from C/C++, so care is needed here. | |
1156 | function bnpInvDigit() { | |
1157 | if (this.t < 1) return 0 | |
1158 | var x = this[0] | |
1159 | if ((x & 1) == 0) return 0 | |
1160 | var y = x & 3; // y == 1/x mod 2^2 | |
1161 | y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 | |
1162 | y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 | |
1163 | y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 | |
1164 | // last step - calculate inverse mod DV directly | |
1165 | // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints | |
1166 | y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits | |
1167 | // we really want the negative inverse, and -DV < y < DV | |
1168 | return (y > 0) ? this.DV - y : -y | |
1169 | } | |
3af2954a | 1170 | |
ab78acc6 IC |
1171 | // Montgomery reduction |
1172 | function Montgomery(m) { | |
1173 | this.m = m | |
1174 | this.mp = m.invDigit() | |
1175 | this.mpl = this.mp & 0x7fff | |
1176 | this.mph = this.mp >> 15 | |
1177 | this.um = (1 << (m.DB - 15)) - 1 | |
1178 | this.mt2 = 2 * m.t | |
1179 | } | |
3af2954a | 1180 | |
ab78acc6 IC |
1181 | // xR mod m |
1182 | function montConvert(x) { | |
1183 | var r = new BigInteger() | |
1184 | x.abs() | |
1185 | .dlShiftTo(this.m.t, r) | |
1186 | r.divRemTo(this.m, null, r) | |
1187 | if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r) | |
1188 | return r | |
1189 | } | |
3af2954a | 1190 | |
ab78acc6 IC |
1191 | // x/R mod m |
1192 | function montRevert(x) { | |
1193 | var r = new BigInteger() | |
1194 | x.copyTo(r) | |
1195 | this.reduce(r) | |
1196 | return r | |
1197 | } | |
3af2954a | 1198 | |
ab78acc6 IC |
1199 | // x = x/R mod m (HAC 14.32) |
1200 | function montReduce(x) { | |
1201 | while (x.t <= this.mt2) // pad x so am has enough room later | |
1202 | x[x.t++] = 0 | |
1203 | for (var i = 0; i < this.m.t; ++i) { | |
1204 | // faster way of calculating u0 = x[i]*mp mod DV | |
1205 | var j = x[i] & 0x7fff | |
1206 | var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM | |
1207 | // use am to combine the multiply-shift-add into one call | |
1208 | j = i + this.m.t | |
1209 | x[j] += this.m.am(0, u0, x, i, 0, this.m.t) | |
1210 | // propagate carry | |
1211 | while (x[j] >= x.DV) { | |
1212 | x[j] -= x.DV | |
1213 | x[++j]++ | |
1214 | } | |
1215 | } | |
1216 | x.clamp() | |
1217 | x.drShiftTo(this.m.t, x) | |
1218 | if (x.compareTo(this.m) >= 0) x.subTo(this.m, x) | |
1219 | } | |
3af2954a | 1220 | |
ab78acc6 IC |
1221 | // r = "x^2/R mod m"; x != r |
1222 | function montSqrTo(x, r) { | |
1223 | x.squareTo(r) | |
1224 | this.reduce(r) | |
1225 | } | |
3af2954a | 1226 | |
ab78acc6 IC |
1227 | // r = "xy/R mod m"; x,y != r |
1228 | function montMulTo(x, y, r) { | |
1229 | x.multiplyTo(y, r) | |
1230 | this.reduce(r) | |
1231 | } | |
3af2954a | 1232 | |
ab78acc6 IC |
1233 | Montgomery.prototype.convert = montConvert |
1234 | Montgomery.prototype.revert = montRevert | |
1235 | Montgomery.prototype.reduce = montReduce | |
1236 | Montgomery.prototype.mulTo = montMulTo | |
1237 | Montgomery.prototype.sqrTo = montSqrTo | |
3af2954a | 1238 | |
ab78acc6 IC |
1239 | // (protected) true iff this is even |
1240 | function bnpIsEven() { | |
1241 | return ((this.t > 0) ? (this[0] & 1) : this.s) == 0 | |
1242 | } | |
3af2954a | 1243 | |
ab78acc6 IC |
1244 | // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) |
1245 | function bnpExp(e, z) { | |
1246 | if (e > 0xffffffff || e < 1) return BigInteger.ONE | |
1247 | var r = new BigInteger(), | |
1248 | r2 = new BigInteger(), | |
1249 | g = z.convert(this), | |
1250 | i = nbits(e) - 1 | |
1251 | g.copyTo(r) | |
1252 | while (--i >= 0) { | |
1253 | z.sqrTo(r, r2) | |
1254 | if ((e & (1 << i)) > 0) z.mulTo(r2, g, r) | |
1255 | else { | |
1256 | var t = r | |
1257 | r = r2 | |
1258 | r2 = t | |
3af2954a | 1259 | } |
3af2954a | 1260 | } |
ab78acc6 IC |
1261 | return z.revert(r) |
1262 | } | |
3af2954a | 1263 | |
ab78acc6 IC |
1264 | // (public) this^e % m, 0 <= e < 2^32 |
1265 | function bnModPowInt(e, m) { | |
1266 | var z | |
1267 | if (e < 256 || m.isEven()) z = new Classic(m) | |
1268 | else z = new Montgomery(m) | |
1269 | return this.exp(e, z) | |
1270 | } | |
3af2954a | 1271 | |
ab78acc6 IC |
1272 | // protected |
1273 | proto.copyTo = bnpCopyTo | |
1274 | proto.fromInt = bnpFromInt | |
1275 | proto.fromString = bnpFromString | |
1276 | proto.clamp = bnpClamp | |
1277 | proto.dlShiftTo = bnpDLShiftTo | |
1278 | proto.drShiftTo = bnpDRShiftTo | |
1279 | proto.lShiftTo = bnpLShiftTo | |
1280 | proto.rShiftTo = bnpRShiftTo | |
1281 | proto.subTo = bnpSubTo | |
1282 | proto.multiplyTo = bnpMultiplyTo | |
1283 | proto.squareTo = bnpSquareTo | |
1284 | proto.divRemTo = bnpDivRemTo | |
1285 | proto.invDigit = bnpInvDigit | |
1286 | proto.isEven = bnpIsEven | |
1287 | proto.exp = bnpExp | |
3af2954a | 1288 | |
ab78acc6 IC |
1289 | // public |
1290 | proto.toString = bnToString | |
1291 | proto.negate = bnNegate | |
1292 | proto.abs = bnAbs | |
1293 | proto.compareTo = bnCompareTo | |
1294 | proto.bitLength = bnBitLength | |
1295 | proto.byteLength = bnByteLength | |
1296 | proto.mod = bnMod | |
1297 | proto.modPowInt = bnModPowInt | |
3af2954a | 1298 | |
ab78acc6 IC |
1299 | // (public) |
1300 | function bnClone() { | |
1301 | var r = new BigInteger() | |
1302 | this.copyTo(r) | |
1303 | return r | |
1304 | } | |
3af2954a | 1305 | |
ab78acc6 IC |
1306 | // (public) return value as integer |
1307 | function bnIntValue() { | |
1308 | if (this.s < 0) { | |
1309 | if (this.t == 1) return this[0] - this.DV | |
1310 | else if (this.t == 0) return -1 | |
1311 | } else if (this.t == 1) return this[0] | |
1312 | else if (this.t == 0) return 0 | |
1313 | // assumes 16 < DB < 32 | |
1314 | return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0] | |
1315 | } | |
3af2954a | 1316 | |
ab78acc6 IC |
1317 | // (public) return value as byte |
1318 | function bnByteValue() { | |
1319 | return (this.t == 0) ? this.s : (this[0] << 24) >> 24 | |
1320 | } | |
3af2954a | 1321 | |
ab78acc6 IC |
1322 | // (public) return value as short (assumes DB>=16) |
1323 | function bnShortValue() { | |
1324 | return (this.t == 0) ? this.s : (this[0] << 16) >> 16 | |
1325 | } | |
3af2954a | 1326 | |
ab78acc6 IC |
1327 | // (protected) return x s.t. r^x < DV |
1328 | function bnpChunkSize(r) { | |
1329 | return Math.floor(Math.LN2 * this.DB / Math.log(r)) | |
1330 | } | |
3af2954a | 1331 | |
ab78acc6 IC |
1332 | // (public) 0 if this == 0, 1 if this > 0 |
1333 | function bnSigNum() { | |
1334 | if (this.s < 0) return -1 | |
1335 | else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0 | |
1336 | else return 1 | |
1337 | } | |
3af2954a | 1338 | |
ab78acc6 IC |
1339 | // (protected) convert to radix string |
1340 | function bnpToRadix(b) { | |
1341 | if (b == null) b = 10 | |
1342 | if (this.signum() == 0 || b < 2 || b > 36) return "0" | |
1343 | var cs = this.chunkSize(b) | |
1344 | var a = Math.pow(b, cs) | |
1345 | var d = nbv(a), | |
1346 | y = new BigInteger(), | |
1347 | z = new BigInteger(), | |
1348 | r = "" | |
1349 | this.divRemTo(d, y, z) | |
1350 | while (y.signum() > 0) { | |
1351 | r = (a + z.intValue()) | |
1352 | .toString(b) | |
1353 | .substr(1) + r | |
1354 | y.divRemTo(d, y, z) | |
1355 | } | |
1356 | return z.intValue() | |
1357 | .toString(b) + r | |
1358 | } | |
3af2954a | 1359 | |
ab78acc6 IC |
1360 | // (protected) convert from radix string |
1361 | function bnpFromRadix(s, b) { | |
1362 | var self = this | |
1363 | self.fromInt(0) | |
1364 | if (b == null) b = 10 | |
1365 | var cs = self.chunkSize(b) | |
1366 | var d = Math.pow(b, cs), | |
1367 | mi = false, | |
1368 | j = 0, | |
1369 | w = 0 | |
1370 | for (var i = 0; i < s.length; ++i) { | |
1371 | var x = intAt(s, i) | |
1372 | if (x < 0) { | |
1373 | if (s.charAt(i) == "-" && self.signum() == 0) mi = true | |
1374 | continue | |
1375 | } | |
1376 | w = b * w + x | |
1377 | if (++j >= cs) { | |
1378 | self.dMultiply(d) | |
1379 | self.dAddOffset(w, 0) | |
1380 | j = 0 | |
1381 | w = 0 | |
1382 | } | |
1383 | } | |
1384 | if (j > 0) { | |
1385 | self.dMultiply(Math.pow(b, j)) | |
1386 | self.dAddOffset(w, 0) | |
1387 | } | |
1388 | if (mi) BigInteger.ZERO.subTo(self, self) | |
1389 | } | |
3af2954a | 1390 | |
ab78acc6 IC |
1391 | // (protected) alternate constructor |
1392 | function bnpFromNumber(a, b, c) { | |
1393 | var self = this | |
1394 | if ("number" == typeof b) { | |
1395 | // new BigInteger(int,int,RNG) | |
1396 | if (a < 2) self.fromInt(1) | |
1397 | else { | |
1398 | self.fromNumber(a, c) | |
1399 | if (!self.testBit(a - 1)) // force MSB set | |
1400 | self.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, self) | |
1401 | if (self.isEven()) self.dAddOffset(1, 0); // force odd | |
1402 | while (!self.isProbablePrime(b)) { | |
1403 | self.dAddOffset(2, 0) | |
1404 | if (self.bitLength() > a) self.subTo(BigInteger.ONE.shiftLeft(a - 1), self) | |
1405 | } | |
1406 | } | |
1407 | } else { | |
1408 | // new BigInteger(int,RNG) | |
1409 | var x = new Array(), | |
1410 | t = a & 7 | |
1411 | x.length = (a >> 3) + 1 | |
1412 | b.nextBytes(x) | |
1413 | if (t > 0) x[0] &= ((1 << t) - 1) | |
1414 | else x[0] = 0 | |
1415 | self.fromString(x, 256) | |
3af2954a | 1416 | } |
ab78acc6 | 1417 | } |
3af2954a | 1418 | |
ab78acc6 IC |
1419 | // (public) convert to bigendian byte array |
1420 | function bnToByteArray() { | |
1421 | var self = this | |
1422 | var i = self.t, | |
1423 | r = new Array() | |
1424 | r[0] = self.s | |
1425 | var p = self.DB - (i * self.DB) % 8, | |
1426 | d, k = 0 | |
1427 | if (i-- > 0) { | |
1428 | if (p < self.DB && (d = self[i] >> p) != (self.s & self.DM) >> p) | |
1429 | r[k++] = d | (self.s << (self.DB - p)) | |
1430 | while (i >= 0) { | |
1431 | if (p < 8) { | |
1432 | d = (self[i] & ((1 << p) - 1)) << (8 - p) | |
1433 | d |= self[--i] >> (p += self.DB - 8) | |
1434 | } else { | |
1435 | d = (self[i] >> (p -= 8)) & 0xff | |
1436 | if (p <= 0) { | |
1437 | p += self.DB | |
1438 | --i | |
1439 | } | |
1440 | } | |
1441 | if ((d & 0x80) != 0) d |= -256 | |
1442 | if (k === 0 && (self.s & 0x80) != (d & 0x80))++k | |
1443 | if (k > 0 || d != self.s) r[k++] = d | |
3af2954a | 1444 | } |
3af2954a | 1445 | } |
ab78acc6 IC |
1446 | return r |
1447 | } | |
3af2954a | 1448 | |
ab78acc6 IC |
1449 | function bnEquals(a) { |
1450 | return (this.compareTo(a) == 0) | |
1451 | } | |
3af2954a | 1452 | |
ab78acc6 IC |
1453 | function bnMin(a) { |
1454 | return (this.compareTo(a) < 0) ? this : a | |
1455 | } | |
3af2954a | 1456 | |
ab78acc6 IC |
1457 | function bnMax(a) { |
1458 | return (this.compareTo(a) > 0) ? this : a | |
1459 | } | |
3af2954a | 1460 | |
ab78acc6 IC |
1461 | // (protected) r = this op a (bitwise) |
1462 | function bnpBitwiseTo(a, op, r) { | |
1463 | var self = this | |
1464 | var i, f, m = Math.min(a.t, self.t) | |
1465 | for (i = 0; i < m; ++i) r[i] = op(self[i], a[i]) | |
1466 | if (a.t < self.t) { | |
1467 | f = a.s & self.DM | |
1468 | for (i = m; i < self.t; ++i) r[i] = op(self[i], f) | |
1469 | r.t = self.t | |
1470 | } else { | |
1471 | f = self.s & self.DM | |
1472 | for (i = m; i < a.t; ++i) r[i] = op(f, a[i]) | |
1473 | r.t = a.t | |
3af2954a | 1474 | } |
ab78acc6 IC |
1475 | r.s = op(self.s, a.s) |
1476 | r.clamp() | |
1477 | } | |
3af2954a | 1478 | |
ab78acc6 IC |
1479 | // (public) this & a |
1480 | function op_and(x, y) { | |
1481 | return x & y | |
1482 | } | |
3af2954a | 1483 | |
ab78acc6 IC |
1484 | function bnAnd(a) { |
1485 | var r = new BigInteger() | |
1486 | this.bitwiseTo(a, op_and, r) | |
1487 | return r | |
1488 | } | |
3af2954a | 1489 | |
ab78acc6 IC |
1490 | // (public) this | a |
1491 | function op_or(x, y) { | |
1492 | return x | y | |
1493 | } | |
3af2954a | 1494 | |
ab78acc6 IC |
1495 | function bnOr(a) { |
1496 | var r = new BigInteger() | |
1497 | this.bitwiseTo(a, op_or, r) | |
1498 | return r | |
1499 | } | |
3af2954a | 1500 | |
ab78acc6 IC |
1501 | // (public) this ^ a |
1502 | function op_xor(x, y) { | |
1503 | return x ^ y | |
1504 | } | |
3af2954a | 1505 | |
ab78acc6 IC |
1506 | function bnXor(a) { |
1507 | var r = new BigInteger() | |
1508 | this.bitwiseTo(a, op_xor, r) | |
1509 | return r | |
1510 | } | |
3af2954a | 1511 | |
ab78acc6 IC |
1512 | // (public) this & ~a |
1513 | function op_andnot(x, y) { | |
1514 | return x & ~y | |
1515 | } | |
3af2954a | 1516 | |
ab78acc6 IC |
1517 | function bnAndNot(a) { |
1518 | var r = new BigInteger() | |
1519 | this.bitwiseTo(a, op_andnot, r) | |
1520 | return r | |
1521 | } | |
3af2954a | 1522 | |
ab78acc6 IC |
1523 | // (public) ~this |
1524 | function bnNot() { | |
1525 | var r = new BigInteger() | |
1526 | for (var i = 0; i < this.t; ++i) r[i] = this.DM & ~this[i] | |
1527 | r.t = this.t | |
1528 | r.s = ~this.s | |
1529 | return r | |
1530 | } | |
3af2954a | 1531 | |
ab78acc6 IC |
1532 | // (public) this << n |
1533 | function bnShiftLeft(n) { | |
1534 | var r = new BigInteger() | |
1535 | if (n < 0) this.rShiftTo(-n, r) | |
1536 | else this.lShiftTo(n, r) | |
1537 | return r | |
1538 | } | |
3af2954a | 1539 | |
ab78acc6 IC |
1540 | // (public) this >> n |
1541 | function bnShiftRight(n) { | |
1542 | var r = new BigInteger() | |
1543 | if (n < 0) this.lShiftTo(-n, r) | |
1544 | else this.rShiftTo(n, r) | |
1545 | return r | |
1546 | } | |
3af2954a | 1547 | |
ab78acc6 IC |
1548 | // return index of lowest 1-bit in x, x < 2^31 |
1549 | function lbit(x) { | |
1550 | if (x == 0) return -1 | |
1551 | var r = 0 | |
1552 | if ((x & 0xffff) == 0) { | |
1553 | x >>= 16 | |
1554 | r += 16 | |
3af2954a | 1555 | } |
ab78acc6 IC |
1556 | if ((x & 0xff) == 0) { |
1557 | x >>= 8 | |
1558 | r += 8 | |
1559 | } | |
1560 | if ((x & 0xf) == 0) { | |
1561 | x >>= 4 | |
1562 | r += 4 | |
1563 | } | |
1564 | if ((x & 3) == 0) { | |
1565 | x >>= 2 | |
1566 | r += 2 | |
1567 | } | |
1568 | if ((x & 1) == 0)++r | |
1569 | return r | |
1570 | } | |
3af2954a | 1571 | |
ab78acc6 IC |
1572 | // (public) returns index of lowest 1-bit (or -1 if none) |
1573 | function bnGetLowestSetBit() { | |
1574 | for (var i = 0; i < this.t; ++i) | |
1575 | if (this[i] != 0) return i * this.DB + lbit(this[i]) | |
1576 | if (this.s < 0) return this.t * this.DB | |
1577 | return -1 | |
1578 | } | |
3af2954a | 1579 | |
ab78acc6 IC |
1580 | // return number of 1 bits in x |
1581 | function cbit(x) { | |
1582 | var r = 0 | |
1583 | while (x != 0) { | |
1584 | x &= x - 1 | |
1585 | ++r | |
3af2954a | 1586 | } |
ab78acc6 IC |
1587 | return r |
1588 | } | |
3af2954a | 1589 | |
ab78acc6 IC |
1590 | // (public) return number of set bits |
1591 | function bnBitCount() { | |
1592 | var r = 0, | |
1593 | x = this.s & this.DM | |
1594 | for (var i = 0; i < this.t; ++i) r += cbit(this[i] ^ x) | |
1595 | return r | |
1596 | } | |
1597 | ||
1598 | // (public) true iff nth bit is set | |
1599 | function bnTestBit(n) { | |
1600 | var j = Math.floor(n / this.DB) | |
1601 | if (j >= this.t) return (this.s != 0) | |
1602 | return ((this[j] & (1 << (n % this.DB))) != 0) | |
1603 | } | |
3af2954a | 1604 | |
ab78acc6 IC |
1605 | // (protected) this op (1<<n) |
1606 | function bnpChangeBit(n, op) { | |
1607 | var r = BigInteger.ONE.shiftLeft(n) | |
1608 | this.bitwiseTo(r, op, r) | |
1609 | return r | |
1610 | } | |
3af2954a | 1611 | |
ab78acc6 IC |
1612 | // (public) this | (1<<n) |
1613 | function bnSetBit(n) { | |
1614 | return this.changeBit(n, op_or) | |
1615 | } | |
3af2954a | 1616 | |
ab78acc6 IC |
1617 | // (public) this & ~(1<<n) |
1618 | function bnClearBit(n) { | |
1619 | return this.changeBit(n, op_andnot) | |
1620 | } | |
3af2954a | 1621 | |
ab78acc6 IC |
1622 | // (public) this ^ (1<<n) |
1623 | function bnFlipBit(n) { | |
1624 | return this.changeBit(n, op_xor) | |
1625 | } | |
3af2954a | 1626 | |
ab78acc6 IC |
1627 | // (protected) r = this + a |
1628 | function bnpAddTo(a, r) { | |
1629 | var self = this | |
3af2954a | 1630 | |
ab78acc6 IC |
1631 | var i = 0, |
1632 | c = 0, | |
1633 | m = Math.min(a.t, self.t) | |
1634 | while (i < m) { | |
1635 | c += self[i] + a[i] | |
1636 | r[i++] = c & self.DM | |
1637 | c >>= self.DB | |
1638 | } | |
1639 | if (a.t < self.t) { | |
1640 | c += a.s | |
1641 | while (i < self.t) { | |
1642 | c += self[i] | |
1643 | r[i++] = c & self.DM | |
1644 | c >>= self.DB | |
1645 | } | |
1646 | c += self.s | |
1647 | } else { | |
1648 | c += self.s | |
1649 | while (i < a.t) { | |
1650 | c += a[i] | |
1651 | r[i++] = c & self.DM | |
1652 | c >>= self.DB | |
1653 | } | |
1654 | c += a.s | |
1655 | } | |
1656 | r.s = (c < 0) ? -1 : 0 | |
1657 | if (c > 0) r[i++] = c | |
1658 | else if (c < -1) r[i++] = self.DV + c | |
1659 | r.t = i | |
1660 | r.clamp() | |
1661 | } | |
3af2954a | 1662 | |
ab78acc6 IC |
1663 | // (public) this + a |
1664 | function bnAdd(a) { | |
1665 | var r = new BigInteger() | |
1666 | this.addTo(a, r) | |
1667 | return r | |
1668 | } | |
3af2954a | 1669 | |
ab78acc6 IC |
1670 | // (public) this - a |
1671 | function bnSubtract(a) { | |
1672 | var r = new BigInteger() | |
1673 | this.subTo(a, r) | |
1674 | return r | |
1675 | } | |
3af2954a | 1676 | |
ab78acc6 IC |
1677 | // (public) this * a |
1678 | function bnMultiply(a) { | |
1679 | var r = new BigInteger() | |
1680 | this.multiplyTo(a, r) | |
1681 | return r | |
1682 | } | |
3af2954a | 1683 | |
ab78acc6 IC |
1684 | // (public) this^2 |
1685 | function bnSquare() { | |
1686 | var r = new BigInteger() | |
1687 | this.squareTo(r) | |
1688 | return r | |
1689 | } | |
3af2954a | 1690 | |
ab78acc6 IC |
1691 | // (public) this / a |
1692 | function bnDivide(a) { | |
1693 | var r = new BigInteger() | |
1694 | this.divRemTo(a, r, null) | |
1695 | return r | |
1696 | } | |
3af2954a | 1697 | |
ab78acc6 IC |
1698 | // (public) this % a |
1699 | function bnRemainder(a) { | |
1700 | var r = new BigInteger() | |
1701 | this.divRemTo(a, null, r) | |
1702 | return r | |
1703 | } | |
3af2954a | 1704 | |
ab78acc6 IC |
1705 | // (public) [this/a,this%a] |
1706 | function bnDivideAndRemainder(a) { | |
1707 | var q = new BigInteger(), | |
1708 | r = new BigInteger() | |
1709 | this.divRemTo(a, q, r) | |
1710 | return new Array(q, r) | |
1711 | } | |
3af2954a | 1712 | |
ab78acc6 IC |
1713 | // (protected) this *= n, this >= 0, 1 < n < DV |
1714 | function bnpDMultiply(n) { | |
1715 | this[this.t] = this.am(0, n - 1, this, 0, 0, this.t) | |
1716 | ++this.t | |
1717 | this.clamp() | |
1718 | } | |
3af2954a | 1719 | |
ab78acc6 IC |
1720 | // (protected) this += n << w words, this >= 0 |
1721 | function bnpDAddOffset(n, w) { | |
1722 | if (n == 0) return | |
1723 | while (this.t <= w) this[this.t++] = 0 | |
1724 | this[w] += n | |
1725 | while (this[w] >= this.DV) { | |
1726 | this[w] -= this.DV | |
1727 | if (++w >= this.t) this[this.t++] = 0 | |
1728 | ++this[w] | |
3af2954a | 1729 | } |
ab78acc6 | 1730 | } |
3af2954a | 1731 | |
ab78acc6 IC |
1732 | // A "null" reducer |
1733 | function NullExp() {} | |
3af2954a | 1734 | |
ab78acc6 IC |
1735 | function nNop(x) { |
1736 | return x | |
1737 | } | |
3af2954a | 1738 | |
ab78acc6 IC |
1739 | function nMulTo(x, y, r) { |
1740 | x.multiplyTo(y, r) | |
1741 | } | |
3af2954a | 1742 | |
ab78acc6 IC |
1743 | function nSqrTo(x, r) { |
1744 | x.squareTo(r) | |
1745 | } | |
3af2954a | 1746 | |
ab78acc6 IC |
1747 | NullExp.prototype.convert = nNop |
1748 | NullExp.prototype.revert = nNop | |
1749 | NullExp.prototype.mulTo = nMulTo | |
1750 | NullExp.prototype.sqrTo = nSqrTo | |
3af2954a | 1751 | |
ab78acc6 IC |
1752 | // (public) this^e |
1753 | function bnPow(e) { | |
1754 | return this.exp(e, new NullExp()) | |
1755 | } | |
3af2954a | 1756 | |
ab78acc6 IC |
1757 | // (protected) r = lower n words of "this * a", a.t <= n |
1758 | // "this" should be the larger one if appropriate. | |
1759 | function bnpMultiplyLowerTo(a, n, r) { | |
1760 | var i = Math.min(this.t + a.t, n) | |
1761 | r.s = 0; // assumes a,this >= 0 | |
1762 | r.t = i | |
1763 | while (i > 0) r[--i] = 0 | |
1764 | var j | |
1765 | for (j = r.t - this.t; i < j; ++i) r[i + this.t] = this.am(0, a[i], r, i, 0, this.t) | |
1766 | for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a[i], r, i, 0, n - i) | |
1767 | r.clamp() | |
1768 | } | |
3af2954a | 1769 | |
ab78acc6 IC |
1770 | // (protected) r = "this * a" without lower n words, n > 0 |
1771 | // "this" should be the larger one if appropriate. | |
1772 | function bnpMultiplyUpperTo(a, n, r) { | |
1773 | --n | |
1774 | var i = r.t = this.t + a.t - n | |
1775 | r.s = 0; // assumes a,this >= 0 | |
1776 | while (--i >= 0) r[i] = 0 | |
1777 | for (i = Math.max(n - this.t, 0); i < a.t; ++i) | |
1778 | r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n) | |
1779 | r.clamp() | |
1780 | r.drShiftTo(1, r) | |
1781 | } | |
3af2954a | 1782 | |
ab78acc6 IC |
1783 | // Barrett modular reduction |
1784 | function Barrett(m) { | |
1785 | // setup Barrett | |
1786 | this.r2 = new BigInteger() | |
1787 | this.q3 = new BigInteger() | |
1788 | BigInteger.ONE.dlShiftTo(2 * m.t, this.r2) | |
1789 | this.mu = this.r2.divide(m) | |
1790 | this.m = m | |
1791 | } | |
3af2954a | 1792 | |
ab78acc6 IC |
1793 | function barrettConvert(x) { |
1794 | if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m) | |
1795 | else if (x.compareTo(this.m) < 0) return x | |
1796 | else { | |
1797 | var r = new BigInteger() | |
1798 | x.copyTo(r) | |
1799 | this.reduce(r) | |
1800 | return r | |
3af2954a | 1801 | } |
ab78acc6 | 1802 | } |
3af2954a | 1803 | |
ab78acc6 IC |
1804 | function barrettRevert(x) { |
1805 | return x | |
1806 | } | |
3af2954a | 1807 | |
ab78acc6 IC |
1808 | // x = x mod m (HAC 14.42) |
1809 | function barrettReduce(x) { | |
1810 | var self = this | |
1811 | x.drShiftTo(self.m.t - 1, self.r2) | |
1812 | if (x.t > self.m.t + 1) { | |
1813 | x.t = self.m.t + 1 | |
1814 | x.clamp() | |
3af2954a | 1815 | } |
ab78acc6 IC |
1816 | self.mu.multiplyUpperTo(self.r2, self.m.t + 1, self.q3) |
1817 | self.m.multiplyLowerTo(self.q3, self.m.t + 1, self.r2) | |
1818 | while (x.compareTo(self.r2) < 0) x.dAddOffset(1, self.m.t + 1) | |
1819 | x.subTo(self.r2, x) | |
1820 | while (x.compareTo(self.m) >= 0) x.subTo(self.m, x) | |
1821 | } | |
3af2954a | 1822 | |
ab78acc6 IC |
1823 | // r = x^2 mod m; x != r |
1824 | function barrettSqrTo(x, r) { | |
1825 | x.squareTo(r) | |
1826 | this.reduce(r) | |
1827 | } | |
3af2954a | 1828 | |
ab78acc6 IC |
1829 | // r = x*y mod m; x,y != r |
1830 | function barrettMulTo(x, y, r) { | |
1831 | x.multiplyTo(y, r) | |
1832 | this.reduce(r) | |
1833 | } | |
3af2954a | 1834 | |
ab78acc6 IC |
1835 | Barrett.prototype.convert = barrettConvert |
1836 | Barrett.prototype.revert = barrettRevert | |
1837 | Barrett.prototype.reduce = barrettReduce | |
1838 | Barrett.prototype.mulTo = barrettMulTo | |
1839 | Barrett.prototype.sqrTo = barrettSqrTo | |
3af2954a | 1840 | |
ab78acc6 IC |
1841 | // (public) this^e % m (HAC 14.85) |
1842 | function bnModPow(e, m) { | |
1843 | var i = e.bitLength(), | |
1844 | k, r = nbv(1), | |
1845 | z | |
1846 | if (i <= 0) return r | |
1847 | else if (i < 18) k = 1 | |
1848 | else if (i < 48) k = 3 | |
1849 | else if (i < 144) k = 4 | |
1850 | else if (i < 768) k = 5 | |
1851 | else k = 6 | |
1852 | if (i < 8) | |
1853 | z = new Classic(m) | |
1854 | else if (m.isEven()) | |
1855 | z = new Barrett(m) | |
1856 | else | |
1857 | z = new Montgomery(m) | |
3af2954a | 1858 | |
ab78acc6 IC |
1859 | // precomputation |
1860 | var g = new Array(), | |
1861 | n = 3, | |
1862 | k1 = k - 1, | |
1863 | km = (1 << k) - 1 | |
1864 | g[1] = z.convert(this) | |
1865 | if (k > 1) { | |
1866 | var g2 = new BigInteger() | |
1867 | z.sqrTo(g[1], g2) | |
1868 | while (n <= km) { | |
1869 | g[n] = new BigInteger() | |
1870 | z.mulTo(g2, g[n - 2], g[n]) | |
1871 | n += 2 | |
1872 | } | |
1873 | } | |
1874 | ||
1875 | var j = e.t - 1, | |
1876 | w, is1 = true, | |
1877 | r2 = new BigInteger(), | |
1878 | t | |
1879 | i = nbits(e[j]) - 1 | |
1880 | while (j >= 0) { | |
1881 | if (i >= k1) w = (e[j] >> (i - k1)) & km | |
1882 | else { | |
1883 | w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i) | |
1884 | if (j > 0) w |= e[j - 1] >> (this.DB + i - k1) | |
1885 | } | |
3af2954a | 1886 | |
ab78acc6 IC |
1887 | n = k |
1888 | while ((w & 1) == 0) { | |
1889 | w >>= 1 | |
1890 | --n | |
1891 | } | |
1892 | if ((i -= n) < 0) { | |
1893 | i += this.DB | |
1894 | --j | |
1895 | } | |
1896 | if (is1) { // ret == 1, don't bother squaring or multiplying it | |
1897 | g[w].copyTo(r) | |
1898 | is1 = false | |
1899 | } else { | |
1900 | while (n > 1) { | |
1901 | z.sqrTo(r, r2) | |
1902 | z.sqrTo(r2, r) | |
1903 | n -= 2 | |
1904 | } | |
1905 | if (n > 0) z.sqrTo(r, r2) | |
1906 | else { | |
1907 | t = r | |
1908 | r = r2 | |
1909 | r2 = t | |
1910 | } | |
1911 | z.mulTo(r2, g[w], r) | |
1912 | } | |
3af2954a | 1913 | |
ab78acc6 IC |
1914 | while (j >= 0 && (e[j] & (1 << i)) == 0) { |
1915 | z.sqrTo(r, r2) | |
1916 | t = r | |
1917 | r = r2 | |
1918 | r2 = t | |
1919 | if (--i < 0) { | |
1920 | i = this.DB - 1 | |
1921 | --j | |
3af2954a | 1922 | } |
3af2954a IC |
1923 | } |
1924 | } | |
ab78acc6 IC |
1925 | return z.revert(r) |
1926 | } | |
3af2954a | 1927 | |
ab78acc6 IC |
1928 | // (public) gcd(this,a) (HAC 14.54) |
1929 | function bnGCD(a) { | |
1930 | var x = (this.s < 0) ? this.negate() : this.clone() | |
1931 | var y = (a.s < 0) ? a.negate() : a.clone() | |
1932 | if (x.compareTo(y) < 0) { | |
1933 | var t = x | |
1934 | x = y | |
1935 | y = t | |
1936 | } | |
1937 | var i = x.getLowestSetBit(), | |
1938 | g = y.getLowestSetBit() | |
1939 | if (g < 0) return x | |
1940 | if (i < g) g = i | |
1941 | if (g > 0) { | |
1942 | x.rShiftTo(g, x) | |
1943 | y.rShiftTo(g, y) | |
1944 | } | |
1945 | while (x.signum() > 0) { | |
1946 | if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x) | |
1947 | if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y) | |
1948 | if (x.compareTo(y) >= 0) { | |
1949 | x.subTo(y, x) | |
1950 | x.rShiftTo(1, x) | |
1951 | } else { | |
1952 | y.subTo(x, y) | |
1953 | y.rShiftTo(1, y) | |
1954 | } | |
3af2954a | 1955 | } |
ab78acc6 IC |
1956 | if (g > 0) y.lShiftTo(g, y) |
1957 | return y | |
1958 | } | |
3af2954a | 1959 | |
ab78acc6 IC |
1960 | // (protected) this % n, n < 2^26 |
1961 | function bnpModInt(n) { | |
1962 | if (n <= 0) return 0 | |
1963 | var d = this.DV % n, | |
1964 | r = (this.s < 0) ? n - 1 : 0 | |
1965 | if (this.t > 0) | |
1966 | if (d == 0) r = this[0] % n | |
1967 | else | |
1968 | for (var i = this.t - 1; i >= 0; --i) r = (d * r + this[i]) % n | |
1969 | return r | |
1970 | } | |
3af2954a | 1971 | |
ab78acc6 IC |
1972 | // (public) 1/this % m (HAC 14.61) |
1973 | function bnModInverse(m) { | |
1974 | var ac = m.isEven() | |
1975 | if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO | |
1976 | var u = m.clone(), | |
1977 | v = this.clone() | |
1978 | var a = nbv(1), | |
1979 | b = nbv(0), | |
1980 | c = nbv(0), | |
1981 | d = nbv(1) | |
1982 | while (u.signum() != 0) { | |
1983 | while (u.isEven()) { | |
1984 | u.rShiftTo(1, u) | |
1985 | if (ac) { | |
1986 | if (!a.isEven() || !b.isEven()) { | |
1987 | a.addTo(this, a) | |
1988 | b.subTo(m, b) | |
1989 | } | |
1990 | a.rShiftTo(1, a) | |
1991 | } else if (!b.isEven()) b.subTo(m, b) | |
1992 | b.rShiftTo(1, b) | |
1993 | } | |
1994 | while (v.isEven()) { | |
1995 | v.rShiftTo(1, v) | |
1996 | if (ac) { | |
1997 | if (!c.isEven() || !d.isEven()) { | |
1998 | c.addTo(this, c) | |
1999 | d.subTo(m, d) | |
2000 | } | |
2001 | c.rShiftTo(1, c) | |
2002 | } else if (!d.isEven()) d.subTo(m, d) | |
2003 | d.rShiftTo(1, d) | |
2004 | } | |
2005 | if (u.compareTo(v) >= 0) { | |
2006 | u.subTo(v, u) | |
2007 | if (ac) a.subTo(c, a) | |
2008 | b.subTo(d, b) | |
2009 | } else { | |
2010 | v.subTo(u, v) | |
2011 | if (ac) c.subTo(a, c) | |
2012 | d.subTo(b, d) | |
2013 | } | |
2014 | } | |
2015 | if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO | |
2016 | if (d.compareTo(m) >= 0) return d.subtract(m) | |
2017 | if (d.signum() < 0) d.addTo(m, d) | |
2018 | else return d | |
2019 | if (d.signum() < 0) return d.add(m) | |
2020 | else return d | |
2021 | } | |
2022 | ||
2023 | var lowprimes = [ | |
2024 | 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, | |
2025 | 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, | |
2026 | 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, | |
2027 | 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, | |
2028 | 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, | |
2029 | 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, | |
2030 | 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, | |
2031 | 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, | |
2032 | 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, | |
2033 | 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, | |
2034 | 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 | |
2035 | ] | |
2036 | ||
2037 | var lplim = (1 << 26) / lowprimes[lowprimes.length - 1] | |
2038 | ||
2039 | // (public) test primality with certainty >= 1-.5^t | |
2040 | function bnIsProbablePrime(t) { | |
2041 | var i, x = this.abs() | |
2042 | if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { | |
2043 | for (i = 0; i < lowprimes.length; ++i) | |
2044 | if (x[0] == lowprimes[i]) return true | |
2045 | return false | |
3af2954a | 2046 | } |
ab78acc6 IC |
2047 | if (x.isEven()) return false |
2048 | i = 1 | |
2049 | while (i < lowprimes.length) { | |
2050 | var m = lowprimes[i], | |
2051 | j = i + 1 | |
2052 | while (j < lowprimes.length && m < lplim) m *= lowprimes[j++] | |
2053 | m = x.modInt(m) | |
2054 | while (i < j) if (m % lowprimes[i++] == 0) return false | |
2055 | } | |
2056 | return x.millerRabin(t) | |
2057 | } | |
2058 | ||
2059 | // (protected) true if probably prime (HAC 4.24, Miller-Rabin) | |
2060 | function bnpMillerRabin(t) { | |
2061 | var n1 = this.subtract(BigInteger.ONE) | |
2062 | var k = n1.getLowestSetBit() | |
2063 | if (k <= 0) return false | |
2064 | var r = n1.shiftRight(k) | |
2065 | t = (t + 1) >> 1 | |
2066 | if (t > lowprimes.length) t = lowprimes.length | |
2067 | var a = new BigInteger(null) | |
2068 | var j, bases = [] | |
2069 | for (var i = 0; i < t; ++i) { | |
2070 | for (;;) { | |
2071 | j = lowprimes[Math.floor(Math.random() * lowprimes.length)] | |
2072 | if (bases.indexOf(j) == -1) break | |
2073 | } | |
2074 | bases.push(j) | |
2075 | a.fromInt(j) | |
2076 | var y = a.modPow(r, this) | |
2077 | if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { | |
2078 | var j = 1 | |
2079 | while (j++ < k && y.compareTo(n1) != 0) { | |
2080 | y = y.modPowInt(2, this) | |
2081 | if (y.compareTo(BigInteger.ONE) == 0) return false | |
2082 | } | |
2083 | if (y.compareTo(n1) != 0) return false | |
2084 | } | |
3af2954a | 2085 | } |
ab78acc6 IC |
2086 | return true |
2087 | } | |
3af2954a | 2088 | |
ab78acc6 IC |
2089 | // protected |
2090 | proto.chunkSize = bnpChunkSize | |
2091 | proto.toRadix = bnpToRadix | |
2092 | proto.fromRadix = bnpFromRadix | |
2093 | proto.fromNumber = bnpFromNumber | |
2094 | proto.bitwiseTo = bnpBitwiseTo | |
2095 | proto.changeBit = bnpChangeBit | |
2096 | proto.addTo = bnpAddTo | |
2097 | proto.dMultiply = bnpDMultiply | |
2098 | proto.dAddOffset = bnpDAddOffset | |
2099 | proto.multiplyLowerTo = bnpMultiplyLowerTo | |
2100 | proto.multiplyUpperTo = bnpMultiplyUpperTo | |
2101 | proto.modInt = bnpModInt | |
2102 | proto.millerRabin = bnpMillerRabin | |
3af2954a | 2103 | |
ab78acc6 IC |
2104 | // public |
2105 | proto.clone = bnClone | |
2106 | proto.intValue = bnIntValue | |
2107 | proto.byteValue = bnByteValue | |
2108 | proto.shortValue = bnShortValue | |
2109 | proto.signum = bnSigNum | |
2110 | proto.toByteArray = bnToByteArray | |
2111 | proto.equals = bnEquals | |
2112 | proto.min = bnMin | |
2113 | proto.max = bnMax | |
2114 | proto.and = bnAnd | |
2115 | proto.or = bnOr | |
2116 | proto.xor = bnXor | |
2117 | proto.andNot = bnAndNot | |
2118 | proto.not = bnNot | |
2119 | proto.shiftLeft = bnShiftLeft | |
2120 | proto.shiftRight = bnShiftRight | |
2121 | proto.getLowestSetBit = bnGetLowestSetBit | |
2122 | proto.bitCount = bnBitCount | |
2123 | proto.testBit = bnTestBit | |
2124 | proto.setBit = bnSetBit | |
2125 | proto.clearBit = bnClearBit | |
2126 | proto.flipBit = bnFlipBit | |
2127 | proto.add = bnAdd | |
2128 | proto.subtract = bnSubtract | |
2129 | proto.multiply = bnMultiply | |
2130 | proto.divide = bnDivide | |
2131 | proto.remainder = bnRemainder | |
2132 | proto.divideAndRemainder = bnDivideAndRemainder | |
2133 | proto.modPow = bnModPow | |
2134 | proto.modInverse = bnModInverse | |
2135 | proto.pow = bnPow | |
2136 | proto.gcd = bnGCD | |
2137 | proto.isProbablePrime = bnIsProbablePrime | |
3af2954a | 2138 | |
ab78acc6 IC |
2139 | // JSBN-specific extension |
2140 | proto.square = bnSquare | |
3af2954a | 2141 | |
ab78acc6 IC |
2142 | // constants |
2143 | BigInteger.ZERO = nbv(0) | |
2144 | BigInteger.ONE = nbv(1) | |
2145 | BigInteger.valueOf = nbv | |
3af2954a | 2146 | |
ab78acc6 | 2147 | module.exports = BigInteger |
3af2954a | 2148 | |
ab78acc6 IC |
2149 | },{"../package.json":4}],2:[function(require,module,exports){ |
2150 | (function (Buffer){ | |
2151 | // FIXME: Kind of a weird way to throw exceptions, consider removing | |
2152 | var assert = require('assert') | |
2153 | var BigInteger = require('./bigi') | |
3af2954a | 2154 | |
ab78acc6 IC |
2155 | /** |
2156 | * Turns a byte array into a big integer. | |
2157 | * | |
2158 | * This function will interpret a byte array as a big integer in big | |
2159 | * endian notation. | |
2160 | */ | |
2161 | BigInteger.fromByteArrayUnsigned = function(byteArray) { | |
2162 | // BigInteger expects a DER integer conformant byte array | |
2163 | if (byteArray[0] & 0x80) { | |
2164 | return new BigInteger([0].concat(byteArray)) | |
3af2954a IC |
2165 | } |
2166 | ||
ab78acc6 IC |
2167 | return new BigInteger(byteArray) |
2168 | } | |
3af2954a | 2169 | |
ab78acc6 IC |
2170 | /** |
2171 | * Returns a byte array representation of the big integer. | |
2172 | * | |
2173 | * This returns the absolute of the contained value in big endian | |
2174 | * form. A value of zero results in an empty array. | |
2175 | */ | |
2176 | BigInteger.prototype.toByteArrayUnsigned = function() { | |
2177 | var byteArray = this.toByteArray() | |
2178 | return byteArray[0] === 0 ? byteArray.slice(1) : byteArray | |
2179 | } | |
3af2954a | 2180 | |
ab78acc6 IC |
2181 | BigInteger.fromDERInteger = function(byteArray) { |
2182 | return new BigInteger(byteArray) | |
2183 | } | |
3af2954a | 2184 | |
ab78acc6 IC |
2185 | /* |
2186 | * Converts BigInteger to a DER integer representation. | |
2187 | * | |
2188 | * The format for this value uses the most significant bit as a sign | |
2189 | * bit. If the most significant bit is already set and the integer is | |
2190 | * positive, a 0x00 is prepended. | |
2191 | * | |
2192 | * Examples: | |
2193 | * | |
2194 | * 0 => 0x00 | |
2195 | * 1 => 0x01 | |
2196 | * -1 => 0xff | |
2197 | * 127 => 0x7f | |
2198 | * -127 => 0x81 | |
2199 | * 128 => 0x0080 | |
2200 | * -128 => 0x80 | |
2201 | * 255 => 0x00ff | |
2202 | * -255 => 0xff01 | |
2203 | * 16300 => 0x3fac | |
2204 | * -16300 => 0xc054 | |
2205 | * 62300 => 0x00f35c | |
2206 | * -62300 => 0xff0ca4 | |
2207 | */ | |
2208 | BigInteger.prototype.toDERInteger = BigInteger.prototype.toByteArray | |
3af2954a | 2209 | |
ab78acc6 IC |
2210 | BigInteger.fromBuffer = function(buffer) { |
2211 | // BigInteger expects a DER integer conformant byte array | |
2212 | if (buffer[0] & 0x80) { | |
2213 | var byteArray = Array.prototype.slice.call(buffer) | |
3af2954a | 2214 | |
ab78acc6 | 2215 | return new BigInteger([0].concat(byteArray)) |
3af2954a IC |
2216 | } |
2217 | ||
ab78acc6 IC |
2218 | return new BigInteger(buffer) |
2219 | } | |
3af2954a | 2220 | |
ab78acc6 IC |
2221 | BigInteger.fromHex = function(hex) { |
2222 | if (hex === '') return BigInteger.ZERO | |
3af2954a | 2223 | |
ab78acc6 IC |
2224 | assert.equal(hex, hex.match(/^[A-Fa-f0-9]+/), 'Invalid hex string') |
2225 | assert.equal(hex.length % 2, 0, 'Incomplete hex') | |
2226 | return new BigInteger(hex, 16) | |
2227 | } | |
3af2954a | 2228 | |
ab78acc6 IC |
2229 | BigInteger.prototype.toBuffer = function(size) { |
2230 | var byteArray = this.toByteArrayUnsigned() | |
2231 | var zeros = [] | |
3af2954a | 2232 | |
ab78acc6 IC |
2233 | var padding = size - byteArray.length |
2234 | while (zeros.length < padding) zeros.push(0) | |
3af2954a | 2235 | |
ab78acc6 IC |
2236 | return new Buffer(zeros.concat(byteArray)) |
2237 | } | |
3af2954a | 2238 | |
ab78acc6 IC |
2239 | BigInteger.prototype.toHex = function(size) { |
2240 | return this.toBuffer(size).toString('hex') | |
2241 | } | |
3af2954a | 2242 | |
ab78acc6 IC |
2243 | }).call(this,require("buffer").Buffer) |
2244 | },{"./bigi":1,"assert":5,"buffer":7}],3:[function(require,module,exports){ | |
2245 | var BigInteger = require('./bigi') | |
3af2954a | 2246 | |
ab78acc6 IC |
2247 | //addons |
2248 | require('./convert') | |
3af2954a | 2249 | |
ab78acc6 IC |
2250 | module.exports = BigInteger |
2251 | },{"./bigi":1,"./convert":2}],4:[function(require,module,exports){ | |
2252 | module.exports={ | |
2253 | "name": "bigi", | |
2254 | "version": "1.4.0", | |
2255 | "description": "Big integers.", | |
2256 | "keywords": [ | |
2257 | "cryptography", | |
2258 | "math", | |
2259 | "bitcoin", | |
2260 | "arbitrary", | |
2261 | "precision", | |
2262 | "arithmetic", | |
2263 | "big", | |
2264 | "integer", | |
2265 | "int", | |
2266 | "number", | |
2267 | "biginteger", | |
2268 | "bigint", | |
2269 | "bignumber", | |
2270 | "decimal", | |
2271 | "float" | |
2272 | ], | |
2273 | "devDependencies": { | |
2274 | "mocha": "^1.20.1", | |
2275 | "jshint": "^2.5.1", | |
2276 | "coveralls": "^2.10.0", | |
2277 | "istanbul": "^0.2.11" | |
2278 | }, | |
2279 | "repository": { | |
2280 | "url": "https://github.com/cryptocoinjs/bigi", | |
2281 | "type": "git" | |
2282 | }, | |
2283 | "main": "./lib/index.js", | |
2284 | "scripts": { | |
2285 | "test": "_mocha -- test/*.js", | |
2286 | "jshint": "jshint --config jshint.json lib/*.js ; true", | |
2287 | "unit": "mocha", | |
2288 | "coverage": "istanbul cover ./node_modules/.bin/_mocha -- --reporter list test/*.js", | |
2289 | "coveralls": "npm run-script coverage && node ./node_modules/.bin/coveralls < coverage/lcov.info" | |
2290 | }, | |
2291 | "dependencies": {}, | |
2292 | "testling": { | |
2293 | "files": "test/*.js", | |
2294 | "harness": "mocha", | |
2295 | "browsers": [ | |
2296 | "ie/9..latest", | |
2297 | "firefox/latest", | |
2298 | "chrome/latest", | |
2299 | "safari/6.0..latest", | |
2300 | "iphone/6.0..latest", | |
2301 | "android-browser/4.2..latest" | |
2302 | ] | |
2303 | }, | |
2304 | "bugs": { | |
2305 | "url": "https://github.com/cryptocoinjs/bigi/issues" | |
2306 | }, | |
2307 | "homepage": "https://github.com/cryptocoinjs/bigi", | |
2308 | "_id": "bigi@1.4.0", | |
2309 | "dist": { | |
2310 | "shasum": "90ac1aeac0a531216463bdb58f42c1e05c8407ac", | |
2311 | "tarball": "http://registry.npmjs.org/bigi/-/bigi-1.4.0.tgz" | |
2312 | }, | |
2313 | "_from": "bigi@^1.4.0", | |
2314 | "_npmVersion": "1.4.3", | |
2315 | "_npmUser": { | |
2316 | "name": "jp", | |
2317 | "email": "jprichardson@gmail.com" | |
2318 | }, | |
2319 | "maintainers": [ | |
2320 | { | |
2321 | "name": "jp", | |
2322 | "email": "jprichardson@gmail.com" | |
2323 | }, | |
2324 | { | |
2325 | "name": "midnightlightning", | |
2326 | "email": "boydb@midnightdesign.ws" | |
2327 | }, | |
2328 | { | |
2329 | "name": "sidazhang", | |
2330 | "email": "sidazhang89@gmail.com" | |
2331 | }, | |
2332 | { | |
2333 | "name": "nadav", | |
2334 | "email": "npm@shesek.info" | |
3af2954a | 2335 | } |
ab78acc6 IC |
2336 | ], |
2337 | "directories": {}, | |
2338 | "_shasum": "90ac1aeac0a531216463bdb58f42c1e05c8407ac", | |
2339 | "_resolved": "https://registry.npmjs.org/bigi/-/bigi-1.4.0.tgz" | |
2340 | } | |
3af2954a | 2341 | |
ab78acc6 IC |
2342 | },{}],5:[function(require,module,exports){ |
2343 | // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 | |
2344 | // | |
2345 | // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! | |
2346 | // | |
2347 | // Originally from narwhal.js (http://narwhaljs.org) | |
2348 | // Copyright (c) 2009 Thomas Robinson <280north.com> | |
2349 | // | |
2350 | // Permission is hereby granted, free of charge, to any person obtaining a copy | |
2351 | // of this software and associated documentation files (the 'Software'), to | |
2352 | // deal in the Software without restriction, including without limitation the | |
2353 | // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
2354 | // sell copies of the Software, and to permit persons to whom the Software is | |
2355 | // furnished to do so, subject to the following conditions: | |
2356 | // | |
2357 | // The above copyright notice and this permission notice shall be included in | |
2358 | // all copies or substantial portions of the Software. | |
2359 | // | |
2360 | // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
2361 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
2362 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
2363 | // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
2364 | // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
2365 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
3af2954a | 2366 | |
ab78acc6 IC |
2367 | // when used in node, this will actually load the util module we depend on |
2368 | // versus loading the builtin util module as happens otherwise | |
2369 | // this is a bug in node module loading as far as I am concerned | |
2370 | var util = require('util/'); | |
3af2954a | 2371 | |
ab78acc6 IC |
2372 | var pSlice = Array.prototype.slice; |
2373 | var hasOwn = Object.prototype.hasOwnProperty; | |
3af2954a | 2374 | |
ab78acc6 IC |
2375 | // 1. The assert module provides functions that throw |
2376 | // AssertionError's when particular conditions are not met. The | |
2377 | // assert module must conform to the following interface. | |
3af2954a | 2378 | |
ab78acc6 | 2379 | var assert = module.exports = ok; |
3af2954a | 2380 | |
ab78acc6 IC |
2381 | // 2. The AssertionError is defined in assert. |
2382 | // new assert.AssertionError({ message: message, | |
2383 | // actual: actual, | |
2384 | // expected: expected }) | |
3af2954a | 2385 | |
ab78acc6 IC |
2386 | assert.AssertionError = function AssertionError(options) { |
2387 | this.name = 'AssertionError'; | |
2388 | this.actual = options.actual; | |
2389 | this.expected = options.expected; | |
2390 | this.operator = options.operator; | |
2391 | if (options.message) { | |
2392 | this.message = options.message; | |
2393 | this.generatedMessage = false; | |
2394 | } else { | |
2395 | this.message = getMessage(this); | |
2396 | this.generatedMessage = true; | |
2397 | } | |
2398 | var stackStartFunction = options.stackStartFunction || fail; | |
3af2954a | 2399 | |
ab78acc6 IC |
2400 | if (Error.captureStackTrace) { |
2401 | Error.captureStackTrace(this, stackStartFunction); | |
3af2954a | 2402 | } |
ab78acc6 IC |
2403 | else { |
2404 | // non v8 browsers so we can have a stacktrace | |
2405 | var err = new Error(); | |
2406 | if (err.stack) { | |
2407 | var out = err.stack; | |
3af2954a | 2408 | |
ab78acc6 IC |
2409 | // try to strip useless frames |
2410 | var fn_name = stackStartFunction.name; | |
2411 | var idx = out.indexOf('\n' + fn_name); | |
2412 | if (idx >= 0) { | |
2413 | // once we have located the function frame | |
2414 | // we need to strip out everything before it (and its line) | |
2415 | var next_line = out.indexOf('\n', idx + 1); | |
2416 | out = out.substring(next_line + 1); | |
2417 | } | |
3af2954a | 2418 | |
ab78acc6 | 2419 | this.stack = out; |
3af2954a | 2420 | } |
3af2954a | 2421 | } |
ab78acc6 | 2422 | }; |
3af2954a | 2423 | |
ab78acc6 IC |
2424 | // assert.AssertionError instanceof Error |
2425 | util.inherits(assert.AssertionError, Error); | |
3af2954a | 2426 | |
ab78acc6 IC |
2427 | function replacer(key, value) { |
2428 | if (util.isUndefined(value)) { | |
2429 | return '' + value; | |
2430 | } | |
2431 | if (util.isNumber(value) && !isFinite(value)) { | |
2432 | return value.toString(); | |
2433 | } | |
2434 | if (util.isFunction(value) || util.isRegExp(value)) { | |
2435 | return value.toString(); | |
2436 | } | |
2437 | return value; | |
2438 | } | |
3af2954a | 2439 | |
ab78acc6 IC |
2440 | function truncate(s, n) { |
2441 | if (util.isString(s)) { | |
2442 | return s.length < n ? s : s.slice(0, n); | |
2443 | } else { | |
2444 | return s; | |
2445 | } | |
2446 | } | |
3af2954a | 2447 | |
ab78acc6 IC |
2448 | function getMessage(self) { |
2449 | return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + | |
2450 | self.operator + ' ' + | |
2451 | truncate(JSON.stringify(self.expected, replacer), 128); | |
2452 | } | |
3af2954a | 2453 | |
ab78acc6 IC |
2454 | // At present only the three keys mentioned above are used and |
2455 | // understood by the spec. Implementations or sub modules can pass | |
2456 | // other keys to the AssertionError's constructor - they will be | |
2457 | // ignored. | |
3af2954a | 2458 | |
ab78acc6 IC |
2459 | // 3. All of the following functions must throw an AssertionError |
2460 | // when a corresponding condition is not met, with a message that | |
2461 | // may be undefined if not provided. All assertion methods provide | |
2462 | // both the actual and expected values to the assertion error for | |
2463 | // display purposes. | |
3af2954a | 2464 | |
ab78acc6 IC |
2465 | function fail(actual, expected, message, operator, stackStartFunction) { |
2466 | throw new assert.AssertionError({ | |
2467 | message: message, | |
2468 | actual: actual, | |
2469 | expected: expected, | |
2470 | operator: operator, | |
2471 | stackStartFunction: stackStartFunction | |
2472 | }); | |
2473 | } | |
3af2954a | 2474 | |
ab78acc6 IC |
2475 | // EXTENSION! allows for well behaved errors defined elsewhere. |
2476 | assert.fail = fail; | |
ebd8d4e8 | 2477 | |
ab78acc6 IC |
2478 | // 4. Pure assertion tests whether a value is truthy, as determined |
2479 | // by !!guard. | |
2480 | // assert.ok(guard, message_opt); | |
2481 | // This statement is equivalent to assert.equal(true, !!guard, | |
2482 | // message_opt);. To test strictly for the value true, use | |
2483 | // assert.strictEqual(true, guard, message_opt);. | |
3af2954a | 2484 | |
ab78acc6 IC |
2485 | function ok(value, message) { |
2486 | if (!value) fail(value, true, message, '==', assert.ok); | |
2487 | } | |
2488 | assert.ok = ok; | |
3af2954a | 2489 | |
ab78acc6 IC |
2490 | // 5. The equality assertion tests shallow, coercive equality with |
2491 | // ==. | |
2492 | // assert.equal(actual, expected, message_opt); | |
3af2954a | 2493 | |
ab78acc6 IC |
2494 | assert.equal = function equal(actual, expected, message) { |
2495 | if (actual != expected) fail(actual, expected, message, '==', assert.equal); | |
2496 | }; | |
3af2954a | 2497 | |
ab78acc6 IC |
2498 | // 6. The non-equality assertion tests for whether two objects are not equal |
2499 | // with != assert.notEqual(actual, expected, message_opt); | |
3af2954a | 2500 | |
ab78acc6 IC |
2501 | assert.notEqual = function notEqual(actual, expected, message) { |
2502 | if (actual == expected) { | |
2503 | fail(actual, expected, message, '!=', assert.notEqual); | |
3af2954a | 2504 | } |
ab78acc6 | 2505 | }; |
3af2954a | 2506 | |
ab78acc6 IC |
2507 | // 7. The equivalence assertion tests a deep equality relation. |
2508 | // assert.deepEqual(actual, expected, message_opt); | |
3af2954a | 2509 | |
ab78acc6 IC |
2510 | assert.deepEqual = function deepEqual(actual, expected, message) { |
2511 | if (!_deepEqual(actual, expected)) { | |
2512 | fail(actual, expected, message, 'deepEqual', assert.deepEqual); | |
2513 | } | |
2514 | }; | |
3af2954a | 2515 | |
ab78acc6 IC |
2516 | function _deepEqual(actual, expected) { |
2517 | // 7.1. All identical values are equivalent, as determined by ===. | |
2518 | if (actual === expected) { | |
2519 | return true; | |
3af2954a | 2520 | |
ab78acc6 IC |
2521 | } else if (util.isBuffer(actual) && util.isBuffer(expected)) { |
2522 | if (actual.length != expected.length) return false; | |
3af2954a | 2523 | |
ab78acc6 IC |
2524 | for (var i = 0; i < actual.length; i++) { |
2525 | if (actual[i] !== expected[i]) return false; | |
3af2954a IC |
2526 | } |
2527 | ||
ab78acc6 | 2528 | return true; |
3af2954a | 2529 | |
ab78acc6 IC |
2530 | // 7.2. If the expected value is a Date object, the actual value is |
2531 | // equivalent if it is also a Date object that refers to the same time. | |
2532 | } else if (util.isDate(actual) && util.isDate(expected)) { | |
2533 | return actual.getTime() === expected.getTime(); | |
3af2954a | 2534 | |
ab78acc6 IC |
2535 | // 7.3 If the expected value is a RegExp object, the actual value is |
2536 | // equivalent if it is also a RegExp object with the same source and | |
2537 | // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). | |
2538 | } else if (util.isRegExp(actual) && util.isRegExp(expected)) { | |
2539 | return actual.source === expected.source && | |
2540 | actual.global === expected.global && | |
2541 | actual.multiline === expected.multiline && | |
2542 | actual.lastIndex === expected.lastIndex && | |
2543 | actual.ignoreCase === expected.ignoreCase; | |
3af2954a | 2544 | |
ab78acc6 IC |
2545 | // 7.4. Other pairs that do not both pass typeof value == 'object', |
2546 | // equivalence is determined by ==. | |
2547 | } else if (!util.isObject(actual) && !util.isObject(expected)) { | |
2548 | return actual == expected; | |
3af2954a | 2549 | |
ab78acc6 IC |
2550 | // 7.5 For all other Object pairs, including Array objects, equivalence is |
2551 | // determined by having the same number of owned properties (as verified | |
2552 | // with Object.prototype.hasOwnProperty.call), the same set of keys | |
2553 | // (although not necessarily the same order), equivalent values for every | |
2554 | // corresponding key, and an identical 'prototype' property. Note: this | |
2555 | // accounts for both named and indexed properties on Arrays. | |
2556 | } else { | |
2557 | return objEquiv(actual, expected); | |
3af2954a | 2558 | } |
ab78acc6 | 2559 | } |
3af2954a | 2560 | |
ab78acc6 IC |
2561 | function isArguments(object) { |
2562 | return Object.prototype.toString.call(object) == '[object Arguments]'; | |
2563 | } | |
3af2954a | 2564 | |
ab78acc6 IC |
2565 | function objEquiv(a, b) { |
2566 | if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) | |
2567 | return false; | |
2568 | // an identical 'prototype' property. | |
2569 | if (a.prototype !== b.prototype) return false; | |
2570 | // if one is a primitive, the other must be same | |
2571 | if (util.isPrimitive(a) || util.isPrimitive(b)) { | |
2572 | return a === b; | |
3af2954a | 2573 | } |
ab78acc6 IC |
2574 | var aIsArgs = isArguments(a), |
2575 | bIsArgs = isArguments(b); | |
2576 | if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) | |
2577 | return false; | |
2578 | if (aIsArgs) { | |
2579 | a = pSlice.call(a); | |
2580 | b = pSlice.call(b); | |
2581 | return _deepEqual(a, b); | |
3af2954a | 2582 | } |
ab78acc6 IC |
2583 | var ka = objectKeys(a), |
2584 | kb = objectKeys(b), | |
2585 | key, i; | |
2586 | // having the same number of owned properties (keys incorporates | |
2587 | // hasOwnProperty) | |
2588 | if (ka.length != kb.length) | |
2589 | return false; | |
2590 | //the same set of keys (although not necessarily the same order), | |
2591 | ka.sort(); | |
2592 | kb.sort(); | |
2593 | //~~~cheap key test | |
2594 | for (i = ka.length - 1; i >= 0; i--) { | |
2595 | if (ka[i] != kb[i]) | |
2596 | return false; | |
3af2954a | 2597 | } |
ab78acc6 IC |
2598 | //equivalent values for every corresponding key, and |
2599 | //~~~possibly expensive deep test | |
2600 | for (i = ka.length - 1; i >= 0; i--) { | |
2601 | key = ka[i]; | |
2602 | if (!_deepEqual(a[key], b[key])) return false; | |
3af2954a | 2603 | } |
ab78acc6 IC |
2604 | return true; |
2605 | } | |
2606 | ||
2607 | // 8. The non-equivalence assertion tests for any deep inequality. | |
2608 | // assert.notDeepEqual(actual, expected, message_opt); | |
3af2954a | 2609 | |
ab78acc6 IC |
2610 | assert.notDeepEqual = function notDeepEqual(actual, expected, message) { |
2611 | if (_deepEqual(actual, expected)) { | |
2612 | fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); | |
3af2954a | 2613 | } |
ab78acc6 | 2614 | }; |
3af2954a | 2615 | |
ab78acc6 IC |
2616 | // 9. The strict equality assertion tests strict equality, as determined by ===. |
2617 | // assert.strictEqual(actual, expected, message_opt); | |
3af2954a | 2618 | |
ab78acc6 IC |
2619 | assert.strictEqual = function strictEqual(actual, expected, message) { |
2620 | if (actual !== expected) { | |
2621 | fail(actual, expected, message, '===', assert.strictEqual); | |
3af2954a | 2622 | } |
ab78acc6 | 2623 | }; |
3af2954a | 2624 | |
ab78acc6 IC |
2625 | // 10. The strict non-equality assertion tests for strict inequality, as |
2626 | // determined by !==. assert.notStrictEqual(actual, expected, message_opt); | |
3af2954a | 2627 | |
ab78acc6 IC |
2628 | assert.notStrictEqual = function notStrictEqual(actual, expected, message) { |
2629 | if (actual === expected) { | |
2630 | fail(actual, expected, message, '!==', assert.notStrictEqual); | |
2631 | } | |
2632 | }; | |
3af2954a | 2633 | |
ab78acc6 IC |
2634 | function expectedException(actual, expected) { |
2635 | if (!actual || !expected) { | |
2636 | return false; | |
2637 | } | |
3af2954a | 2638 | |
ab78acc6 IC |
2639 | if (Object.prototype.toString.call(expected) == '[object RegExp]') { |
2640 | return expected.test(actual); | |
2641 | } else if (actual instanceof expected) { | |
2642 | return true; | |
2643 | } else if (expected.call({}, actual) === true) { | |
2644 | return true; | |
3af2954a IC |
2645 | } |
2646 | ||
ab78acc6 IC |
2647 | return false; |
2648 | } | |
3af2954a | 2649 | |
ab78acc6 IC |
2650 | function _throws(shouldThrow, block, expected, message) { |
2651 | var actual; | |
3af2954a | 2652 | |
ab78acc6 IC |
2653 | if (util.isString(expected)) { |
2654 | message = expected; | |
2655 | expected = null; | |
3af2954a IC |
2656 | } |
2657 | ||
ab78acc6 IC |
2658 | try { |
2659 | block(); | |
2660 | } catch (e) { | |
2661 | actual = e; | |
3af2954a IC |
2662 | } |
2663 | ||
ab78acc6 IC |
2664 | message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + |
2665 | (message ? ' ' + message : '.'); | |
3af2954a | 2666 | |
ab78acc6 IC |
2667 | if (shouldThrow && !actual) { |
2668 | fail(actual, expected, 'Missing expected exception' + message); | |
3af2954a IC |
2669 | } |
2670 | ||
ab78acc6 IC |
2671 | if (!shouldThrow && expectedException(actual, expected)) { |
2672 | fail(actual, expected, 'Got unwanted exception' + message); | |
3af2954a IC |
2673 | } |
2674 | ||
ab78acc6 IC |
2675 | if ((shouldThrow && actual && expected && |
2676 | !expectedException(actual, expected)) || (!shouldThrow && actual)) { | |
2677 | throw actual; | |
3af2954a | 2678 | } |
ab78acc6 | 2679 | } |
3af2954a | 2680 | |
ab78acc6 IC |
2681 | // 11. Expected to throw an error: |
2682 | // assert.throws(block, Error_opt, message_opt); | |
3af2954a | 2683 | |
ab78acc6 IC |
2684 | assert.throws = function(block, /*optional*/error, /*optional*/message) { |
2685 | _throws.apply(this, [true].concat(pSlice.call(arguments))); | |
2686 | }; | |
3af2954a | 2687 | |
ab78acc6 IC |
2688 | // EXTENSION! This is annoying to write outside this module. |
2689 | assert.doesNotThrow = function(block, /*optional*/message) { | |
2690 | _throws.apply(this, [false].concat(pSlice.call(arguments))); | |
2691 | }; | |
3af2954a | 2692 | |
ab78acc6 | 2693 | assert.ifError = function(err) { if (err) {throw err;}}; |
3af2954a | 2694 | |
ab78acc6 IC |
2695 | var objectKeys = Object.keys || function (obj) { |
2696 | var keys = []; | |
2697 | for (var key in obj) { | |
2698 | if (hasOwn.call(obj, key)) keys.push(key); | |
3af2954a | 2699 | } |
ab78acc6 IC |
2700 | return keys; |
2701 | }; | |
3af2954a | 2702 | |
ab78acc6 | 2703 | },{"util/":29}],6:[function(require,module,exports){ |
3af2954a | 2704 | |
ab78acc6 IC |
2705 | },{}],7:[function(require,module,exports){ |
2706 | /*! | |
2707 | * The buffer module from node.js, for the browser. | |
2708 | * | |
2709 | * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org> | |
2710 | * @license MIT | |
2711 | */ | |
3af2954a | 2712 | |
ab78acc6 IC |
2713 | var base64 = require('base64-js') |
2714 | var ieee754 = require('ieee754') | |
2715 | var isArray = require('is-array') | |
3af2954a | 2716 | |
ab78acc6 IC |
2717 | exports.Buffer = Buffer |
2718 | exports.SlowBuffer = SlowBuffer | |
2719 | exports.INSPECT_MAX_BYTES = 50 | |
2720 | Buffer.poolSize = 8192 // not used by this implementation | |
3af2954a | 2721 | |
ab78acc6 | 2722 | var rootParent = {} |
3af2954a | 2723 | |
ab78acc6 IC |
2724 | /** |
2725 | * If `Buffer.TYPED_ARRAY_SUPPORT`: | |
2726 | * === true Use Uint8Array implementation (fastest) | |
2727 | * === false Use Object implementation (most compatible, even IE6) | |
2728 | * | |
2729 | * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, | |
2730 | * Opera 11.6+, iOS 4.2+. | |
2731 | * | |
2732 | * Due to various browser bugs, sometimes the Object implementation will be used even | |
2733 | * when the browser supports typed arrays. | |
2734 | * | |
2735 | * Note: | |
2736 | * | |
2737 | * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances, | |
2738 | * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438. | |
2739 | * | |
2740 | * - Safari 5-7 lacks support for changing the `Object.prototype.constructor` property | |
2741 | * on objects. | |
2742 | * | |
2743 | * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function. | |
2744 | * | |
2745 | * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of | |
2746 | * incorrect length in some situations. | |
3af2954a | 2747 | |
ab78acc6 IC |
2748 | * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they |
2749 | * get the Object implementation, which is slower but behaves correctly. | |
2750 | */ | |
2751 | Buffer.TYPED_ARRAY_SUPPORT = (function () { | |
2752 | function Bar () {} | |
2753 | try { | |
2754 | var arr = new Uint8Array(1) | |
2755 | arr.foo = function () { return 42 } | |
2756 | arr.constructor = Bar | |
2757 | return arr.foo() === 42 && // typed array instances can be augmented | |
2758 | arr.constructor === Bar && // constructor can be set | |
2759 | typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray` | |
2760 | arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray` | |
2761 | } catch (e) { | |
2762 | return false | |
2763 | } | |
2764 | })() | |
3af2954a | 2765 | |
ab78acc6 IC |
2766 | function kMaxLength () { |
2767 | return Buffer.TYPED_ARRAY_SUPPORT | |
2768 | ? 0x7fffffff | |
2769 | : 0x3fffffff | |
2770 | } | |
3af2954a | 2771 | |
ab78acc6 IC |
2772 | /** |
2773 | * Class: Buffer | |
2774 | * ============= | |
2775 | * | |
2776 | * The Buffer constructor returns instances of `Uint8Array` that are augmented | |
2777 | * with function properties for all the node `Buffer` API functions. We use | |
2778 | * `Uint8Array` so that square bracket notation works as expected -- it returns | |
2779 | * a single octet. | |
2780 | * | |
2781 | * By augmenting the instances, we can avoid modifying the `Uint8Array` | |
2782 | * prototype. | |
2783 | */ | |
2784 | function Buffer (arg) { | |
2785 | if (!(this instanceof Buffer)) { | |
2786 | // Avoid going through an ArgumentsAdaptorTrampoline in the common case. | |
2787 | if (arguments.length > 1) return new Buffer(arg, arguments[1]) | |
2788 | return new Buffer(arg) | |
3af2954a IC |
2789 | } |
2790 | ||
ab78acc6 IC |
2791 | this.length = 0 |
2792 | this.parent = undefined | |
3af2954a | 2793 | |
ab78acc6 IC |
2794 | // Common case. |
2795 | if (typeof arg === 'number') { | |
2796 | return fromNumber(this, arg) | |
2797 | } | |
3af2954a | 2798 | |
ab78acc6 IC |
2799 | // Slightly less common case. |
2800 | if (typeof arg === 'string') { | |
2801 | return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8') | |
2802 | } | |
3af2954a | 2803 | |
ab78acc6 IC |
2804 | // Unusual. |
2805 | return fromObject(this, arg) | |
2806 | } | |
3af2954a | 2807 | |
ab78acc6 IC |
2808 | function fromNumber (that, length) { |
2809 | that = allocate(that, length < 0 ? 0 : checked(length) | 0) | |
2810 | if (!Buffer.TYPED_ARRAY_SUPPORT) { | |
2811 | for (var i = 0; i < length; i++) { | |
2812 | that[i] = 0 | |
2813 | } | |
3af2954a | 2814 | } |
ab78acc6 IC |
2815 | return that |
2816 | } | |
3af2954a | 2817 | |
ab78acc6 IC |
2818 | function fromString (that, string, encoding) { |
2819 | if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8' | |
3af2954a | 2820 | |
ab78acc6 IC |
2821 | // Assumption: byteLength() return value is always < kMaxLength. |
2822 | var length = byteLength(string, encoding) | 0 | |
2823 | that = allocate(that, length) | |
3af2954a | 2824 | |
ab78acc6 IC |
2825 | that.write(string, encoding) |
2826 | return that | |
2827 | } | |
3af2954a | 2828 | |
ab78acc6 IC |
2829 | function fromObject (that, object) { |
2830 | if (Buffer.isBuffer(object)) return fromBuffer(that, object) | |
3af2954a | 2831 | |
ab78acc6 | 2832 | if (isArray(object)) return fromArray(that, object) |
3af2954a | 2833 | |
ab78acc6 IC |
2834 | if (object == null) { |
2835 | throw new TypeError('must start with number, buffer, array or string') | |
2836 | } | |
3af2954a | 2837 | |
ab78acc6 IC |
2838 | if (typeof ArrayBuffer !== 'undefined') { |
2839 | if (object.buffer instanceof ArrayBuffer) { | |
2840 | return fromTypedArray(that, object) | |
2841 | } | |
2842 | if (object instanceof ArrayBuffer) { | |
2843 | return fromArrayBuffer(that, object) | |
2844 | } | |
3af2954a IC |
2845 | } |
2846 | ||
ab78acc6 | 2847 | if (object.length) return fromArrayLike(that, object) |
3af2954a | 2848 | |
ab78acc6 IC |
2849 | return fromJsonObject(that, object) |
2850 | } | |
3af2954a | 2851 | |
ab78acc6 IC |
2852 | function fromBuffer (that, buffer) { |
2853 | var length = checked(buffer.length) | 0 | |
2854 | that = allocate(that, length) | |
2855 | buffer.copy(that, 0, 0, length) | |
2856 | return that | |
2857 | } | |
3af2954a | 2858 | |
ab78acc6 IC |
2859 | function fromArray (that, array) { |
2860 | var length = checked(array.length) | 0 | |
2861 | that = allocate(that, length) | |
2862 | for (var i = 0; i < length; i += 1) { | |
2863 | that[i] = array[i] & 255 | |
3af2954a | 2864 | } |
ab78acc6 IC |
2865 | return that |
2866 | } | |
3af2954a | 2867 | |
ab78acc6 IC |
2868 | // Duplicate of fromArray() to keep fromArray() monomorphic. |
2869 | function fromTypedArray (that, array) { | |
2870 | var length = checked(array.length) | 0 | |
2871 | that = allocate(that, length) | |
2872 | // Truncating the elements is probably not what people expect from typed | |
2873 | // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior | |
2874 | // of the old Buffer constructor. | |
2875 | for (var i = 0; i < length; i += 1) { | |
2876 | that[i] = array[i] & 255 | |
3af2954a | 2877 | } |
ab78acc6 IC |
2878 | return that |
2879 | } | |
3af2954a | 2880 | |
ab78acc6 IC |
2881 | function fromArrayBuffer (that, array) { |
2882 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
2883 | // Return an augmented `Uint8Array` instance, for best performance | |
2884 | array.byteLength | |
2885 | that = Buffer._augment(new Uint8Array(array)) | |
2886 | } else { | |
2887 | // Fallback: Return an object instance of the Buffer class | |
2888 | that = fromTypedArray(that, new Uint8Array(array)) | |
2889 | } | |
2890 | return that | |
2891 | } | |
3af2954a | 2892 | |
ab78acc6 IC |
2893 | function fromArrayLike (that, array) { |
2894 | var length = checked(array.length) | 0 | |
2895 | that = allocate(that, length) | |
2896 | for (var i = 0; i < length; i += 1) { | |
2897 | that[i] = array[i] & 255 | |
3af2954a | 2898 | } |
ab78acc6 IC |
2899 | return that |
2900 | } | |
3af2954a | 2901 | |
ab78acc6 IC |
2902 | // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object. |
2903 | // Returns a zero-length buffer for inputs that don't conform to the spec. | |
2904 | function fromJsonObject (that, object) { | |
2905 | var array | |
2906 | var length = 0 | |
2907 | ||
2908 | if (object.type === 'Buffer' && isArray(object.data)) { | |
2909 | array = object.data | |
2910 | length = checked(array.length) | 0 | |
3af2954a | 2911 | } |
ab78acc6 | 2912 | that = allocate(that, length) |
3af2954a | 2913 | |
ab78acc6 IC |
2914 | for (var i = 0; i < length; i += 1) { |
2915 | that[i] = array[i] & 255 | |
3af2954a | 2916 | } |
ab78acc6 IC |
2917 | return that |
2918 | } | |
3af2954a | 2919 | |
ab78acc6 IC |
2920 | function allocate (that, length) { |
2921 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
2922 | // Return an augmented `Uint8Array` instance, for best performance | |
2923 | that = Buffer._augment(new Uint8Array(length)) | |
2924 | } else { | |
2925 | // Fallback: Return an object instance of the Buffer class | |
2926 | that.length = length | |
2927 | that._isBuffer = true | |
2928 | } | |
3af2954a | 2929 | |
ab78acc6 IC |
2930 | var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1 |
2931 | if (fromPool) that.parent = rootParent | |
3af2954a | 2932 | |
ab78acc6 IC |
2933 | return that |
2934 | } | |
3af2954a | 2935 | |
ab78acc6 IC |
2936 | function checked (length) { |
2937 | // Note: cannot use `length < kMaxLength` here because that fails when | |
2938 | // length is NaN (which is otherwise coerced to zero.) | |
2939 | if (length >= kMaxLength()) { | |
2940 | throw new RangeError('Attempt to allocate Buffer larger than maximum ' + | |
2941 | 'size: 0x' + kMaxLength().toString(16) + ' bytes') | |
3af2954a | 2942 | } |
ab78acc6 IC |
2943 | return length | 0 |
2944 | } | |
3af2954a | 2945 | |
ab78acc6 IC |
2946 | function SlowBuffer (subject, encoding) { |
2947 | if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding) | |
3af2954a | 2948 | |
ab78acc6 IC |
2949 | var buf = new Buffer(subject, encoding) |
2950 | delete buf.parent | |
2951 | return buf | |
2952 | } | |
3af2954a | 2953 | |
ab78acc6 IC |
2954 | Buffer.isBuffer = function isBuffer (b) { |
2955 | return !!(b != null && b._isBuffer) | |
2956 | } | |
3af2954a | 2957 | |
ab78acc6 IC |
2958 | Buffer.compare = function compare (a, b) { |
2959 | if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { | |
2960 | throw new TypeError('Arguments must be Buffers') | |
3af2954a IC |
2961 | } |
2962 | ||
ab78acc6 | 2963 | if (a === b) return 0 |
3af2954a | 2964 | |
ab78acc6 IC |
2965 | var x = a.length |
2966 | var y = b.length | |
3af2954a | 2967 | |
ab78acc6 IC |
2968 | var i = 0 |
2969 | var len = Math.min(x, y) | |
2970 | while (i < len) { | |
2971 | if (a[i] !== b[i]) break | |
3af2954a | 2972 | |
ab78acc6 IC |
2973 | ++i |
2974 | } | |
3af2954a | 2975 | |
ab78acc6 IC |
2976 | if (i !== len) { |
2977 | x = a[i] | |
2978 | y = b[i] | |
2979 | } | |
3af2954a | 2980 | |
ab78acc6 IC |
2981 | if (x < y) return -1 |
2982 | if (y < x) return 1 | |
2983 | return 0 | |
2984 | } | |
3af2954a | 2985 | |
ab78acc6 IC |
2986 | Buffer.isEncoding = function isEncoding (encoding) { |
2987 | switch (String(encoding).toLowerCase()) { | |
2988 | case 'hex': | |
2989 | case 'utf8': | |
2990 | case 'utf-8': | |
2991 | case 'ascii': | |
2992 | case 'binary': | |
2993 | case 'base64': | |
2994 | case 'raw': | |
2995 | case 'ucs2': | |
2996 | case 'ucs-2': | |
2997 | case 'utf16le': | |
2998 | case 'utf-16le': | |
2999 | return true | |
3000 | default: | |
3001 | return false | |
3af2954a | 3002 | } |
ab78acc6 | 3003 | } |
3af2954a | 3004 | |
ab78acc6 IC |
3005 | Buffer.concat = function concat (list, length) { |
3006 | if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.') | |
3af2954a | 3007 | |
ab78acc6 IC |
3008 | if (list.length === 0) { |
3009 | return new Buffer(0) | |
3af2954a IC |
3010 | } |
3011 | ||
ab78acc6 IC |
3012 | var i |
3013 | if (length === undefined) { | |
3014 | length = 0 | |
3015 | for (i = 0; i < list.length; i++) { | |
3016 | length += list[i].length | |
3017 | } | |
3af2954a IC |
3018 | } |
3019 | ||
ab78acc6 IC |
3020 | var buf = new Buffer(length) |
3021 | var pos = 0 | |
3022 | for (i = 0; i < list.length; i++) { | |
3023 | var item = list[i] | |
3024 | item.copy(buf, pos) | |
3025 | pos += item.length | |
3026 | } | |
3027 | return buf | |
3028 | } | |
3af2954a | 3029 | |
ab78acc6 IC |
3030 | function byteLength (string, encoding) { |
3031 | if (typeof string !== 'string') string = '' + string | |
3032 | ||
3033 | var len = string.length | |
3034 | if (len === 0) return 0 | |
3035 | ||
3036 | // Use a for loop to avoid recursion | |
3037 | var loweredCase = false | |
3038 | for (;;) { | |
3039 | switch (encoding) { | |
3040 | case 'ascii': | |
3041 | case 'binary': | |
3042 | // Deprecated | |
3043 | case 'raw': | |
3044 | case 'raws': | |
3045 | return len | |
3046 | case 'utf8': | |
3047 | case 'utf-8': | |
3048 | return utf8ToBytes(string).length | |
3049 | case 'ucs2': | |
3050 | case 'ucs-2': | |
3051 | case 'utf16le': | |
3052 | case 'utf-16le': | |
3053 | return len * 2 | |
3054 | case 'hex': | |
3055 | return len >>> 1 | |
3056 | case 'base64': | |
3057 | return base64ToBytes(string).length | |
3058 | default: | |
3059 | if (loweredCase) return utf8ToBytes(string).length // assume utf8 | |
3060 | encoding = ('' + encoding).toLowerCase() | |
3061 | loweredCase = true | |
3af2954a | 3062 | } |
3af2954a | 3063 | } |
ab78acc6 IC |
3064 | } |
3065 | Buffer.byteLength = byteLength | |
3af2954a | 3066 | |
ab78acc6 IC |
3067 | // pre-set for values that may exist in the future |
3068 | Buffer.prototype.length = undefined | |
3069 | Buffer.prototype.parent = undefined | |
3af2954a | 3070 | |
ab78acc6 IC |
3071 | function slowToString (encoding, start, end) { |
3072 | var loweredCase = false | |
3af2954a | 3073 | |
ab78acc6 IC |
3074 | start = start | 0 |
3075 | end = end === undefined || end === Infinity ? this.length : end | 0 | |
3af2954a | 3076 | |
ab78acc6 IC |
3077 | if (!encoding) encoding = 'utf8' |
3078 | if (start < 0) start = 0 | |
3079 | if (end > this.length) end = this.length | |
3080 | if (end <= start) return '' | |
3af2954a | 3081 | |
ab78acc6 IC |
3082 | while (true) { |
3083 | switch (encoding) { | |
3084 | case 'hex': | |
3085 | return hexSlice(this, start, end) | |
3af2954a | 3086 | |
ab78acc6 IC |
3087 | case 'utf8': |
3088 | case 'utf-8': | |
3089 | return utf8Slice(this, start, end) | |
3af2954a | 3090 | |
ab78acc6 IC |
3091 | case 'ascii': |
3092 | return asciiSlice(this, start, end) | |
3af2954a | 3093 | |
ab78acc6 IC |
3094 | case 'binary': |
3095 | return binarySlice(this, start, end) | |
3af2954a | 3096 | |
ab78acc6 IC |
3097 | case 'base64': |
3098 | return base64Slice(this, start, end) | |
3af2954a | 3099 | |
ab78acc6 IC |
3100 | case 'ucs2': |
3101 | case 'ucs-2': | |
3102 | case 'utf16le': | |
3103 | case 'utf-16le': | |
3104 | return utf16leSlice(this, start, end) | |
3af2954a | 3105 | |
ab78acc6 IC |
3106 | default: |
3107 | if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) | |
3108 | encoding = (encoding + '').toLowerCase() | |
3109 | loweredCase = true | |
3110 | } | |
3af2954a | 3111 | } |
ab78acc6 | 3112 | } |
3af2954a | 3113 | |
ab78acc6 IC |
3114 | Buffer.prototype.toString = function toString () { |
3115 | var length = this.length | 0 | |
3116 | if (length === 0) return '' | |
3117 | if (arguments.length === 0) return utf8Slice(this, 0, length) | |
3118 | return slowToString.apply(this, arguments) | |
3119 | } | |
3af2954a | 3120 | |
ab78acc6 IC |
3121 | Buffer.prototype.equals = function equals (b) { |
3122 | if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') | |
3123 | if (this === b) return true | |
3124 | return Buffer.compare(this, b) === 0 | |
3125 | } | |
3af2954a | 3126 | |
ab78acc6 IC |
3127 | Buffer.prototype.inspect = function inspect () { |
3128 | var str = '' | |
3129 | var max = exports.INSPECT_MAX_BYTES | |
3130 | if (this.length > 0) { | |
3131 | str = this.toString('hex', 0, max).match(/.{2}/g).join(' ') | |
3132 | if (this.length > max) str += ' ... ' | |
3af2954a | 3133 | } |
ab78acc6 IC |
3134 | return '<Buffer ' + str + '>' |
3135 | } | |
3af2954a | 3136 | |
ab78acc6 IC |
3137 | Buffer.prototype.compare = function compare (b) { |
3138 | if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') | |
3139 | if (this === b) return 0 | |
3140 | return Buffer.compare(this, b) | |
3141 | } | |
3af2954a | 3142 | |
ab78acc6 IC |
3143 | Buffer.prototype.indexOf = function indexOf (val, byteOffset) { |
3144 | if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff | |
3145 | else if (byteOffset < -0x80000000) byteOffset = -0x80000000 | |
3146 | byteOffset >>= 0 | |
3af2954a | 3147 | |
ab78acc6 IC |
3148 | if (this.length === 0) return -1 |
3149 | if (byteOffset >= this.length) return -1 | |
3af2954a | 3150 | |
ab78acc6 IC |
3151 | // Negative offsets start from the end of the buffer |
3152 | if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0) | |
3af2954a | 3153 | |
ab78acc6 IC |
3154 | if (typeof val === 'string') { |
3155 | if (val.length === 0) return -1 // special case: looking for empty string always fails | |
3156 | return String.prototype.indexOf.call(this, val, byteOffset) | |
3af2954a | 3157 | } |
ab78acc6 IC |
3158 | if (Buffer.isBuffer(val)) { |
3159 | return arrayIndexOf(this, val, byteOffset) | |
3af2954a | 3160 | } |
ab78acc6 IC |
3161 | if (typeof val === 'number') { |
3162 | if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') { | |
3163 | return Uint8Array.prototype.indexOf.call(this, val, byteOffset) | |
3af2954a | 3164 | } |
ab78acc6 | 3165 | return arrayIndexOf(this, [ val ], byteOffset) |
3af2954a IC |
3166 | } |
3167 | ||
ab78acc6 IC |
3168 | function arrayIndexOf (arr, val, byteOffset) { |
3169 | var foundIndex = -1 | |
3170 | for (var i = 0; byteOffset + i < arr.length; i++) { | |
3171 | if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) { | |
3172 | if (foundIndex === -1) foundIndex = i | |
3173 | if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex | |
3af2954a | 3174 | } else { |
ab78acc6 | 3175 | foundIndex = -1 |
3af2954a | 3176 | } |
3af2954a | 3177 | } |
ab78acc6 IC |
3178 | return -1 |
3179 | } | |
3af2954a | 3180 | |
ab78acc6 IC |
3181 | throw new TypeError('val must be string, number or Buffer') |
3182 | } | |
3af2954a | 3183 | |
ab78acc6 IC |
3184 | // `get` is deprecated |
3185 | Buffer.prototype.get = function get (offset) { | |
3186 | console.log('.get() is deprecated. Access using array indexes instead.') | |
3187 | return this.readUInt8(offset) | |
3188 | } | |
3af2954a | 3189 | |
ab78acc6 IC |
3190 | // `set` is deprecated |
3191 | Buffer.prototype.set = function set (v, offset) { | |
3192 | console.log('.set() is deprecated. Access using array indexes instead.') | |
3193 | return this.writeUInt8(v, offset) | |
3194 | } | |
3af2954a | 3195 | |
ab78acc6 IC |
3196 | function hexWrite (buf, string, offset, length) { |
3197 | offset = Number(offset) || 0 | |
3198 | var remaining = buf.length - offset | |
3199 | if (!length) { | |
3200 | length = remaining | |
3201 | } else { | |
3202 | length = Number(length) | |
3203 | if (length > remaining) { | |
3204 | length = remaining | |
3205 | } | |
3206 | } | |
3af2954a | 3207 | |
ab78acc6 IC |
3208 | // must be an even number of digits |
3209 | var strLen = string.length | |
3210 | if (strLen % 2 !== 0) throw new Error('Invalid hex string') | |
3af2954a | 3211 | |
ab78acc6 IC |
3212 | if (length > strLen / 2) { |
3213 | length = strLen / 2 | |
3214 | } | |
3215 | for (var i = 0; i < length; i++) { | |
3216 | var parsed = parseInt(string.substr(i * 2, 2), 16) | |
3217 | if (isNaN(parsed)) throw new Error('Invalid hex string') | |
3218 | buf[offset + i] = parsed | |
3af2954a | 3219 | } |
ab78acc6 IC |
3220 | return i |
3221 | } | |
3222 | ||
3223 | function utf8Write (buf, string, offset, length) { | |
3224 | return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) | |
3225 | } | |
3af2954a | 3226 | |
ab78acc6 IC |
3227 | function asciiWrite (buf, string, offset, length) { |
3228 | return blitBuffer(asciiToBytes(string), buf, offset, length) | |
3229 | } | |
3af2954a | 3230 | |
ab78acc6 IC |
3231 | function binaryWrite (buf, string, offset, length) { |
3232 | return asciiWrite(buf, string, offset, length) | |
3233 | } | |
3af2954a | 3234 | |
ab78acc6 IC |
3235 | function base64Write (buf, string, offset, length) { |
3236 | return blitBuffer(base64ToBytes(string), buf, offset, length) | |
3237 | } | |
3af2954a | 3238 | |
ab78acc6 IC |
3239 | function ucs2Write (buf, string, offset, length) { |
3240 | return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) | |
3241 | } | |
3af2954a | 3242 | |
ab78acc6 IC |
3243 | Buffer.prototype.write = function write (string, offset, length, encoding) { |
3244 | // Buffer#write(string) | |
3245 | if (offset === undefined) { | |
3246 | encoding = 'utf8' | |
3247 | length = this.length | |
3248 | offset = 0 | |
3249 | // Buffer#write(string, encoding) | |
3250 | } else if (length === undefined && typeof offset === 'string') { | |
3251 | encoding = offset | |
3252 | length = this.length | |
3253 | offset = 0 | |
3254 | // Buffer#write(string, offset[, length][, encoding]) | |
3255 | } else if (isFinite(offset)) { | |
3256 | offset = offset | 0 | |
3257 | if (isFinite(length)) { | |
3258 | length = length | 0 | |
3259 | if (encoding === undefined) encoding = 'utf8' | |
3260 | } else { | |
3261 | encoding = length | |
3262 | length = undefined | |
3263 | } | |
3264 | // legacy write(string, encoding, offset, length) - remove in v0.13 | |
3265 | } else { | |
3266 | var swap = encoding | |
3267 | encoding = offset | |
3268 | offset = length | 0 | |
3269 | length = swap | |
3af2954a IC |
3270 | } |
3271 | ||
ab78acc6 IC |
3272 | var remaining = this.length - offset |
3273 | if (length === undefined || length > remaining) length = remaining | |
3af2954a | 3274 | |
ab78acc6 IC |
3275 | if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { |
3276 | throw new RangeError('attempt to write outside buffer bounds') | |
3277 | } | |
3af2954a | 3278 | |
ab78acc6 | 3279 | if (!encoding) encoding = 'utf8' |
3af2954a | 3280 | |
ab78acc6 IC |
3281 | var loweredCase = false |
3282 | for (;;) { | |
3283 | switch (encoding) { | |
3284 | case 'hex': | |
3285 | return hexWrite(this, string, offset, length) | |
ebd8d4e8 | 3286 | |
ab78acc6 IC |
3287 | case 'utf8': |
3288 | case 'utf-8': | |
3289 | return utf8Write(this, string, offset, length) | |
ebd8d4e8 | 3290 | |
ab78acc6 IC |
3291 | case 'ascii': |
3292 | return asciiWrite(this, string, offset, length) | |
ebd8d4e8 | 3293 | |
ab78acc6 IC |
3294 | case 'binary': |
3295 | return binaryWrite(this, string, offset, length) | |
ebd8d4e8 | 3296 | |
ab78acc6 IC |
3297 | case 'base64': |
3298 | // Warning: maxLength not taken into account in base64Write | |
3299 | return base64Write(this, string, offset, length) | |
ebd8d4e8 | 3300 | |
ab78acc6 IC |
3301 | case 'ucs2': |
3302 | case 'ucs-2': | |
3303 | case 'utf16le': | |
3304 | case 'utf-16le': | |
3305 | return ucs2Write(this, string, offset, length) | |
ebd8d4e8 | 3306 | |
ab78acc6 IC |
3307 | default: |
3308 | if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) | |
3309 | encoding = ('' + encoding).toLowerCase() | |
3310 | loweredCase = true | |
3311 | } | |
3312 | } | |
3313 | } | |
212b1b46 | 3314 | |
ab78acc6 IC |
3315 | Buffer.prototype.toJSON = function toJSON () { |
3316 | return { | |
3317 | type: 'Buffer', | |
3318 | data: Array.prototype.slice.call(this._arr || this, 0) | |
3319 | } | |
3320 | } | |
212b1b46 | 3321 | |
ab78acc6 IC |
3322 | function base64Slice (buf, start, end) { |
3323 | if (start === 0 && end === buf.length) { | |
3324 | return base64.fromByteArray(buf) | |
3325 | } else { | |
3326 | return base64.fromByteArray(buf.slice(start, end)) | |
3af2954a | 3327 | } |
ab78acc6 IC |
3328 | } |
3329 | ||
3330 | function utf8Slice (buf, start, end) { | |
3331 | end = Math.min(buf.length, end) | |
3332 | var firstByte | |
3333 | var secondByte | |
3334 | var thirdByte | |
3335 | var fourthByte | |
3336 | var bytesPerSequence | |
3337 | var tempCodePoint | |
3338 | var codePoint | |
3339 | var res = [] | |
3340 | var i = start | |
3341 | ||
3342 | for (; i < end; i += bytesPerSequence) { | |
3343 | firstByte = buf[i] | |
3344 | codePoint = 0xFFFD | |
3345 | ||
3346 | if (firstByte > 0xEF) { | |
3347 | bytesPerSequence = 4 | |
3348 | } else if (firstByte > 0xDF) { | |
3349 | bytesPerSequence = 3 | |
3350 | } else if (firstByte > 0xBF) { | |
3351 | bytesPerSequence = 2 | |
3352 | } else { | |
3353 | bytesPerSequence = 1 | |
3354 | } | |
212b1b46 | 3355 | |
ab78acc6 IC |
3356 | if (i + bytesPerSequence <= end) { |
3357 | switch (bytesPerSequence) { | |
3358 | case 1: | |
3359 | if (firstByte < 0x80) { | |
3360 | codePoint = firstByte | |
3361 | } | |
3362 | break | |
3363 | case 2: | |
3364 | secondByte = buf[i + 1] | |
3365 | if ((secondByte & 0xC0) === 0x80) { | |
3366 | tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) | |
3367 | if (tempCodePoint > 0x7F) { | |
3368 | codePoint = tempCodePoint | |
3369 | } | |
3370 | } | |
3371 | break | |
3372 | case 3: | |
3373 | secondByte = buf[i + 1] | |
3374 | thirdByte = buf[i + 2] | |
3375 | if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { | |
3376 | tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) | |
3377 | if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { | |
3378 | codePoint = tempCodePoint | |
3379 | } | |
3380 | } | |
3381 | break | |
3382 | case 4: | |
3383 | secondByte = buf[i + 1] | |
3384 | thirdByte = buf[i + 2] | |
3385 | fourthByte = buf[i + 3] | |
3386 | if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { | |
3387 | tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) | |
3388 | if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { | |
3389 | codePoint = tempCodePoint | |
3390 | } | |
3391 | } | |
3392 | } | |
3393 | } | |
212b1b46 | 3394 | |
ab78acc6 IC |
3395 | if (codePoint === 0xFFFD) { |
3396 | // we generated an invalid codePoint so make sure to only advance by 1 byte | |
3397 | bytesPerSequence = 1 | |
3398 | } else if (codePoint > 0xFFFF) { | |
3399 | // encode to utf16 (surrogate pair dance) | |
3400 | codePoint -= 0x10000 | |
3401 | res.push(codePoint >>> 10 & 0x3FF | 0xD800) | |
3402 | codePoint = 0xDC00 | codePoint & 0x3FF | |
3403 | } | |
212b1b46 | 3404 | |
ab78acc6 | 3405 | res.push(codePoint) |
3af2954a | 3406 | } |
212b1b46 | 3407 | |
ab78acc6 IC |
3408 | return String.fromCharCode.apply(String, res) |
3409 | } | |
212b1b46 | 3410 | |
ab78acc6 IC |
3411 | function asciiSlice (buf, start, end) { |
3412 | var ret = '' | |
3413 | end = Math.min(buf.length, end) | |
3414 | ||
3415 | for (var i = start; i < end; i++) { | |
3416 | ret += String.fromCharCode(buf[i] & 0x7F) | |
3af2954a | 3417 | } |
ab78acc6 IC |
3418 | return ret |
3419 | } | |
212b1b46 | 3420 | |
ab78acc6 IC |
3421 | function binarySlice (buf, start, end) { |
3422 | var ret = '' | |
3423 | end = Math.min(buf.length, end) | |
212b1b46 | 3424 | |
ab78acc6 IC |
3425 | for (var i = start; i < end; i++) { |
3426 | ret += String.fromCharCode(buf[i]) | |
3427 | } | |
3428 | return ret | |
3429 | } | |
212b1b46 | 3430 | |
ab78acc6 IC |
3431 | function hexSlice (buf, start, end) { |
3432 | var len = buf.length | |
212b1b46 | 3433 | |
ab78acc6 IC |
3434 | if (!start || start < 0) start = 0 |
3435 | if (!end || end < 0 || end > len) end = len | |
212b1b46 | 3436 | |
ab78acc6 IC |
3437 | var out = '' |
3438 | for (var i = start; i < end; i++) { | |
3439 | out += toHex(buf[i]) | |
3440 | } | |
3441 | return out | |
3442 | } | |
212b1b46 | 3443 | |
ab78acc6 IC |
3444 | function utf16leSlice (buf, start, end) { |
3445 | var bytes = buf.slice(start, end) | |
3446 | var res = '' | |
3447 | for (var i = 0; i < bytes.length; i += 2) { | |
3448 | res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256) | |
3449 | } | |
3450 | return res | |
3451 | } | |
212b1b46 | 3452 | |
ab78acc6 IC |
3453 | Buffer.prototype.slice = function slice (start, end) { |
3454 | var len = this.length | |
3455 | start = ~~start | |
3456 | end = end === undefined ? len : ~~end | |
212b1b46 | 3457 | |
ab78acc6 IC |
3458 | if (start < 0) { |
3459 | start += len | |
3460 | if (start < 0) start = 0 | |
3461 | } else if (start > len) { | |
3462 | start = len | |
3463 | } | |
212b1b46 | 3464 | |
ab78acc6 IC |
3465 | if (end < 0) { |
3466 | end += len | |
3467 | if (end < 0) end = 0 | |
3468 | } else if (end > len) { | |
3469 | end = len | |
3470 | } | |
212b1b46 | 3471 | |
ab78acc6 | 3472 | if (end < start) end = start |
212b1b46 | 3473 | |
ab78acc6 IC |
3474 | var newBuf |
3475 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3476 | newBuf = Buffer._augment(this.subarray(start, end)) | |
3477 | } else { | |
3478 | var sliceLen = end - start | |
3479 | newBuf = new Buffer(sliceLen, undefined) | |
3480 | for (var i = 0; i < sliceLen; i++) { | |
3481 | newBuf[i] = this[i + start] | |
3af2954a IC |
3482 | } |
3483 | } | |
212b1b46 | 3484 | |
ab78acc6 | 3485 | if (newBuf.length) newBuf.parent = this.parent || this |
ebd8d4e8 | 3486 | |
ab78acc6 IC |
3487 | return newBuf |
3488 | } | |
ebd8d4e8 | 3489 | |
ab78acc6 IC |
3490 | /* |
3491 | * Need to make sure that buffer isn't trying to write out of bounds. | |
3492 | */ | |
3493 | function checkOffset (offset, ext, length) { | |
3494 | if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') | |
3495 | if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') | |
3496 | } | |
ebd8d4e8 | 3497 | |
ab78acc6 IC |
3498 | Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { |
3499 | offset = offset | 0 | |
3500 | byteLength = byteLength | 0 | |
3501 | if (!noAssert) checkOffset(offset, byteLength, this.length) | |
3af2954a | 3502 | |
ab78acc6 IC |
3503 | var val = this[offset] |
3504 | var mul = 1 | |
3505 | var i = 0 | |
3506 | while (++i < byteLength && (mul *= 0x100)) { | |
3507 | val += this[offset + i] * mul | |
3508 | } | |
3af2954a | 3509 | |
ab78acc6 IC |
3510 | return val |
3511 | } | |
3af2954a | 3512 | |
ab78acc6 IC |
3513 | Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { |
3514 | offset = offset | 0 | |
3515 | byteLength = byteLength | 0 | |
3516 | if (!noAssert) { | |
3517 | checkOffset(offset, byteLength, this.length) | |
3518 | } | |
3af2954a | 3519 | |
ab78acc6 IC |
3520 | var val = this[offset + --byteLength] |
3521 | var mul = 1 | |
3522 | while (byteLength > 0 && (mul *= 0x100)) { | |
3523 | val += this[offset + --byteLength] * mul | |
3af2954a IC |
3524 | } |
3525 | ||
ab78acc6 IC |
3526 | return val |
3527 | } | |
3af2954a | 3528 | |
ab78acc6 IC |
3529 | Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { |
3530 | if (!noAssert) checkOffset(offset, 1, this.length) | |
3531 | return this[offset] | |
3532 | } | |
3af2954a | 3533 | |
ab78acc6 IC |
3534 | Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { |
3535 | if (!noAssert) checkOffset(offset, 2, this.length) | |
3536 | return this[offset] | (this[offset + 1] << 8) | |
3537 | } | |
3af2954a | 3538 | |
ab78acc6 IC |
3539 | Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { |
3540 | if (!noAssert) checkOffset(offset, 2, this.length) | |
3541 | return (this[offset] << 8) | this[offset + 1] | |
3542 | } | |
ebd8d4e8 | 3543 | |
ab78acc6 IC |
3544 | Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { |
3545 | if (!noAssert) checkOffset(offset, 4, this.length) | |
3af2954a | 3546 | |
ab78acc6 IC |
3547 | return ((this[offset]) | |
3548 | (this[offset + 1] << 8) | | |
3549 | (this[offset + 2] << 16)) + | |
3550 | (this[offset + 3] * 0x1000000) | |
3551 | } | |
3af2954a | 3552 | |
ab78acc6 IC |
3553 | Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { |
3554 | if (!noAssert) checkOffset(offset, 4, this.length) | |
ebd8d4e8 | 3555 | |
ab78acc6 IC |
3556 | return (this[offset] * 0x1000000) + |
3557 | ((this[offset + 1] << 16) | | |
3558 | (this[offset + 2] << 8) | | |
3559 | this[offset + 3]) | |
3560 | } | |
ebd8d4e8 | 3561 | |
ab78acc6 IC |
3562 | Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { |
3563 | offset = offset | 0 | |
3564 | byteLength = byteLength | 0 | |
3565 | if (!noAssert) checkOffset(offset, byteLength, this.length) | |
ebd8d4e8 | 3566 | |
ab78acc6 IC |
3567 | var val = this[offset] |
3568 | var mul = 1 | |
3569 | var i = 0 | |
3570 | while (++i < byteLength && (mul *= 0x100)) { | |
3571 | val += this[offset + i] * mul | |
ebd8d4e8 | 3572 | } |
ab78acc6 | 3573 | mul *= 0x80 |
ebd8d4e8 | 3574 | |
ab78acc6 IC |
3575 | if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
3576 | ||
3577 | return val | |
ebd8d4e8 IC |
3578 | } |
3579 | ||
ab78acc6 IC |
3580 | Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { |
3581 | offset = offset | 0 | |
3582 | byteLength = byteLength | 0 | |
3583 | if (!noAssert) checkOffset(offset, byteLength, this.length) | |
ebd8d4e8 | 3584 | |
ab78acc6 IC |
3585 | var i = byteLength |
3586 | var mul = 1 | |
3587 | var val = this[offset + --i] | |
3588 | while (i > 0 && (mul *= 0x100)) { | |
3589 | val += this[offset + --i] * mul | |
3590 | } | |
3591 | mul *= 0x80 | |
ebd8d4e8 | 3592 | |
ab78acc6 | 3593 | if (val >= mul) val -= Math.pow(2, 8 * byteLength) |
ebd8d4e8 | 3594 | |
ab78acc6 IC |
3595 | return val |
3596 | } | |
ebd8d4e8 | 3597 | |
ab78acc6 IC |
3598 | Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { |
3599 | if (!noAssert) checkOffset(offset, 1, this.length) | |
3600 | if (!(this[offset] & 0x80)) return (this[offset]) | |
3601 | return ((0xff - this[offset] + 1) * -1) | |
ebd8d4e8 | 3602 | } |
ab78acc6 IC |
3603 | |
3604 | Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { | |
3605 | if (!noAssert) checkOffset(offset, 2, this.length) | |
3606 | var val = this[offset] | (this[offset + 1] << 8) | |
3607 | return (val & 0x8000) ? val | 0xFFFF0000 : val | |
ebd8d4e8 | 3608 | } |
ab78acc6 IC |
3609 | |
3610 | Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { | |
3611 | if (!noAssert) checkOffset(offset, 2, this.length) | |
3612 | var val = this[offset + 1] | (this[offset] << 8) | |
3613 | return (val & 0x8000) ? val | 0xFFFF0000 : val | |
ebd8d4e8 IC |
3614 | } |
3615 | ||
ab78acc6 IC |
3616 | Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { |
3617 | if (!noAssert) checkOffset(offset, 4, this.length) | |
ebd8d4e8 | 3618 | |
ab78acc6 IC |
3619 | return (this[offset]) | |
3620 | (this[offset + 1] << 8) | | |
3621 | (this[offset + 2] << 16) | | |
3622 | (this[offset + 3] << 24) | |
ebd8d4e8 | 3623 | } |
ebd8d4e8 | 3624 | |
ab78acc6 IC |
3625 | Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { |
3626 | if (!noAssert) checkOffset(offset, 4, this.length) | |
ebd8d4e8 | 3627 | |
ab78acc6 IC |
3628 | return (this[offset] << 24) | |
3629 | (this[offset + 1] << 16) | | |
3630 | (this[offset + 2] << 8) | | |
3631 | (this[offset + 3]) | |
ebd8d4e8 IC |
3632 | } |
3633 | ||
ab78acc6 IC |
3634 | Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { |
3635 | if (!noAssert) checkOffset(offset, 4, this.length) | |
3636 | return ieee754.read(this, offset, true, 23, 4) | |
ebd8d4e8 IC |
3637 | } |
3638 | ||
ab78acc6 IC |
3639 | Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { |
3640 | if (!noAssert) checkOffset(offset, 4, this.length) | |
3641 | return ieee754.read(this, offset, false, 23, 4) | |
ebd8d4e8 IC |
3642 | } |
3643 | ||
ab78acc6 IC |
3644 | Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { |
3645 | if (!noAssert) checkOffset(offset, 8, this.length) | |
3646 | return ieee754.read(this, offset, true, 52, 8) | |
ebd8d4e8 IC |
3647 | } |
3648 | ||
ab78acc6 IC |
3649 | Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { |
3650 | if (!noAssert) checkOffset(offset, 8, this.length) | |
3651 | return ieee754.read(this, offset, false, 52, 8) | |
ebd8d4e8 IC |
3652 | } |
3653 | ||
ab78acc6 IC |
3654 | function checkInt (buf, value, offset, ext, max, min) { |
3655 | if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance') | |
3656 | if (value > max || value < min) throw new RangeError('value is out of bounds') | |
3657 | if (offset + ext > buf.length) throw new RangeError('index out of range') | |
ebd8d4e8 IC |
3658 | } |
3659 | ||
ab78acc6 IC |
3660 | Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { |
3661 | value = +value | |
3662 | offset = offset | 0 | |
3663 | byteLength = byteLength | 0 | |
3664 | if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) | |
ebd8d4e8 | 3665 | |
ab78acc6 IC |
3666 | var mul = 1 |
3667 | var i = 0 | |
3668 | this[offset] = value & 0xFF | |
3669 | while (++i < byteLength && (mul *= 0x100)) { | |
3670 | this[offset + i] = (value / mul) & 0xFF | |
3671 | } | |
ebd8d4e8 | 3672 | |
ab78acc6 | 3673 | return offset + byteLength |
ebd8d4e8 IC |
3674 | } |
3675 | ||
ab78acc6 IC |
3676 | Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { |
3677 | value = +value | |
3678 | offset = offset | 0 | |
3679 | byteLength = byteLength | 0 | |
3680 | if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0) | |
ebd8d4e8 | 3681 | |
ab78acc6 IC |
3682 | var i = byteLength - 1 |
3683 | var mul = 1 | |
3684 | this[offset + i] = value & 0xFF | |
3685 | while (--i >= 0 && (mul *= 0x100)) { | |
3686 | this[offset + i] = (value / mul) & 0xFF | |
3687 | } | |
ebd8d4e8 | 3688 | |
ab78acc6 | 3689 | return offset + byteLength |
ebd8d4e8 IC |
3690 | } |
3691 | ||
ab78acc6 IC |
3692 | Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { |
3693 | value = +value | |
3694 | offset = offset | 0 | |
3695 | if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) | |
3696 | if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) | |
3697 | this[offset] = value | |
3698 | return offset + 1 | |
ebd8d4e8 IC |
3699 | } |
3700 | ||
ab78acc6 IC |
3701 | function objectWriteUInt16 (buf, value, offset, littleEndian) { |
3702 | if (value < 0) value = 0xffff + value + 1 | |
3703 | for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) { | |
3704 | buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>> | |
3705 | (littleEndian ? i : 1 - i) * 8 | |
ebd8d4e8 | 3706 | } |
ebd8d4e8 IC |
3707 | } |
3708 | ||
ab78acc6 IC |
3709 | Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { |
3710 | value = +value | |
3711 | offset = offset | 0 | |
3712 | if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) | |
3713 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3714 | this[offset] = value | |
3715 | this[offset + 1] = (value >>> 8) | |
3716 | } else { | |
3717 | objectWriteUInt16(this, value, offset, true) | |
3718 | } | |
3719 | return offset + 2 | |
ebd8d4e8 IC |
3720 | } |
3721 | ||
ab78acc6 IC |
3722 | Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { |
3723 | value = +value | |
3724 | offset = offset | 0 | |
3725 | if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) | |
3726 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3727 | this[offset] = (value >>> 8) | |
3728 | this[offset + 1] = value | |
3729 | } else { | |
3730 | objectWriteUInt16(this, value, offset, false) | |
ebd8d4e8 | 3731 | } |
ab78acc6 | 3732 | return offset + 2 |
ebd8d4e8 IC |
3733 | } |
3734 | ||
ab78acc6 IC |
3735 | function objectWriteUInt32 (buf, value, offset, littleEndian) { |
3736 | if (value < 0) value = 0xffffffff + value + 1 | |
3737 | for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) { | |
3738 | buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff | |
3739 | } | |
ebd8d4e8 IC |
3740 | } |
3741 | ||
ab78acc6 IC |
3742 | Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { |
3743 | value = +value | |
3744 | offset = offset | 0 | |
3745 | if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) | |
3746 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3747 | this[offset + 3] = (value >>> 24) | |
3748 | this[offset + 2] = (value >>> 16) | |
3749 | this[offset + 1] = (value >>> 8) | |
3750 | this[offset] = value | |
3751 | } else { | |
3752 | objectWriteUInt32(this, value, offset, true) | |
ebd8d4e8 | 3753 | } |
ab78acc6 | 3754 | return offset + 4 |
ebd8d4e8 IC |
3755 | } |
3756 | ||
ab78acc6 IC |
3757 | Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { |
3758 | value = +value | |
3759 | offset = offset | 0 | |
3760 | if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) | |
3761 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3762 | this[offset] = (value >>> 24) | |
3763 | this[offset + 1] = (value >>> 16) | |
3764 | this[offset + 2] = (value >>> 8) | |
3765 | this[offset + 3] = value | |
3766 | } else { | |
3767 | objectWriteUInt32(this, value, offset, false) | |
ebd8d4e8 | 3768 | } |
ab78acc6 IC |
3769 | return offset + 4 |
3770 | } | |
3771 | ||
3772 | Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { | |
3773 | value = +value | |
3774 | offset = offset | 0 | |
3775 | if (!noAssert) { | |
3776 | var limit = Math.pow(2, 8 * byteLength - 1) | |
3777 | ||
3778 | checkInt(this, value, offset, byteLength, limit - 1, -limit) | |
ebd8d4e8 | 3779 | } |
ab78acc6 IC |
3780 | |
3781 | var i = 0 | |
3782 | var mul = 1 | |
3783 | var sub = value < 0 ? 1 : 0 | |
3784 | this[offset] = value & 0xFF | |
3785 | while (++i < byteLength && (mul *= 0x100)) { | |
3786 | this[offset + i] = ((value / mul) >> 0) - sub & 0xFF | |
ebd8d4e8 | 3787 | } |
ebd8d4e8 | 3788 | |
ab78acc6 | 3789 | return offset + byteLength |
ebd8d4e8 IC |
3790 | } |
3791 | ||
ab78acc6 IC |
3792 | Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { |
3793 | value = +value | |
3794 | offset = offset | 0 | |
3795 | if (!noAssert) { | |
3796 | var limit = Math.pow(2, 8 * byteLength - 1) | |
ebd8d4e8 | 3797 | |
ab78acc6 IC |
3798 | checkInt(this, value, offset, byteLength, limit - 1, -limit) |
3799 | } | |
ebd8d4e8 | 3800 | |
ab78acc6 IC |
3801 | var i = byteLength - 1 |
3802 | var mul = 1 | |
3803 | var sub = value < 0 ? 1 : 0 | |
3804 | this[offset + i] = value & 0xFF | |
3805 | while (--i >= 0 && (mul *= 0x100)) { | |
3806 | this[offset + i] = ((value / mul) >> 0) - sub & 0xFF | |
3807 | } | |
3808 | ||
3809 | return offset + byteLength | |
ebd8d4e8 IC |
3810 | } |
3811 | ||
ab78acc6 IC |
3812 | Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { |
3813 | value = +value | |
3814 | offset = offset | 0 | |
3815 | if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) | |
3816 | if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value) | |
3817 | if (value < 0) value = 0xff + value + 1 | |
3818 | this[offset] = value | |
3819 | return offset + 1 | |
ebd8d4e8 IC |
3820 | } |
3821 | ||
ab78acc6 IC |
3822 | Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { |
3823 | value = +value | |
3824 | offset = offset | 0 | |
3825 | if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) | |
3826 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3827 | this[offset] = value | |
3828 | this[offset + 1] = (value >>> 8) | |
3829 | } else { | |
3830 | objectWriteUInt16(this, value, offset, true) | |
3831 | } | |
3832 | return offset + 2 | |
ebd8d4e8 IC |
3833 | } |
3834 | ||
ab78acc6 IC |
3835 | Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { |
3836 | value = +value | |
3837 | offset = offset | 0 | |
3838 | if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) | |
3839 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3840 | this[offset] = (value >>> 8) | |
3841 | this[offset + 1] = value | |
3842 | } else { | |
3843 | objectWriteUInt16(this, value, offset, false) | |
3844 | } | |
3845 | return offset + 2 | |
ebd8d4e8 IC |
3846 | } |
3847 | ||
ab78acc6 IC |
3848 | Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { |
3849 | value = +value | |
3850 | offset = offset | 0 | |
3851 | if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) | |
3852 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3853 | this[offset] = value | |
3854 | this[offset + 1] = (value >>> 8) | |
3855 | this[offset + 2] = (value >>> 16) | |
3856 | this[offset + 3] = (value >>> 24) | |
3857 | } else { | |
3858 | objectWriteUInt32(this, value, offset, true) | |
3859 | } | |
3860 | return offset + 4 | |
3861 | } | |
3862 | ||
3863 | Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { | |
3864 | value = +value | |
3865 | offset = offset | 0 | |
3866 | if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) | |
3867 | if (value < 0) value = 0xffffffff + value + 1 | |
3868 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
3869 | this[offset] = (value >>> 24) | |
3870 | this[offset + 1] = (value >>> 16) | |
3871 | this[offset + 2] = (value >>> 8) | |
3872 | this[offset + 3] = value | |
3873 | } else { | |
3874 | objectWriteUInt32(this, value, offset, false) | |
ebd8d4e8 | 3875 | } |
ab78acc6 | 3876 | return offset + 4 |
ebd8d4e8 IC |
3877 | } |
3878 | ||
ab78acc6 IC |
3879 | function checkIEEE754 (buf, value, offset, ext, max, min) { |
3880 | if (value > max || value < min) throw new RangeError('value is out of bounds') | |
3881 | if (offset + ext > buf.length) throw new RangeError('index out of range') | |
3882 | if (offset < 0) throw new RangeError('index out of range') | |
3883 | } | |
ebd8d4e8 | 3884 | |
ab78acc6 IC |
3885 | function writeFloat (buf, value, offset, littleEndian, noAssert) { |
3886 | if (!noAssert) { | |
3887 | checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) | |
3888 | } | |
3889 | ieee754.write(buf, value, offset, littleEndian, 23, 4) | |
3890 | return offset + 4 | |
3891 | } | |
ebd8d4e8 | 3892 | |
ab78acc6 IC |
3893 | Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { |
3894 | return writeFloat(this, value, offset, true, noAssert) | |
3895 | } | |
ebd8d4e8 | 3896 | |
ab78acc6 IC |
3897 | Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { |
3898 | return writeFloat(this, value, offset, false, noAssert) | |
3899 | } | |
ebd8d4e8 | 3900 | |
ab78acc6 IC |
3901 | function writeDouble (buf, value, offset, littleEndian, noAssert) { |
3902 | if (!noAssert) { | |
3903 | checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) | |
ebd8d4e8 | 3904 | } |
ab78acc6 IC |
3905 | ieee754.write(buf, value, offset, littleEndian, 52, 8) |
3906 | return offset + 8 | |
ebd8d4e8 IC |
3907 | } |
3908 | ||
ab78acc6 IC |
3909 | Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { |
3910 | return writeDouble(this, value, offset, true, noAssert) | |
ebd8d4e8 IC |
3911 | } |
3912 | ||
ab78acc6 IC |
3913 | Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { |
3914 | return writeDouble(this, value, offset, false, noAssert) | |
3915 | } | |
ebd8d4e8 | 3916 | |
ab78acc6 IC |
3917 | // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) |
3918 | Buffer.prototype.copy = function copy (target, targetStart, start, end) { | |
3919 | if (!start) start = 0 | |
3920 | if (!end && end !== 0) end = this.length | |
3921 | if (targetStart >= target.length) targetStart = target.length | |
3922 | if (!targetStart) targetStart = 0 | |
3923 | if (end > 0 && end < start) end = start | |
3924 | ||
3925 | // Copy 0 bytes; we're done | |
3926 | if (end === start) return 0 | |
3927 | if (target.length === 0 || this.length === 0) return 0 | |
ebd8d4e8 | 3928 | |
ab78acc6 IC |
3929 | // Fatal error conditions |
3930 | if (targetStart < 0) { | |
3931 | throw new RangeError('targetStart out of bounds') | |
3932 | } | |
3933 | if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds') | |
3934 | if (end < 0) throw new RangeError('sourceEnd out of bounds') | |
ebd8d4e8 | 3935 | |
ab78acc6 IC |
3936 | // Are we oob? |
3937 | if (end > this.length) end = this.length | |
3938 | if (target.length - targetStart < end - start) { | |
3939 | end = target.length - targetStart + start | |
3940 | } | |
ebd8d4e8 | 3941 | |
ab78acc6 IC |
3942 | var len = end - start |
3943 | var i | |
ebd8d4e8 | 3944 | |
ab78acc6 IC |
3945 | if (this === target && start < targetStart && targetStart < end) { |
3946 | // descending copy from end | |
3947 | for (i = len - 1; i >= 0; i--) { | |
3948 | target[i + targetStart] = this[i + start] | |
3949 | } | |
3950 | } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) { | |
3951 | // ascending copy from start | |
3952 | for (i = 0; i < len; i++) { | |
3953 | target[i + targetStart] = this[i + start] | |
3954 | } | |
3955 | } else { | |
3956 | target._set(this.subarray(start, start + len), targetStart) | |
ebd8d4e8 | 3957 | } |
ebd8d4e8 | 3958 | |
ab78acc6 IC |
3959 | return len |
3960 | } | |
ebd8d4e8 | 3961 | |
ab78acc6 IC |
3962 | // fill(value, start=0, end=buffer.length) |
3963 | Buffer.prototype.fill = function fill (value, start, end) { | |
3964 | if (!value) value = 0 | |
3965 | if (!start) start = 0 | |
3966 | if (!end) end = this.length | |
ebd8d4e8 | 3967 | |
ab78acc6 | 3968 | if (end < start) throw new RangeError('end < start') |
ebd8d4e8 | 3969 | |
ab78acc6 IC |
3970 | // Fill 0 bytes; we're done |
3971 | if (end === start) return | |
3972 | if (this.length === 0) return | |
ebd8d4e8 | 3973 | |
ab78acc6 IC |
3974 | if (start < 0 || start >= this.length) throw new RangeError('start out of bounds') |
3975 | if (end < 0 || end > this.length) throw new RangeError('end out of bounds') | |
ebd8d4e8 | 3976 | |
ab78acc6 IC |
3977 | var i |
3978 | if (typeof value === 'number') { | |
3979 | for (i = start; i < end; i++) { | |
3980 | this[i] = value | |
ebd8d4e8 | 3981 | } |
ab78acc6 IC |
3982 | } else { |
3983 | var bytes = utf8ToBytes(value.toString()) | |
3984 | var len = bytes.length | |
3985 | for (i = start; i < end; i++) { | |
3986 | this[i] = bytes[i % len] | |
ebd8d4e8 IC |
3987 | } |
3988 | } | |
ebd8d4e8 | 3989 | |
ab78acc6 | 3990 | return this |
ebd8d4e8 IC |
3991 | } |
3992 | ||
ab78acc6 IC |
3993 | /** |
3994 | * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance. | |
3995 | * Added in Node 0.12. Only available in browsers that support ArrayBuffer. | |
3996 | */ | |
3997 | Buffer.prototype.toArrayBuffer = function toArrayBuffer () { | |
3998 | if (typeof Uint8Array !== 'undefined') { | |
3999 | if (Buffer.TYPED_ARRAY_SUPPORT) { | |
4000 | return (new Buffer(this)).buffer | |
4001 | } else { | |
4002 | var buf = new Uint8Array(this.length) | |
4003 | for (var i = 0, len = buf.length; i < len; i += 1) { | |
4004 | buf[i] = this[i] | |
ebd8d4e8 | 4005 | } |
ab78acc6 | 4006 | return buf.buffer |
ebd8d4e8 | 4007 | } |
ab78acc6 IC |
4008 | } else { |
4009 | throw new TypeError('Buffer.toArrayBuffer not supported in this browser') | |
ebd8d4e8 | 4010 | } |
ebd8d4e8 IC |
4011 | } |
4012 | ||
ab78acc6 IC |
4013 | // HELPER FUNCTIONS |
4014 | // ================ | |
ebd8d4e8 | 4015 | |
ab78acc6 | 4016 | var BP = Buffer.prototype |
ebd8d4e8 | 4017 | |
ab78acc6 IC |
4018 | /** |
4019 | * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods | |
4020 | */ | |
4021 | Buffer._augment = function _augment (arr) { | |
4022 | arr.constructor = Buffer | |
4023 | arr._isBuffer = true | |
ebd8d4e8 | 4024 | |
ab78acc6 IC |
4025 | // save reference to original Uint8Array set method before overwriting |
4026 | arr._set = arr.set | |
ebd8d4e8 | 4027 | |
ab78acc6 IC |
4028 | // deprecated |
4029 | arr.get = BP.get | |
4030 | arr.set = BP.set | |
ebd8d4e8 | 4031 | |
ab78acc6 IC |
4032 | arr.write = BP.write |
4033 | arr.toString = BP.toString | |
4034 | arr.toLocaleString = BP.toString | |
4035 | arr.toJSON = BP.toJSON | |
4036 | arr.equals = BP.equals | |
4037 | arr.compare = BP.compare | |
4038 | arr.indexOf = BP.indexOf | |
4039 | arr.copy = BP.copy | |
4040 | arr.slice = BP.slice | |
4041 | arr.readUIntLE = BP.readUIntLE | |
4042 | arr.readUIntBE = BP.readUIntBE | |
4043 | arr.readUInt8 = BP.readUInt8 | |
4044 | arr.readUInt16LE = BP.readUInt16LE | |
4045 | arr.readUInt16BE = BP.readUInt16BE | |
4046 | arr.readUInt32LE = BP.readUInt32LE | |
4047 | arr.readUInt32BE = BP.readUInt32BE | |
4048 | arr.readIntLE = BP.readIntLE | |
4049 | arr.readIntBE = BP.readIntBE | |
4050 | arr.readInt8 = BP.readInt8 | |
4051 | arr.readInt16LE = BP.readInt16LE | |
4052 | arr.readInt16BE = BP.readInt16BE | |
4053 | arr.readInt32LE = BP.readInt32LE | |
4054 | arr.readInt32BE = BP.readInt32BE | |
4055 | arr.readFloatLE = BP.readFloatLE | |
4056 | arr.readFloatBE = BP.readFloatBE | |
4057 | arr.readDoubleLE = BP.readDoubleLE | |
4058 | arr.readDoubleBE = BP.readDoubleBE | |
4059 | arr.writeUInt8 = BP.writeUInt8 | |
4060 | arr.writeUIntLE = BP.writeUIntLE | |
4061 | arr.writeUIntBE = BP.writeUIntBE | |
4062 | arr.writeUInt16LE = BP.writeUInt16LE | |
4063 | arr.writeUInt16BE = BP.writeUInt16BE | |
4064 | arr.writeUInt32LE = BP.writeUInt32LE | |
4065 | arr.writeUInt32BE = BP.writeUInt32BE | |
4066 | arr.writeIntLE = BP.writeIntLE | |
4067 | arr.writeIntBE = BP.writeIntBE | |
4068 | arr.writeInt8 = BP.writeInt8 | |
4069 | arr.writeInt16LE = BP.writeInt16LE | |
4070 | arr.writeInt16BE = BP.writeInt16BE | |
4071 | arr.writeInt32LE = BP.writeInt32LE | |
4072 | arr.writeInt32BE = BP.writeInt32BE | |
4073 | arr.writeFloatLE = BP.writeFloatLE | |
4074 | arr.writeFloatBE = BP.writeFloatBE | |
4075 | arr.writeDoubleLE = BP.writeDoubleLE | |
4076 | arr.writeDoubleBE = BP.writeDoubleBE | |
4077 | arr.fill = BP.fill | |
4078 | arr.inspect = BP.inspect | |
4079 | arr.toArrayBuffer = BP.toArrayBuffer | |
ebd8d4e8 | 4080 | |
ab78acc6 | 4081 | return arr |
ebd8d4e8 IC |
4082 | } |
4083 | ||
ab78acc6 | 4084 | var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g |
ebd8d4e8 | 4085 | |
ab78acc6 IC |
4086 | function base64clean (str) { |
4087 | // Node strips out invalid characters like \n and \t from the string, base64-js does not | |
4088 | str = stringtrim(str).replace(INVALID_BASE64_RE, '') | |
4089 | // Node converts strings with length < 2 to '' | |
4090 | if (str.length < 2) return '' | |
4091 | // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not | |
4092 | while (str.length % 4 !== 0) { | |
4093 | str = str + '=' | |
4094 | } | |
4095 | return str | |
ebd8d4e8 IC |
4096 | } |
4097 | ||
ab78acc6 IC |
4098 | function stringtrim (str) { |
4099 | if (str.trim) return str.trim() | |
4100 | return str.replace(/^\s+|\s+$/g, '') | |
ebd8d4e8 IC |
4101 | } |
4102 | ||
ab78acc6 IC |
4103 | function toHex (n) { |
4104 | if (n < 16) return '0' + n.toString(16) | |
4105 | return n.toString(16) | |
ebd8d4e8 IC |
4106 | } |
4107 | ||
ab78acc6 IC |
4108 | function utf8ToBytes (string, units) { |
4109 | units = units || Infinity | |
4110 | var codePoint | |
4111 | var length = string.length | |
4112 | var leadSurrogate = null | |
4113 | var bytes = [] | |
ebd8d4e8 | 4114 | |
ab78acc6 IC |
4115 | for (var i = 0; i < length; i++) { |
4116 | codePoint = string.charCodeAt(i) | |
ebd8d4e8 | 4117 | |
ab78acc6 IC |
4118 | // is surrogate component |
4119 | if (codePoint > 0xD7FF && codePoint < 0xE000) { | |
4120 | // last char was a lead | |
4121 | if (!leadSurrogate) { | |
4122 | // no lead yet | |
4123 | if (codePoint > 0xDBFF) { | |
4124 | // unexpected trail | |
4125 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) | |
4126 | continue | |
ebd8d4e8 | 4127 | |
ab78acc6 IC |
4128 | } else if (i + 1 === length) { |
4129 | // unpaired lead | |
4130 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) | |
4131 | continue | |
4132 | } | |
ebd8d4e8 | 4133 | |
ab78acc6 IC |
4134 | // valid lead |
4135 | leadSurrogate = codePoint | |
ebd8d4e8 | 4136 | |
ab78acc6 IC |
4137 | continue |
4138 | } | |
ebd8d4e8 | 4139 | |
ab78acc6 IC |
4140 | // 2 leads in a row |
4141 | if (codePoint < 0xDC00) { | |
4142 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) | |
4143 | leadSurrogate = codePoint | |
4144 | continue | |
4145 | } | |
ebd8d4e8 | 4146 | |
ab78acc6 IC |
4147 | // valid surrogate pair |
4148 | codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000 | |
4149 | ||
4150 | } else if (leadSurrogate) { | |
4151 | // valid bmp char, but last char was a lead | |
4152 | if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) | |
4153 | } | |
4154 | ||
4155 | leadSurrogate = null | |
4156 | ||
4157 | // encode utf8 | |
4158 | if (codePoint < 0x80) { | |
4159 | if ((units -= 1) < 0) break | |
4160 | bytes.push(codePoint) | |
4161 | } else if (codePoint < 0x800) { | |
4162 | if ((units -= 2) < 0) break | |
4163 | bytes.push( | |
4164 | codePoint >> 0x6 | 0xC0, | |
4165 | codePoint & 0x3F | 0x80 | |
4166 | ) | |
4167 | } else if (codePoint < 0x10000) { | |
4168 | if ((units -= 3) < 0) break | |
4169 | bytes.push( | |
4170 | codePoint >> 0xC | 0xE0, | |
4171 | codePoint >> 0x6 & 0x3F | 0x80, | |
4172 | codePoint & 0x3F | 0x80 | |
4173 | ) | |
4174 | } else if (codePoint < 0x110000) { | |
4175 | if ((units -= 4) < 0) break | |
4176 | bytes.push( | |
4177 | codePoint >> 0x12 | 0xF0, | |
4178 | codePoint >> 0xC & 0x3F | 0x80, | |
4179 | codePoint >> 0x6 & 0x3F | 0x80, | |
4180 | codePoint & 0x3F | 0x80 | |
4181 | ) | |
4182 | } else { | |
4183 | throw new Error('Invalid code point') | |
ebd8d4e8 | 4184 | } |
ebd8d4e8 | 4185 | } |
ab78acc6 IC |
4186 | |
4187 | return bytes | |
4188 | } | |
4189 | ||
4190 | function asciiToBytes (str) { | |
4191 | var byteArray = [] | |
4192 | for (var i = 0; i < str.length; i++) { | |
4193 | // Node's code seems to be doing this and not & 0x7F.. | |
4194 | byteArray.push(str.charCodeAt(i) & 0xFF) | |
ebd8d4e8 | 4195 | } |
ab78acc6 | 4196 | return byteArray |
ebd8d4e8 IC |
4197 | } |
4198 | ||
ab78acc6 IC |
4199 | function utf16leToBytes (str, units) { |
4200 | var c, hi, lo | |
4201 | var byteArray = [] | |
4202 | for (var i = 0; i < str.length; i++) { | |
4203 | if ((units -= 2) < 0) break | |
ebd8d4e8 | 4204 | |
ab78acc6 IC |
4205 | c = str.charCodeAt(i) |
4206 | hi = c >> 8 | |
4207 | lo = c % 256 | |
4208 | byteArray.push(lo) | |
4209 | byteArray.push(hi) | |
4210 | } | |
ebd8d4e8 | 4211 | |
ab78acc6 IC |
4212 | return byteArray |
4213 | } | |
ebd8d4e8 | 4214 | |
ab78acc6 IC |
4215 | function base64ToBytes (str) { |
4216 | return base64.toByteArray(base64clean(str)) | |
4217 | } | |
ebd8d4e8 | 4218 | |
ab78acc6 IC |
4219 | function blitBuffer (src, dst, offset, length) { |
4220 | for (var i = 0; i < length; i++) { | |
4221 | if ((i + offset >= dst.length) || (i >= src.length)) break | |
4222 | dst[i + offset] = src[i] | |
4223 | } | |
4224 | return i | |
4225 | } | |
4226 | ||
4227 | },{"base64-js":8,"ieee754":9,"is-array":10}],8:[function(require,module,exports){ | |
4228 | var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |
4229 | ||
4230 | ;(function (exports) { | |
4231 | 'use strict'; | |
4232 | ||
4233 | var Arr = (typeof Uint8Array !== 'undefined') | |
4234 | ? Uint8Array | |
4235 | : Array | |
ebd8d4e8 | 4236 | |
ab78acc6 IC |
4237 | var PLUS = '+'.charCodeAt(0) |
4238 | var SLASH = '/'.charCodeAt(0) | |
4239 | var NUMBER = '0'.charCodeAt(0) | |
4240 | var LOWER = 'a'.charCodeAt(0) | |
4241 | var UPPER = 'A'.charCodeAt(0) | |
4242 | var PLUS_URL_SAFE = '-'.charCodeAt(0) | |
4243 | var SLASH_URL_SAFE = '_'.charCodeAt(0) | |
ebd8d4e8 | 4244 | |
ab78acc6 IC |
4245 | function decode (elt) { |
4246 | var code = elt.charCodeAt(0) | |
4247 | if (code === PLUS || | |
4248 | code === PLUS_URL_SAFE) | |
4249 | return 62 // '+' | |
4250 | if (code === SLASH || | |
4251 | code === SLASH_URL_SAFE) | |
4252 | return 63 // '/' | |
4253 | if (code < NUMBER) | |
4254 | return -1 //no match | |
4255 | if (code < NUMBER + 10) | |
4256 | return code - NUMBER + 26 + 26 | |
4257 | if (code < UPPER + 26) | |
4258 | return code - UPPER | |
4259 | if (code < LOWER + 26) | |
4260 | return code - LOWER + 26 | |
4261 | } | |
ebd8d4e8 | 4262 | |
ab78acc6 IC |
4263 | function b64ToByteArray (b64) { |
4264 | var i, j, l, tmp, placeHolders, arr | |
ebd8d4e8 | 4265 | |
ab78acc6 IC |
4266 | if (b64.length % 4 > 0) { |
4267 | throw new Error('Invalid string. Length must be a multiple of 4') | |
4268 | } | |
ebd8d4e8 | 4269 | |
ab78acc6 IC |
4270 | // the number of equal signs (place holders) |
4271 | // if there are two placeholders, than the two characters before it | |
4272 | // represent one byte | |
4273 | // if there is only one, then the three characters before it represent 2 bytes | |
4274 | // this is just a cheap hack to not do indexOf twice | |
4275 | var len = b64.length | |
4276 | placeHolders = '=' === b64.charAt(len - 2) ? 2 : '=' === b64.charAt(len - 1) ? 1 : 0 | |
ebd8d4e8 | 4277 | |
ab78acc6 IC |
4278 | // base64 is 4/3 + up to two characters of the original data |
4279 | arr = new Arr(b64.length * 3 / 4 - placeHolders) | |
ebd8d4e8 | 4280 | |
ab78acc6 IC |
4281 | // if there are placeholders, only get up to the last complete 4 chars |
4282 | l = placeHolders > 0 ? b64.length - 4 : b64.length | |
ebd8d4e8 | 4283 | |
ab78acc6 | 4284 | var L = 0 |
ebd8d4e8 | 4285 | |
ab78acc6 IC |
4286 | function push (v) { |
4287 | arr[L++] = v | |
4288 | } | |
ebd8d4e8 | 4289 | |
ab78acc6 IC |
4290 | for (i = 0, j = 0; i < l; i += 4, j += 3) { |
4291 | tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3)) | |
4292 | push((tmp & 0xFF0000) >> 16) | |
4293 | push((tmp & 0xFF00) >> 8) | |
4294 | push(tmp & 0xFF) | |
4295 | } | |
ebd8d4e8 | 4296 | |
ab78acc6 IC |
4297 | if (placeHolders === 2) { |
4298 | tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4) | |
4299 | push(tmp & 0xFF) | |
4300 | } else if (placeHolders === 1) { | |
4301 | tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2) | |
4302 | push((tmp >> 8) & 0xFF) | |
4303 | push(tmp & 0xFF) | |
4304 | } | |
ebd8d4e8 | 4305 | |
ab78acc6 IC |
4306 | return arr |
4307 | } | |
ebd8d4e8 | 4308 | |
ab78acc6 IC |
4309 | function uint8ToBase64 (uint8) { |
4310 | var i, | |
4311 | extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes | |
4312 | output = "", | |
4313 | temp, length | |
ebd8d4e8 | 4314 | |
ab78acc6 IC |
4315 | function encode (num) { |
4316 | return lookup.charAt(num) | |
4317 | } | |
ebd8d4e8 | 4318 | |
ab78acc6 IC |
4319 | function tripletToBase64 (num) { |
4320 | return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F) | |
4321 | } | |
ebd8d4e8 | 4322 | |
ab78acc6 IC |
4323 | // go through the array every three bytes, we'll deal with trailing stuff later |
4324 | for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) { | |
4325 | temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) | |
4326 | output += tripletToBase64(temp) | |
4327 | } | |
ebd8d4e8 | 4328 | |
ab78acc6 IC |
4329 | // pad the end with zeros, but make sure to not forget the extra bytes |
4330 | switch (extraBytes) { | |
4331 | case 1: | |
4332 | temp = uint8[uint8.length - 1] | |
4333 | output += encode(temp >> 2) | |
4334 | output += encode((temp << 4) & 0x3F) | |
4335 | output += '==' | |
4336 | break | |
4337 | case 2: | |
4338 | temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1]) | |
4339 | output += encode(temp >> 10) | |
4340 | output += encode((temp >> 4) & 0x3F) | |
4341 | output += encode((temp << 2) & 0x3F) | |
4342 | output += '=' | |
4343 | break | |
4344 | } | |
ebd8d4e8 | 4345 | |
ab78acc6 IC |
4346 | return output |
4347 | } | |
ebd8d4e8 | 4348 | |
ab78acc6 IC |
4349 | exports.toByteArray = b64ToByteArray |
4350 | exports.fromByteArray = uint8ToBase64 | |
4351 | }(typeof exports === 'undefined' ? (this.base64js = {}) : exports)) | |
ebd8d4e8 | 4352 | |
ab78acc6 IC |
4353 | },{}],9:[function(require,module,exports){ |
4354 | exports.read = function (buffer, offset, isLE, mLen, nBytes) { | |
4355 | var e, m | |
4356 | var eLen = nBytes * 8 - mLen - 1 | |
4357 | var eMax = (1 << eLen) - 1 | |
4358 | var eBias = eMax >> 1 | |
4359 | var nBits = -7 | |
4360 | var i = isLE ? (nBytes - 1) : 0 | |
4361 | var d = isLE ? -1 : 1 | |
4362 | var s = buffer[offset + i] | |
4363 | ||
4364 | i += d | |
4365 | ||
4366 | e = s & ((1 << (-nBits)) - 1) | |
4367 | s >>= (-nBits) | |
4368 | nBits += eLen | |
4369 | for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} | |
4370 | ||
4371 | m = e & ((1 << (-nBits)) - 1) | |
4372 | e >>= (-nBits) | |
4373 | nBits += mLen | |
4374 | for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} | |
ebd8d4e8 | 4375 | |
ab78acc6 IC |
4376 | if (e === 0) { |
4377 | e = 1 - eBias | |
4378 | } else if (e === eMax) { | |
4379 | return m ? NaN : ((s ? -1 : 1) * Infinity) | |
4380 | } else { | |
4381 | m = m + Math.pow(2, mLen) | |
4382 | e = e - eBias | |
ebd8d4e8 | 4383 | } |
ab78acc6 | 4384 | return (s ? -1 : 1) * m * Math.pow(2, e - mLen) |
ebd8d4e8 IC |
4385 | } |
4386 | ||
ab78acc6 IC |
4387 | exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { |
4388 | var e, m, c | |
4389 | var eLen = nBytes * 8 - mLen - 1 | |
4390 | var eMax = (1 << eLen) - 1 | |
4391 | var eBias = eMax >> 1 | |
4392 | var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) | |
4393 | var i = isLE ? 0 : (nBytes - 1) | |
4394 | var d = isLE ? 1 : -1 | |
4395 | var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 | |
ebd8d4e8 | 4396 | |
ab78acc6 | 4397 | value = Math.abs(value) |
ebd8d4e8 | 4398 | |
ab78acc6 IC |
4399 | if (isNaN(value) || value === Infinity) { |
4400 | m = isNaN(value) ? 1 : 0 | |
4401 | e = eMax | |
4402 | } else { | |
4403 | e = Math.floor(Math.log(value) / Math.LN2) | |
4404 | if (value * (c = Math.pow(2, -e)) < 1) { | |
4405 | e-- | |
4406 | c *= 2 | |
ebd8d4e8 | 4407 | } |
ab78acc6 IC |
4408 | if (e + eBias >= 1) { |
4409 | value += rt / c | |
4410 | } else { | |
4411 | value += rt * Math.pow(2, 1 - eBias) | |
ebd8d4e8 | 4412 | } |
ab78acc6 IC |
4413 | if (value * c >= 2) { |
4414 | e++ | |
4415 | c /= 2 | |
ebd8d4e8 | 4416 | } |
ab78acc6 IC |
4417 | |
4418 | if (e + eBias >= eMax) { | |
4419 | m = 0 | |
4420 | e = eMax | |
4421 | } else if (e + eBias >= 1) { | |
4422 | m = (value * c - 1) * Math.pow(2, mLen) | |
4423 | e = e + eBias | |
4424 | } else { | |
4425 | m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) | |
4426 | e = 0 | |
ebd8d4e8 IC |
4427 | } |
4428 | } | |
ebd8d4e8 | 4429 | |
ab78acc6 | 4430 | for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} |
ebd8d4e8 | 4431 | |
ab78acc6 IC |
4432 | e = (e << mLen) | m |
4433 | eLen += mLen | |
4434 | for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} | |
ebd8d4e8 | 4435 | |
ab78acc6 IC |
4436 | buffer[offset + i - d] |= s * 128 |
4437 | } | |
ebd8d4e8 | 4438 | |
ab78acc6 | 4439 | },{}],10:[function(require,module,exports){ |
ebd8d4e8 | 4440 | |
ab78acc6 IC |
4441 | /** |
4442 | * isArray | |
4443 | */ | |
ebd8d4e8 | 4444 | |
ab78acc6 | 4445 | var isArray = Array.isArray; |
ebd8d4e8 IC |
4446 | |
4447 | /** | |
ab78acc6 | 4448 | * toString |
ebd8d4e8 | 4449 | */ |
ebd8d4e8 | 4450 | |
ab78acc6 | 4451 | var str = Object.prototype.toString; |
ebd8d4e8 IC |
4452 | |
4453 | /** | |
ab78acc6 IC |
4454 | * Whether or not the given `val` |
4455 | * is an array. | |
ebd8d4e8 | 4456 | * |
ab78acc6 IC |
4457 | * example: |
4458 | * | |
4459 | * isArray([]); | |
4460 | * // > true | |
4461 | * isArray(arguments); | |
4462 | * // > false | |
4463 | * isArray(''); | |
4464 | * // > false | |
4465 | * | |
4466 | * @param {mixed} val | |
4467 | * @return {bool} | |
ebd8d4e8 | 4468 | */ |
ebd8d4e8 | 4469 | |
ab78acc6 IC |
4470 | module.exports = isArray || function (val) { |
4471 | return !! val && '[object Array]' == str.call(val); | |
4472 | }; | |
4473 | ||
4474 | },{}],11:[function(require,module,exports){ | |
4475 | // Copyright Joyent, Inc. and other Node contributors. | |
4476 | // | |
4477 | // Permission is hereby granted, free of charge, to any person obtaining a | |
4478 | // copy of this software and associated documentation files (the | |
4479 | // "Software"), to deal in the Software without restriction, including | |
4480 | // without limitation the rights to use, copy, modify, merge, publish, | |
4481 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
4482 | // persons to whom the Software is furnished to do so, subject to the | |
4483 | // following conditions: | |
4484 | // | |
4485 | // The above copyright notice and this permission notice shall be included | |
4486 | // in all copies or substantial portions of the Software. | |
4487 | // | |
4488 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
4489 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
4490 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
4491 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
4492 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
4493 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
4494 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
4495 | ||
4496 | function EventEmitter() { | |
4497 | this._events = this._events || {}; | |
4498 | this._maxListeners = this._maxListeners || undefined; | |
ebd8d4e8 | 4499 | } |
ab78acc6 | 4500 | module.exports = EventEmitter; |
ebd8d4e8 | 4501 | |
ab78acc6 IC |
4502 | // Backwards-compat with node 0.10.x |
4503 | EventEmitter.EventEmitter = EventEmitter; | |
ebd8d4e8 | 4504 | |
ab78acc6 IC |
4505 | EventEmitter.prototype._events = undefined; |
4506 | EventEmitter.prototype._maxListeners = undefined; | |
4507 | ||
4508 | // By default EventEmitters will print a warning if more than 10 listeners are | |
4509 | // added to it. This is a useful default which helps finding memory leaks. | |
4510 | EventEmitter.defaultMaxListeners = 10; | |
4511 | ||
4512 | // Obviously not all Emitters should be limited to 10. This function allows | |
4513 | // that to be increased. Set to zero for unlimited. | |
4514 | EventEmitter.prototype.setMaxListeners = function(n) { | |
4515 | if (!isNumber(n) || n < 0 || isNaN(n)) | |
4516 | throw TypeError('n must be a positive number'); | |
4517 | this._maxListeners = n; | |
4518 | return this; | |
4519 | }; | |
4520 | ||
4521 | EventEmitter.prototype.emit = function(type) { | |
4522 | var er, handler, len, args, i, listeners; | |
4523 | ||
4524 | if (!this._events) | |
4525 | this._events = {}; | |
4526 | ||
4527 | // If there is no 'error' event listener then throw. | |
4528 | if (type === 'error') { | |
4529 | if (!this._events.error || | |
4530 | (isObject(this._events.error) && !this._events.error.length)) { | |
4531 | er = arguments[1]; | |
4532 | if (er instanceof Error) { | |
4533 | throw er; // Unhandled 'error' event | |
4534 | } | |
4535 | throw TypeError('Uncaught, unspecified "error" event.'); | |
4536 | } | |
4537 | } | |
4538 | ||
4539 | handler = this._events[type]; | |
4540 | ||
4541 | if (isUndefined(handler)) | |
4542 | return false; | |
4543 | ||
4544 | if (isFunction(handler)) { | |
4545 | switch (arguments.length) { | |
4546 | // fast cases | |
4547 | case 1: | |
4548 | handler.call(this); | |
4549 | break; | |
4550 | case 2: | |
4551 | handler.call(this, arguments[1]); | |
4552 | break; | |
4553 | case 3: | |
4554 | handler.call(this, arguments[1], arguments[2]); | |
4555 | break; | |
4556 | // slower | |
4557 | default: | |
4558 | len = arguments.length; | |
4559 | args = new Array(len - 1); | |
4560 | for (i = 1; i < len; i++) | |
4561 | args[i - 1] = arguments[i]; | |
4562 | handler.apply(this, args); | |
4563 | } | |
4564 | } else if (isObject(handler)) { | |
4565 | len = arguments.length; | |
4566 | args = new Array(len - 1); | |
4567 | for (i = 1; i < len; i++) | |
4568 | args[i - 1] = arguments[i]; | |
ebd8d4e8 | 4569 | |
ab78acc6 IC |
4570 | listeners = handler.slice(); |
4571 | len = listeners.length; | |
4572 | for (i = 0; i < len; i++) | |
4573 | listeners[i].apply(this, args); | |
ebd8d4e8 IC |
4574 | } |
4575 | ||
ab78acc6 IC |
4576 | return true; |
4577 | }; | |
ebd8d4e8 | 4578 | |
ab78acc6 IC |
4579 | EventEmitter.prototype.addListener = function(type, listener) { |
4580 | var m; | |
ebd8d4e8 | 4581 | |
ab78acc6 IC |
4582 | if (!isFunction(listener)) |
4583 | throw TypeError('listener must be a function'); | |
ebd8d4e8 | 4584 | |
ab78acc6 IC |
4585 | if (!this._events) |
4586 | this._events = {}; | |
ebd8d4e8 | 4587 | |
ab78acc6 IC |
4588 | // To avoid recursion in the case that type === "newListener"! Before |
4589 | // adding it to the listeners, first emit "newListener". | |
4590 | if (this._events.newListener) | |
4591 | this.emit('newListener', type, | |
4592 | isFunction(listener.listener) ? | |
4593 | listener.listener : listener); | |
ebd8d4e8 | 4594 | |
ab78acc6 IC |
4595 | if (!this._events[type]) |
4596 | // Optimize the case of one listener. Don't need the extra array object. | |
4597 | this._events[type] = listener; | |
4598 | else if (isObject(this._events[type])) | |
4599 | // If we've already got an array, just append. | |
4600 | this._events[type].push(listener); | |
4601 | else | |
4602 | // Adding the second element, need to change to array. | |
4603 | this._events[type] = [this._events[type], listener]; | |
4604 | ||
4605 | // Check for listener leak | |
4606 | if (isObject(this._events[type]) && !this._events[type].warned) { | |
4607 | var m; | |
4608 | if (!isUndefined(this._maxListeners)) { | |
4609 | m = this._maxListeners; | |
4610 | } else { | |
4611 | m = EventEmitter.defaultMaxListeners; | |
4612 | } | |
4613 | ||
4614 | if (m && m > 0 && this._events[type].length > m) { | |
4615 | this._events[type].warned = true; | |
4616 | console.error('(node) warning: possible EventEmitter memory ' + | |
4617 | 'leak detected. %d listeners added. ' + | |
4618 | 'Use emitter.setMaxListeners() to increase limit.', | |
4619 | this._events[type].length); | |
4620 | if (typeof console.trace === 'function') { | |
4621 | // not supported in IE 10 | |
4622 | console.trace(); | |
4623 | } | |
4624 | } | |
4625 | } | |
ebd8d4e8 | 4626 | |
ab78acc6 IC |
4627 | return this; |
4628 | }; | |
ebd8d4e8 | 4629 | |
ab78acc6 | 4630 | EventEmitter.prototype.on = EventEmitter.prototype.addListener; |
ebd8d4e8 | 4631 | |
ab78acc6 IC |
4632 | EventEmitter.prototype.once = function(type, listener) { |
4633 | if (!isFunction(listener)) | |
4634 | throw TypeError('listener must be a function'); | |
ebd8d4e8 | 4635 | |
ab78acc6 | 4636 | var fired = false; |
ebd8d4e8 | 4637 | |
ab78acc6 IC |
4638 | function g() { |
4639 | this.removeListener(type, g); | |
ebd8d4e8 | 4640 | |
ab78acc6 IC |
4641 | if (!fired) { |
4642 | fired = true; | |
4643 | listener.apply(this, arguments); | |
4644 | } | |
4645 | } | |
ebd8d4e8 | 4646 | |
ab78acc6 IC |
4647 | g.listener = listener; |
4648 | this.on(type, g); | |
ebd8d4e8 | 4649 | |
ab78acc6 IC |
4650 | return this; |
4651 | }; | |
ebd8d4e8 | 4652 | |
ab78acc6 IC |
4653 | // emits a 'removeListener' event iff the listener was removed |
4654 | EventEmitter.prototype.removeListener = function(type, listener) { | |
4655 | var list, position, length, i; | |
ebd8d4e8 | 4656 | |
ab78acc6 IC |
4657 | if (!isFunction(listener)) |
4658 | throw TypeError('listener must be a function'); | |
ebd8d4e8 | 4659 | |
ab78acc6 IC |
4660 | if (!this._events || !this._events[type]) |
4661 | return this; | |
ebd8d4e8 | 4662 | |
ab78acc6 IC |
4663 | list = this._events[type]; |
4664 | length = list.length; | |
4665 | position = -1; | |
4666 | ||
4667 | if (list === listener || | |
4668 | (isFunction(list.listener) && list.listener === listener)) { | |
4669 | delete this._events[type]; | |
4670 | if (this._events.removeListener) | |
4671 | this.emit('removeListener', type, listener); | |
4672 | ||
4673 | } else if (isObject(list)) { | |
4674 | for (i = length; i-- > 0;) { | |
4675 | if (list[i] === listener || | |
4676 | (list[i].listener && list[i].listener === listener)) { | |
4677 | position = i; | |
4678 | break; | |
ebd8d4e8 | 4679 | } |
ab78acc6 | 4680 | } |
ebd8d4e8 | 4681 | |
ab78acc6 IC |
4682 | if (position < 0) |
4683 | return this; | |
4684 | ||
4685 | if (list.length === 1) { | |
4686 | list.length = 0; | |
4687 | delete this._events[type]; | |
4688 | } else { | |
4689 | list.splice(position, 1); | |
ebd8d4e8 | 4690 | } |
ab78acc6 IC |
4691 | |
4692 | if (this._events.removeListener) | |
4693 | this.emit('removeListener', type, listener); | |
ebd8d4e8 | 4694 | } |
ab78acc6 IC |
4695 | |
4696 | return this; | |
ebd8d4e8 IC |
4697 | }; |
4698 | ||
ab78acc6 IC |
4699 | EventEmitter.prototype.removeAllListeners = function(type) { |
4700 | var key, listeners; | |
ebd8d4e8 | 4701 | |
ab78acc6 IC |
4702 | if (!this._events) |
4703 | return this; | |
4704 | ||
4705 | // not listening for removeListener, no need to emit | |
4706 | if (!this._events.removeListener) { | |
4707 | if (arguments.length === 0) | |
4708 | this._events = {}; | |
4709 | else if (this._events[type]) | |
4710 | delete this._events[type]; | |
4711 | return this; | |
ebd8d4e8 | 4712 | } |
ab78acc6 IC |
4713 | |
4714 | // emit removeListener for all listeners on all events | |
4715 | if (arguments.length === 0) { | |
4716 | for (key in this._events) { | |
4717 | if (key === 'removeListener') continue; | |
4718 | this.removeAllListeners(key); | |
4719 | } | |
4720 | this.removeAllListeners('removeListener'); | |
4721 | this._events = {}; | |
4722 | return this; | |
ebd8d4e8 | 4723 | } |
ebd8d4e8 | 4724 | |
ab78acc6 IC |
4725 | listeners = this._events[type]; |
4726 | ||
4727 | if (isFunction(listeners)) { | |
4728 | this.removeListener(type, listeners); | |
ebd8d4e8 | 4729 | } else { |
ab78acc6 IC |
4730 | // LIFO order |
4731 | while (listeners.length) | |
4732 | this.removeListener(type, listeners[listeners.length - 1]); | |
ebd8d4e8 | 4733 | } |
ab78acc6 | 4734 | delete this._events[type]; |
ebd8d4e8 | 4735 | |
ab78acc6 IC |
4736 | return this; |
4737 | }; | |
ebd8d4e8 | 4738 | |
ab78acc6 IC |
4739 | EventEmitter.prototype.listeners = function(type) { |
4740 | var ret; | |
4741 | if (!this._events || !this._events[type]) | |
4742 | ret = []; | |
4743 | else if (isFunction(this._events[type])) | |
4744 | ret = [this._events[type]]; | |
4745 | else | |
4746 | ret = this._events[type].slice(); | |
4747 | return ret; | |
4748 | }; | |
ebd8d4e8 | 4749 | |
ab78acc6 IC |
4750 | EventEmitter.listenerCount = function(emitter, type) { |
4751 | var ret; | |
4752 | if (!emitter._events || !emitter._events[type]) | |
4753 | ret = 0; | |
4754 | else if (isFunction(emitter._events[type])) | |
4755 | ret = 1; | |
4756 | else | |
4757 | ret = emitter._events[type].length; | |
4758 | return ret; | |
4759 | }; | |
ebd8d4e8 | 4760 | |
ab78acc6 IC |
4761 | function isFunction(arg) { |
4762 | return typeof arg === 'function'; | |
ebd8d4e8 IC |
4763 | } |
4764 | ||
ab78acc6 IC |
4765 | function isNumber(arg) { |
4766 | return typeof arg === 'number'; | |
4767 | } | |
ebd8d4e8 | 4768 | |
ab78acc6 IC |
4769 | function isObject(arg) { |
4770 | return typeof arg === 'object' && arg !== null; | |
4771 | } | |
ebd8d4e8 | 4772 | |
ab78acc6 IC |
4773 | function isUndefined(arg) { |
4774 | return arg === void 0; | |
ebd8d4e8 | 4775 | } |
ebd8d4e8 | 4776 | |
ab78acc6 IC |
4777 | },{}],12:[function(require,module,exports){ |
4778 | if (typeof Object.create === 'function') { | |
4779 | // implementation from standard node.js 'util' module | |
4780 | module.exports = function inherits(ctor, superCtor) { | |
4781 | ctor.super_ = superCtor | |
4782 | ctor.prototype = Object.create(superCtor.prototype, { | |
4783 | constructor: { | |
4784 | value: ctor, | |
4785 | enumerable: false, | |
4786 | writable: true, | |
4787 | configurable: true | |
4788 | } | |
4789 | }); | |
4790 | }; | |
4791 | } else { | |
4792 | // old school shim for old browsers | |
4793 | module.exports = function inherits(ctor, superCtor) { | |
4794 | ctor.super_ = superCtor | |
4795 | var TempCtor = function () {} | |
4796 | TempCtor.prototype = superCtor.prototype | |
4797 | ctor.prototype = new TempCtor() | |
4798 | ctor.prototype.constructor = ctor | |
4799 | } | |
4800 | } | |
ebd8d4e8 | 4801 | |
ab78acc6 IC |
4802 | },{}],13:[function(require,module,exports){ |
4803 | module.exports = Array.isArray || function (arr) { | |
4804 | return Object.prototype.toString.call(arr) == '[object Array]'; | |
ebd8d4e8 IC |
4805 | }; |
4806 | ||
ab78acc6 IC |
4807 | },{}],14:[function(require,module,exports){ |
4808 | // shim for using process in browser | |
ebd8d4e8 | 4809 | |
ab78acc6 IC |
4810 | var process = module.exports = {}; |
4811 | var queue = []; | |
4812 | var draining = false; | |
4813 | var currentQueue; | |
4814 | var queueIndex = -1; | |
4815 | ||
4816 | function cleanUpNextTick() { | |
4817 | draining = false; | |
4818 | if (currentQueue.length) { | |
4819 | queue = currentQueue.concat(queue); | |
4820 | } else { | |
4821 | queueIndex = -1; | |
4822 | } | |
4823 | if (queue.length) { | |
4824 | drainQueue(); | |
4825 | } | |
4826 | } | |
ebd8d4e8 | 4827 | |
ab78acc6 IC |
4828 | function drainQueue() { |
4829 | if (draining) { | |
4830 | return; | |
4831 | } | |
4832 | var timeout = setTimeout(cleanUpNextTick); | |
4833 | draining = true; | |
ebd8d4e8 | 4834 | |
ab78acc6 IC |
4835 | var len = queue.length; |
4836 | while(len) { | |
4837 | currentQueue = queue; | |
4838 | queue = []; | |
4839 | while (++queueIndex < len) { | |
4840 | currentQueue[queueIndex].run(); | |
4841 | } | |
4842 | queueIndex = -1; | |
4843 | len = queue.length; | |
4844 | } | |
4845 | currentQueue = null; | |
4846 | draining = false; | |
4847 | clearTimeout(timeout); | |
4848 | } | |
4849 | ||
4850 | process.nextTick = function (fun) { | |
4851 | var args = new Array(arguments.length - 1); | |
4852 | if (arguments.length > 1) { | |
4853 | for (var i = 1; i < arguments.length; i++) { | |
4854 | args[i - 1] = arguments[i]; | |
4855 | } | |
4856 | } | |
4857 | queue.push(new Item(fun, args)); | |
4858 | if (queue.length === 1 && !draining) { | |
4859 | setTimeout(drainQueue, 0); | |
4860 | } | |
ebd8d4e8 IC |
4861 | }; |
4862 | ||
ab78acc6 IC |
4863 | // v8 likes predictible objects |
4864 | function Item(fun, array) { | |
4865 | this.fun = fun; | |
4866 | this.array = array; | |
4867 | } | |
4868 | Item.prototype.run = function () { | |
4869 | this.fun.apply(null, this.array); | |
4870 | }; | |
4871 | process.title = 'browser'; | |
4872 | process.browser = true; | |
4873 | process.env = {}; | |
4874 | process.argv = []; | |
4875 | process.version = ''; // empty string to avoid regexp issues | |
4876 | process.versions = {}; | |
ebd8d4e8 | 4877 | |
ab78acc6 IC |
4878 | function noop() {} |
4879 | ||
4880 | process.on = noop; | |
4881 | process.addListener = noop; | |
4882 | process.once = noop; | |
4883 | process.off = noop; | |
4884 | process.removeListener = noop; | |
4885 | process.removeAllListeners = noop; | |
4886 | process.emit = noop; | |
4887 | ||
4888 | process.binding = function (name) { | |
4889 | throw new Error('process.binding is not supported'); | |
4890 | }; | |
ebd8d4e8 | 4891 | |
ab78acc6 IC |
4892 | // TODO(shtylman) |
4893 | process.cwd = function () { return '/' }; | |
4894 | process.chdir = function (dir) { | |
4895 | throw new Error('process.chdir is not supported'); | |
4896 | }; | |
4897 | process.umask = function() { return 0; }; | |
ebd8d4e8 | 4898 | |
ab78acc6 IC |
4899 | },{}],15:[function(require,module,exports){ |
4900 | module.exports = require("./lib/_stream_duplex.js") | |
ebd8d4e8 | 4901 | |
ab78acc6 IC |
4902 | },{"./lib/_stream_duplex.js":16}],16:[function(require,module,exports){ |
4903 | (function (process){ | |
4904 | // Copyright Joyent, Inc. and other Node contributors. | |
4905 | // | |
4906 | // Permission is hereby granted, free of charge, to any person obtaining a | |
4907 | // copy of this software and associated documentation files (the | |
4908 | // "Software"), to deal in the Software without restriction, including | |
4909 | // without limitation the rights to use, copy, modify, merge, publish, | |
4910 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
4911 | // persons to whom the Software is furnished to do so, subject to the | |
4912 | // following conditions: | |
4913 | // | |
4914 | // The above copyright notice and this permission notice shall be included | |
4915 | // in all copies or substantial portions of the Software. | |
4916 | // | |
4917 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
4918 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
4919 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
4920 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
4921 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
4922 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
4923 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 4924 | |
ab78acc6 IC |
4925 | // a duplex stream is just a stream that is both readable and writable. |
4926 | // Since JS doesn't have multiple prototypal inheritance, this class | |
4927 | // prototypally inherits from Readable, and then parasitically from | |
4928 | // Writable. | |
ebd8d4e8 | 4929 | |
ab78acc6 | 4930 | module.exports = Duplex; |
ebd8d4e8 | 4931 | |
ab78acc6 IC |
4932 | /*<replacement>*/ |
4933 | var objectKeys = Object.keys || function (obj) { | |
4934 | var keys = []; | |
4935 | for (var key in obj) keys.push(key); | |
4936 | return keys; | |
ebd8d4e8 | 4937 | } |
ab78acc6 | 4938 | /*</replacement>*/ |
ebd8d4e8 | 4939 | |
ebd8d4e8 | 4940 | |
ab78acc6 IC |
4941 | /*<replacement>*/ |
4942 | var util = require('core-util-is'); | |
4943 | util.inherits = require('inherits'); | |
4944 | /*</replacement>*/ | |
ebd8d4e8 | 4945 | |
ab78acc6 IC |
4946 | var Readable = require('./_stream_readable'); |
4947 | var Writable = require('./_stream_writable'); | |
ebd8d4e8 | 4948 | |
ab78acc6 | 4949 | util.inherits(Duplex, Readable); |
ebd8d4e8 | 4950 | |
ab78acc6 IC |
4951 | forEach(objectKeys(Writable.prototype), function(method) { |
4952 | if (!Duplex.prototype[method]) | |
4953 | Duplex.prototype[method] = Writable.prototype[method]; | |
4954 | }); | |
ebd8d4e8 | 4955 | |
ab78acc6 IC |
4956 | function Duplex(options) { |
4957 | if (!(this instanceof Duplex)) | |
4958 | return new Duplex(options); | |
ebd8d4e8 | 4959 | |
ab78acc6 IC |
4960 | Readable.call(this, options); |
4961 | Writable.call(this, options); | |
ebd8d4e8 | 4962 | |
ab78acc6 IC |
4963 | if (options && options.readable === false) |
4964 | this.readable = false; | |
ebd8d4e8 | 4965 | |
ab78acc6 IC |
4966 | if (options && options.writable === false) |
4967 | this.writable = false; | |
ebd8d4e8 | 4968 | |
ab78acc6 IC |
4969 | this.allowHalfOpen = true; |
4970 | if (options && options.allowHalfOpen === false) | |
4971 | this.allowHalfOpen = false; | |
ebd8d4e8 | 4972 | |
ab78acc6 | 4973 | this.once('end', onend); |
ebd8d4e8 IC |
4974 | } |
4975 | ||
ab78acc6 IC |
4976 | // the no-half-open enforcer |
4977 | function onend() { | |
4978 | // if we allow half-open state, or if the writable side ended, | |
4979 | // then we're ok. | |
4980 | if (this.allowHalfOpen || this._writableState.ended) | |
4981 | return; | |
ebd8d4e8 | 4982 | |
ab78acc6 IC |
4983 | // no more data can be written. |
4984 | // But allow more writes to happen in this tick. | |
4985 | process.nextTick(this.end.bind(this)); | |
4986 | } | |
ebd8d4e8 | 4987 | |
ab78acc6 IC |
4988 | function forEach (xs, f) { |
4989 | for (var i = 0, l = xs.length; i < l; i++) { | |
4990 | f(xs[i], i); | |
ebd8d4e8 | 4991 | } |
ab78acc6 | 4992 | } |
ebd8d4e8 | 4993 | |
ab78acc6 IC |
4994 | }).call(this,require('_process')) |
4995 | },{"./_stream_readable":18,"./_stream_writable":20,"_process":14,"core-util-is":21,"inherits":12}],17:[function(require,module,exports){ | |
4996 | // Copyright Joyent, Inc. and other Node contributors. | |
4997 | // | |
4998 | // Permission is hereby granted, free of charge, to any person obtaining a | |
4999 | // copy of this software and associated documentation files (the | |
5000 | // "Software"), to deal in the Software without restriction, including | |
5001 | // without limitation the rights to use, copy, modify, merge, publish, | |
5002 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
5003 | // persons to whom the Software is furnished to do so, subject to the | |
5004 | // following conditions: | |
5005 | // | |
5006 | // The above copyright notice and this permission notice shall be included | |
5007 | // in all copies or substantial portions of the Software. | |
5008 | // | |
5009 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
5010 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
5011 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
5012 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
5013 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
5014 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
5015 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 5016 | |
ab78acc6 IC |
5017 | // a passthrough stream. |
5018 | // basically just the most minimal sort of Transform stream. | |
5019 | // Every written chunk gets output as-is. | |
ebd8d4e8 | 5020 | |
ab78acc6 | 5021 | module.exports = PassThrough; |
ebd8d4e8 | 5022 | |
ab78acc6 | 5023 | var Transform = require('./_stream_transform'); |
ebd8d4e8 | 5024 | |
ab78acc6 IC |
5025 | /*<replacement>*/ |
5026 | var util = require('core-util-is'); | |
5027 | util.inherits = require('inherits'); | |
5028 | /*</replacement>*/ | |
ebd8d4e8 | 5029 | |
ab78acc6 | 5030 | util.inherits(PassThrough, Transform); |
ebd8d4e8 | 5031 | |
ab78acc6 IC |
5032 | function PassThrough(options) { |
5033 | if (!(this instanceof PassThrough)) | |
5034 | return new PassThrough(options); | |
ebd8d4e8 | 5035 | |
ab78acc6 IC |
5036 | Transform.call(this, options); |
5037 | } | |
ebd8d4e8 | 5038 | |
ab78acc6 IC |
5039 | PassThrough.prototype._transform = function(chunk, encoding, cb) { |
5040 | cb(null, chunk); | |
ebd8d4e8 IC |
5041 | }; |
5042 | ||
ab78acc6 IC |
5043 | },{"./_stream_transform":19,"core-util-is":21,"inherits":12}],18:[function(require,module,exports){ |
5044 | (function (process){ | |
ebd8d4e8 IC |
5045 | // Copyright Joyent, Inc. and other Node contributors. |
5046 | // | |
5047 | // Permission is hereby granted, free of charge, to any person obtaining a | |
5048 | // copy of this software and associated documentation files (the | |
5049 | // "Software"), to deal in the Software without restriction, including | |
5050 | // without limitation the rights to use, copy, modify, merge, publish, | |
5051 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
5052 | // persons to whom the Software is furnished to do so, subject to the | |
5053 | // following conditions: | |
5054 | // | |
5055 | // The above copyright notice and this permission notice shall be included | |
5056 | // in all copies or substantial portions of the Software. | |
5057 | // | |
5058 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
5059 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
5060 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
5061 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
5062 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
5063 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
5064 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
5065 | ||
ab78acc6 | 5066 | module.exports = Readable; |
ebd8d4e8 | 5067 | |
ab78acc6 IC |
5068 | /*<replacement>*/ |
5069 | var isArray = require('isarray'); | |
5070 | /*</replacement>*/ | |
5071 | ||
5072 | ||
5073 | /*<replacement>*/ | |
5074 | var Buffer = require('buffer').Buffer; | |
5075 | /*</replacement>*/ | |
5076 | ||
5077 | Readable.ReadableState = ReadableState; | |
5078 | ||
5079 | var EE = require('events').EventEmitter; | |
5080 | ||
5081 | /*<replacement>*/ | |
5082 | if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { | |
5083 | return emitter.listeners(type).length; | |
ebd8d4e8 | 5084 | }; |
ab78acc6 IC |
5085 | /*</replacement>*/ |
5086 | ||
5087 | var Stream = require('stream'); | |
5088 | ||
5089 | /*<replacement>*/ | |
5090 | var util = require('core-util-is'); | |
5091 | util.inherits = require('inherits'); | |
5092 | /*</replacement>*/ | |
5093 | ||
5094 | var StringDecoder; | |
5095 | ||
5096 | ||
5097 | /*<replacement>*/ | |
5098 | var debug = require('util'); | |
5099 | if (debug && debug.debuglog) { | |
5100 | debug = debug.debuglog('stream'); | |
5101 | } else { | |
5102 | debug = function () {}; | |
5103 | } | |
5104 | /*</replacement>*/ | |
5105 | ||
5106 | ||
5107 | util.inherits(Readable, Stream); | |
5108 | ||
5109 | function ReadableState(options, stream) { | |
5110 | var Duplex = require('./_stream_duplex'); | |
5111 | ||
5112 | options = options || {}; | |
5113 | ||
5114 | // the point at which it stops calling _read() to fill the buffer | |
5115 | // Note: 0 is a valid value, means "don't call _read preemptively ever" | |
5116 | var hwm = options.highWaterMark; | |
5117 | var defaultHwm = options.objectMode ? 16 : 16 * 1024; | |
5118 | this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; | |
5119 | ||
5120 | // cast to ints. | |
5121 | this.highWaterMark = ~~this.highWaterMark; | |
5122 | ||
5123 | this.buffer = []; | |
5124 | this.length = 0; | |
5125 | this.pipes = null; | |
5126 | this.pipesCount = 0; | |
5127 | this.flowing = null; | |
5128 | this.ended = false; | |
5129 | this.endEmitted = false; | |
5130 | this.reading = false; | |
ebd8d4e8 | 5131 | |
ab78acc6 IC |
5132 | // a flag to be able to tell if the onwrite cb is called immediately, |
5133 | // or on a later tick. We set this to true at first, because any | |
5134 | // actions that shouldn't happen until "later" should generally also | |
5135 | // not happen before the first write call. | |
5136 | this.sync = true; | |
ebd8d4e8 | 5137 | |
ab78acc6 IC |
5138 | // whenever we return null, then we set a flag to say |
5139 | // that we're awaiting a 'readable' event emission. | |
5140 | this.needReadable = false; | |
5141 | this.emittedReadable = false; | |
5142 | this.readableListening = false; | |
ebd8d4e8 | 5143 | |
ab78acc6 IC |
5144 | |
5145 | // object stream flag. Used to make read(n) ignore n and to | |
5146 | // make all the buffer merging and length checks go away | |
5147 | this.objectMode = !!options.objectMode; | |
5148 | ||
5149 | if (stream instanceof Duplex) | |
5150 | this.objectMode = this.objectMode || !!options.readableObjectMode; | |
5151 | ||
5152 | // Crypto is kind of old and crusty. Historically, its default string | |
5153 | // encoding is 'binary' so we have to make this configurable. | |
5154 | // Everything else in the universe uses 'utf8', though. | |
5155 | this.defaultEncoding = options.defaultEncoding || 'utf8'; | |
5156 | ||
5157 | // when piping, we only care about 'readable' events that happen | |
5158 | // after read()ing all the bytes and not getting any pushback. | |
5159 | this.ranOut = false; | |
5160 | ||
5161 | // the number of writers that are awaiting a drain event in .pipe()s | |
5162 | this.awaitDrain = 0; | |
5163 | ||
5164 | // if true, a maybeReadMore has been scheduled | |
5165 | this.readingMore = false; | |
5166 | ||
5167 | this.decoder = null; | |
5168 | this.encoding = null; | |
5169 | if (options.encoding) { | |
5170 | if (!StringDecoder) | |
5171 | StringDecoder = require('string_decoder/').StringDecoder; | |
5172 | this.decoder = new StringDecoder(options.encoding); | |
5173 | this.encoding = options.encoding; | |
ebd8d4e8 | 5174 | } |
ab78acc6 | 5175 | } |
ebd8d4e8 | 5176 | |
ab78acc6 IC |
5177 | function Readable(options) { |
5178 | var Duplex = require('./_stream_duplex'); | |
5179 | ||
5180 | if (!(this instanceof Readable)) | |
5181 | return new Readable(options); | |
5182 | ||
5183 | this._readableState = new ReadableState(options, this); | |
5184 | ||
5185 | // legacy | |
5186 | this.readable = true; | |
5187 | ||
5188 | Stream.call(this); | |
5189 | } | |
5190 | ||
5191 | // Manually shove something into the read() buffer. | |
5192 | // This returns true if the highWaterMark has not been hit yet, | |
5193 | // similar to how Writable.write() returns true if you should | |
5194 | // write() some more. | |
5195 | Readable.prototype.push = function(chunk, encoding) { | |
5196 | var state = this._readableState; | |
5197 | ||
5198 | if (util.isString(chunk) && !state.objectMode) { | |
5199 | encoding = encoding || state.defaultEncoding; | |
5200 | if (encoding !== state.encoding) { | |
5201 | chunk = new Buffer(chunk, encoding); | |
5202 | encoding = ''; | |
ebd8d4e8 | 5203 | } |
ebd8d4e8 IC |
5204 | } |
5205 | ||
ab78acc6 | 5206 | return readableAddChunk(this, state, chunk, encoding, false); |
ebd8d4e8 IC |
5207 | }; |
5208 | ||
ab78acc6 IC |
5209 | // Unshift should *always* be something directly out of read() |
5210 | Readable.prototype.unshift = function(chunk) { | |
5211 | var state = this._readableState; | |
5212 | return readableAddChunk(this, state, chunk, '', true); | |
5213 | }; | |
ebd8d4e8 | 5214 | |
ab78acc6 IC |
5215 | function readableAddChunk(stream, state, chunk, encoding, addToFront) { |
5216 | var er = chunkInvalid(state, chunk); | |
5217 | if (er) { | |
5218 | stream.emit('error', er); | |
5219 | } else if (util.isNullOrUndefined(chunk)) { | |
5220 | state.reading = false; | |
5221 | if (!state.ended) | |
5222 | onEofChunk(stream, state); | |
5223 | } else if (state.objectMode || chunk && chunk.length > 0) { | |
5224 | if (state.ended && !addToFront) { | |
5225 | var e = new Error('stream.push() after EOF'); | |
5226 | stream.emit('error', e); | |
5227 | } else if (state.endEmitted && addToFront) { | |
5228 | var e = new Error('stream.unshift() after end event'); | |
5229 | stream.emit('error', e); | |
ebd8d4e8 | 5230 | } else { |
ab78acc6 IC |
5231 | if (state.decoder && !addToFront && !encoding) |
5232 | chunk = state.decoder.write(chunk); | |
5233 | ||
5234 | if (!addToFront) | |
5235 | state.reading = false; | |
5236 | ||
5237 | // if we want the data now, just emit it. | |
5238 | if (state.flowing && state.length === 0 && !state.sync) { | |
5239 | stream.emit('data', chunk); | |
5240 | stream.read(0); | |
5241 | } else { | |
5242 | // update the buffer info. | |
5243 | state.length += state.objectMode ? 1 : chunk.length; | |
5244 | if (addToFront) | |
5245 | state.buffer.unshift(chunk); | |
5246 | else | |
5247 | state.buffer.push(chunk); | |
5248 | ||
5249 | if (state.needReadable) | |
5250 | emitReadable(stream); | |
5251 | } | |
5252 | ||
5253 | maybeReadMore(stream, state); | |
ebd8d4e8 | 5254 | } |
ab78acc6 IC |
5255 | } else if (!addToFront) { |
5256 | state.reading = false; | |
ebd8d4e8 | 5257 | } |
ebd8d4e8 | 5258 | |
ab78acc6 IC |
5259 | return needMoreData(state); |
5260 | } | |
ebd8d4e8 | 5261 | |
ab78acc6 IC |
5262 | |
5263 | ||
5264 | // if it's past the high water mark, we can push in some more. | |
5265 | // Also, if we have no data yet, we can stand some | |
5266 | // more bytes. This is to work around cases where hwm=0, | |
5267 | // such as the repl. Also, if the push() triggered a | |
5268 | // readable event, and the user called read(largeNumber) such that | |
5269 | // needReadable was set, then we ought to push more, so that another | |
5270 | // 'readable' event will be triggered. | |
5271 | function needMoreData(state) { | |
5272 | return !state.ended && | |
5273 | (state.needReadable || | |
5274 | state.length < state.highWaterMark || | |
5275 | state.length === 0); | |
5276 | } | |
5277 | ||
5278 | // backwards compatibility. | |
5279 | Readable.prototype.setEncoding = function(enc) { | |
5280 | if (!StringDecoder) | |
5281 | StringDecoder = require('string_decoder/').StringDecoder; | |
5282 | this._readableState.decoder = new StringDecoder(enc); | |
5283 | this._readableState.encoding = enc; | |
5284 | return this; | |
5285 | }; | |
5286 | ||
5287 | // Don't raise the hwm > 128MB | |
5288 | var MAX_HWM = 0x800000; | |
5289 | function roundUpToNextPowerOf2(n) { | |
5290 | if (n >= MAX_HWM) { | |
5291 | n = MAX_HWM; | |
5292 | } else { | |
5293 | // Get the next highest power of 2 | |
5294 | n--; | |
5295 | for (var p = 1; p < 32; p <<= 1) n |= n >> p; | |
5296 | n++; | |
ebd8d4e8 | 5297 | } |
ab78acc6 | 5298 | return n; |
ebd8d4e8 | 5299 | } |
ebd8d4e8 | 5300 | |
ab78acc6 IC |
5301 | function howMuchToRead(n, state) { |
5302 | if (state.length === 0 && state.ended) | |
5303 | return 0; | |
ebd8d4e8 | 5304 | |
ab78acc6 IC |
5305 | if (state.objectMode) |
5306 | return n === 0 ? 0 : 1; | |
ebd8d4e8 | 5307 | |
ab78acc6 IC |
5308 | if (isNaN(n) || util.isNull(n)) { |
5309 | // only flow one buffer at a time | |
5310 | if (state.flowing && state.buffer.length) | |
5311 | return state.buffer[0].length; | |
5312 | else | |
5313 | return state.length; | |
5314 | } | |
ebd8d4e8 | 5315 | |
ab78acc6 IC |
5316 | if (n <= 0) |
5317 | return 0; | |
ebd8d4e8 | 5318 | |
ab78acc6 IC |
5319 | // If we're asking for more than the target buffer level, |
5320 | // then raise the water mark. Bump up to the next highest | |
5321 | // power of 2, to prevent increasing it excessively in tiny | |
5322 | // amounts. | |
5323 | if (n > state.highWaterMark) | |
5324 | state.highWaterMark = roundUpToNextPowerOf2(n); | |
ebd8d4e8 | 5325 | |
ab78acc6 IC |
5326 | // don't have that much. return null, unless we've ended. |
5327 | if (n > state.length) { | |
5328 | if (!state.ended) { | |
5329 | state.needReadable = true; | |
5330 | return 0; | |
5331 | } else | |
5332 | return state.length; | |
ebd8d4e8 | 5333 | } |
ab78acc6 IC |
5334 | |
5335 | return n; | |
ebd8d4e8 IC |
5336 | } |
5337 | ||
ab78acc6 IC |
5338 | // you can override either this method, or the async _read(n) below. |
5339 | Readable.prototype.read = function(n) { | |
5340 | debug('read', n); | |
5341 | var state = this._readableState; | |
5342 | var nOrig = n; | |
ebd8d4e8 | 5343 | |
ab78acc6 IC |
5344 | if (!util.isNumber(n) || n > 0) |
5345 | state.emittedReadable = false; | |
5346 | ||
5347 | // if we're doing read(0) to trigger a readable event, but we | |
5348 | // already have a bunch of data in the buffer, then just trigger | |
5349 | // the 'readable' event and move on. | |
5350 | if (n === 0 && | |
5351 | state.needReadable && | |
5352 | (state.length >= state.highWaterMark || state.ended)) { | |
5353 | debug('read: emitReadable', state.length, state.ended); | |
5354 | if (state.length === 0 && state.ended) | |
5355 | endReadable(this); | |
5356 | else | |
5357 | emitReadable(this); | |
5358 | return null; | |
5359 | } | |
5360 | ||
5361 | n = howMuchToRead(n, state); | |
5362 | ||
5363 | // if we've ended, and we're now clear, then finish it up. | |
5364 | if (n === 0 && state.ended) { | |
5365 | if (state.length === 0) | |
5366 | endReadable(this); | |
5367 | return null; | |
5368 | } | |
5369 | ||
5370 | // All the actual chunk generation logic needs to be | |
5371 | // *below* the call to _read. The reason is that in certain | |
5372 | // synthetic stream cases, such as passthrough streams, _read | |
5373 | // may be a completely synchronous operation which may change | |
5374 | // the state of the read buffer, providing enough data when | |
5375 | // before there was *not* enough. | |
5376 | // | |
5377 | // So, the steps are: | |
5378 | // 1. Figure out what the state of things will be after we do | |
5379 | // a read from the buffer. | |
5380 | // | |
5381 | // 2. If that resulting state will trigger a _read, then call _read. | |
5382 | // Note that this may be asynchronous, or synchronous. Yes, it is | |
5383 | // deeply ugly to write APIs this way, but that still doesn't mean | |
5384 | // that the Readable class should behave improperly, as streams are | |
5385 | // designed to be sync/async agnostic. | |
5386 | // Take note if the _read call is sync or async (ie, if the read call | |
5387 | // has returned yet), so that we know whether or not it's safe to emit | |
5388 | // 'readable' etc. | |
5389 | // | |
5390 | // 3. Actually pull the requested chunks out of the buffer and return. | |
5391 | ||
5392 | // if we need a readable event, then we need to do some reading. | |
5393 | var doRead = state.needReadable; | |
5394 | debug('need readable', doRead); | |
5395 | ||
5396 | // if we currently have less than the highWaterMark, then also read some | |
5397 | if (state.length === 0 || state.length - n < state.highWaterMark) { | |
5398 | doRead = true; | |
5399 | debug('length less than watermark', doRead); | |
5400 | } | |
5401 | ||
5402 | // however, if we've ended, then there's no point, and if we're already | |
5403 | // reading, then it's unnecessary. | |
5404 | if (state.ended || state.reading) { | |
5405 | doRead = false; | |
5406 | debug('reading or ended', doRead); | |
5407 | } | |
5408 | ||
5409 | if (doRead) { | |
5410 | debug('do read'); | |
5411 | state.reading = true; | |
5412 | state.sync = true; | |
5413 | // if the length is currently zero, then we *need* a readable event. | |
5414 | if (state.length === 0) | |
5415 | state.needReadable = true; | |
5416 | // call internal read method | |
5417 | this._read(state.highWaterMark); | |
5418 | state.sync = false; | |
5419 | } | |
5420 | ||
5421 | // If _read pushed data synchronously, then `reading` will be false, | |
5422 | // and we need to re-evaluate how much data we can return to the user. | |
5423 | if (doRead && !state.reading) | |
5424 | n = howMuchToRead(nOrig, state); | |
5425 | ||
5426 | var ret; | |
5427 | if (n > 0) | |
5428 | ret = fromList(n, state); | |
5429 | else | |
5430 | ret = null; | |
ebd8d4e8 | 5431 | |
ab78acc6 IC |
5432 | if (util.isNull(ret)) { |
5433 | state.needReadable = true; | |
5434 | n = 0; | |
5435 | } | |
ebd8d4e8 | 5436 | |
ab78acc6 | 5437 | state.length -= n; |
ebd8d4e8 | 5438 | |
ab78acc6 IC |
5439 | // If we have nothing in the buffer, then we want to know |
5440 | // as soon as we *do* get something into the buffer. | |
5441 | if (state.length === 0 && !state.ended) | |
5442 | state.needReadable = true; | |
ebd8d4e8 | 5443 | |
ab78acc6 IC |
5444 | // If we tried to read() past the EOF, then emit end on the next tick. |
5445 | if (nOrig !== n && state.ended && state.length === 0) | |
5446 | endReadable(this); | |
5447 | ||
5448 | if (!util.isNull(ret)) | |
5449 | this.emit('data', ret); | |
5450 | ||
5451 | return ret; | |
5452 | }; | |
5453 | ||
5454 | function chunkInvalid(state, chunk) { | |
5455 | var er = null; | |
5456 | if (!util.isBuffer(chunk) && | |
5457 | !util.isString(chunk) && | |
5458 | !util.isNullOrUndefined(chunk) && | |
5459 | !state.objectMode) { | |
5460 | er = new TypeError('Invalid non-string/buffer chunk'); | |
5461 | } | |
5462 | return er; | |
ebd8d4e8 IC |
5463 | } |
5464 | ||
5465 | ||
ab78acc6 IC |
5466 | function onEofChunk(stream, state) { |
5467 | if (state.decoder && !state.ended) { | |
5468 | var chunk = state.decoder.end(); | |
5469 | if (chunk && chunk.length) { | |
5470 | state.buffer.push(chunk); | |
5471 | state.length += state.objectMode ? 1 : chunk.length; | |
ebd8d4e8 | 5472 | } |
ebd8d4e8 | 5473 | } |
ab78acc6 | 5474 | state.ended = true; |
ebd8d4e8 | 5475 | |
ab78acc6 IC |
5476 | // emit 'readable' now to make sure it gets picked up. |
5477 | emitReadable(stream); | |
5478 | } | |
5479 | ||
5480 | // Don't emit readable right away in sync mode, because this can trigger | |
5481 | // another read() call => stack overflow. This way, it might trigger | |
5482 | // a nextTick recursion warning, but that's not so bad. | |
5483 | function emitReadable(stream) { | |
5484 | var state = stream._readableState; | |
5485 | state.needReadable = false; | |
5486 | if (!state.emittedReadable) { | |
5487 | debug('emitReadable', state.flowing); | |
5488 | state.emittedReadable = true; | |
5489 | if (state.sync) | |
5490 | process.nextTick(function() { | |
5491 | emitReadable_(stream); | |
5492 | }); | |
5493 | else | |
5494 | emitReadable_(stream); | |
ebd8d4e8 | 5495 | } |
ab78acc6 | 5496 | } |
ebd8d4e8 | 5497 | |
ab78acc6 IC |
5498 | function emitReadable_(stream) { |
5499 | debug('emit readable'); | |
5500 | stream.emit('readable'); | |
5501 | flow(stream); | |
5502 | } | |
ebd8d4e8 | 5503 | |
ab78acc6 IC |
5504 | |
5505 | // at this point, the user has presumably seen the 'readable' event, | |
5506 | // and called read() to consume some data. that may have triggered | |
5507 | // in turn another _read(n) call, in which case reading = true if | |
5508 | // it's in progress. | |
5509 | // However, if we're not ended, or reading, and the length < hwm, | |
5510 | // then go ahead and try to read some more preemptively. | |
5511 | function maybeReadMore(stream, state) { | |
5512 | if (!state.readingMore) { | |
5513 | state.readingMore = true; | |
5514 | process.nextTick(function() { | |
5515 | maybeReadMore_(stream, state); | |
5516 | }); | |
ebd8d4e8 | 5517 | } |
ab78acc6 | 5518 | } |
ebd8d4e8 | 5519 | |
ab78acc6 IC |
5520 | function maybeReadMore_(stream, state) { |
5521 | var len = state.length; | |
5522 | while (!state.reading && !state.flowing && !state.ended && | |
5523 | state.length < state.highWaterMark) { | |
5524 | debug('maybeReadMore read 0'); | |
5525 | stream.read(0); | |
5526 | if (len === state.length) | |
5527 | // didn't get any data, stop spinning. | |
5528 | break; | |
5529 | else | |
5530 | len = state.length; | |
ebd8d4e8 | 5531 | } |
ab78acc6 IC |
5532 | state.readingMore = false; |
5533 | } | |
ebd8d4e8 | 5534 | |
ab78acc6 IC |
5535 | // abstract method. to be overridden in specific implementation classes. |
5536 | // call cb(er, data) where data is <= n in length. | |
5537 | // for virtual (non-string, non-buffer) streams, "length" is somewhat | |
5538 | // arbitrary, and perhaps not very meaningful. | |
5539 | Readable.prototype._read = function(n) { | |
5540 | this.emit('error', new Error('not implemented')); | |
5541 | }; | |
5542 | ||
5543 | Readable.prototype.pipe = function(dest, pipeOpts) { | |
5544 | var src = this; | |
5545 | var state = this._readableState; | |
5546 | ||
5547 | switch (state.pipesCount) { | |
5548 | case 0: | |
5549 | state.pipes = dest; | |
5550 | break; | |
5551 | case 1: | |
5552 | state.pipes = [state.pipes, dest]; | |
5553 | break; | |
5554 | default: | |
5555 | state.pipes.push(dest); | |
5556 | break; | |
ebd8d4e8 | 5557 | } |
ab78acc6 IC |
5558 | state.pipesCount += 1; |
5559 | debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); | |
ebd8d4e8 | 5560 | |
ab78acc6 IC |
5561 | var doEnd = (!pipeOpts || pipeOpts.end !== false) && |
5562 | dest !== process.stdout && | |
5563 | dest !== process.stderr; | |
ebd8d4e8 | 5564 | |
ab78acc6 IC |
5565 | var endFn = doEnd ? onend : cleanup; |
5566 | if (state.endEmitted) | |
5567 | process.nextTick(endFn); | |
5568 | else | |
5569 | src.once('end', endFn); | |
5570 | ||
5571 | dest.on('unpipe', onunpipe); | |
5572 | function onunpipe(readable) { | |
5573 | debug('onunpipe'); | |
5574 | if (readable === src) { | |
5575 | cleanup(); | |
5576 | } | |
5577 | } | |
5578 | ||
5579 | function onend() { | |
5580 | debug('onend'); | |
5581 | dest.end(); | |
5582 | } | |
5583 | ||
5584 | // when the dest drains, it reduces the awaitDrain counter | |
5585 | // on the source. This would be more elegant with a .once() | |
5586 | // handler in flow(), but adding and removing repeatedly is | |
5587 | // too slow. | |
5588 | var ondrain = pipeOnDrain(src); | |
5589 | dest.on('drain', ondrain); | |
5590 | ||
5591 | function cleanup() { | |
5592 | debug('cleanup'); | |
5593 | // cleanup event handlers once the pipe is broken | |
5594 | dest.removeListener('close', onclose); | |
5595 | dest.removeListener('finish', onfinish); | |
5596 | dest.removeListener('drain', ondrain); | |
5597 | dest.removeListener('error', onerror); | |
5598 | dest.removeListener('unpipe', onunpipe); | |
5599 | src.removeListener('end', onend); | |
5600 | src.removeListener('end', cleanup); | |
5601 | src.removeListener('data', ondata); | |
5602 | ||
5603 | // if the reader is waiting for a drain event from this | |
5604 | // specific writer, then it would cause it to never start | |
5605 | // flowing again. | |
5606 | // So, if this is awaiting a drain, then we just call it now. | |
5607 | // If we don't know, then assume that we are waiting for one. | |
5608 | if (state.awaitDrain && | |
5609 | (!dest._writableState || dest._writableState.needDrain)) | |
5610 | ondrain(); | |
5611 | } | |
5612 | ||
5613 | src.on('data', ondata); | |
5614 | function ondata(chunk) { | |
5615 | debug('ondata'); | |
5616 | var ret = dest.write(chunk); | |
5617 | if (false === ret) { | |
5618 | debug('false write response, pause', | |
5619 | src._readableState.awaitDrain); | |
5620 | src._readableState.awaitDrain++; | |
5621 | src.pause(); | |
5622 | } | |
5623 | } | |
5624 | ||
5625 | // if the dest has an error, then stop piping into it. | |
5626 | // however, don't suppress the throwing behavior for this. | |
5627 | function onerror(er) { | |
5628 | debug('onerror', er); | |
5629 | unpipe(); | |
5630 | dest.removeListener('error', onerror); | |
5631 | if (EE.listenerCount(dest, 'error') === 0) | |
5632 | dest.emit('error', er); | |
5633 | } | |
5634 | // This is a brutally ugly hack to make sure that our error handler | |
5635 | // is attached before any userland ones. NEVER DO THIS. | |
5636 | if (!dest._events || !dest._events.error) | |
5637 | dest.on('error', onerror); | |
5638 | else if (isArray(dest._events.error)) | |
5639 | dest._events.error.unshift(onerror); | |
5640 | else | |
5641 | dest._events.error = [onerror, dest._events.error]; | |
5642 | ||
5643 | ||
5644 | ||
5645 | // Both close and finish should trigger unpipe, but only once. | |
5646 | function onclose() { | |
5647 | dest.removeListener('finish', onfinish); | |
5648 | unpipe(); | |
ebd8d4e8 | 5649 | } |
ab78acc6 IC |
5650 | dest.once('close', onclose); |
5651 | function onfinish() { | |
5652 | debug('onfinish'); | |
5653 | dest.removeListener('close', onclose); | |
5654 | unpipe(); | |
5655 | } | |
5656 | dest.once('finish', onfinish); | |
ebd8d4e8 | 5657 | |
ab78acc6 IC |
5658 | function unpipe() { |
5659 | debug('unpipe'); | |
5660 | src.unpipe(dest); | |
ebd8d4e8 IC |
5661 | } |
5662 | ||
ab78acc6 IC |
5663 | // tell the dest that it's being piped to |
5664 | dest.emit('pipe', src); | |
5665 | ||
5666 | // start the flow if it hasn't been started already. | |
5667 | if (!state.flowing) { | |
5668 | debug('pipe resume'); | |
5669 | src.resume(); | |
ebd8d4e8 IC |
5670 | } |
5671 | ||
ab78acc6 IC |
5672 | return dest; |
5673 | }; | |
5674 | ||
5675 | function pipeOnDrain(src) { | |
5676 | return function() { | |
5677 | var state = src._readableState; | |
5678 | debug('pipeOnDrain', state.awaitDrain); | |
5679 | if (state.awaitDrain) | |
5680 | state.awaitDrain--; | |
5681 | if (state.awaitDrain === 0 && EE.listenerCount(src, 'data')) { | |
5682 | state.flowing = true; | |
5683 | flow(src); | |
5684 | } | |
5685 | }; | |
5686 | } | |
5687 | ||
5688 | ||
5689 | Readable.prototype.unpipe = function(dest) { | |
5690 | var state = this._readableState; | |
5691 | ||
5692 | // if we're not piping anywhere, then do nothing. | |
5693 | if (state.pipesCount === 0) | |
5694 | return this; | |
5695 | ||
5696 | // just one destination. most common case. | |
5697 | if (state.pipesCount === 1) { | |
5698 | // passed in one, but it's not the right one. | |
5699 | if (dest && dest !== state.pipes) | |
5700 | return this; | |
5701 | ||
5702 | if (!dest) | |
5703 | dest = state.pipes; | |
5704 | ||
5705 | // got a match. | |
5706 | state.pipes = null; | |
5707 | state.pipesCount = 0; | |
5708 | state.flowing = false; | |
5709 | if (dest) | |
5710 | dest.emit('unpipe', this); | |
5711 | return this; | |
ebd8d4e8 IC |
5712 | } |
5713 | ||
ab78acc6 IC |
5714 | // slow case. multiple pipe destinations. |
5715 | ||
5716 | if (!dest) { | |
5717 | // remove all. | |
5718 | var dests = state.pipes; | |
5719 | var len = state.pipesCount; | |
5720 | state.pipes = null; | |
5721 | state.pipesCount = 0; | |
5722 | state.flowing = false; | |
5723 | ||
5724 | for (var i = 0; i < len; i++) | |
5725 | dests[i].emit('unpipe', this); | |
5726 | return this; | |
ebd8d4e8 IC |
5727 | } |
5728 | ||
ab78acc6 IC |
5729 | // try to find the right one. |
5730 | var i = indexOf(state.pipes, dest); | |
5731 | if (i === -1) | |
5732 | return this; | |
5733 | ||
5734 | state.pipes.splice(i, 1); | |
5735 | state.pipesCount -= 1; | |
5736 | if (state.pipesCount === 1) | |
5737 | state.pipes = state.pipes[0]; | |
5738 | ||
5739 | dest.emit('unpipe', this); | |
ebd8d4e8 | 5740 | |
ab78acc6 IC |
5741 | return this; |
5742 | }; | |
5743 | ||
5744 | // set up data events if they are asked for | |
5745 | // Ensure readable listeners eventually get something | |
5746 | Readable.prototype.on = function(ev, fn) { | |
5747 | var res = Stream.prototype.on.call(this, ev, fn); | |
5748 | ||
5749 | // If listening to data, and it has not explicitly been paused, | |
5750 | // then call resume to start the flow of data on the next tick. | |
5751 | if (ev === 'data' && false !== this._readableState.flowing) { | |
5752 | this.resume(); | |
5753 | } | |
5754 | ||
5755 | if (ev === 'readable' && this.readable) { | |
5756 | var state = this._readableState; | |
5757 | if (!state.readableListening) { | |
5758 | state.readableListening = true; | |
5759 | state.emittedReadable = false; | |
5760 | state.needReadable = true; | |
5761 | if (!state.reading) { | |
5762 | var self = this; | |
5763 | process.nextTick(function() { | |
5764 | debug('readable nexttick read 0'); | |
5765 | self.read(0); | |
5766 | }); | |
5767 | } else if (state.length) { | |
5768 | emitReadable(this, state); | |
5769 | } | |
ebd8d4e8 IC |
5770 | } |
5771 | } | |
5772 | ||
ab78acc6 IC |
5773 | return res; |
5774 | }; | |
5775 | Readable.prototype.addListener = Readable.prototype.on; | |
5776 | ||
5777 | // pause() and resume() are remnants of the legacy readable stream API | |
5778 | // If the user uses them, then switch into old mode. | |
5779 | Readable.prototype.resume = function() { | |
5780 | var state = this._readableState; | |
5781 | if (!state.flowing) { | |
5782 | debug('resume'); | |
5783 | state.flowing = true; | |
5784 | if (!state.reading) { | |
5785 | debug('resume read 0'); | |
5786 | this.read(0); | |
5787 | } | |
5788 | resume(this, state); | |
5789 | } | |
5790 | return this; | |
5791 | }; | |
ebd8d4e8 | 5792 | |
ab78acc6 IC |
5793 | function resume(stream, state) { |
5794 | if (!state.resumeScheduled) { | |
5795 | state.resumeScheduled = true; | |
5796 | process.nextTick(function() { | |
5797 | resume_(stream, state); | |
ebd8d4e8 IC |
5798 | }); |
5799 | } | |
ebd8d4e8 IC |
5800 | } |
5801 | ||
ab78acc6 IC |
5802 | function resume_(stream, state) { |
5803 | state.resumeScheduled = false; | |
5804 | stream.emit('resume'); | |
5805 | flow(stream); | |
5806 | if (state.flowing && !state.reading) | |
5807 | stream.read(0); | |
ebd8d4e8 IC |
5808 | } |
5809 | ||
ab78acc6 IC |
5810 | Readable.prototype.pause = function() { |
5811 | debug('call pause flowing=%j', this._readableState.flowing); | |
5812 | if (false !== this._readableState.flowing) { | |
5813 | debug('pause'); | |
5814 | this._readableState.flowing = false; | |
5815 | this.emit('pause'); | |
5816 | } | |
5817 | return this; | |
5818 | }; | |
ebd8d4e8 | 5819 | |
ab78acc6 IC |
5820 | function flow(stream) { |
5821 | var state = stream._readableState; | |
5822 | debug('flow', state.flowing); | |
5823 | if (state.flowing) { | |
5824 | do { | |
5825 | var chunk = stream.read(); | |
5826 | } while (null !== chunk && state.flowing); | |
5827 | } | |
ebd8d4e8 IC |
5828 | } |
5829 | ||
ab78acc6 IC |
5830 | // wrap an old-style stream as the async data source. |
5831 | // This is *not* part of the readable stream interface. | |
5832 | // It is an ugly unfortunate mess of history. | |
5833 | Readable.prototype.wrap = function(stream) { | |
5834 | var state = this._readableState; | |
5835 | var paused = false; | |
ebd8d4e8 | 5836 | |
ab78acc6 IC |
5837 | var self = this; |
5838 | stream.on('end', function() { | |
5839 | debug('wrapped end'); | |
5840 | if (state.decoder && !state.ended) { | |
5841 | var chunk = state.decoder.end(); | |
5842 | if (chunk && chunk.length) | |
5843 | self.push(chunk); | |
ebd8d4e8 | 5844 | } |
ab78acc6 IC |
5845 | |
5846 | self.push(null); | |
ebd8d4e8 | 5847 | }); |
ebd8d4e8 | 5848 | |
ab78acc6 IC |
5849 | stream.on('data', function(chunk) { |
5850 | debug('wrapped data'); | |
5851 | if (state.decoder) | |
5852 | chunk = state.decoder.write(chunk); | |
5853 | if (!chunk || !state.objectMode && !chunk.length) | |
5854 | return; | |
ebd8d4e8 | 5855 | |
ab78acc6 IC |
5856 | var ret = self.push(chunk); |
5857 | if (!ret) { | |
5858 | paused = true; | |
5859 | stream.pause(); | |
ebd8d4e8 | 5860 | } |
ab78acc6 IC |
5861 | }); |
5862 | ||
5863 | // proxy all the other methods. | |
5864 | // important when wrapping filters and duplexes. | |
5865 | for (var i in stream) { | |
5866 | if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { | |
5867 | this[i] = function(method) { return function() { | |
5868 | return stream[method].apply(stream, arguments); | |
5869 | }}(i); | |
ebd8d4e8 IC |
5870 | } |
5871 | } | |
ab78acc6 IC |
5872 | |
5873 | // proxy certain important events. | |
5874 | var events = ['error', 'close', 'destroy', 'pause', 'resume']; | |
5875 | forEach(events, function(ev) { | |
5876 | stream.on(ev, self.emit.bind(self, ev)); | |
5877 | }); | |
5878 | ||
5879 | // when we try to consume some more bytes, simply unpause the | |
5880 | // underlying stream. | |
5881 | self._read = function(n) { | |
5882 | debug('wrapped _read', n); | |
5883 | if (paused) { | |
5884 | paused = false; | |
5885 | stream.resume(); | |
ebd8d4e8 | 5886 | } |
ab78acc6 IC |
5887 | }; |
5888 | ||
5889 | return self; | |
5890 | }; | |
5891 | ||
5892 | ||
5893 | ||
5894 | // exposed for testing purposes only. | |
5895 | Readable._fromList = fromList; | |
5896 | ||
5897 | // Pluck off n bytes from an array of buffers. | |
5898 | // Length is the combined lengths of all the buffers in the list. | |
5899 | function fromList(n, state) { | |
5900 | var list = state.buffer; | |
5901 | var length = state.length; | |
5902 | var stringMode = !!state.decoder; | |
5903 | var objectMode = !!state.objectMode; | |
5904 | var ret; | |
5905 | ||
5906 | // nothing in the list, definitely empty. | |
5907 | if (list.length === 0) | |
5908 | return null; | |
5909 | ||
5910 | if (length === 0) | |
5911 | ret = null; | |
5912 | else if (objectMode) | |
5913 | ret = list.shift(); | |
5914 | else if (!n || n >= length) { | |
5915 | // read it all, truncate the array. | |
5916 | if (stringMode) | |
5917 | ret = list.join(''); | |
5918 | else | |
5919 | ret = Buffer.concat(list, length); | |
5920 | list.length = 0; | |
5921 | } else { | |
5922 | // read just some of it. | |
5923 | if (n < list[0].length) { | |
5924 | // just take a part of the first list item. | |
5925 | // slice is the same for buffers and strings. | |
5926 | var buf = list[0]; | |
5927 | ret = buf.slice(0, n); | |
5928 | list[0] = buf.slice(n); | |
5929 | } else if (n === list[0].length) { | |
5930 | // first list is a perfect match | |
5931 | ret = list.shift(); | |
ebd8d4e8 | 5932 | } else { |
ab78acc6 IC |
5933 | // complex case. |
5934 | // we have enough to cover it, but it spans past the first buffer. | |
5935 | if (stringMode) | |
5936 | ret = ''; | |
5937 | else | |
5938 | ret = new Buffer(n); | |
ebd8d4e8 | 5939 | |
ab78acc6 IC |
5940 | var c = 0; |
5941 | for (var i = 0, l = list.length; i < l && c < n; i++) { | |
5942 | var buf = list[0]; | |
5943 | var cpy = Math.min(n - c, buf.length); | |
ebd8d4e8 | 5944 | |
ab78acc6 IC |
5945 | if (stringMode) |
5946 | ret += buf.slice(0, cpy); | |
5947 | else | |
5948 | buf.copy(ret, c, 0, cpy); | |
ebd8d4e8 | 5949 | |
ab78acc6 IC |
5950 | if (cpy < buf.length) |
5951 | list[0] = buf.slice(cpy); | |
5952 | else | |
5953 | list.shift(); | |
ebd8d4e8 | 5954 | |
ab78acc6 IC |
5955 | c += cpy; |
5956 | } | |
5957 | } | |
ebd8d4e8 IC |
5958 | } |
5959 | ||
ab78acc6 | 5960 | return ret; |
ebd8d4e8 IC |
5961 | } |
5962 | ||
ab78acc6 IC |
5963 | function endReadable(stream) { |
5964 | var state = stream._readableState; | |
ebd8d4e8 | 5965 | |
ab78acc6 IC |
5966 | // If we get here before consuming all the bytes, then that is a |
5967 | // bug in node. Should never happen. | |
5968 | if (state.length > 0) | |
5969 | throw new Error('endReadable called on non-empty stream'); | |
ebd8d4e8 | 5970 | |
ab78acc6 IC |
5971 | if (!state.endEmitted) { |
5972 | state.ended = true; | |
5973 | process.nextTick(function() { | |
5974 | // Check that we didn't get one last unshift. | |
5975 | if (!state.endEmitted && state.length === 0) { | |
5976 | state.endEmitted = true; | |
5977 | stream.readable = false; | |
5978 | stream.emit('end'); | |
5979 | } | |
5980 | }); | |
5981 | } | |
ebd8d4e8 | 5982 | } |
ebd8d4e8 | 5983 | |
ab78acc6 IC |
5984 | function forEach (xs, f) { |
5985 | for (var i = 0, l = xs.length; i < l; i++) { | |
5986 | f(xs[i], i); | |
5987 | } | |
ebd8d4e8 | 5988 | } |
ebd8d4e8 | 5989 | |
ab78acc6 IC |
5990 | function indexOf (xs, x) { |
5991 | for (var i = 0, l = xs.length; i < l; i++) { | |
5992 | if (xs[i] === x) return i; | |
5993 | } | |
5994 | return -1; | |
ebd8d4e8 | 5995 | } |
ebd8d4e8 | 5996 | |
ab78acc6 IC |
5997 | }).call(this,require('_process')) |
5998 | },{"./_stream_duplex":16,"_process":14,"buffer":7,"core-util-is":21,"events":11,"inherits":12,"isarray":13,"stream":26,"string_decoder/":27,"util":6}],19:[function(require,module,exports){ | |
5999 | // Copyright Joyent, Inc. and other Node contributors. | |
6000 | // | |
6001 | // Permission is hereby granted, free of charge, to any person obtaining a | |
6002 | // copy of this software and associated documentation files (the | |
6003 | // "Software"), to deal in the Software without restriction, including | |
6004 | // without limitation the rights to use, copy, modify, merge, publish, | |
6005 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
6006 | // persons to whom the Software is furnished to do so, subject to the | |
6007 | // following conditions: | |
6008 | // | |
6009 | // The above copyright notice and this permission notice shall be included | |
6010 | // in all copies or substantial portions of the Software. | |
6011 | // | |
6012 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
6013 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
6014 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
6015 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
6016 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
6017 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
6018 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 6019 | |
ebd8d4e8 | 6020 | |
ab78acc6 IC |
6021 | // a transform stream is a readable/writable stream where you do |
6022 | // something with the data. Sometimes it's called a "filter", | |
6023 | // but that's not a great name for it, since that implies a thing where | |
6024 | // some bits pass through, and others are simply ignored. (That would | |
6025 | // be a valid example of a transform, of course.) | |
6026 | // | |
6027 | // While the output is causally related to the input, it's not a | |
6028 | // necessarily symmetric or synchronous transformation. For example, | |
6029 | // a zlib stream might take multiple plain-text writes(), and then | |
6030 | // emit a single compressed chunk some time in the future. | |
6031 | // | |
6032 | // Here's how this works: | |
6033 | // | |
6034 | // The Transform stream has all the aspects of the readable and writable | |
6035 | // stream classes. When you write(chunk), that calls _write(chunk,cb) | |
6036 | // internally, and returns false if there's a lot of pending writes | |
6037 | // buffered up. When you call read(), that calls _read(n) until | |
6038 | // there's enough pending readable data buffered up. | |
6039 | // | |
6040 | // In a transform stream, the written data is placed in a buffer. When | |
6041 | // _read(n) is called, it transforms the queued up data, calling the | |
6042 | // buffered _write cb's as it consumes chunks. If consuming a single | |
6043 | // written chunk would result in multiple output chunks, then the first | |
6044 | // outputted bit calls the readcb, and subsequent chunks just go into | |
6045 | // the read buffer, and will cause it to emit 'readable' if necessary. | |
6046 | // | |
6047 | // This way, back-pressure is actually determined by the reading side, | |
6048 | // since _read has to be called to start processing a new chunk. However, | |
6049 | // a pathological inflate type of transform can cause excessive buffering | |
6050 | // here. For example, imagine a stream where every byte of input is | |
6051 | // interpreted as an integer from 0-255, and then results in that many | |
6052 | // bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in | |
6053 | // 1kb of data being output. In this case, you could write a very small | |
6054 | // amount of input, and end up with a very large amount of output. In | |
6055 | // such a pathological inflating mechanism, there'd be no way to tell | |
6056 | // the system to stop doing the transform. A single 4MB write could | |
6057 | // cause the system to run out of memory. | |
6058 | // | |
6059 | // However, even in such a pathological case, only a single written chunk | |
6060 | // would be consumed, and then the rest would wait (un-transformed) until | |
6061 | // the results of the previous transformed chunk were consumed. | |
ebd8d4e8 | 6062 | |
ab78acc6 | 6063 | module.exports = Transform; |
ebd8d4e8 | 6064 | |
ab78acc6 | 6065 | var Duplex = require('./_stream_duplex'); |
ebd8d4e8 | 6066 | |
ab78acc6 IC |
6067 | /*<replacement>*/ |
6068 | var util = require('core-util-is'); | |
6069 | util.inherits = require('inherits'); | |
6070 | /*</replacement>*/ | |
6071 | ||
6072 | util.inherits(Transform, Duplex); | |
6073 | ||
6074 | ||
6075 | function TransformState(options, stream) { | |
6076 | this.afterTransform = function(er, data) { | |
6077 | return afterTransform(stream, er, data); | |
6078 | }; | |
6079 | ||
6080 | this.needTransform = false; | |
6081 | this.transforming = false; | |
6082 | this.writecb = null; | |
6083 | this.writechunk = null; | |
ebd8d4e8 | 6084 | } |
ebd8d4e8 | 6085 | |
ab78acc6 IC |
6086 | function afterTransform(stream, er, data) { |
6087 | var ts = stream._transformState; | |
6088 | ts.transforming = false; | |
6089 | ||
6090 | var cb = ts.writecb; | |
6091 | ||
6092 | if (!cb) | |
6093 | return stream.emit('error', new Error('no writecb in Transform class')); | |
6094 | ||
6095 | ts.writechunk = null; | |
6096 | ts.writecb = null; | |
6097 | ||
6098 | if (!util.isNullOrUndefined(data)) | |
6099 | stream.push(data); | |
6100 | ||
6101 | if (cb) | |
6102 | cb(er); | |
6103 | ||
6104 | var rs = stream._readableState; | |
6105 | rs.reading = false; | |
6106 | if (rs.needReadable || rs.length < rs.highWaterMark) { | |
6107 | stream._read(rs.highWaterMark); | |
6108 | } | |
ebd8d4e8 | 6109 | } |
ebd8d4e8 | 6110 | |
ab78acc6 IC |
6111 | |
6112 | function Transform(options) { | |
6113 | if (!(this instanceof Transform)) | |
6114 | return new Transform(options); | |
6115 | ||
6116 | Duplex.call(this, options); | |
6117 | ||
6118 | this._transformState = new TransformState(options, this); | |
6119 | ||
6120 | // when the writable side finishes, then flush out anything remaining. | |
6121 | var stream = this; | |
6122 | ||
6123 | // start out asking for a readable event once data is transformed. | |
6124 | this._readableState.needReadable = true; | |
6125 | ||
6126 | // we have implemented the _read method, and done the other things | |
6127 | // that Readable wants before the first _read call, so unset the | |
6128 | // sync guard flag. | |
6129 | this._readableState.sync = false; | |
6130 | ||
6131 | this.once('prefinish', function() { | |
6132 | if (util.isFunction(this._flush)) | |
6133 | this._flush(function(er) { | |
6134 | done(stream, er); | |
6135 | }); | |
6136 | else | |
6137 | done(stream); | |
6138 | }); | |
ebd8d4e8 | 6139 | } |
ebd8d4e8 | 6140 | |
ab78acc6 IC |
6141 | Transform.prototype.push = function(chunk, encoding) { |
6142 | this._transformState.needTransform = false; | |
6143 | return Duplex.prototype.push.call(this, chunk, encoding); | |
6144 | }; | |
6145 | ||
6146 | // This is the part where you do stuff! | |
6147 | // override this function in implementation classes. | |
6148 | // 'chunk' is an input chunk. | |
6149 | // | |
6150 | // Call `push(newChunk)` to pass along transformed output | |
6151 | // to the readable side. You may call 'push' zero or more times. | |
6152 | // | |
6153 | // Call `cb(err)` when you are done with this chunk. If you pass | |
6154 | // an error, then that'll put the hurt on the whole operation. If you | |
6155 | // never call cb(), then you'll never get another chunk. | |
6156 | Transform.prototype._transform = function(chunk, encoding, cb) { | |
6157 | throw new Error('not implemented'); | |
6158 | }; | |
6159 | ||
6160 | Transform.prototype._write = function(chunk, encoding, cb) { | |
6161 | var ts = this._transformState; | |
6162 | ts.writecb = cb; | |
6163 | ts.writechunk = chunk; | |
6164 | ts.writeencoding = encoding; | |
6165 | if (!ts.transforming) { | |
6166 | var rs = this._readableState; | |
6167 | if (ts.needTransform || | |
6168 | rs.needReadable || | |
6169 | rs.length < rs.highWaterMark) | |
6170 | this._read(rs.highWaterMark); | |
6171 | } | |
6172 | }; | |
6173 | ||
6174 | // Doesn't matter what the args are here. | |
6175 | // _transform does all the work. | |
6176 | // That we got here means that the readable side wants more data. | |
6177 | Transform.prototype._read = function(n) { | |
6178 | var ts = this._transformState; | |
ebd8d4e8 | 6179 | |
ab78acc6 IC |
6180 | if (!util.isNull(ts.writechunk) && ts.writecb && !ts.transforming) { |
6181 | ts.transforming = true; | |
6182 | this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); | |
6183 | } else { | |
6184 | // mark that we need a transform, so that any data that comes in | |
6185 | // will get processed, now that we've asked for it. | |
6186 | ts.needTransform = true; | |
6187 | } | |
6188 | }; | |
ebd8d4e8 | 6189 | |
ebd8d4e8 | 6190 | |
ab78acc6 IC |
6191 | function done(stream, er) { |
6192 | if (er) | |
6193 | return stream.emit('error', er); | |
ebd8d4e8 | 6194 | |
ab78acc6 IC |
6195 | // if there's nothing in the write buffer, then that means |
6196 | // that nothing more will ever be provided | |
6197 | var ws = stream._writableState; | |
6198 | var ts = stream._transformState; | |
ebd8d4e8 | 6199 | |
ab78acc6 IC |
6200 | if (ws.length) |
6201 | throw new Error('calling transform done when ws.length != 0'); | |
6202 | ||
6203 | if (ts.transforming) | |
6204 | throw new Error('calling transform done when still transforming'); | |
6205 | ||
6206 | return stream.push(null); | |
ebd8d4e8 IC |
6207 | } |
6208 | ||
ab78acc6 IC |
6209 | },{"./_stream_duplex":16,"core-util-is":21,"inherits":12}],20:[function(require,module,exports){ |
6210 | (function (process){ | |
6211 | // Copyright Joyent, Inc. and other Node contributors. | |
6212 | // | |
6213 | // Permission is hereby granted, free of charge, to any person obtaining a | |
6214 | // copy of this software and associated documentation files (the | |
6215 | // "Software"), to deal in the Software without restriction, including | |
6216 | // without limitation the rights to use, copy, modify, merge, publish, | |
6217 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
6218 | // persons to whom the Software is furnished to do so, subject to the | |
6219 | // following conditions: | |
6220 | // | |
6221 | // The above copyright notice and this permission notice shall be included | |
6222 | // in all copies or substantial portions of the Software. | |
6223 | // | |
6224 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
6225 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
6226 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
6227 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
6228 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
6229 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
6230 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 6231 | |
ab78acc6 IC |
6232 | // A bit simpler than readable streams. |
6233 | // Implement an async ._write(chunk, cb), and it'll handle all | |
6234 | // the drain event emission and buffering. | |
ebd8d4e8 | 6235 | |
ab78acc6 | 6236 | module.exports = Writable; |
ebd8d4e8 | 6237 | |
ab78acc6 IC |
6238 | /*<replacement>*/ |
6239 | var Buffer = require('buffer').Buffer; | |
6240 | /*</replacement>*/ | |
ebd8d4e8 | 6241 | |
ab78acc6 | 6242 | Writable.WritableState = WritableState; |
ebd8d4e8 IC |
6243 | |
6244 | ||
ab78acc6 IC |
6245 | /*<replacement>*/ |
6246 | var util = require('core-util-is'); | |
6247 | util.inherits = require('inherits'); | |
6248 | /*</replacement>*/ | |
ebd8d4e8 | 6249 | |
ab78acc6 | 6250 | var Stream = require('stream'); |
ebd8d4e8 | 6251 | |
ab78acc6 | 6252 | util.inherits(Writable, Stream); |
ebd8d4e8 | 6253 | |
ab78acc6 IC |
6254 | function WriteReq(chunk, encoding, cb) { |
6255 | this.chunk = chunk; | |
6256 | this.encoding = encoding; | |
6257 | this.callback = cb; | |
ebd8d4e8 IC |
6258 | } |
6259 | ||
ab78acc6 IC |
6260 | function WritableState(options, stream) { |
6261 | var Duplex = require('./_stream_duplex'); | |
ebd8d4e8 | 6262 | |
ab78acc6 | 6263 | options = options || {}; |
ebd8d4e8 | 6264 | |
ab78acc6 IC |
6265 | // the point at which write() starts returning false |
6266 | // Note: 0 is a valid value, means that we always return false if | |
6267 | // the entire buffer is not flushed immediately on write() | |
6268 | var hwm = options.highWaterMark; | |
6269 | var defaultHwm = options.objectMode ? 16 : 16 * 1024; | |
6270 | this.highWaterMark = (hwm || hwm === 0) ? hwm : defaultHwm; | |
ebd8d4e8 | 6271 | |
ab78acc6 IC |
6272 | // object stream flag to indicate whether or not this stream |
6273 | // contains buffers or objects. | |
6274 | this.objectMode = !!options.objectMode; | |
ebd8d4e8 | 6275 | |
ab78acc6 IC |
6276 | if (stream instanceof Duplex) |
6277 | this.objectMode = this.objectMode || !!options.writableObjectMode; | |
ebd8d4e8 | 6278 | |
ab78acc6 IC |
6279 | // cast to ints. |
6280 | this.highWaterMark = ~~this.highWaterMark; | |
ebd8d4e8 | 6281 | |
ab78acc6 IC |
6282 | this.needDrain = false; |
6283 | // at the start of calling end() | |
6284 | this.ending = false; | |
6285 | // when end() has been called, and returned | |
6286 | this.ended = false; | |
6287 | // when 'finish' is emitted | |
6288 | this.finished = false; | |
ebd8d4e8 | 6289 | |
ab78acc6 IC |
6290 | // should we decode strings into buffers before passing to _write? |
6291 | // this is here so that some node-core streams can optimize string | |
6292 | // handling at a lower level. | |
6293 | var noDecode = options.decodeStrings === false; | |
6294 | this.decodeStrings = !noDecode; | |
ebd8d4e8 | 6295 | |
ab78acc6 IC |
6296 | // Crypto is kind of old and crusty. Historically, its default string |
6297 | // encoding is 'binary' so we have to make this configurable. | |
6298 | // Everything else in the universe uses 'utf8', though. | |
6299 | this.defaultEncoding = options.defaultEncoding || 'utf8'; | |
ebd8d4e8 | 6300 | |
ab78acc6 IC |
6301 | // not an actual buffer we keep track of, but a measurement |
6302 | // of how much we're waiting to get pushed to some underlying | |
6303 | // socket or file. | |
6304 | this.length = 0; | |
ebd8d4e8 | 6305 | |
ab78acc6 IC |
6306 | // a flag to see when we're in the middle of a write. |
6307 | this.writing = false; | |
ebd8d4e8 | 6308 | |
ab78acc6 IC |
6309 | // when true all writes will be buffered until .uncork() call |
6310 | this.corked = 0; | |
ebd8d4e8 | 6311 | |
ab78acc6 IC |
6312 | // a flag to be able to tell if the onwrite cb is called immediately, |
6313 | // or on a later tick. We set this to true at first, because any | |
6314 | // actions that shouldn't happen until "later" should generally also | |
6315 | // not happen before the first write call. | |
6316 | this.sync = true; | |
ebd8d4e8 | 6317 | |
ab78acc6 IC |
6318 | // a flag to know if we're processing previously buffered items, which |
6319 | // may call the _write() callback in the same tick, so that we don't | |
6320 | // end up in an overlapped onwrite situation. | |
6321 | this.bufferProcessing = false; | |
ebd8d4e8 | 6322 | |
ab78acc6 IC |
6323 | // the callback that's passed to _write(chunk,cb) |
6324 | this.onwrite = function(er) { | |
6325 | onwrite(stream, er); | |
6326 | }; | |
ebd8d4e8 | 6327 | |
ab78acc6 IC |
6328 | // the callback that the user supplies to write(chunk,encoding,cb) |
6329 | this.writecb = null; | |
ebd8d4e8 | 6330 | |
ab78acc6 IC |
6331 | // the amount that is being written when _write is called. |
6332 | this.writelen = 0; | |
ebd8d4e8 | 6333 | |
ab78acc6 | 6334 | this.buffer = []; |
ebd8d4e8 | 6335 | |
ab78acc6 IC |
6336 | // number of pending user-supplied write callbacks |
6337 | // this must be 0 before 'finish' can be emitted | |
6338 | this.pendingcb = 0; | |
ebd8d4e8 | 6339 | |
ab78acc6 IC |
6340 | // emit prefinish if the only thing we're waiting for is _write cbs |
6341 | // This is relevant for synchronous Transform streams | |
6342 | this.prefinished = false; | |
ebd8d4e8 | 6343 | |
ab78acc6 IC |
6344 | // True if the error was already emitted and should not be thrown again |
6345 | this.errorEmitted = false; | |
ebd8d4e8 IC |
6346 | } |
6347 | ||
ab78acc6 IC |
6348 | function Writable(options) { |
6349 | var Duplex = require('./_stream_duplex'); | |
ebd8d4e8 | 6350 | |
ab78acc6 IC |
6351 | // Writable ctor is applied to Duplexes, though they're not |
6352 | // instanceof Writable, they're instanceof Readable. | |
6353 | if (!(this instanceof Writable) && !(this instanceof Duplex)) | |
6354 | return new Writable(options); | |
ebd8d4e8 | 6355 | |
ab78acc6 | 6356 | this._writableState = new WritableState(options, this); |
ebd8d4e8 | 6357 | |
ab78acc6 IC |
6358 | // legacy. |
6359 | this.writable = true; | |
ebd8d4e8 | 6360 | |
ab78acc6 | 6361 | Stream.call(this); |
ebd8d4e8 IC |
6362 | } |
6363 | ||
ab78acc6 IC |
6364 | // Otherwise people can pipe Writable streams, which is just wrong. |
6365 | Writable.prototype.pipe = function() { | |
6366 | this.emit('error', new Error('Cannot pipe. Not readable.')); | |
6367 | }; | |
ebd8d4e8 | 6368 | |
ebd8d4e8 | 6369 | |
ab78acc6 IC |
6370 | function writeAfterEnd(stream, state, cb) { |
6371 | var er = new Error('write after end'); | |
6372 | // TODO: defer error events consistently everywhere, not just the cb | |
6373 | stream.emit('error', er); | |
6374 | process.nextTick(function() { | |
6375 | cb(er); | |
6376 | }); | |
ebd8d4e8 IC |
6377 | } |
6378 | ||
ab78acc6 IC |
6379 | // If we get something that is not a buffer, string, null, or undefined, |
6380 | // and we're not in objectMode, then that's an error. | |
6381 | // Otherwise stream chunks are all considered to be of length=1, and the | |
6382 | // watermarks determine how many objects to keep in the buffer, rather than | |
6383 | // how many bytes or characters. | |
6384 | function validChunk(stream, state, chunk, cb) { | |
6385 | var valid = true; | |
6386 | if (!util.isBuffer(chunk) && | |
6387 | !util.isString(chunk) && | |
6388 | !util.isNullOrUndefined(chunk) && | |
6389 | !state.objectMode) { | |
6390 | var er = new TypeError('Invalid non-string/buffer chunk'); | |
6391 | stream.emit('error', er); | |
6392 | process.nextTick(function() { | |
6393 | cb(er); | |
6394 | }); | |
6395 | valid = false; | |
6396 | } | |
6397 | return valid; | |
ebd8d4e8 IC |
6398 | } |
6399 | ||
ab78acc6 IC |
6400 | Writable.prototype.write = function(chunk, encoding, cb) { |
6401 | var state = this._writableState; | |
6402 | var ret = false; | |
ebd8d4e8 | 6403 | |
ab78acc6 IC |
6404 | if (util.isFunction(encoding)) { |
6405 | cb = encoding; | |
6406 | encoding = null; | |
ebd8d4e8 | 6407 | } |
ebd8d4e8 | 6408 | |
ab78acc6 IC |
6409 | if (util.isBuffer(chunk)) |
6410 | encoding = 'buffer'; | |
6411 | else if (!encoding) | |
6412 | encoding = state.defaultEncoding; | |
6413 | ||
6414 | if (!util.isFunction(cb)) | |
6415 | cb = function() {}; | |
6416 | ||
6417 | if (state.ended) | |
6418 | writeAfterEnd(this, state, cb); | |
6419 | else if (validChunk(this, state, chunk, cb)) { | |
6420 | state.pendingcb++; | |
6421 | ret = writeOrBuffer(this, state, chunk, encoding, cb); | |
ebd8d4e8 | 6422 | } |
ebd8d4e8 | 6423 | |
ab78acc6 IC |
6424 | return ret; |
6425 | }; | |
6426 | ||
6427 | Writable.prototype.cork = function() { | |
6428 | var state = this._writableState; | |
6429 | ||
6430 | state.corked++; | |
6431 | }; | |
ebd8d4e8 | 6432 | |
ab78acc6 IC |
6433 | Writable.prototype.uncork = function() { |
6434 | var state = this._writableState; | |
ebd8d4e8 | 6435 | |
ab78acc6 IC |
6436 | if (state.corked) { |
6437 | state.corked--; | |
ebd8d4e8 | 6438 | |
ab78acc6 IC |
6439 | if (!state.writing && |
6440 | !state.corked && | |
6441 | !state.finished && | |
6442 | !state.bufferProcessing && | |
6443 | state.buffer.length) | |
6444 | clearBuffer(this, state); | |
ebd8d4e8 | 6445 | } |
ab78acc6 | 6446 | }; |
ebd8d4e8 | 6447 | |
ab78acc6 IC |
6448 | function decodeChunk(state, chunk, encoding) { |
6449 | if (!state.objectMode && | |
6450 | state.decodeStrings !== false && | |
6451 | util.isString(chunk)) { | |
6452 | chunk = new Buffer(chunk, encoding); | |
ebd8d4e8 | 6453 | } |
ab78acc6 | 6454 | return chunk; |
ebd8d4e8 IC |
6455 | } |
6456 | ||
ab78acc6 IC |
6457 | // if we're already writing something, then just put this |
6458 | // in the queue, and wait our turn. Otherwise, call _write | |
6459 | // If we return false, then we need a drain event, so set that flag. | |
6460 | function writeOrBuffer(stream, state, chunk, encoding, cb) { | |
6461 | chunk = decodeChunk(state, chunk, encoding); | |
6462 | if (util.isBuffer(chunk)) | |
6463 | encoding = 'buffer'; | |
6464 | var len = state.objectMode ? 1 : chunk.length; | |
6465 | ||
6466 | state.length += len; | |
6467 | ||
6468 | var ret = state.length < state.highWaterMark; | |
6469 | // we must ensure that previous needDrain will not be reset to false. | |
6470 | if (!ret) | |
6471 | state.needDrain = true; | |
6472 | ||
6473 | if (state.writing || state.corked) | |
6474 | state.buffer.push(new WriteReq(chunk, encoding, cb)); | |
6475 | else | |
6476 | doWrite(stream, state, false, len, chunk, encoding, cb); | |
6477 | ||
6478 | return ret; | |
ebd8d4e8 IC |
6479 | } |
6480 | ||
ab78acc6 IC |
6481 | function doWrite(stream, state, writev, len, chunk, encoding, cb) { |
6482 | state.writelen = len; | |
6483 | state.writecb = cb; | |
6484 | state.writing = true; | |
6485 | state.sync = true; | |
6486 | if (writev) | |
6487 | stream._writev(chunk, state.onwrite); | |
6488 | else | |
6489 | stream._write(chunk, encoding, state.onwrite); | |
6490 | state.sync = false; | |
ebd8d4e8 IC |
6491 | } |
6492 | ||
ab78acc6 IC |
6493 | function onwriteError(stream, state, sync, er, cb) { |
6494 | if (sync) | |
6495 | process.nextTick(function() { | |
6496 | state.pendingcb--; | |
6497 | cb(er); | |
6498 | }); | |
6499 | else { | |
6500 | state.pendingcb--; | |
6501 | cb(er); | |
6502 | } | |
ebd8d4e8 | 6503 | |
ab78acc6 IC |
6504 | stream._writableState.errorEmitted = true; |
6505 | stream.emit('error', er); | |
6506 | } | |
ebd8d4e8 | 6507 | |
ab78acc6 IC |
6508 | function onwriteStateUpdate(state) { |
6509 | state.writing = false; | |
6510 | state.writecb = null; | |
6511 | state.length -= state.writelen; | |
6512 | state.writelen = 0; | |
6513 | } | |
ebd8d4e8 | 6514 | |
ab78acc6 IC |
6515 | function onwrite(stream, er) { |
6516 | var state = stream._writableState; | |
6517 | var sync = state.sync; | |
6518 | var cb = state.writecb; | |
ebd8d4e8 | 6519 | |
ab78acc6 | 6520 | onwriteStateUpdate(state); |
ebd8d4e8 | 6521 | |
ab78acc6 IC |
6522 | if (er) |
6523 | onwriteError(stream, state, sync, er, cb); | |
6524 | else { | |
6525 | // Check if we're actually ready to finish, but don't emit yet | |
6526 | var finished = needFinish(stream, state); | |
ebd8d4e8 | 6527 | |
ab78acc6 IC |
6528 | if (!finished && |
6529 | !state.corked && | |
6530 | !state.bufferProcessing && | |
6531 | state.buffer.length) { | |
6532 | clearBuffer(stream, state); | |
6533 | } | |
6534 | ||
6535 | if (sync) { | |
6536 | process.nextTick(function() { | |
6537 | afterWrite(stream, state, finished, cb); | |
6538 | }); | |
6539 | } else { | |
6540 | afterWrite(stream, state, finished, cb); | |
ebd8d4e8 | 6541 | } |
ebd8d4e8 IC |
6542 | } |
6543 | } | |
6544 | ||
ab78acc6 IC |
6545 | function afterWrite(stream, state, finished, cb) { |
6546 | if (!finished) | |
6547 | onwriteDrain(stream, state); | |
6548 | state.pendingcb--; | |
6549 | cb(); | |
6550 | finishMaybe(stream, state); | |
6551 | } | |
6552 | ||
6553 | // Must force callback to be called on nextTick, so that we don't | |
6554 | // emit 'drain' before the write() consumer gets the 'false' return | |
6555 | // value, and has a chance to attach a 'drain' listener. | |
6556 | function onwriteDrain(stream, state) { | |
6557 | if (state.length === 0 && state.needDrain) { | |
6558 | state.needDrain = false; | |
6559 | stream.emit('drain'); | |
ebd8d4e8 IC |
6560 | } |
6561 | } | |
6562 | ||
ebd8d4e8 | 6563 | |
ab78acc6 IC |
6564 | // if there's something in the buffer waiting, then process it |
6565 | function clearBuffer(stream, state) { | |
6566 | state.bufferProcessing = true; | |
6567 | ||
6568 | if (stream._writev && state.buffer.length > 1) { | |
6569 | // Fast case, write everything using _writev() | |
6570 | var cbs = []; | |
6571 | for (var c = 0; c < state.buffer.length; c++) | |
6572 | cbs.push(state.buffer[c].callback); | |
6573 | ||
6574 | // count the one we are adding, as well. | |
6575 | // TODO(isaacs) clean this up | |
6576 | state.pendingcb++; | |
6577 | doWrite(stream, state, true, state.length, state.buffer, '', function(err) { | |
6578 | for (var i = 0; i < cbs.length; i++) { | |
6579 | state.pendingcb--; | |
6580 | cbs[i](err); | |
6581 | } | |
6582 | }); | |
6583 | ||
6584 | // Clear buffer | |
6585 | state.buffer = []; | |
6586 | } else { | |
6587 | // Slow case, write chunks one-by-one | |
6588 | for (var c = 0; c < state.buffer.length; c++) { | |
6589 | var entry = state.buffer[c]; | |
6590 | var chunk = entry.chunk; | |
6591 | var encoding = entry.encoding; | |
6592 | var cb = entry.callback; | |
6593 | var len = state.objectMode ? 1 : chunk.length; | |
6594 | ||
6595 | doWrite(stream, state, false, len, chunk, encoding, cb); | |
6596 | ||
6597 | // if we didn't call the onwrite immediately, then | |
6598 | // it means that we need to wait until it does. | |
6599 | // also, that means that the chunk and cb are currently | |
6600 | // being processed, so move the buffer counter past them. | |
6601 | if (state.writing) { | |
6602 | c++; | |
6603 | break; | |
6604 | } | |
ebd8d4e8 | 6605 | } |
ab78acc6 IC |
6606 | |
6607 | if (c < state.buffer.length) | |
6608 | state.buffer = state.buffer.slice(c); | |
6609 | else | |
6610 | state.buffer.length = 0; | |
ebd8d4e8 IC |
6611 | } |
6612 | ||
ab78acc6 | 6613 | state.bufferProcessing = false; |
ebd8d4e8 IC |
6614 | } |
6615 | ||
ab78acc6 IC |
6616 | Writable.prototype._write = function(chunk, encoding, cb) { |
6617 | cb(new Error('not implemented')); | |
ebd8d4e8 | 6618 | |
ab78acc6 | 6619 | }; |
ebd8d4e8 | 6620 | |
ab78acc6 | 6621 | Writable.prototype._writev = null; |
ebd8d4e8 | 6622 | |
ab78acc6 IC |
6623 | Writable.prototype.end = function(chunk, encoding, cb) { |
6624 | var state = this._writableState; | |
ebd8d4e8 | 6625 | |
ab78acc6 IC |
6626 | if (util.isFunction(chunk)) { |
6627 | cb = chunk; | |
6628 | chunk = null; | |
6629 | encoding = null; | |
6630 | } else if (util.isFunction(encoding)) { | |
6631 | cb = encoding; | |
6632 | encoding = null; | |
6633 | } | |
ebd8d4e8 | 6634 | |
ab78acc6 IC |
6635 | if (!util.isNullOrUndefined(chunk)) |
6636 | this.write(chunk, encoding); | |
6637 | ||
6638 | // .end() fully uncorks | |
6639 | if (state.corked) { | |
6640 | state.corked = 1; | |
6641 | this.uncork(); | |
ebd8d4e8 | 6642 | } |
ab78acc6 IC |
6643 | |
6644 | // ignore unnecessary end() calls. | |
6645 | if (!state.ending && !state.finished) | |
6646 | endWritable(this, state, cb); | |
6647 | }; | |
6648 | ||
6649 | ||
6650 | function needFinish(stream, state) { | |
6651 | return (state.ending && | |
6652 | state.length === 0 && | |
6653 | !state.finished && | |
6654 | !state.writing); | |
ebd8d4e8 IC |
6655 | } |
6656 | ||
ab78acc6 IC |
6657 | function prefinish(stream, state) { |
6658 | if (!state.prefinished) { | |
6659 | state.prefinished = true; | |
6660 | stream.emit('prefinish'); | |
ebd8d4e8 | 6661 | } |
ebd8d4e8 IC |
6662 | } |
6663 | ||
ab78acc6 IC |
6664 | function finishMaybe(stream, state) { |
6665 | var need = needFinish(stream, state); | |
6666 | if (need) { | |
6667 | if (state.pendingcb === 0) { | |
6668 | prefinish(stream, state); | |
6669 | state.finished = true; | |
6670 | stream.emit('finish'); | |
6671 | } else | |
6672 | prefinish(stream, state); | |
6673 | } | |
6674 | return need; | |
6675 | } | |
ebd8d4e8 | 6676 | |
ab78acc6 IC |
6677 | function endWritable(stream, state, cb) { |
6678 | state.ending = true; | |
6679 | finishMaybe(stream, state); | |
6680 | if (cb) { | |
6681 | if (state.finished) | |
6682 | process.nextTick(cb); | |
6683 | else | |
6684 | stream.once('finish', cb); | |
ebd8d4e8 | 6685 | } |
ab78acc6 | 6686 | state.ended = true; |
ebd8d4e8 IC |
6687 | } |
6688 | ||
ab78acc6 IC |
6689 | }).call(this,require('_process')) |
6690 | },{"./_stream_duplex":16,"_process":14,"buffer":7,"core-util-is":21,"inherits":12,"stream":26}],21:[function(require,module,exports){ | |
6691 | (function (Buffer){ | |
6692 | // Copyright Joyent, Inc. and other Node contributors. | |
6693 | // | |
6694 | // Permission is hereby granted, free of charge, to any person obtaining a | |
6695 | // copy of this software and associated documentation files (the | |
6696 | // "Software"), to deal in the Software without restriction, including | |
6697 | // without limitation the rights to use, copy, modify, merge, publish, | |
6698 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
6699 | // persons to whom the Software is furnished to do so, subject to the | |
6700 | // following conditions: | |
6701 | // | |
6702 | // The above copyright notice and this permission notice shall be included | |
6703 | // in all copies or substantial portions of the Software. | |
6704 | // | |
6705 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
6706 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
6707 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
6708 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
6709 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
6710 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
6711 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
6712 | ||
6713 | // NOTE: These type checking functions intentionally don't use `instanceof` | |
6714 | // because it is fragile and can be easily faked with `Object.create()`. | |
6715 | function isArray(ar) { | |
6716 | return Array.isArray(ar); | |
ebd8d4e8 | 6717 | } |
ab78acc6 | 6718 | exports.isArray = isArray; |
ebd8d4e8 | 6719 | |
ab78acc6 IC |
6720 | function isBoolean(arg) { |
6721 | return typeof arg === 'boolean'; | |
ebd8d4e8 | 6722 | } |
ab78acc6 | 6723 | exports.isBoolean = isBoolean; |
ebd8d4e8 | 6724 | |
ab78acc6 IC |
6725 | function isNull(arg) { |
6726 | return arg === null; | |
6727 | } | |
6728 | exports.isNull = isNull; | |
ebd8d4e8 | 6729 | |
ab78acc6 IC |
6730 | function isNullOrUndefined(arg) { |
6731 | return arg == null; | |
6732 | } | |
6733 | exports.isNullOrUndefined = isNullOrUndefined; | |
ebd8d4e8 | 6734 | |
ab78acc6 IC |
6735 | function isNumber(arg) { |
6736 | return typeof arg === 'number'; | |
ebd8d4e8 | 6737 | } |
ab78acc6 | 6738 | exports.isNumber = isNumber; |
ebd8d4e8 | 6739 | |
ab78acc6 IC |
6740 | function isString(arg) { |
6741 | return typeof arg === 'string'; | |
6742 | } | |
6743 | exports.isString = isString; | |
ebd8d4e8 | 6744 | |
ab78acc6 IC |
6745 | function isSymbol(arg) { |
6746 | return typeof arg === 'symbol'; | |
6747 | } | |
6748 | exports.isSymbol = isSymbol; | |
ebd8d4e8 | 6749 | |
ab78acc6 IC |
6750 | function isUndefined(arg) { |
6751 | return arg === void 0; | |
ebd8d4e8 | 6752 | } |
ab78acc6 | 6753 | exports.isUndefined = isUndefined; |
ebd8d4e8 | 6754 | |
ab78acc6 IC |
6755 | function isRegExp(re) { |
6756 | return isObject(re) && objectToString(re) === '[object RegExp]'; | |
ebd8d4e8 | 6757 | } |
ab78acc6 | 6758 | exports.isRegExp = isRegExp; |
ebd8d4e8 | 6759 | |
ab78acc6 IC |
6760 | function isObject(arg) { |
6761 | return typeof arg === 'object' && arg !== null; | |
ebd8d4e8 | 6762 | } |
ab78acc6 | 6763 | exports.isObject = isObject; |
ebd8d4e8 | 6764 | |
ab78acc6 IC |
6765 | function isDate(d) { |
6766 | return isObject(d) && objectToString(d) === '[object Date]'; | |
6767 | } | |
6768 | exports.isDate = isDate; | |
ebd8d4e8 | 6769 | |
ab78acc6 IC |
6770 | function isError(e) { |
6771 | return isObject(e) && | |
6772 | (objectToString(e) === '[object Error]' || e instanceof Error); | |
6773 | } | |
6774 | exports.isError = isError; | |
ebd8d4e8 | 6775 | |
ab78acc6 IC |
6776 | function isFunction(arg) { |
6777 | return typeof arg === 'function'; | |
6778 | } | |
6779 | exports.isFunction = isFunction; | |
6780 | ||
6781 | function isPrimitive(arg) { | |
6782 | return arg === null || | |
6783 | typeof arg === 'boolean' || | |
6784 | typeof arg === 'number' || | |
6785 | typeof arg === 'string' || | |
6786 | typeof arg === 'symbol' || // ES6 symbol | |
6787 | typeof arg === 'undefined'; | |
ebd8d4e8 | 6788 | } |
ab78acc6 | 6789 | exports.isPrimitive = isPrimitive; |
ebd8d4e8 | 6790 | |
ab78acc6 IC |
6791 | function isBuffer(arg) { |
6792 | return Buffer.isBuffer(arg); | |
ebd8d4e8 | 6793 | } |
ab78acc6 | 6794 | exports.isBuffer = isBuffer; |
ebd8d4e8 | 6795 | |
ab78acc6 IC |
6796 | function objectToString(o) { |
6797 | return Object.prototype.toString.call(o); | |
ebd8d4e8 | 6798 | } |
ab78acc6 IC |
6799 | }).call(this,require("buffer").Buffer) |
6800 | },{"buffer":7}],22:[function(require,module,exports){ | |
6801 | module.exports = require("./lib/_stream_passthrough.js") | |
ebd8d4e8 | 6802 | |
ab78acc6 IC |
6803 | },{"./lib/_stream_passthrough.js":17}],23:[function(require,module,exports){ |
6804 | exports = module.exports = require('./lib/_stream_readable.js'); | |
6805 | exports.Stream = require('stream'); | |
6806 | exports.Readable = exports; | |
6807 | exports.Writable = require('./lib/_stream_writable.js'); | |
6808 | exports.Duplex = require('./lib/_stream_duplex.js'); | |
6809 | exports.Transform = require('./lib/_stream_transform.js'); | |
6810 | exports.PassThrough = require('./lib/_stream_passthrough.js'); | |
ebd8d4e8 | 6811 | |
ab78acc6 IC |
6812 | },{"./lib/_stream_duplex.js":16,"./lib/_stream_passthrough.js":17,"./lib/_stream_readable.js":18,"./lib/_stream_transform.js":19,"./lib/_stream_writable.js":20,"stream":26}],24:[function(require,module,exports){ |
6813 | module.exports = require("./lib/_stream_transform.js") | |
ebd8d4e8 | 6814 | |
ab78acc6 IC |
6815 | },{"./lib/_stream_transform.js":19}],25:[function(require,module,exports){ |
6816 | module.exports = require("./lib/_stream_writable.js") | |
6817 | ||
6818 | },{"./lib/_stream_writable.js":20}],26:[function(require,module,exports){ | |
6819 | // Copyright Joyent, Inc. and other Node contributors. | |
6820 | // | |
6821 | // Permission is hereby granted, free of charge, to any person obtaining a | |
6822 | // copy of this software and associated documentation files (the | |
6823 | // "Software"), to deal in the Software without restriction, including | |
6824 | // without limitation the rights to use, copy, modify, merge, publish, | |
6825 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
6826 | // persons to whom the Software is furnished to do so, subject to the | |
6827 | // following conditions: | |
6828 | // | |
6829 | // The above copyright notice and this permission notice shall be included | |
6830 | // in all copies or substantial portions of the Software. | |
6831 | // | |
6832 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
6833 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
6834 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
6835 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
6836 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
6837 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
6838 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
6839 | ||
6840 | module.exports = Stream; | |
6841 | ||
6842 | var EE = require('events').EventEmitter; | |
6843 | var inherits = require('inherits'); | |
6844 | ||
6845 | inherits(Stream, EE); | |
6846 | Stream.Readable = require('readable-stream/readable.js'); | |
6847 | Stream.Writable = require('readable-stream/writable.js'); | |
6848 | Stream.Duplex = require('readable-stream/duplex.js'); | |
6849 | Stream.Transform = require('readable-stream/transform.js'); | |
6850 | Stream.PassThrough = require('readable-stream/passthrough.js'); | |
6851 | ||
6852 | // Backwards-compat with node 0.4.x | |
6853 | Stream.Stream = Stream; | |
6854 | ||
6855 | ||
6856 | ||
6857 | // old-style streams. Note that the pipe method (the only relevant | |
6858 | // part of this class) is overridden in the Readable class. | |
6859 | ||
6860 | function Stream() { | |
6861 | EE.call(this); | |
ebd8d4e8 IC |
6862 | } |
6863 | ||
ab78acc6 IC |
6864 | Stream.prototype.pipe = function(dest, options) { |
6865 | var source = this; | |
ebd8d4e8 | 6866 | |
ab78acc6 IC |
6867 | function ondata(chunk) { |
6868 | if (dest.writable) { | |
6869 | if (false === dest.write(chunk) && source.pause) { | |
6870 | source.pause(); | |
6871 | } | |
6872 | } | |
6873 | } | |
ebd8d4e8 | 6874 | |
ab78acc6 | 6875 | source.on('data', ondata); |
ebd8d4e8 | 6876 | |
ab78acc6 IC |
6877 | function ondrain() { |
6878 | if (source.readable && source.resume) { | |
6879 | source.resume(); | |
6880 | } | |
6881 | } | |
ebd8d4e8 | 6882 | |
ab78acc6 | 6883 | dest.on('drain', ondrain); |
ebd8d4e8 | 6884 | |
ab78acc6 IC |
6885 | // If the 'end' option is not supplied, dest.end() will be called when |
6886 | // source gets the 'end' or 'close' events. Only dest.end() once. | |
6887 | if (!dest._isStdio && (!options || options.end !== false)) { | |
6888 | source.on('end', onend); | |
6889 | source.on('close', onclose); | |
ebd8d4e8 IC |
6890 | } |
6891 | ||
ab78acc6 IC |
6892 | var didOnEnd = false; |
6893 | function onend() { | |
6894 | if (didOnEnd) return; | |
6895 | didOnEnd = true; | |
ebd8d4e8 | 6896 | |
ab78acc6 IC |
6897 | dest.end(); |
6898 | } | |
ebd8d4e8 | 6899 | |
ebd8d4e8 | 6900 | |
ab78acc6 IC |
6901 | function onclose() { |
6902 | if (didOnEnd) return; | |
6903 | didOnEnd = true; | |
ebd8d4e8 | 6904 | |
ab78acc6 | 6905 | if (typeof dest.destroy === 'function') dest.destroy(); |
ebd8d4e8 IC |
6906 | } |
6907 | ||
ab78acc6 IC |
6908 | // don't leave dangling pipes when there are errors. |
6909 | function onerror(er) { | |
6910 | cleanup(); | |
6911 | if (EE.listenerCount(this, 'error') === 0) { | |
6912 | throw er; // Unhandled stream error in pipe. | |
6913 | } | |
6914 | } | |
ebd8d4e8 | 6915 | |
ab78acc6 IC |
6916 | source.on('error', onerror); |
6917 | dest.on('error', onerror); | |
ebd8d4e8 | 6918 | |
ab78acc6 IC |
6919 | // remove all the event listeners that were added. |
6920 | function cleanup() { | |
6921 | source.removeListener('data', ondata); | |
6922 | dest.removeListener('drain', ondrain); | |
ebd8d4e8 | 6923 | |
ab78acc6 IC |
6924 | source.removeListener('end', onend); |
6925 | source.removeListener('close', onclose); | |
6926 | ||
6927 | source.removeListener('error', onerror); | |
6928 | dest.removeListener('error', onerror); | |
6929 | ||
6930 | source.removeListener('end', cleanup); | |
6931 | source.removeListener('close', cleanup); | |
6932 | ||
6933 | dest.removeListener('close', cleanup); | |
ebd8d4e8 IC |
6934 | } |
6935 | ||
ab78acc6 IC |
6936 | source.on('end', cleanup); |
6937 | source.on('close', cleanup); | |
ebd8d4e8 | 6938 | |
ab78acc6 | 6939 | dest.on('close', cleanup); |
ebd8d4e8 | 6940 | |
ab78acc6 | 6941 | dest.emit('pipe', source); |
ebd8d4e8 | 6942 | |
ab78acc6 IC |
6943 | // Allow for unix-like usage: A.pipe(B).pipe(C) |
6944 | return dest; | |
6945 | }; | |
ebd8d4e8 | 6946 | |
ab78acc6 IC |
6947 | },{"events":11,"inherits":12,"readable-stream/duplex.js":15,"readable-stream/passthrough.js":22,"readable-stream/readable.js":23,"readable-stream/transform.js":24,"readable-stream/writable.js":25}],27:[function(require,module,exports){ |
6948 | // Copyright Joyent, Inc. and other Node contributors. | |
6949 | // | |
6950 | // Permission is hereby granted, free of charge, to any person obtaining a | |
6951 | // copy of this software and associated documentation files (the | |
6952 | // "Software"), to deal in the Software without restriction, including | |
6953 | // without limitation the rights to use, copy, modify, merge, publish, | |
6954 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
6955 | // persons to whom the Software is furnished to do so, subject to the | |
6956 | // following conditions: | |
6957 | // | |
6958 | // The above copyright notice and this permission notice shall be included | |
6959 | // in all copies or substantial portions of the Software. | |
6960 | // | |
6961 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
6962 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
6963 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
6964 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
6965 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
6966 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
6967 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 6968 | |
ab78acc6 | 6969 | var Buffer = require('buffer').Buffer; |
ebd8d4e8 | 6970 | |
ab78acc6 IC |
6971 | var isBufferEncoding = Buffer.isEncoding |
6972 | || function(encoding) { | |
6973 | switch (encoding && encoding.toLowerCase()) { | |
6974 | case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; | |
6975 | default: return false; | |
6976 | } | |
6977 | } | |
ebd8d4e8 | 6978 | |
ebd8d4e8 | 6979 | |
ab78acc6 IC |
6980 | function assertEncoding(encoding) { |
6981 | if (encoding && !isBufferEncoding(encoding)) { | |
6982 | throw new Error('Unknown encoding: ' + encoding); | |
ebd8d4e8 | 6983 | } |
ebd8d4e8 IC |
6984 | } |
6985 | ||
ab78acc6 IC |
6986 | // StringDecoder provides an interface for efficiently splitting a series of |
6987 | // buffers into a series of JS strings without breaking apart multi-byte | |
6988 | // characters. CESU-8 is handled as part of the UTF-8 encoding. | |
6989 | // | |
6990 | // @TODO Handling all encodings inside a single object makes it very difficult | |
6991 | // to reason about this code, so it should be split up in the future. | |
6992 | // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code | |
6993 | // points as used by CESU-8. | |
6994 | var StringDecoder = exports.StringDecoder = function(encoding) { | |
6995 | this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); | |
6996 | assertEncoding(encoding); | |
6997 | switch (this.encoding) { | |
6998 | case 'utf8': | |
6999 | // CESU-8 represents each of Surrogate Pair by 3-bytes | |
7000 | this.surrogateSize = 3; | |
7001 | break; | |
7002 | case 'ucs2': | |
7003 | case 'utf16le': | |
7004 | // UTF-16 represents each of Surrogate Pair by 2-bytes | |
7005 | this.surrogateSize = 2; | |
7006 | this.detectIncompleteChar = utf16DetectIncompleteChar; | |
7007 | break; | |
7008 | case 'base64': | |
7009 | // Base-64 stores 3 bytes in 4 chars, and pads the remainder. | |
7010 | this.surrogateSize = 3; | |
7011 | this.detectIncompleteChar = base64DetectIncompleteChar; | |
7012 | break; | |
7013 | default: | |
7014 | this.write = passThroughWrite; | |
7015 | return; | |
7016 | } | |
ebd8d4e8 | 7017 | |
ab78acc6 IC |
7018 | // Enough space to store all bytes of a single character. UTF-8 needs 4 |
7019 | // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). | |
7020 | this.charBuffer = new Buffer(6); | |
7021 | // Number of bytes received for the current incomplete multi-byte character. | |
7022 | this.charReceived = 0; | |
7023 | // Number of bytes expected for the current incomplete multi-byte character. | |
7024 | this.charLength = 0; | |
7025 | }; | |
ebd8d4e8 | 7026 | |
ebd8d4e8 | 7027 | |
ab78acc6 IC |
7028 | // write decodes the given buffer and returns it as JS string that is |
7029 | // guaranteed to not contain any partial multi-byte characters. Any partial | |
7030 | // character found at the end of the buffer is buffered up, and will be | |
7031 | // returned when calling write again with the remaining bytes. | |
7032 | // | |
7033 | // Note: Converting a Buffer containing an orphan surrogate to a String | |
7034 | // currently works, but converting a String to a Buffer (via `new Buffer`, or | |
7035 | // Buffer#write) will replace incomplete surrogates with the unicode | |
7036 | // replacement character. See https://codereview.chromium.org/121173009/ . | |
7037 | StringDecoder.prototype.write = function(buffer) { | |
7038 | var charStr = ''; | |
7039 | // if our last write ended with an incomplete multibyte character | |
7040 | while (this.charLength) { | |
7041 | // determine how many remaining bytes this buffer has to offer for this char | |
7042 | var available = (buffer.length >= this.charLength - this.charReceived) ? | |
7043 | this.charLength - this.charReceived : | |
7044 | buffer.length; | |
7045 | ||
7046 | // add the new bytes to the char buffer | |
7047 | buffer.copy(this.charBuffer, this.charReceived, 0, available); | |
7048 | this.charReceived += available; | |
7049 | ||
7050 | if (this.charReceived < this.charLength) { | |
7051 | // still not enough chars in this buffer? wait for more ... | |
7052 | return ''; | |
7053 | } | |
7054 | ||
7055 | // remove bytes belonging to the current character from the buffer | |
7056 | buffer = buffer.slice(available, buffer.length); | |
7057 | ||
7058 | // get the character that was split | |
7059 | charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); | |
7060 | ||
7061 | // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character | |
7062 | var charCode = charStr.charCodeAt(charStr.length - 1); | |
7063 | if (charCode >= 0xD800 && charCode <= 0xDBFF) { | |
7064 | this.charLength += this.surrogateSize; | |
7065 | charStr = ''; | |
7066 | continue; | |
7067 | } | |
7068 | this.charReceived = this.charLength = 0; | |
ebd8d4e8 | 7069 | |
ab78acc6 IC |
7070 | // if there are no more bytes in this buffer, just emit our char |
7071 | if (buffer.length === 0) { | |
7072 | return charStr; | |
7073 | } | |
7074 | break; | |
ebd8d4e8 | 7075 | } |
ebd8d4e8 | 7076 | |
ab78acc6 IC |
7077 | // determine and set charLength / charReceived |
7078 | this.detectIncompleteChar(buffer); | |
ebd8d4e8 | 7079 | |
ab78acc6 IC |
7080 | var end = buffer.length; |
7081 | if (this.charLength) { | |
7082 | // buffer the incomplete character bytes we got | |
7083 | buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); | |
7084 | end -= this.charReceived; | |
ebd8d4e8 IC |
7085 | } |
7086 | ||
ab78acc6 | 7087 | charStr += buffer.toString(this.encoding, 0, end); |
ebd8d4e8 | 7088 | |
ab78acc6 IC |
7089 | var end = charStr.length - 1; |
7090 | var charCode = charStr.charCodeAt(end); | |
7091 | // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character | |
7092 | if (charCode >= 0xD800 && charCode <= 0xDBFF) { | |
7093 | var size = this.surrogateSize; | |
7094 | this.charLength += size; | |
7095 | this.charReceived += size; | |
7096 | this.charBuffer.copy(this.charBuffer, size, 0, size); | |
7097 | buffer.copy(this.charBuffer, 0, 0, size); | |
7098 | return charStr.substring(0, end); | |
ebd8d4e8 IC |
7099 | } |
7100 | ||
ab78acc6 IC |
7101 | // or just emit the charStr |
7102 | return charStr; | |
7103 | }; | |
ebd8d4e8 | 7104 | |
ab78acc6 IC |
7105 | // detectIncompleteChar determines if there is an incomplete UTF-8 character at |
7106 | // the end of the given buffer. If so, it sets this.charLength to the byte | |
7107 | // length that character, and sets this.charReceived to the number of bytes | |
7108 | // that are available for this character. | |
7109 | StringDecoder.prototype.detectIncompleteChar = function(buffer) { | |
7110 | // determine how many bytes we have to check at the end of this buffer | |
7111 | var i = (buffer.length >= 3) ? 3 : buffer.length; | |
ebd8d4e8 | 7112 | |
ab78acc6 IC |
7113 | // Figure out if one of the last i bytes of our buffer announces an |
7114 | // incomplete char. | |
7115 | for (; i > 0; i--) { | |
7116 | var c = buffer[buffer.length - i]; | |
ebd8d4e8 | 7117 | |
ab78acc6 | 7118 | // See http://en.wikipedia.org/wiki/UTF-8#Description |
ebd8d4e8 | 7119 | |
ab78acc6 IC |
7120 | // 110XXXXX |
7121 | if (i == 1 && c >> 5 == 0x06) { | |
7122 | this.charLength = 2; | |
7123 | break; | |
7124 | } | |
ebd8d4e8 | 7125 | |
ab78acc6 IC |
7126 | // 1110XXXX |
7127 | if (i <= 2 && c >> 4 == 0x0E) { | |
7128 | this.charLength = 3; | |
7129 | break; | |
7130 | } | |
ebd8d4e8 | 7131 | |
ab78acc6 IC |
7132 | // 11110XXX |
7133 | if (i <= 3 && c >> 3 == 0x1E) { | |
7134 | this.charLength = 4; | |
7135 | break; | |
7136 | } | |
7137 | } | |
7138 | this.charReceived = i; | |
7139 | }; | |
ebd8d4e8 | 7140 | |
ab78acc6 IC |
7141 | StringDecoder.prototype.end = function(buffer) { |
7142 | var res = ''; | |
7143 | if (buffer && buffer.length) | |
7144 | res = this.write(buffer); | |
ebd8d4e8 | 7145 | |
ab78acc6 IC |
7146 | if (this.charReceived) { |
7147 | var cr = this.charReceived; | |
7148 | var buf = this.charBuffer; | |
7149 | var enc = this.encoding; | |
7150 | res += buf.slice(0, cr).toString(enc); | |
ebd8d4e8 IC |
7151 | } |
7152 | ||
ab78acc6 IC |
7153 | return res; |
7154 | }; | |
ebd8d4e8 | 7155 | |
ab78acc6 IC |
7156 | function passThroughWrite(buffer) { |
7157 | return buffer.toString(this.encoding); | |
ebd8d4e8 IC |
7158 | } |
7159 | ||
ab78acc6 IC |
7160 | function utf16DetectIncompleteChar(buffer) { |
7161 | this.charReceived = buffer.length % 2; | |
7162 | this.charLength = this.charReceived ? 2 : 0; | |
ebd8d4e8 IC |
7163 | } |
7164 | ||
ab78acc6 IC |
7165 | function base64DetectIncompleteChar(buffer) { |
7166 | this.charReceived = buffer.length % 3; | |
7167 | this.charLength = this.charReceived ? 3 : 0; | |
ebd8d4e8 IC |
7168 | } |
7169 | ||
ab78acc6 IC |
7170 | },{"buffer":7}],28:[function(require,module,exports){ |
7171 | module.exports = function isBuffer(arg) { | |
7172 | return arg && typeof arg === 'object' | |
7173 | && typeof arg.copy === 'function' | |
7174 | && typeof arg.fill === 'function' | |
7175 | && typeof arg.readUInt8 === 'function'; | |
7176 | } | |
7177 | },{}],29:[function(require,module,exports){ | |
7178 | (function (process,global){ | |
7179 | // Copyright Joyent, Inc. and other Node contributors. | |
7180 | // | |
7181 | // Permission is hereby granted, free of charge, to any person obtaining a | |
7182 | // copy of this software and associated documentation files (the | |
7183 | // "Software"), to deal in the Software without restriction, including | |
7184 | // without limitation the rights to use, copy, modify, merge, publish, | |
7185 | // distribute, sublicense, and/or sell copies of the Software, and to permit | |
7186 | // persons to whom the Software is furnished to do so, subject to the | |
7187 | // following conditions: | |
7188 | // | |
7189 | // The above copyright notice and this permission notice shall be included | |
7190 | // in all copies or substantial portions of the Software. | |
7191 | // | |
7192 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
7193 | // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
7194 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN | |
7195 | // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | |
7196 | // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | |
7197 | // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | |
7198 | // USE OR OTHER DEALINGS IN THE SOFTWARE. | |
ebd8d4e8 | 7199 | |
ab78acc6 IC |
7200 | var formatRegExp = /%[sdj%]/g; |
7201 | exports.format = function(f) { | |
7202 | if (!isString(f)) { | |
7203 | var objects = []; | |
7204 | for (var i = 0; i < arguments.length; i++) { | |
7205 | objects.push(inspect(arguments[i])); | |
7206 | } | |
7207 | return objects.join(' '); | |
7208 | } | |
ebd8d4e8 | 7209 | |
ab78acc6 IC |
7210 | var i = 1; |
7211 | var args = arguments; | |
7212 | var len = args.length; | |
7213 | var str = String(f).replace(formatRegExp, function(x) { | |
7214 | if (x === '%%') return '%'; | |
7215 | if (i >= len) return x; | |
7216 | switch (x) { | |
7217 | case '%s': return String(args[i++]); | |
7218 | case '%d': return Number(args[i++]); | |
7219 | case '%j': | |
7220 | try { | |
7221 | return JSON.stringify(args[i++]); | |
7222 | } catch (_) { | |
7223 | return '[Circular]'; | |
7224 | } | |
7225 | default: | |
7226 | return x; | |
7227 | } | |
7228 | }); | |
7229 | for (var x = args[i]; i < len; x = args[++i]) { | |
7230 | if (isNull(x) || !isObject(x)) { | |
7231 | str += ' ' + x; | |
7232 | } else { | |
7233 | str += ' ' + inspect(x); | |
7234 | } | |
7235 | } | |
7236 | return str; | |
7237 | }; | |
ebd8d4e8 | 7238 | |
ebd8d4e8 | 7239 | |
ab78acc6 IC |
7240 | // Mark that a method should not be used. |
7241 | // Returns a modified function which warns once by default. | |
7242 | // If --no-deprecation is set, then it is a no-op. | |
7243 | exports.deprecate = function(fn, msg) { | |
7244 | // Allow for deprecating things in the process of starting up. | |
7245 | if (isUndefined(global.process)) { | |
7246 | return function() { | |
7247 | return exports.deprecate(fn, msg).apply(this, arguments); | |
7248 | }; | |
7249 | } | |
ebd8d4e8 | 7250 | |
ab78acc6 IC |
7251 | if (process.noDeprecation === true) { |
7252 | return fn; | |
7253 | } | |
ebd8d4e8 | 7254 | |
ab78acc6 IC |
7255 | var warned = false; |
7256 | function deprecated() { | |
7257 | if (!warned) { | |
7258 | if (process.throwDeprecation) { | |
7259 | throw new Error(msg); | |
7260 | } else if (process.traceDeprecation) { | |
7261 | console.trace(msg); | |
7262 | } else { | |
7263 | console.error(msg); | |
7264 | } | |
7265 | warned = true; | |
7266 | } | |
7267 | return fn.apply(this, arguments); | |
7268 | } | |
ebd8d4e8 | 7269 | |
ab78acc6 IC |
7270 | return deprecated; |
7271 | }; | |
ebd8d4e8 | 7272 | |
ebd8d4e8 | 7273 | |
ab78acc6 IC |
7274 | var debugs = {}; |
7275 | var debugEnviron; | |
7276 | exports.debuglog = function(set) { | |
7277 | if (isUndefined(debugEnviron)) | |
7278 | debugEnviron = process.env.NODE_DEBUG || ''; | |
7279 | set = set.toUpperCase(); | |
7280 | if (!debugs[set]) { | |
7281 | if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { | |
7282 | var pid = process.pid; | |
7283 | debugs[set] = function() { | |
7284 | var msg = exports.format.apply(exports, arguments); | |
7285 | console.error('%s %d: %s', set, pid, msg); | |
7286 | }; | |
7287 | } else { | |
7288 | debugs[set] = function() {}; | |
ebd8d4e8 IC |
7289 | } |
7290 | } | |
ab78acc6 IC |
7291 | return debugs[set]; |
7292 | }; | |
ebd8d4e8 | 7293 | |
ebd8d4e8 IC |
7294 | |
7295 | /** | |
ab78acc6 IC |
7296 | * Echos the value of a value. Trys to print the value out |
7297 | * in the best way possible given the different types. | |
7298 | * | |
7299 | * @param {Object} obj The object to print out. | |
7300 | * @param {Object} opts Optional options object that alters the output. | |
ebd8d4e8 | 7301 | */ |
ab78acc6 IC |
7302 | /* legacy: obj, showHidden, depth, colors*/ |
7303 | function inspect(obj, opts) { | |
7304 | // default options | |
7305 | var ctx = { | |
7306 | seen: [], | |
7307 | stylize: stylizeNoColor | |
7308 | }; | |
7309 | // legacy... | |
7310 | if (arguments.length >= 3) ctx.depth = arguments[2]; | |
7311 | if (arguments.length >= 4) ctx.colors = arguments[3]; | |
7312 | if (isBoolean(opts)) { | |
7313 | // legacy... | |
7314 | ctx.showHidden = opts; | |
7315 | } else if (opts) { | |
7316 | // got an "options" object | |
7317 | exports._extend(ctx, opts); | |
ebd8d4e8 | 7318 | } |
ab78acc6 IC |
7319 | // set default options |
7320 | if (isUndefined(ctx.showHidden)) ctx.showHidden = false; | |
7321 | if (isUndefined(ctx.depth)) ctx.depth = 2; | |
7322 | if (isUndefined(ctx.colors)) ctx.colors = false; | |
7323 | if (isUndefined(ctx.customInspect)) ctx.customInspect = true; | |
7324 | if (ctx.colors) ctx.stylize = stylizeWithColor; | |
7325 | return formatValue(ctx, obj, ctx.depth); | |
ebd8d4e8 | 7326 | } |
ab78acc6 | 7327 | exports.inspect = inspect; |
ebd8d4e8 | 7328 | |
ebd8d4e8 | 7329 | |
ab78acc6 IC |
7330 | // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics |
7331 | inspect.colors = { | |
7332 | 'bold' : [1, 22], | |
7333 | 'italic' : [3, 23], | |
7334 | 'underline' : [4, 24], | |
7335 | 'inverse' : [7, 27], | |
7336 | 'white' : [37, 39], | |
7337 | 'grey' : [90, 39], | |
7338 | 'black' : [30, 39], | |
7339 | 'blue' : [34, 39], | |
7340 | 'cyan' : [36, 39], | |
7341 | 'green' : [32, 39], | |
7342 | 'magenta' : [35, 39], | |
7343 | 'red' : [31, 39], | |
7344 | 'yellow' : [33, 39] | |
7345 | }; | |
ebd8d4e8 | 7346 | |
ab78acc6 IC |
7347 | // Don't use 'blue' not visible on cmd.exe |
7348 | inspect.styles = { | |
7349 | 'special': 'cyan', | |
7350 | 'number': 'yellow', | |
7351 | 'boolean': 'yellow', | |
7352 | 'undefined': 'grey', | |
7353 | 'null': 'bold', | |
7354 | 'string': 'green', | |
7355 | 'date': 'magenta', | |
7356 | // "name": intentionally not styling | |
7357 | 'regexp': 'red' | |
7358 | }; | |
ebd8d4e8 | 7359 | |
ebd8d4e8 | 7360 | |
ab78acc6 IC |
7361 | function stylizeWithColor(str, styleType) { |
7362 | var style = inspect.styles[styleType]; | |
ebd8d4e8 | 7363 | |
ab78acc6 IC |
7364 | if (style) { |
7365 | return '\u001b[' + inspect.colors[style][0] + 'm' + str + | |
7366 | '\u001b[' + inspect.colors[style][1] + 'm'; | |
7367 | } else { | |
7368 | return str; | |
ebd8d4e8 | 7369 | } |
ebd8d4e8 IC |
7370 | } |
7371 | ||
ebd8d4e8 | 7372 | |
ab78acc6 IC |
7373 | function stylizeNoColor(str, styleType) { |
7374 | return str; | |
ebd8d4e8 IC |
7375 | } |
7376 | ||
ebd8d4e8 | 7377 | |
ab78acc6 IC |
7378 | function arrayToHash(array) { |
7379 | var hash = {}; | |
ebd8d4e8 | 7380 | |
ab78acc6 IC |
7381 | array.forEach(function(val, idx) { |
7382 | hash[val] = true; | |
7383 | }); | |
ebd8d4e8 | 7384 | |
ab78acc6 | 7385 | return hash; |
ebd8d4e8 IC |
7386 | } |
7387 | ||
ebd8d4e8 | 7388 | |
ab78acc6 IC |
7389 | function formatValue(ctx, value, recurseTimes) { |
7390 | // Provide a hook for user-specified inspect functions. | |
7391 | // Check that value is an object with an inspect function on it | |
7392 | if (ctx.customInspect && | |
7393 | value && | |
7394 | isFunction(value.inspect) && | |
7395 | // Filter out the util module, it's inspect function is special | |
7396 | value.inspect !== exports.inspect && | |
7397 | // Also filter out any prototype objects using the circular check. | |
7398 | !(value.constructor && value.constructor.prototype === value)) { | |
7399 | var ret = value.inspect(recurseTimes, ctx); | |
7400 | if (!isString(ret)) { | |
7401 | ret = formatValue(ctx, ret, recurseTimes); | |
7402 | } | |
7403 | return ret; | |
ebd8d4e8 | 7404 | } |
ebd8d4e8 | 7405 | |
ab78acc6 IC |
7406 | // Primitive types cannot have properties |
7407 | var primitive = formatPrimitive(ctx, value); | |
7408 | if (primitive) { | |
7409 | return primitive; | |
ebd8d4e8 IC |
7410 | } |
7411 | ||
ab78acc6 IC |
7412 | // Look up the keys of the object. |
7413 | var keys = Object.keys(value); | |
7414 | var visibleKeys = arrayToHash(keys); | |
ebd8d4e8 | 7415 | |
ab78acc6 IC |
7416 | if (ctx.showHidden) { |
7417 | keys = Object.getOwnPropertyNames(value); | |
7418 | } | |
ebd8d4e8 | 7419 | |
ab78acc6 IC |
7420 | // IE doesn't make error fields non-enumerable |
7421 | // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx | |
7422 | if (isError(value) | |
7423 | && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { | |
7424 | return formatError(value); | |
ebd8d4e8 | 7425 | } |
ebd8d4e8 | 7426 | |
ab78acc6 IC |
7427 | // Some type of object without properties can be shortcutted. |
7428 | if (keys.length === 0) { | |
7429 | if (isFunction(value)) { | |
7430 | var name = value.name ? ': ' + value.name : ''; | |
7431 | return ctx.stylize('[Function' + name + ']', 'special'); | |
7432 | } | |
7433 | if (isRegExp(value)) { | |
7434 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); | |
7435 | } | |
7436 | if (isDate(value)) { | |
7437 | return ctx.stylize(Date.prototype.toString.call(value), 'date'); | |
7438 | } | |
7439 | if (isError(value)) { | |
7440 | return formatError(value); | |
7441 | } | |
ebd8d4e8 | 7442 | } |
ebd8d4e8 | 7443 | |
ab78acc6 | 7444 | var base = '', array = false, braces = ['{', '}']; |
ebd8d4e8 | 7445 | |
ab78acc6 IC |
7446 | // Make Array say that they are Array |
7447 | if (isArray(value)) { | |
7448 | array = true; | |
7449 | braces = ['[', ']']; | |
7450 | } | |
ebd8d4e8 | 7451 | |
ab78acc6 IC |
7452 | // Make functions say that they are functions |
7453 | if (isFunction(value)) { | |
7454 | var n = value.name ? ': ' + value.name : ''; | |
7455 | base = ' [Function' + n + ']'; | |
7456 | } | |
ebd8d4e8 | 7457 | |
ab78acc6 IC |
7458 | // Make RegExps say that they are RegExps |
7459 | if (isRegExp(value)) { | |
7460 | base = ' ' + RegExp.prototype.toString.call(value); | |
7461 | } | |
ebd8d4e8 | 7462 | |
ab78acc6 IC |
7463 | // Make dates with properties first say the date |
7464 | if (isDate(value)) { | |
7465 | base = ' ' + Date.prototype.toUTCString.call(value); | |
7466 | } | |
ebd8d4e8 | 7467 | |
ab78acc6 IC |
7468 | // Make error with message first say the error |
7469 | if (isError(value)) { | |
7470 | base = ' ' + formatError(value); | |
7471 | } | |
ebd8d4e8 | 7472 | |
ab78acc6 IC |
7473 | if (keys.length === 0 && (!array || value.length == 0)) { |
7474 | return braces[0] + base + braces[1]; | |
7475 | } | |
ebd8d4e8 | 7476 | |
ab78acc6 IC |
7477 | if (recurseTimes < 0) { |
7478 | if (isRegExp(value)) { | |
7479 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); | |
7480 | } else { | |
7481 | return ctx.stylize('[Object]', 'special'); | |
7482 | } | |
7483 | } | |
ebd8d4e8 | 7484 | |
ab78acc6 | 7485 | ctx.seen.push(value); |
ebd8d4e8 | 7486 | |
ab78acc6 IC |
7487 | var output; |
7488 | if (array) { | |
7489 | output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); | |
7490 | } else { | |
7491 | output = keys.map(function(key) { | |
7492 | return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); | |
7493 | }); | |
7494 | } | |
ebd8d4e8 | 7495 | |
ab78acc6 | 7496 | ctx.seen.pop(); |
ebd8d4e8 | 7497 | |
ab78acc6 IC |
7498 | return reduceToSingleString(output, base, braces); |
7499 | } | |
ebd8d4e8 | 7500 | |
ebd8d4e8 | 7501 | |
ab78acc6 IC |
7502 | function formatPrimitive(ctx, value) { |
7503 | if (isUndefined(value)) | |
7504 | return ctx.stylize('undefined', 'undefined'); | |
7505 | if (isString(value)) { | |
7506 | var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') | |
7507 | .replace(/'/g, "\\'") | |
7508 | .replace(/\\"/g, '"') + '\''; | |
7509 | return ctx.stylize(simple, 'string'); | |
7510 | } | |
7511 | if (isNumber(value)) | |
7512 | return ctx.stylize('' + value, 'number'); | |
7513 | if (isBoolean(value)) | |
7514 | return ctx.stylize('' + value, 'boolean'); | |
7515 | // For some reason typeof null is "object", so special case here. | |
7516 | if (isNull(value)) | |
7517 | return ctx.stylize('null', 'null'); | |
7518 | } | |
ebd8d4e8 | 7519 | |
ebd8d4e8 | 7520 | |
ab78acc6 IC |
7521 | function formatError(value) { |
7522 | return '[' + Error.prototype.toString.call(value) + ']'; | |
7523 | } | |
ebd8d4e8 | 7524 | |
ebd8d4e8 | 7525 | |
ab78acc6 IC |
7526 | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { |
7527 | var output = []; | |
7528 | for (var i = 0, l = value.length; i < l; ++i) { | |
7529 | if (hasOwnProperty(value, String(i))) { | |
7530 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, | |
7531 | String(i), true)); | |
7532 | } else { | |
7533 | output.push(''); | |
7534 | } | |
7535 | } | |
7536 | keys.forEach(function(key) { | |
7537 | if (!key.match(/^\d+$/)) { | |
7538 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, | |
7539 | key, true)); | |
7540 | } | |
7541 | }); | |
7542 | return output; | |
7543 | } | |
ebd8d4e8 | 7544 | |
ebd8d4e8 | 7545 | |
ab78acc6 IC |
7546 | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { |
7547 | var name, str, desc; | |
7548 | desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; | |
7549 | if (desc.get) { | |
7550 | if (desc.set) { | |
7551 | str = ctx.stylize('[Getter/Setter]', 'special'); | |
7552 | } else { | |
7553 | str = ctx.stylize('[Getter]', 'special'); | |
7554 | } | |
7555 | } else { | |
7556 | if (desc.set) { | |
7557 | str = ctx.stylize('[Setter]', 'special'); | |
7558 | } | |
7559 | } | |
7560 | if (!hasOwnProperty(visibleKeys, key)) { | |
7561 | name = '[' + key + ']'; | |
7562 | } | |
7563 | if (!str) { | |
7564 | if (ctx.seen.indexOf(desc.value) < 0) { | |
7565 | if (isNull(recurseTimes)) { | |
7566 | str = formatValue(ctx, desc.value, null); | |
7567 | } else { | |
7568 | str = formatValue(ctx, desc.value, recurseTimes - 1); | |
7569 | } | |
7570 | if (str.indexOf('\n') > -1) { | |
7571 | if (array) { | |
7572 | str = str.split('\n').map(function(line) { | |
7573 | return ' ' + line; | |
7574 | }).join('\n').substr(2); | |
7575 | } else { | |
7576 | str = '\n' + str.split('\n').map(function(line) { | |
7577 | return ' ' + line; | |
7578 | }).join('\n'); | |
7579 | } | |
7580 | } | |
7581 | } else { | |
7582 | str = ctx.stylize('[Circular]', 'special'); | |
7583 | } | |
7584 | } | |
7585 | if (isUndefined(name)) { | |
7586 | if (array && key.match(/^\d+$/)) { | |
7587 | return str; | |
7588 | } | |
7589 | name = JSON.stringify('' + key); | |
7590 | if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { | |
7591 | name = name.substr(1, name.length - 2); | |
7592 | name = ctx.stylize(name, 'name'); | |
7593 | } else { | |
7594 | name = name.replace(/'/g, "\\'") | |
7595 | .replace(/\\"/g, '"') | |
7596 | .replace(/(^"|"$)/g, "'"); | |
7597 | name = ctx.stylize(name, 'string'); | |
7598 | } | |
7599 | } | |
ebd8d4e8 | 7600 | |
ab78acc6 IC |
7601 | return name + ': ' + str; |
7602 | } | |
ebd8d4e8 | 7603 | |
ebd8d4e8 | 7604 | |
ab78acc6 IC |
7605 | function reduceToSingleString(output, base, braces) { |
7606 | var numLinesEst = 0; | |
7607 | var length = output.reduce(function(prev, cur) { | |
7608 | numLinesEst++; | |
7609 | if (cur.indexOf('\n') >= 0) numLinesEst++; | |
7610 | return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; | |
7611 | }, 0); | |
ebd8d4e8 | 7612 | |
ab78acc6 IC |
7613 | if (length > 60) { |
7614 | return braces[0] + | |
7615 | (base === '' ? '' : base + '\n ') + | |
7616 | ' ' + | |
7617 | output.join(',\n ') + | |
7618 | ' ' + | |
7619 | braces[1]; | |
7620 | } | |
ebd8d4e8 | 7621 | |
ab78acc6 IC |
7622 | return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; |
7623 | } | |
ebd8d4e8 | 7624 | |
ebd8d4e8 | 7625 | |
ab78acc6 IC |
7626 | // NOTE: These type checking functions intentionally don't use `instanceof` |
7627 | // because it is fragile and can be easily faked with `Object.create()`. | |
7628 | function isArray(ar) { | |
7629 | return Array.isArray(ar); | |
7630 | } | |
7631 | exports.isArray = isArray; | |
ebd8d4e8 | 7632 | |
ab78acc6 IC |
7633 | function isBoolean(arg) { |
7634 | return typeof arg === 'boolean'; | |
7635 | } | |
7636 | exports.isBoolean = isBoolean; | |
ebd8d4e8 | 7637 | |
ab78acc6 IC |
7638 | function isNull(arg) { |
7639 | return arg === null; | |
7640 | } | |
7641 | exports.isNull = isNull; | |
ebd8d4e8 | 7642 | |
ab78acc6 IC |
7643 | function isNullOrUndefined(arg) { |
7644 | return arg == null; | |
7645 | } | |
7646 | exports.isNullOrUndefined = isNullOrUndefined; | |
ebd8d4e8 | 7647 | |
ab78acc6 IC |
7648 | function isNumber(arg) { |
7649 | return typeof arg === 'number'; | |
7650 | } | |
7651 | exports.isNumber = isNumber; | |
ebd8d4e8 | 7652 | |
ab78acc6 IC |
7653 | function isString(arg) { |
7654 | return typeof arg === 'string'; | |
7655 | } | |
7656 | exports.isString = isString; | |
ebd8d4e8 | 7657 | |
ab78acc6 IC |
7658 | function isSymbol(arg) { |
7659 | return typeof arg === 'symbol'; | |
7660 | } | |
7661 | exports.isSymbol = isSymbol; | |
ebd8d4e8 | 7662 | |
ab78acc6 IC |
7663 | function isUndefined(arg) { |
7664 | return arg === void 0; | |
7665 | } | |
7666 | exports.isUndefined = isUndefined; | |
ebd8d4e8 | 7667 | |
ab78acc6 IC |
7668 | function isRegExp(re) { |
7669 | return isObject(re) && objectToString(re) === '[object RegExp]'; | |
7670 | } | |
7671 | exports.isRegExp = isRegExp; | |
ebd8d4e8 | 7672 | |
ab78acc6 IC |
7673 | function isObject(arg) { |
7674 | return typeof arg === 'object' && arg !== null; | |
ebd8d4e8 | 7675 | } |
ab78acc6 | 7676 | exports.isObject = isObject; |
ebd8d4e8 | 7677 | |
ab78acc6 IC |
7678 | function isDate(d) { |
7679 | return isObject(d) && objectToString(d) === '[object Date]'; | |
7680 | } | |
7681 | exports.isDate = isDate; | |
ebd8d4e8 | 7682 | |
ab78acc6 IC |
7683 | function isError(e) { |
7684 | return isObject(e) && | |
7685 | (objectToString(e) === '[object Error]' || e instanceof Error); | |
7686 | } | |
7687 | exports.isError = isError; | |
ebd8d4e8 | 7688 | |
ab78acc6 IC |
7689 | function isFunction(arg) { |
7690 | return typeof arg === 'function'; | |
7691 | } | |
7692 | exports.isFunction = isFunction; | |
ebd8d4e8 | 7693 | |
ab78acc6 IC |
7694 | function isPrimitive(arg) { |
7695 | return arg === null || | |
7696 | typeof arg === 'boolean' || | |
7697 | typeof arg === 'number' || | |
7698 | typeof arg === 'string' || | |
7699 | typeof arg === 'symbol' || // ES6 symbol | |
7700 | typeof arg === 'undefined'; | |
7701 | } | |
7702 | exports.isPrimitive = isPrimitive; | |
ebd8d4e8 | 7703 | |
ab78acc6 | 7704 | exports.isBuffer = require('./support/isBuffer'); |
ebd8d4e8 | 7705 | |
ab78acc6 IC |
7706 | function objectToString(o) { |
7707 | return Object.prototype.toString.call(o); | |
7708 | } | |
ebd8d4e8 | 7709 | |
ebd8d4e8 | 7710 | |
ab78acc6 IC |
7711 | function pad(n) { |
7712 | return n < 10 ? '0' + n.toString(10) : n.toString(10); | |
7713 | } | |
ebd8d4e8 | 7714 | |
ebd8d4e8 | 7715 | |
ab78acc6 IC |
7716 | var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', |
7717 | 'Oct', 'Nov', 'Dec']; | |
ebd8d4e8 | 7718 | |
ab78acc6 IC |
7719 | // 26 Feb 16:19:34 |
7720 | function timestamp() { | |
7721 | var d = new Date(); | |
7722 | var time = [pad(d.getHours()), | |
7723 | pad(d.getMinutes()), | |
7724 | pad(d.getSeconds())].join(':'); | |
7725 | return [d.getDate(), months[d.getMonth()], time].join(' '); | |
ebd8d4e8 IC |
7726 | } |
7727 | ||
ab78acc6 IC |
7728 | |
7729 | // log is just a thin wrapper to console.log that prepends a timestamp | |
7730 | exports.log = function() { | |
7731 | console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); | |
ebd8d4e8 IC |
7732 | }; |
7733 | ||
ab78acc6 IC |
7734 | |
7735 | /** | |
7736 | * Inherit the prototype methods from one constructor into another. | |
7737 | * | |
7738 | * The Function.prototype.inherits from lang.js rewritten as a standalone | |
7739 | * function (not on Function.prototype). NOTE: If this file is to be loaded | |
7740 | * during bootstrapping this function needs to be rewritten using some native | |
7741 | * functions as prototype setup using normal JavaScript does not work as | |
7742 | * expected during bootstrapping (see mirror.js in r114903). | |
7743 | * | |
7744 | * @param {function} ctor Constructor function which needs to inherit the | |
7745 | * prototype. | |
7746 | * @param {function} superCtor Constructor function to inherit prototype from. | |
7747 | */ | |
7748 | exports.inherits = require('inherits'); | |
7749 | ||
7750 | exports._extend = function(origin, add) { | |
7751 | // Don't do anything if add isn't an object | |
7752 | if (!add || !isObject(add)) return origin; | |
7753 | ||
7754 | var keys = Object.keys(add); | |
7755 | var i = keys.length; | |
7756 | while (i--) { | |
7757 | origin[keys[i]] = add[keys[i]]; | |
7758 | } | |
7759 | return origin; | |
7760 | }; | |
7761 | ||
7762 | function hasOwnProperty(obj, prop) { | |
7763 | return Object.prototype.hasOwnProperty.call(obj, prop); | |
7764 | } | |
7765 | ||
7766 | }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
7767 | },{"./support/isBuffer":28,"_process":14,"inherits":12}],30:[function(require,module,exports){ | |
ebd8d4e8 IC |
7768 | // Base58 encoding/decoding |
7769 | // Originally written by Mike Hearn for BitcoinJ | |
7770 | // Copyright (c) 2011 Google Inc | |
7771 | // Ported to JavaScript by Stefan Thomas | |
7772 | // Merged Buffer refactorings from base58-native by Stephen Pair | |
7773 | // Copyright (c) 2013 BitPay Inc | |
7774 | ||
ebd8d4e8 | 7775 | var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' |
ebd8d4e8 IC |
7776 | var ALPHABET_MAP = {} |
7777 | for(var i = 0; i < ALPHABET.length; i++) { | |
ab78acc6 | 7778 | ALPHABET_MAP[ALPHABET.charAt(i)] = i |
ebd8d4e8 | 7779 | } |
ab78acc6 | 7780 | var BASE = 58 |
ebd8d4e8 IC |
7781 | |
7782 | function encode(buffer) { | |
ab78acc6 IC |
7783 | if (buffer.length === 0) return '' |
7784 | ||
7785 | var i, j, digits = [0] | |
7786 | for (i = 0; i < buffer.length; i++) { | |
7787 | for (j = 0; j < digits.length; j++) digits[j] <<= 8 | |
7788 | ||
7789 | digits[0] += buffer[i] | |
ebd8d4e8 | 7790 | |
ab78acc6 IC |
7791 | var carry = 0 |
7792 | for (j = 0; j < digits.length; ++j) { | |
7793 | digits[j] += carry | |
ebd8d4e8 | 7794 | |
ab78acc6 IC |
7795 | carry = (digits[j] / BASE) | 0 |
7796 | digits[j] %= BASE | |
7797 | } | |
7798 | ||
7799 | while (carry) { | |
7800 | digits.push(carry % BASE) | |
7801 | ||
7802 | carry = (carry / BASE) | 0 | |
7803 | } | |
ebd8d4e8 IC |
7804 | } |
7805 | ||
7806 | // deal with leading zeros | |
ab78acc6 | 7807 | for (i = 0; buffer[i] === 0 && i < buffer.length - 1; i++) digits.push(0) |
ebd8d4e8 | 7808 | |
ab78acc6 IC |
7809 | // convert digits to a string |
7810 | var stringOutput = "" | |
7811 | for (var i = digits.length - 1; i >= 0; i--) { | |
7812 | stringOutput = stringOutput + ALPHABET[digits[i]] | |
7813 | } | |
7814 | return stringOutput | |
ebd8d4e8 IC |
7815 | } |
7816 | ||
7817 | function decode(string) { | |
ab78acc6 | 7818 | if (string.length === 0) return [] |
ebd8d4e8 | 7819 | |
ab78acc6 IC |
7820 | var i, j, bytes = [0] |
7821 | for (i = 0; i < string.length; i++) { | |
7822 | var c = string[i] | |
7823 | if (!(c in ALPHABET_MAP)) throw new Error('Non-base58 character') | |
ebd8d4e8 | 7824 | |
ab78acc6 IC |
7825 | for (j = 0; j < bytes.length; j++) bytes[j] *= BASE |
7826 | bytes[0] += ALPHABET_MAP[c] | |
ebd8d4e8 | 7827 | |
ab78acc6 IC |
7828 | var carry = 0 |
7829 | for (j = 0; j < bytes.length; ++j) { | |
7830 | bytes[j] += carry | |
ebd8d4e8 | 7831 | |
ab78acc6 IC |
7832 | carry = bytes[j] >> 8 |
7833 | bytes[j] &= 0xff | |
7834 | } | |
ebd8d4e8 | 7835 | |
ab78acc6 IC |
7836 | while (carry) { |
7837 | bytes.push(carry & 0xff) | |
7838 | ||
7839 | carry >>= 8 | |
7840 | } | |
ebd8d4e8 IC |
7841 | } |
7842 | ||
ab78acc6 IC |
7843 | // deal with leading zeros |
7844 | for (i = 0; string[i] === '1' && i < string.length - 1; i++) bytes.push(0) | |
ebd8d4e8 | 7845 | |
ab78acc6 | 7846 | return bytes.reverse() |
ebd8d4e8 IC |
7847 | } |
7848 | ||
7849 | module.exports = { | |
7850 | encode: encode, | |
7851 | decode: decode | |
7852 | } | |
7853 | ||
ab78acc6 | 7854 | },{}],31:[function(require,module,exports){ |
ebd8d4e8 | 7855 | (function (Buffer){ |
ab78acc6 IC |
7856 | 'use strict' |
7857 | ||
7858 | var base58 = require('bs58') | |
7859 | var createHash = require('create-hash') | |
7860 | ||
7861 | // SHA256(SHA256(buffer)) | |
7862 | function sha256x2 (buffer) { | |
7863 | buffer = createHash('sha256').update(buffer).digest() | |
7864 | return createHash('sha256').update(buffer).digest() | |
7865 | } | |
7866 | ||
7867 | // Encode a buffer as a base58-check encoded string | |
7868 | function encode (payload) { | |
7869 | var checksum = sha256x2(payload).slice(0, 4) | |
7870 | ||
7871 | return base58.encode(Buffer.concat([ | |
7872 | payload, | |
7873 | checksum | |
7874 | ])) | |
7875 | } | |
7876 | ||
7877 | // Decode a base58-check encoded string to a buffer | |
7878 | function decode (string) { | |
7879 | var buffer = new Buffer(base58.decode(string)) | |
7880 | ||
7881 | var payload = buffer.slice(0, -4) | |
7882 | var checksum = buffer.slice(-4) | |
7883 | var newChecksum = sha256x2(payload).slice(0, 4) | |
7884 | ||
7885 | for (var i = 0; i < newChecksum.length; ++i) { | |
7886 | if (newChecksum[i] === checksum[i]) continue | |
7887 | ||
7888 | throw new Error('Invalid checksum') | |
ebd8d4e8 | 7889 | } |
ab78acc6 IC |
7890 | |
7891 | return payload | |
ebd8d4e8 IC |
7892 | } |
7893 | ||
ab78acc6 IC |
7894 | module.exports = { |
7895 | encode: encode, | |
7896 | decode: decode | |
ebd8d4e8 IC |
7897 | } |
7898 | ||
ab78acc6 IC |
7899 | }).call(this,require("buffer").Buffer) |
7900 | },{"bs58":30,"buffer":7,"create-hash":32}],32:[function(require,module,exports){ | |
ebd8d4e8 | 7901 | (function (Buffer){ |
ab78acc6 IC |
7902 | 'use strict'; |
7903 | var inherits = require('inherits') | |
7904 | var md5 = require('./md5') | |
7905 | var rmd160 = require('ripemd160') | |
7906 | var sha = require('sha.js') | |
ebd8d4e8 | 7907 | |
ab78acc6 | 7908 | var Transform = require('stream').Transform |
ebd8d4e8 | 7909 | |
ab78acc6 IC |
7910 | function HashNoConstructor(hash) { |
7911 | Transform.call(this) | |
ebd8d4e8 | 7912 | |
ab78acc6 IC |
7913 | this._hash = hash |
7914 | this.buffers = [] | |
7915 | } | |
ebd8d4e8 | 7916 | |
ab78acc6 | 7917 | inherits(HashNoConstructor, Transform) |
ebd8d4e8 | 7918 | |
ab78acc6 IC |
7919 | HashNoConstructor.prototype._transform = function (data, _, next) { |
7920 | this.buffers.push(data) | |
ebd8d4e8 | 7921 | |
ab78acc6 IC |
7922 | next() |
7923 | } | |
ebd8d4e8 | 7924 | |
ab78acc6 IC |
7925 | HashNoConstructor.prototype._flush = function (next) { |
7926 | this.push(this.digest()) | |
7927 | next() | |
7928 | } | |
7929 | ||
7930 | HashNoConstructor.prototype.update = function (data, enc) { | |
7931 | if (typeof data === 'string') { | |
7932 | data = new Buffer(data, enc) | |
ebd8d4e8 IC |
7933 | } |
7934 | ||
ab78acc6 IC |
7935 | this.buffers.push(data) |
7936 | return this | |
7937 | } | |
7938 | ||
7939 | HashNoConstructor.prototype.digest = function (enc) { | |
7940 | var buf = Buffer.concat(this.buffers) | |
7941 | var r = this._hash(buf) | |
7942 | this.buffers = null | |
7943 | ||
7944 | return enc ? r.toString(enc) : r | |
7945 | } | |
7946 | ||
7947 | function Hash(hash) { | |
7948 | Transform.call(this) | |
7949 | ||
7950 | this._hash = hash | |
7951 | } | |
7952 | ||
7953 | inherits(Hash, Transform) | |
7954 | ||
7955 | Hash.prototype._transform = function (data, enc, next) { | |
7956 | if (enc) data = new Buffer(data, enc) | |
7957 | ||
7958 | this._hash.update(data) | |
7959 | ||
7960 | next() | |
ebd8d4e8 IC |
7961 | } |
7962 | ||
ab78acc6 IC |
7963 | Hash.prototype._flush = function (next) { |
7964 | this.push(this._hash.digest()) | |
7965 | this._hash = null | |
7966 | ||
7967 | next() | |
7968 | } | |
7969 | ||
7970 | Hash.prototype.update = function (data, enc) { | |
7971 | if (typeof data === 'string') { | |
7972 | data = new Buffer(data, enc) | |
7973 | } | |
7974 | ||
7975 | this._hash.update(data) | |
ebd8d4e8 IC |
7976 | return this |
7977 | } | |
7978 | ||
ab78acc6 IC |
7979 | Hash.prototype.digest = function (enc) { |
7980 | var outData = this._hash.digest() | |
7981 | ||
7982 | return enc ? outData.toString(enc) : outData | |
ebd8d4e8 IC |
7983 | } |
7984 | ||
ab78acc6 IC |
7985 | module.exports = function createHash (alg) { |
7986 | if ('md5' === alg) return new HashNoConstructor(md5) | |
7987 | if ('rmd160' === alg) return new HashNoConstructor(rmd160) | |
7988 | ||
7989 | return new Hash(sha(alg)) | |
7990 | } | |
ebd8d4e8 | 7991 | |
ab78acc6 IC |
7992 | }).call(this,require("buffer").Buffer) |
7993 | },{"./md5":34,"buffer":7,"inherits":35,"ripemd160":36,"sha.js":38,"stream":26}],33:[function(require,module,exports){ | |
ebd8d4e8 | 7994 | (function (Buffer){ |
ab78acc6 | 7995 | 'use strict'; |
ebd8d4e8 IC |
7996 | var intSize = 4; |
7997 | var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0); | |
7998 | var chrsz = 8; | |
7999 | ||
8000 | function toArray(buf, bigEndian) { | |
8001 | if ((buf.length % intSize) !== 0) { | |
8002 | var len = buf.length + (intSize - (buf.length % intSize)); | |
8003 | buf = Buffer.concat([buf, zeroBuffer], len); | |
8004 | } | |
8005 | ||
8006 | var arr = []; | |
8007 | var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE; | |
8008 | for (var i = 0; i < buf.length; i += intSize) { | |
8009 | arr.push(fn.call(buf, i)); | |
8010 | } | |
8011 | return arr; | |
8012 | } | |
8013 | ||
8014 | function toBuffer(arr, size, bigEndian) { | |
8015 | var buf = new Buffer(size); | |
8016 | var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE; | |
8017 | for (var i = 0; i < arr.length; i++) { | |
8018 | fn.call(buf, arr[i], i * 4, true); | |
8019 | } | |
8020 | return buf; | |
8021 | } | |
8022 | ||
8023 | function hash(buf, fn, hashSize, bigEndian) { | |
8024 | if (!Buffer.isBuffer(buf)) buf = new Buffer(buf); | |
8025 | var arr = fn(toArray(buf, bigEndian), buf.length * chrsz); | |
8026 | return toBuffer(arr, hashSize, bigEndian); | |
8027 | } | |
ab78acc6 IC |
8028 | exports.hash = hash; |
8029 | }).call(this,require("buffer").Buffer) | |
8030 | },{"buffer":7}],34:[function(require,module,exports){ | |
8031 | 'use strict'; | |
ebd8d4e8 IC |
8032 | /* |
8033 | * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message | |
8034 | * Digest Algorithm, as defined in RFC 1321. | |
8035 | * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. | |
8036 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |
8037 | * Distributed under the BSD License | |
8038 | * See http://pajhome.org.uk/crypt/md5 for more info. | |
8039 | */ | |
8040 | ||
ab78acc6 | 8041 | var helpers = require('./helpers'); |
ebd8d4e8 IC |
8042 | |
8043 | /* | |
8044 | * Calculate the MD5 of an array of little-endian words, and a bit length | |
8045 | */ | |
8046 | function core_md5(x, len) | |
8047 | { | |
8048 | /* append padding */ | |
8049 | x[len >> 5] |= 0x80 << ((len) % 32); | |
8050 | x[(((len + 64) >>> 9) << 4) + 14] = len; | |
8051 | ||
8052 | var a = 1732584193; | |
8053 | var b = -271733879; | |
8054 | var c = -1732584194; | |
8055 | var d = 271733878; | |
8056 | ||
8057 | for(var i = 0; i < x.length; i += 16) | |
8058 | { | |
8059 | var olda = a; | |
8060 | var oldb = b; | |
8061 | var oldc = c; | |
8062 | var oldd = d; | |
8063 | ||
8064 | a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); | |
8065 | d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); | |
8066 | c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); | |
8067 | b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); | |
8068 | a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); | |
8069 | d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); | |
8070 | c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); | |
8071 | b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); | |
8072 | a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); | |
8073 | d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); | |
8074 | c = md5_ff(c, d, a, b, x[i+10], 17, -42063); | |
8075 | b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); | |
8076 | a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); | |
8077 | d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); | |
8078 | c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); | |
8079 | b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); | |
8080 | ||
8081 | a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); | |
8082 | d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); | |
8083 | c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); | |
8084 | b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); | |
8085 | a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); | |
8086 | d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); | |
8087 | c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); | |
8088 | b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); | |
8089 | a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); | |
8090 | d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); | |
8091 | c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); | |
8092 | b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); | |
8093 | a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); | |
8094 | d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); | |
8095 | c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); | |
8096 | b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); | |
8097 | ||
8098 | a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); | |
8099 | d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); | |
8100 | c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); | |
8101 | b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); | |
8102 | a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); | |
8103 | d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); | |
8104 | c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); | |
8105 | b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); | |
8106 | a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); | |
8107 | d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); | |
8108 | c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); | |
8109 | b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); | |
8110 | a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); | |
8111 | d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); | |
8112 | c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); | |
8113 | b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); | |
8114 | ||
8115 | a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); | |
8116 | d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); | |
8117 | c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); | |
8118 | b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); | |
8119 | a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); | |
8120 | d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); | |
8121 | c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); | |
8122 | b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); | |
8123 | a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); | |
8124 | d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); | |
8125 | c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); | |
8126 | b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); | |
8127 | a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); | |
8128 | d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); | |
8129 | c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); | |
8130 | b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); | |
8131 | ||
8132 | a = safe_add(a, olda); | |
8133 | b = safe_add(b, oldb); | |
8134 | c = safe_add(c, oldc); | |
8135 | d = safe_add(d, oldd); | |
8136 | } | |
8137 | return Array(a, b, c, d); | |
8138 | ||
8139 | } | |
8140 | ||
8141 | /* | |
8142 | * These functions implement the four basic operations the algorithm uses. | |
8143 | */ | |
8144 | function md5_cmn(q, a, b, x, s, t) | |
8145 | { | |
8146 | return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); | |
8147 | } | |
8148 | function md5_ff(a, b, c, d, x, s, t) | |
8149 | { | |
8150 | return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); | |
8151 | } | |
8152 | function md5_gg(a, b, c, d, x, s, t) | |
8153 | { | |
8154 | return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); | |
8155 | } | |
8156 | function md5_hh(a, b, c, d, x, s, t) | |
8157 | { | |
8158 | return md5_cmn(b ^ c ^ d, a, b, x, s, t); | |
8159 | } | |
8160 | function md5_ii(a, b, c, d, x, s, t) | |
8161 | { | |
8162 | return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); | |
8163 | } | |
8164 | ||
8165 | /* | |
8166 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally | |
8167 | * to work around bugs in some JS interpreters. | |
8168 | */ | |
8169 | function safe_add(x, y) | |
8170 | { | |
8171 | var lsw = (x & 0xFFFF) + (y & 0xFFFF); | |
8172 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); | |
8173 | return (msw << 16) | (lsw & 0xFFFF); | |
8174 | } | |
8175 | ||
8176 | /* | |
8177 | * Bitwise rotate a 32-bit number to the left. | |
8178 | */ | |
8179 | function bit_rol(num, cnt) | |
8180 | { | |
8181 | return (num << cnt) | (num >>> (32 - cnt)); | |
8182 | } | |
8183 | ||
8184 | module.exports = function md5(buf) { | |
8185 | return helpers.hash(buf, core_md5, 16); | |
8186 | }; | |
ab78acc6 IC |
8187 | },{"./helpers":33}],35:[function(require,module,exports){ |
8188 | arguments[4][12][0].apply(exports,arguments) | |
8189 | },{"dup":12}],36:[function(require,module,exports){ | |
ebd8d4e8 | 8190 | (function (Buffer){ |
ebd8d4e8 IC |
8191 | /* |
8192 | CryptoJS v3.1.2 | |
8193 | code.google.com/p/crypto-js | |
8194 | (c) 2009-2013 by Jeff Mott. All rights reserved. | |
8195 | code.google.com/p/crypto-js/wiki/License | |
8196 | */ | |
8197 | /** @preserve | |
8198 | (c) 2012 by Cédric Mesnil. All rights reserved. | |
8199 | ||
8200 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: | |
8201 | ||
8202 | - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. | |
8203 | - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. | |
8204 | ||
8205 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
8206 | */ | |
8207 | ||
ab78acc6 | 8208 | // constants table |
ebd8d4e8 | 8209 | var zl = [ |
ab78acc6 IC |
8210 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
8211 | 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, | |
8212 | 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, | |
8213 | 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, | |
8214 | 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 | |
8215 | ] | |
8216 | ||
ebd8d4e8 | 8217 | var zr = [ |
ab78acc6 IC |
8218 | 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, |
8219 | 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, | |
8220 | 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, | |
8221 | 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, | |
8222 | 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 | |
8223 | ] | |
8224 | ||
ebd8d4e8 | 8225 | var sl = [ |
ab78acc6 IC |
8226 | 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, |
8227 | 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, | |
8228 | 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, | |
8229 | 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, | |
8230 | 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 | |
8231 | ] | |
8232 | ||
ebd8d4e8 | 8233 | var sr = [ |
ab78acc6 IC |
8234 | 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, |
8235 | 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, | |
8236 | 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, | |
8237 | 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, | |
8238 | 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 | |
8239 | ] | |
ebd8d4e8 | 8240 | |
ab78acc6 IC |
8241 | var hl = [0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E] |
8242 | var hr = [0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000] | |
ebd8d4e8 | 8243 | |
ab78acc6 IC |
8244 | function bytesToWords (bytes) { |
8245 | var words = [] | |
ebd8d4e8 | 8246 | for (var i = 0, b = 0; i < bytes.length; i++, b += 8) { |
ab78acc6 | 8247 | words[b >>> 5] |= bytes[i] << (24 - b % 32) |
ebd8d4e8 | 8248 | } |
ab78acc6 IC |
8249 | return words |
8250 | } | |
ebd8d4e8 | 8251 | |
ab78acc6 IC |
8252 | function wordsToBytes (words) { |
8253 | var bytes = [] | |
ebd8d4e8 | 8254 | for (var b = 0; b < words.length * 32; b += 8) { |
ab78acc6 | 8255 | bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF) |
ebd8d4e8 | 8256 | } |
ab78acc6 IC |
8257 | return bytes |
8258 | } | |
ebd8d4e8 | 8259 | |
ab78acc6 IC |
8260 | function processBlock (H, M, offset) { |
8261 | // swap endian | |
ebd8d4e8 | 8262 | for (var i = 0; i < 16; i++) { |
ab78acc6 IC |
8263 | var offset_i = offset + i |
8264 | var M_offset_i = M[offset_i] | |
ebd8d4e8 IC |
8265 | |
8266 | // Swap | |
8267 | M[offset_i] = ( | |
ab78acc6 IC |
8268 | (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | |
8269 | (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) | |
8270 | ) | |
ebd8d4e8 IC |
8271 | } |
8272 | ||
8273 | // Working variables | |
ab78acc6 IC |
8274 | var al, bl, cl, dl, el |
8275 | var ar, br, cr, dr, er | |
8276 | ||
8277 | ar = al = H[0] | |
8278 | br = bl = H[1] | |
8279 | cr = cl = H[2] | |
8280 | dr = dl = H[3] | |
8281 | er = el = H[4] | |
8282 | ||
8283 | // computation | |
8284 | var t | |
8285 | for (i = 0; i < 80; i += 1) { | |
8286 | t = (al + M[offset + zl[i]]) | 0 | |
8287 | if (i < 16) { | |
8288 | t += f1(bl, cl, dl) + hl[0] | |
8289 | } else if (i < 32) { | |
8290 | t += f2(bl, cl, dl) + hl[1] | |
8291 | } else if (i < 48) { | |
8292 | t += f3(bl, cl, dl) + hl[2] | |
8293 | } else if (i < 64) { | |
8294 | t += f4(bl, cl, dl) + hl[3] | |
ebd8d4e8 | 8295 | } else {// if (i<80) { |
ab78acc6 IC |
8296 | t += f5(bl, cl, dl) + hl[4] |
8297 | } | |
8298 | t = t | 0 | |
8299 | t = rotl(t, sl[i]) | |
8300 | t = (t + el) | 0 | |
8301 | al = el | |
8302 | el = dl | |
8303 | dl = rotl(cl, 10) | |
8304 | cl = bl | |
8305 | bl = t | |
8306 | ||
8307 | t = (ar + M[offset + zr[i]]) | 0 | |
8308 | if (i < 16) { | |
8309 | t += f5(br, cr, dr) + hr[0] | |
8310 | } else if (i < 32) { | |
8311 | t += f4(br, cr, dr) + hr[1] | |
8312 | } else if (i < 48) { | |
8313 | t += f3(br, cr, dr) + hr[2] | |
8314 | } else if (i < 64) { | |
8315 | t += f2(br, cr, dr) + hr[3] | |
ebd8d4e8 | 8316 | } else {// if (i<80) { |
ab78acc6 | 8317 | t += f1(br, cr, dr) + hr[4] |
ebd8d4e8 | 8318 | } |
ebd8d4e8 | 8319 | |
ab78acc6 IC |
8320 | t = t | 0 |
8321 | t = rotl(t, sr[i]) | |
8322 | t = (t + er) | 0 | |
8323 | ar = er | |
8324 | er = dr | |
8325 | dr = rotl(cr, 10) | |
8326 | cr = br | |
8327 | br = t | |
8328 | } | |
8329 | ||
8330 | // intermediate hash value | |
8331 | t = (H[1] + cl + dr) | 0 | |
8332 | H[1] = (H[2] + dl + er) | 0 | |
8333 | H[2] = (H[3] + el + ar) | 0 | |
8334 | H[3] = (H[4] + al + br) | 0 | |
8335 | H[4] = (H[0] + bl + cr) | 0 | |
8336 | H[0] = t | |
ebd8d4e8 IC |
8337 | } |
8338 | ||
ab78acc6 IC |
8339 | function f1 (x, y, z) { |
8340 | return ((x) ^ (y) ^ (z)) | |
ebd8d4e8 IC |
8341 | } |
8342 | ||
ab78acc6 IC |
8343 | function f2 (x, y, z) { |
8344 | return (((x) & (y)) | ((~x) & (z))) | |
ebd8d4e8 IC |
8345 | } |
8346 | ||
ab78acc6 IC |
8347 | function f3 (x, y, z) { |
8348 | return (((x) | (~(y))) ^ (z)) | |
ebd8d4e8 IC |
8349 | } |
8350 | ||
ab78acc6 IC |
8351 | function f4 (x, y, z) { |
8352 | return (((x) & (z)) | ((y) & (~(z)))) | |
ebd8d4e8 IC |
8353 | } |
8354 | ||
ab78acc6 IC |
8355 | function f5 (x, y, z) { |
8356 | return ((x) ^ ((y) | (~(z)))) | |
ebd8d4e8 IC |
8357 | } |
8358 | ||
ab78acc6 IC |
8359 | function rotl (x, n) { |
8360 | return (x << n) | (x >>> (32 - n)) | |
8361 | } | |
8362 | ||
8363 | function ripemd160 (message) { | |
8364 | var H = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0] | |
ebd8d4e8 | 8365 | |
ab78acc6 IC |
8366 | if (typeof message === 'string') { |
8367 | message = new Buffer(message, 'utf8') | |
8368 | } | |
ebd8d4e8 | 8369 | |
ab78acc6 | 8370 | var m = bytesToWords(message) |
ebd8d4e8 | 8371 | |
ab78acc6 IC |
8372 | var nBitsLeft = message.length * 8 |
8373 | var nBitsTotal = message.length * 8 | |
ebd8d4e8 IC |
8374 | |
8375 | // Add padding | |
ab78acc6 | 8376 | m[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32) |
ebd8d4e8 | 8377 | m[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( |
ab78acc6 IC |
8378 | (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | |
8379 | (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) | |
8380 | ) | |
ebd8d4e8 | 8381 | |
ab78acc6 IC |
8382 | for (var i = 0; i < m.length; i += 16) { |
8383 | processBlock(H, m, i) | |
ebd8d4e8 IC |
8384 | } |
8385 | ||
ab78acc6 IC |
8386 | // swap endian |
8387 | for (i = 0; i < 5; i++) { | |
8388 | // shortcut | |
8389 | var H_i = H[i] | |
ebd8d4e8 IC |
8390 | |
8391 | // Swap | |
ab78acc6 IC |
8392 | H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | |
8393 | (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00) | |
ebd8d4e8 IC |
8394 | } |
8395 | ||
ab78acc6 IC |
8396 | var digestbytes = wordsToBytes(H) |
8397 | return new Buffer(digestbytes) | |
ebd8d4e8 IC |
8398 | } |
8399 | ||
ab78acc6 IC |
8400 | module.exports = ripemd160 |
8401 | ||
8402 | }).call(this,require("buffer").Buffer) | |
8403 | },{"buffer":7}],37:[function(require,module,exports){ | |
8404 | (function (Buffer){ | |
8405 | // prototype class for hash functions | |
8406 | function Hash (blockSize, finalSize) { | |
8407 | this._block = new Buffer(blockSize) | |
8408 | this._finalSize = finalSize | |
8409 | this._blockSize = blockSize | |
8410 | this._len = 0 | |
8411 | this._s = 0 | |
8412 | } | |
ebd8d4e8 | 8413 | |
ab78acc6 IC |
8414 | Hash.prototype.update = function (data, enc) { |
8415 | if (typeof data === 'string') { | |
8416 | enc = enc || 'utf8' | |
8417 | data = new Buffer(data, enc) | |
8418 | } | |
ebd8d4e8 | 8419 | |
ab78acc6 IC |
8420 | var l = this._len += data.length |
8421 | var s = this._s || 0 | |
8422 | var f = 0 | |
8423 | var buffer = this._block | |
ebd8d4e8 | 8424 | |
ab78acc6 IC |
8425 | while (s < l) { |
8426 | var t = Math.min(data.length, f + this._blockSize - (s % this._blockSize)) | |
8427 | var ch = (t - f) | |
ebd8d4e8 | 8428 | |
ab78acc6 IC |
8429 | for (var i = 0; i < ch; i++) { |
8430 | buffer[(s % this._blockSize) + i] = data[i + f] | |
8431 | } | |
8432 | ||
8433 | s += ch | |
8434 | f += ch | |
ebd8d4e8 | 8435 | |
ab78acc6 IC |
8436 | if ((s % this._blockSize) === 0) { |
8437 | this._update(buffer) | |
8438 | } | |
ebd8d4e8 | 8439 | } |
ab78acc6 IC |
8440 | this._s = s |
8441 | ||
8442 | return this | |
8443 | } | |
ebd8d4e8 | 8444 | |
ab78acc6 IC |
8445 | Hash.prototype.digest = function (enc) { |
8446 | // Suppose the length of the message M, in bits, is l | |
8447 | var l = this._len * 8 | |
8448 | ||
8449 | // Append the bit 1 to the end of the message | |
8450 | this._block[this._len % this._blockSize] = 0x80 | |
8451 | ||
8452 | // and then k zero bits, where k is the smallest non-negative solution to the equation (l + 1 + k) === finalSize mod blockSize | |
8453 | this._block.fill(0, this._len % this._blockSize + 1) | |
8454 | ||
8455 | if (l % (this._blockSize * 8) >= this._finalSize * 8) { | |
8456 | this._update(this._block) | |
8457 | this._block.fill(0) | |
ebd8d4e8 IC |
8458 | } |
8459 | ||
ab78acc6 IC |
8460 | // to this append the block which is equal to the number l written in binary |
8461 | // TODO: handle case where l is > Math.pow(2, 29) | |
8462 | this._block.writeInt32BE(l, this._blockSize - 4) | |
8463 | ||
8464 | var hash = this._update(this._block) || this._hash() | |
ebd8d4e8 | 8465 | |
ab78acc6 IC |
8466 | return enc ? hash.toString(enc) : hash |
8467 | } | |
ebd8d4e8 | 8468 | |
ab78acc6 IC |
8469 | Hash.prototype._update = function () { |
8470 | throw new Error('_update must be implemented by subclass') | |
8471 | } | |
ebd8d4e8 | 8472 | |
ab78acc6 | 8473 | module.exports = Hash |
ebd8d4e8 | 8474 | |
ab78acc6 IC |
8475 | }).call(this,require("buffer").Buffer) |
8476 | },{"buffer":7}],38:[function(require,module,exports){ | |
8477 | var exports = module.exports = function SHA (algorithm) { | |
8478 | algorithm = algorithm.toLowerCase() | |
ebd8d4e8 | 8479 | |
ab78acc6 IC |
8480 | var Algorithm = exports[algorithm] |
8481 | if (!Algorithm) throw new Error(algorithm + ' is not supported (we accept pull requests)') | |
ebd8d4e8 | 8482 | |
ab78acc6 IC |
8483 | return new Algorithm() |
8484 | } | |
8485 | ||
8486 | exports.sha = require('./sha') | |
8487 | exports.sha1 = require('./sha1') | |
8488 | exports.sha224 = require('./sha224') | |
8489 | exports.sha256 = require('./sha256') | |
8490 | exports.sha384 = require('./sha384') | |
8491 | exports.sha512 = require('./sha512') | |
8492 | ||
8493 | },{"./sha":39,"./sha1":40,"./sha224":41,"./sha256":42,"./sha384":43,"./sha512":44}],39:[function(require,module,exports){ | |
8494 | (function (Buffer){ | |
8495 | /* | |
8496 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-0, as defined | |
8497 | * in FIPS PUB 180-1 | |
8498 | * This source code is derived from sha1.js of the same repository. | |
8499 | * The difference between SHA-0 and SHA-1 is just a bitwise rotate left | |
8500 | * operation was added. | |
8501 | */ | |
ebd8d4e8 | 8502 | |
ab78acc6 IC |
8503 | var inherits = require('inherits') |
8504 | var Hash = require('./hash') | |
ebd8d4e8 | 8505 | |
ab78acc6 | 8506 | var W = new Array(80) |
ebd8d4e8 | 8507 | |
ab78acc6 IC |
8508 | function Sha () { |
8509 | this.init() | |
8510 | this._w = W | |
ebd8d4e8 | 8511 | |
ab78acc6 IC |
8512 | Hash.call(this, 64, 56) |
8513 | } | |
ebd8d4e8 | 8514 | |
ab78acc6 | 8515 | inherits(Sha, Hash) |
ebd8d4e8 | 8516 | |
ab78acc6 IC |
8517 | Sha.prototype.init = function () { |
8518 | this._a = 0x67452301 | 0 | |
8519 | this._b = 0xefcdab89 | 0 | |
8520 | this._c = 0x98badcfe | 0 | |
8521 | this._d = 0x10325476 | 0 | |
8522 | this._e = 0xc3d2e1f0 | 0 | |
ebd8d4e8 | 8523 | |
ab78acc6 IC |
8524 | return this |
8525 | } | |
8526 | ||
8527 | /* | |
8528 | * Bitwise rotate a 32-bit number to the left. | |
8529 | */ | |
8530 | function rol (num, cnt) { | |
8531 | return (num << cnt) | (num >>> (32 - cnt)) | |
8532 | } | |
8533 | ||
8534 | Sha.prototype._update = function (M) { | |
8535 | var W = this._w | |
8536 | ||
8537 | var a = this._a | |
8538 | var b = this._b | |
8539 | var c = this._c | |
8540 | var d = this._d | |
8541 | var e = this._e | |
ebd8d4e8 | 8542 | |
ab78acc6 IC |
8543 | var j = 0, k |
8544 | ||
8545 | /* | |
8546 | * SHA-1 has a bitwise rotate left operation. But, SHA is not | |
8547 | * function calcW() { return rol(W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16], 1) } | |
8548 | */ | |
8549 | function calcW () { return W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16] } | |
8550 | function loop (w, f) { | |
8551 | W[j] = w | |
8552 | ||
8553 | var t = rol(a, 5) + f + e + w + k | |
8554 | ||
8555 | e = d | |
8556 | d = c | |
8557 | c = rol(b, 30) | |
8558 | b = a | |
8559 | a = t | |
8560 | j++ | |
ebd8d4e8 IC |
8561 | } |
8562 | ||
ab78acc6 IC |
8563 | k = 1518500249 |
8564 | while (j < 16) loop(M.readInt32BE(j * 4), (b & c) | ((~b) & d)) | |
8565 | while (j < 20) loop(calcW(), (b & c) | ((~b) & d)) | |
8566 | k = 1859775393 | |
8567 | while (j < 40) loop(calcW(), b ^ c ^ d) | |
8568 | k = -1894007588 | |
8569 | while (j < 60) loop(calcW(), (b & c) | (b & d) | (c & d)) | |
8570 | k = -899497514 | |
8571 | while (j < 80) loop(calcW(), b ^ c ^ d) | |
8572 | ||
8573 | this._a = (a + this._a) | 0 | |
8574 | this._b = (b + this._b) | 0 | |
8575 | this._c = (c + this._c) | 0 | |
8576 | this._d = (d + this._d) | 0 | |
8577 | this._e = (e + this._e) | 0 | |
ebd8d4e8 IC |
8578 | } |
8579 | ||
ab78acc6 IC |
8580 | Sha.prototype._hash = function () { |
8581 | var H = new Buffer(20) | |
8582 | ||
8583 | H.writeInt32BE(this._a | 0, 0) | |
8584 | H.writeInt32BE(this._b | 0, 4) | |
8585 | H.writeInt32BE(this._c | 0, 8) | |
8586 | H.writeInt32BE(this._d | 0, 12) | |
8587 | H.writeInt32BE(this._e | 0, 16) | |
8588 | ||
8589 | return H | |
ebd8d4e8 IC |
8590 | } |
8591 | ||
ab78acc6 | 8592 | module.exports = Sha |
ebd8d4e8 | 8593 | |
ebd8d4e8 | 8594 | |
ab78acc6 IC |
8595 | }).call(this,require("buffer").Buffer) |
8596 | },{"./hash":37,"buffer":7,"inherits":35}],40:[function(require,module,exports){ | |
8597 | (function (Buffer){ | |
ebd8d4e8 IC |
8598 | /* |
8599 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined | |
8600 | * in FIPS PUB 180-1 | |
8601 | * Version 2.1a Copyright Paul Johnston 2000 - 2002. | |
8602 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |
8603 | * Distributed under the BSD License | |
8604 | * See http://pajhome.org.uk/crypt/md5 for details. | |
8605 | */ | |
ebd8d4e8 | 8606 | |
ab78acc6 IC |
8607 | var inherits = require('inherits') |
8608 | var Hash = require('./hash') | |
ebd8d4e8 | 8609 | |
ab78acc6 | 8610 | var W = new Array(80) |
ebd8d4e8 | 8611 | |
ab78acc6 IC |
8612 | function Sha1 () { |
8613 | this.init() | |
8614 | this._w = W | |
ebd8d4e8 | 8615 | |
ab78acc6 IC |
8616 | Hash.call(this, 64, 56) |
8617 | } | |
ebd8d4e8 | 8618 | |
ab78acc6 | 8619 | inherits(Sha1, Hash) |
ebd8d4e8 | 8620 | |
ab78acc6 IC |
8621 | Sha1.prototype.init = function () { |
8622 | this._a = 0x67452301 | 0 | |
8623 | this._b = 0xefcdab89 | 0 | |
8624 | this._c = 0x98badcfe | 0 | |
8625 | this._d = 0x10325476 | 0 | |
8626 | this._e = 0xc3d2e1f0 | 0 | |
ebd8d4e8 | 8627 | |
ab78acc6 IC |
8628 | return this |
8629 | } | |
ebd8d4e8 | 8630 | |
ab78acc6 IC |
8631 | /* |
8632 | * Bitwise rotate a 32-bit number to the left. | |
8633 | */ | |
8634 | function rol (num, cnt) { | |
8635 | return (num << cnt) | (num >>> (32 - cnt)) | |
8636 | } | |
ebd8d4e8 | 8637 | |
ab78acc6 IC |
8638 | Sha1.prototype._update = function (M) { |
8639 | var W = this._w | |
ebd8d4e8 | 8640 | |
ab78acc6 IC |
8641 | var a = this._a |
8642 | var b = this._b | |
8643 | var c = this._c | |
8644 | var d = this._d | |
8645 | var e = this._e | |
ebd8d4e8 | 8646 | |
ab78acc6 | 8647 | var j = 0, k |
ebd8d4e8 | 8648 | |
ab78acc6 IC |
8649 | function calcW () { return rol(W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16], 1) } |
8650 | function loop (w, f) { | |
8651 | W[j] = w | |
ebd8d4e8 | 8652 | |
ab78acc6 | 8653 | var t = rol(a, 5) + f + e + w + k |
ebd8d4e8 | 8654 | |
ab78acc6 IC |
8655 | e = d |
8656 | d = c | |
8657 | c = rol(b, 30) | |
8658 | b = a | |
8659 | a = t | |
8660 | j++ | |
ebd8d4e8 IC |
8661 | } |
8662 | ||
ab78acc6 IC |
8663 | k = 1518500249 |
8664 | while (j < 16) loop(M.readInt32BE(j * 4), (b & c) | ((~b) & d)) | |
8665 | while (j < 20) loop(calcW(), (b & c) | ((~b) & d)) | |
8666 | k = 1859775393 | |
8667 | while (j < 40) loop(calcW(), b ^ c ^ d) | |
8668 | k = -1894007588 | |
8669 | while (j < 60) loop(calcW(), (b & c) | (b & d) | (c & d)) | |
8670 | k = -899497514 | |
8671 | while (j < 80) loop(calcW(), b ^ c ^ d) | |
ebd8d4e8 | 8672 | |
ab78acc6 IC |
8673 | this._a = (a + this._a) | 0 |
8674 | this._b = (b + this._b) | 0 | |
8675 | this._c = (c + this._c) | 0 | |
8676 | this._d = (d + this._d) | 0 | |
8677 | this._e = (e + this._e) | 0 | |
8678 | } | |
ebd8d4e8 | 8679 | |
ab78acc6 IC |
8680 | Sha1.prototype._hash = function () { |
8681 | var H = new Buffer(20) | |
ebd8d4e8 | 8682 | |
ab78acc6 IC |
8683 | H.writeInt32BE(this._a | 0, 0) |
8684 | H.writeInt32BE(this._b | 0, 4) | |
8685 | H.writeInt32BE(this._c | 0, 8) | |
8686 | H.writeInt32BE(this._d | 0, 12) | |
8687 | H.writeInt32BE(this._e | 0, 16) | |
ebd8d4e8 | 8688 | |
ab78acc6 IC |
8689 | return H |
8690 | } | |
ebd8d4e8 | 8691 | |
ab78acc6 | 8692 | module.exports = Sha1 |
ebd8d4e8 | 8693 | |
ab78acc6 IC |
8694 | }).call(this,require("buffer").Buffer) |
8695 | },{"./hash":37,"buffer":7,"inherits":35}],41:[function(require,module,exports){ | |
8696 | (function (Buffer){ | |
8697 | /** | |
8698 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined | |
8699 | * in FIPS 180-2 | |
8700 | * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. | |
8701 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |
8702 | * | |
8703 | */ | |
ebd8d4e8 | 8704 | |
ab78acc6 IC |
8705 | var inherits = require('inherits') |
8706 | var Sha256 = require('./sha256') | |
8707 | var Hash = require('./hash') | |
ebd8d4e8 | 8708 | |
ab78acc6 | 8709 | var W = new Array(64) |
ebd8d4e8 | 8710 | |
ab78acc6 IC |
8711 | function Sha224 () { |
8712 | this.init() | |
ebd8d4e8 | 8713 | |
ab78acc6 | 8714 | this._w = W // new Array(64) |
ebd8d4e8 | 8715 | |
ab78acc6 IC |
8716 | Hash.call(this, 64, 56) |
8717 | } | |
ebd8d4e8 | 8718 | |
ab78acc6 | 8719 | inherits(Sha224, Sha256) |
ebd8d4e8 | 8720 | |
ab78acc6 IC |
8721 | Sha224.prototype.init = function () { |
8722 | this._a = 0xc1059ed8 | 0 | |
8723 | this._b = 0x367cd507 | 0 | |
8724 | this._c = 0x3070dd17 | 0 | |
8725 | this._d = 0xf70e5939 | 0 | |
8726 | this._e = 0xffc00b31 | 0 | |
8727 | this._f = 0x68581511 | 0 | |
8728 | this._g = 0x64f98fa7 | 0 | |
8729 | this._h = 0xbefa4fa4 | 0 | |
8730 | ||
8731 | return this | |
8732 | } | |
8733 | ||
8734 | Sha224.prototype._hash = function () { | |
8735 | var H = new Buffer(28) | |
8736 | ||
8737 | H.writeInt32BE(this._a, 0) | |
8738 | H.writeInt32BE(this._b, 4) | |
8739 | H.writeInt32BE(this._c, 8) | |
8740 | H.writeInt32BE(this._d, 12) | |
8741 | H.writeInt32BE(this._e, 16) | |
8742 | H.writeInt32BE(this._f, 20) | |
8743 | H.writeInt32BE(this._g, 24) | |
8744 | ||
8745 | return H | |
ebd8d4e8 IC |
8746 | } |
8747 | ||
ab78acc6 | 8748 | module.exports = Sha224 |
ebd8d4e8 | 8749 | |
ab78acc6 IC |
8750 | }).call(this,require("buffer").Buffer) |
8751 | },{"./hash":37,"./sha256":42,"buffer":7,"inherits":35}],42:[function(require,module,exports){ | |
8752 | (function (Buffer){ | |
ebd8d4e8 IC |
8753 | /** |
8754 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined | |
8755 | * in FIPS 180-2 | |
8756 | * Version 2.2-beta Copyright Angel Marin, Paul Johnston 2000 - 2009. | |
8757 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet | |
8758 | * | |
8759 | */ | |
8760 | ||
ab78acc6 IC |
8761 | var inherits = require('inherits') |
8762 | var Hash = require('./hash') | |
8763 | ||
8764 | var K = [ | |
8765 | 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, | |
8766 | 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, | |
8767 | 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, | |
8768 | 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, | |
8769 | 0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC, | |
8770 | 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, | |
8771 | 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, | |
8772 | 0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967, | |
8773 | 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, | |
8774 | 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, | |
8775 | 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, | |
8776 | 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, | |
8777 | 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, | |
8778 | 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, | |
8779 | 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, | |
8780 | 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 | |
8781 | ] | |
8782 | ||
8783 | var W = new Array(64) | |
8784 | ||
8785 | function Sha256 () { | |
8786 | this.init() | |
8787 | ||
8788 | this._w = W // new Array(64) | |
8789 | ||
8790 | Hash.call(this, 64, 56) | |
8791 | } | |
8792 | ||
8793 | inherits(Sha256, Hash) | |
8794 | ||
8795 | Sha256.prototype.init = function () { | |
8796 | this._a = 0x6a09e667 | 0 | |
8797 | this._b = 0xbb67ae85 | 0 | |
8798 | this._c = 0x3c6ef372 | 0 | |
8799 | this._d = 0xa54ff53a | 0 | |
8800 | this._e = 0x510e527f | 0 | |
8801 | this._f = 0x9b05688c | 0 | |
8802 | this._g = 0x1f83d9ab | 0 | |
8803 | this._h = 0x5be0cd19 | 0 | |
ebd8d4e8 | 8804 | |
ab78acc6 IC |
8805 | return this |
8806 | } | |
ebd8d4e8 | 8807 | |
ab78acc6 IC |
8808 | function S (X, n) { |
8809 | return (X >>> n) | (X << (32 - n)) | |
8810 | } | |
ebd8d4e8 | 8811 | |
ab78acc6 IC |
8812 | function R (X, n) { |
8813 | return (X >>> n) | |
8814 | } | |
ebd8d4e8 | 8815 | |
ab78acc6 IC |
8816 | function Ch (x, y, z) { |
8817 | return ((x & y) ^ ((~x) & z)) | |
8818 | } | |
ebd8d4e8 | 8819 | |
ab78acc6 IC |
8820 | function Maj (x, y, z) { |
8821 | return ((x & y) ^ (x & z) ^ (y & z)) | |
8822 | } | |
ebd8d4e8 | 8823 | |
ab78acc6 IC |
8824 | function Sigma0256 (x) { |
8825 | return (S(x, 2) ^ S(x, 13) ^ S(x, 22)) | |
8826 | } | |
ebd8d4e8 | 8827 | |
ab78acc6 IC |
8828 | function Sigma1256 (x) { |
8829 | return (S(x, 6) ^ S(x, 11) ^ S(x, 25)) | |
8830 | } | |
ebd8d4e8 | 8831 | |
ab78acc6 IC |
8832 | function Gamma0256 (x) { |
8833 | return (S(x, 7) ^ S(x, 18) ^ R(x, 3)) | |
8834 | } | |
ebd8d4e8 | 8835 | |
ab78acc6 IC |
8836 | function Gamma1256 (x) { |
8837 | return (S(x, 17) ^ S(x, 19) ^ R(x, 10)) | |
8838 | } | |
ebd8d4e8 | 8839 | |
ab78acc6 IC |
8840 | Sha256.prototype._update = function (M) { |
8841 | var W = this._w | |
ebd8d4e8 | 8842 | |
ab78acc6 IC |
8843 | var a = this._a | 0 |
8844 | var b = this._b | 0 | |
8845 | var c = this._c | 0 | |
8846 | var d = this._d | 0 | |
8847 | var e = this._e | 0 | |
8848 | var f = this._f | 0 | |
8849 | var g = this._g | 0 | |
8850 | var h = this._h | 0 | |
ebd8d4e8 | 8851 | |
ab78acc6 | 8852 | var j = 0 |
ebd8d4e8 | 8853 | |
ab78acc6 IC |
8854 | function calcW () { return Gamma1256(W[j - 2]) + W[j - 7] + Gamma0256(W[j - 15]) + W[j - 16] } |
8855 | function loop (w) { | |
8856 | W[j] = w | |
ebd8d4e8 | 8857 | |
ab78acc6 IC |
8858 | var T1 = h + Sigma1256(e) + Ch(e, f, g) + K[j] + w |
8859 | var T2 = Sigma0256(a) + Maj(a, b, c) | |
ebd8d4e8 | 8860 | |
ab78acc6 IC |
8861 | h = g |
8862 | g = f | |
8863 | f = e | |
8864 | e = d + T1 | |
8865 | d = c | |
8866 | c = b | |
8867 | b = a | |
8868 | a = T1 + T2 | |
ebd8d4e8 | 8869 | |
ab78acc6 | 8870 | j++ |
ebd8d4e8 IC |
8871 | } |
8872 | ||
ab78acc6 IC |
8873 | while (j < 16) loop(M.readInt32BE(j * 4)) |
8874 | while (j < 64) loop(calcW()) | |
ebd8d4e8 | 8875 | |
ab78acc6 IC |
8876 | this._a = (a + this._a) | 0 |
8877 | this._b = (b + this._b) | 0 | |
8878 | this._c = (c + this._c) | 0 | |
8879 | this._d = (d + this._d) | 0 | |
8880 | this._e = (e + this._e) | 0 | |
8881 | this._f = (f + this._f) | 0 | |
8882 | this._g = (g + this._g) | 0 | |
8883 | this._h = (h + this._h) | 0 | |
8884 | } | |
ebd8d4e8 | 8885 | |
ab78acc6 IC |
8886 | Sha256.prototype._hash = function () { |
8887 | var H = new Buffer(32) | |
ebd8d4e8 | 8888 | |
ab78acc6 IC |
8889 | H.writeInt32BE(this._a, 0) |
8890 | H.writeInt32BE(this._b, 4) | |
8891 | H.writeInt32BE(this._c, 8) | |
8892 | H.writeInt32BE(this._d, 12) | |
8893 | H.writeInt32BE(this._e, 16) | |
8894 | H.writeInt32BE(this._f, 20) | |
8895 | H.writeInt32BE(this._g, 24) | |
8896 | H.writeInt32BE(this._h, 28) | |
ebd8d4e8 | 8897 | |
ab78acc6 IC |
8898 | return H |
8899 | } | |
ebd8d4e8 | 8900 | |
ab78acc6 | 8901 | module.exports = Sha256 |
ebd8d4e8 | 8902 | |
ab78acc6 IC |
8903 | }).call(this,require("buffer").Buffer) |
8904 | },{"./hash":37,"buffer":7,"inherits":35}],43:[function(require,module,exports){ | |
8905 | (function (Buffer){ | |
8906 | var inherits = require('inherits') | |
8907 | var SHA512 = require('./sha512') | |
8908 | var Hash = require('./hash') | |
ebd8d4e8 | 8909 | |
ab78acc6 | 8910 | var W = new Array(160) |
ebd8d4e8 | 8911 | |
ab78acc6 IC |
8912 | function Sha384 () { |
8913 | this.init() | |
8914 | this._w = W | |
ebd8d4e8 | 8915 | |
ab78acc6 IC |
8916 | Hash.call(this, 128, 112) |
8917 | } | |
ebd8d4e8 | 8918 | |
ab78acc6 | 8919 | inherits(Sha384, SHA512) |
ebd8d4e8 | 8920 | |
ab78acc6 IC |
8921 | Sha384.prototype.init = function () { |
8922 | this._a = 0xcbbb9d5d | 0 | |
8923 | this._b = 0x629a292a | 0 | |
8924 | this._c = 0x9159015a | 0 | |
8925 | this._d = 0x152fecd8 | 0 | |
8926 | this._e = 0x67332667 | 0 | |
8927 | this._f = 0x8eb44a87 | 0 | |
8928 | this._g = 0xdb0c2e0d | 0 | |
8929 | this._h = 0x47b5481d | 0 | |
ebd8d4e8 | 8930 | |
ab78acc6 IC |
8931 | this._al = 0xc1059ed8 | 0 |
8932 | this._bl = 0x367cd507 | 0 | |
8933 | this._cl = 0x3070dd17 | 0 | |
8934 | this._dl = 0xf70e5939 | 0 | |
8935 | this._el = 0xffc00b31 | 0 | |
8936 | this._fl = 0x68581511 | 0 | |
8937 | this._gl = 0x64f98fa7 | 0 | |
8938 | this._hl = 0xbefa4fa4 | 0 | |
ebd8d4e8 | 8939 | |
ab78acc6 | 8940 | return this |
ebd8d4e8 IC |
8941 | } |
8942 | ||
ab78acc6 IC |
8943 | Sha384.prototype._hash = function () { |
8944 | var H = new Buffer(48) | |
ebd8d4e8 | 8945 | |
ab78acc6 IC |
8946 | function writeInt64BE (h, l, offset) { |
8947 | H.writeInt32BE(h, offset) | |
8948 | H.writeInt32BE(l, offset + 4) | |
ebd8d4e8 | 8949 | } |
ebd8d4e8 | 8950 | |
ab78acc6 IC |
8951 | writeInt64BE(this._a, this._al, 0) |
8952 | writeInt64BE(this._b, this._bl, 8) | |
8953 | writeInt64BE(this._c, this._cl, 16) | |
8954 | writeInt64BE(this._d, this._dl, 24) | |
8955 | writeInt64BE(this._e, this._el, 32) | |
8956 | writeInt64BE(this._f, this._fl, 40) | |
8957 | ||
8958 | return H | |
ebd8d4e8 IC |
8959 | } |
8960 | ||
ab78acc6 | 8961 | module.exports = Sha384 |
ebd8d4e8 | 8962 | |
ab78acc6 IC |
8963 | }).call(this,require("buffer").Buffer) |
8964 | },{"./hash":37,"./sha512":44,"buffer":7,"inherits":35}],44:[function(require,module,exports){ | |
ebd8d4e8 | 8965 | (function (Buffer){ |
ab78acc6 IC |
8966 | var inherits = require('inherits') |
8967 | var Hash = require('./hash') | |
8968 | ||
8969 | var K = [ | |
8970 | 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, | |
8971 | 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, | |
8972 | 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, | |
8973 | 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, | |
8974 | 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, | |
8975 | 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, | |
8976 | 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, | |
8977 | 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, | |
8978 | 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, | |
8979 | 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, | |
8980 | 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, | |
8981 | 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, | |
8982 | 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, | |
8983 | 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, | |
8984 | 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, | |
8985 | 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, | |
8986 | 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, | |
8987 | 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, | |
8988 | 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, | |
8989 | 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, | |
8990 | 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, | |
8991 | 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, | |
8992 | 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, | |
8993 | 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, | |
8994 | 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, | |
8995 | 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, | |
8996 | 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, | |
8997 | 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, | |
8998 | 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, | |
8999 | 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, | |
9000 | 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, | |
9001 | 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, | |
9002 | 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, | |
9003 | 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, | |
9004 | 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, | |
9005 | 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, | |
9006 | 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, | |
9007 | 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, | |
9008 | 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, | |
9009 | 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 | |
9010 | ] | |
9011 | ||
9012 | var W = new Array(160) | |
9013 | ||
9014 | function Sha512 () { | |
9015 | this.init() | |
9016 | this._w = W | |
9017 | ||
9018 | Hash.call(this, 128, 112) | |
9019 | } | |
9020 | ||
9021 | inherits(Sha512, Hash) | |
9022 | ||
9023 | Sha512.prototype.init = function () { | |
9024 | this._a = 0x6a09e667 | 0 | |
9025 | this._b = 0xbb67ae85 | 0 | |
9026 | this._c = 0x3c6ef372 | 0 | |
9027 | this._d = 0xa54ff53a | 0 | |
9028 | this._e = 0x510e527f | 0 | |
9029 | this._f = 0x9b05688c | 0 | |
9030 | this._g = 0x1f83d9ab | 0 | |
9031 | this._h = 0x5be0cd19 | 0 | |
9032 | ||
9033 | this._al = 0xf3bcc908 | 0 | |
9034 | this._bl = 0x84caa73b | 0 | |
9035 | this._cl = 0xfe94f82b | 0 | |
9036 | this._dl = 0x5f1d36f1 | 0 | |
9037 | this._el = 0xade682d1 | 0 | |
9038 | this._fl = 0x2b3e6c1f | 0 | |
9039 | this._gl = 0xfb41bd6b | 0 | |
9040 | this._hl = 0x137e2179 | 0 | |
ebd8d4e8 | 9041 | |
ab78acc6 | 9042 | return this |
ebd8d4e8 IC |
9043 | } |
9044 | ||
ab78acc6 IC |
9045 | function S (X, Xl, n) { |
9046 | return (X >>> n) | (Xl << (32 - n)) | |
9047 | } | |
9048 | ||
9049 | function Ch (x, y, z) { | |
9050 | return ((x & y) ^ ((~x) & z)) | |
9051 | } | |
9052 | ||
9053 | function Maj (x, y, z) { | |
9054 | return ((x & y) ^ (x & z) ^ (y & z)) | |
9055 | } | |
9056 | ||
9057 | Sha512.prototype._update = function (M) { | |
9058 | var W = this._w | |
9059 | ||
9060 | var a = this._a | 0 | |
9061 | var b = this._b | 0 | |
9062 | var c = this._c | 0 | |
9063 | var d = this._d | 0 | |
9064 | var e = this._e | 0 | |
9065 | var f = this._f | 0 | |
9066 | var g = this._g | 0 | |
9067 | var h = this._h | 0 | |
9068 | ||
9069 | var al = this._al | 0 | |
9070 | var bl = this._bl | 0 | |
9071 | var cl = this._cl | 0 | |
9072 | var dl = this._dl | 0 | |
9073 | var el = this._el | 0 | |
9074 | var fl = this._fl | 0 | |
9075 | var gl = this._gl | 0 | |
9076 | var hl = this._hl | 0 | |
9077 | ||
9078 | var i = 0, j = 0 | |
9079 | var Wi, Wil | |
9080 | function calcW () { | |
9081 | var x = W[j - 15 * 2] | |
9082 | var xl = W[j - 15 * 2 + 1] | |
9083 | var gamma0 = S(x, xl, 1) ^ S(x, xl, 8) ^ (x >>> 7) | |
9084 | var gamma0l = S(xl, x, 1) ^ S(xl, x, 8) ^ S(xl, x, 7) | |
9085 | ||
9086 | x = W[j - 2 * 2] | |
9087 | xl = W[j - 2 * 2 + 1] | |
9088 | var gamma1 = S(x, xl, 19) ^ S(xl, x, 29) ^ (x >>> 6) | |
9089 | var gamma1l = S(xl, x, 19) ^ S(x, xl, 29) ^ S(xl, x, 6) | |
9090 | ||
9091 | // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] | |
9092 | var Wi7 = W[j - 7 * 2] | |
9093 | var Wi7l = W[j - 7 * 2 + 1] | |
9094 | ||
9095 | var Wi16 = W[j - 16 * 2] | |
9096 | var Wi16l = W[j - 16 * 2 + 1] | |
ebd8d4e8 | 9097 | |
ab78acc6 IC |
9098 | Wil = gamma0l + Wi7l |
9099 | Wi = gamma0 + Wi7 + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0) | |
9100 | Wil = Wil + gamma1l | |
9101 | Wi = Wi + gamma1 + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0) | |
9102 | Wil = Wil + Wi16l | |
9103 | Wi = Wi + Wi16 + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0) | |
9104 | } | |
9105 | ||
9106 | function loop () { | |
9107 | W[j] = Wi | |
9108 | W[j + 1] = Wil | |
ebd8d4e8 | 9109 | |
ab78acc6 IC |
9110 | var maj = Maj(a, b, c) |
9111 | var majl = Maj(al, bl, cl) | |
ebd8d4e8 | 9112 | |
ab78acc6 IC |
9113 | var sigma0h = S(a, al, 28) ^ S(al, a, 2) ^ S(al, a, 7) |
9114 | var sigma0l = S(al, a, 28) ^ S(a, al, 2) ^ S(a, al, 7) | |
9115 | var sigma1h = S(e, el, 14) ^ S(e, el, 18) ^ S(el, e, 9) | |
9116 | var sigma1l = S(el, e, 14) ^ S(el, e, 18) ^ S(e, el, 9) | |
ebd8d4e8 | 9117 | |
ab78acc6 IC |
9118 | // t1 = h + sigma1 + ch + K[i] + W[i] |
9119 | var Ki = K[j] | |
9120 | var Kil = K[j + 1] | |
ebd8d4e8 | 9121 | |
ab78acc6 IC |
9122 | var ch = Ch(e, f, g) |
9123 | var chl = Ch(el, fl, gl) | |
ebd8d4e8 | 9124 | |
ab78acc6 IC |
9125 | var t1l = hl + sigma1l |
9126 | var t1 = h + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0) | |
9127 | t1l = t1l + chl | |
9128 | t1 = t1 + ch + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0) | |
9129 | t1l = t1l + Kil | |
9130 | t1 = t1 + Ki + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0) | |
9131 | t1l = t1l + Wil | |
9132 | t1 = t1 + Wi + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0) | |
ebd8d4e8 | 9133 | |
ab78acc6 IC |
9134 | // t2 = sigma0 + maj |
9135 | var t2l = sigma0l + majl | |
9136 | var t2 = sigma0h + maj + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0) | |
ebd8d4e8 | 9137 | |
ab78acc6 IC |
9138 | h = g |
9139 | hl = gl | |
9140 | g = f | |
9141 | gl = fl | |
9142 | f = e | |
9143 | fl = el | |
9144 | el = (dl + t1l) | 0 | |
9145 | e = (d + t1 + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0 | |
9146 | d = c | |
9147 | dl = cl | |
9148 | c = b | |
9149 | cl = bl | |
9150 | b = a | |
9151 | bl = al | |
9152 | al = (t1l + t2l) | 0 | |
9153 | a = (t1 + t2 + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0 | |
9154 | ||
9155 | i++ | |
9156 | j += 2 | |
9157 | } | |
9158 | ||
9159 | while (i < 16) { | |
9160 | Wi = M.readInt32BE(j * 4) | |
9161 | Wil = M.readInt32BE(j * 4 + 4) | |
9162 | ||
9163 | loop() | |
9164 | } | |
9165 | ||
9166 | while (i < 80) { | |
9167 | calcW() | |
9168 | loop() | |
9169 | } | |
9170 | ||
9171 | this._al = (this._al + al) | 0 | |
9172 | this._bl = (this._bl + bl) | 0 | |
9173 | this._cl = (this._cl + cl) | 0 | |
9174 | this._dl = (this._dl + dl) | 0 | |
9175 | this._el = (this._el + el) | 0 | |
9176 | this._fl = (this._fl + fl) | 0 | |
9177 | this._gl = (this._gl + gl) | 0 | |
9178 | this._hl = (this._hl + hl) | 0 | |
9179 | ||
9180 | this._a = (this._a + a + ((this._al >>> 0) < (al >>> 0) ? 1 : 0)) | 0 | |
9181 | this._b = (this._b + b + ((this._bl >>> 0) < (bl >>> 0) ? 1 : 0)) | 0 | |
9182 | this._c = (this._c + c + ((this._cl >>> 0) < (cl >>> 0) ? 1 : 0)) | 0 | |
9183 | this._d = (this._d + d + ((this._dl >>> 0) < (dl >>> 0) ? 1 : 0)) | 0 | |
9184 | this._e = (this._e + e + ((this._el >>> 0) < (el >>> 0) ? 1 : 0)) | 0 | |
9185 | this._f = (this._f + f + ((this._fl >>> 0) < (fl >>> 0) ? 1 : 0)) | 0 | |
9186 | this._g = (this._g + g + ((this._gl >>> 0) < (gl >>> 0) ? 1 : 0)) | 0 | |
9187 | this._h = (this._h + h + ((this._hl >>> 0) < (hl >>> 0) ? 1 : 0)) | 0 | |
9188 | } | |
9189 | ||
9190 | Sha512.prototype._hash = function () { | |
9191 | var H = new Buffer(64) | |
9192 | ||
9193 | function writeInt64BE (h, l, offset) { | |
9194 | H.writeInt32BE(h, offset) | |
9195 | H.writeInt32BE(l, offset + 4) | |
9196 | } | |
9197 | ||
9198 | writeInt64BE(this._a, this._al, 0) | |
9199 | writeInt64BE(this._b, this._bl, 8) | |
9200 | writeInt64BE(this._c, this._cl, 16) | |
9201 | writeInt64BE(this._d, this._dl, 24) | |
9202 | writeInt64BE(this._e, this._el, 32) | |
9203 | writeInt64BE(this._f, this._fl, 40) | |
9204 | writeInt64BE(this._g, this._gl, 48) | |
9205 | writeInt64BE(this._h, this._hl, 56) | |
9206 | ||
9207 | return H | |
9208 | } | |
9209 | ||
9210 | module.exports = Sha512 | |
9211 | ||
9212 | }).call(this,require("buffer").Buffer) | |
9213 | },{"./hash":37,"buffer":7,"inherits":35}],45:[function(require,module,exports){ | |
9214 | (function (Buffer){ | |
9215 | 'use strict'; | |
9216 | var createHash = require('create-hash/browser'); | |
9217 | var inherits = require('inherits') | |
ebd8d4e8 | 9218 | |
ab78acc6 | 9219 | var Transform = require('stream').Transform |
ebd8d4e8 | 9220 | |
ab78acc6 IC |
9221 | var ZEROS = new Buffer(128) |
9222 | ZEROS.fill(0) | |
ebd8d4e8 | 9223 | |
ab78acc6 IC |
9224 | function Hmac(alg, key) { |
9225 | Transform.call(this) | |
ebd8d4e8 | 9226 | |
ab78acc6 IC |
9227 | if (typeof key === 'string') { |
9228 | key = new Buffer(key) | |
9229 | } | |
ebd8d4e8 | 9230 | |
ab78acc6 | 9231 | var blocksize = (alg === 'sha512' || alg === 'sha384') ? 128 : 64 |
ebd8d4e8 | 9232 | |
ab78acc6 IC |
9233 | this._alg = alg |
9234 | this._key = key | |
ebd8d4e8 | 9235 | |
ab78acc6 IC |
9236 | if (key.length > blocksize) { |
9237 | key = createHash(alg).update(key).digest() | |
ebd8d4e8 | 9238 | |
ab78acc6 IC |
9239 | } else if (key.length < blocksize) { |
9240 | key = Buffer.concat([key, ZEROS], blocksize) | |
9241 | } | |
ebd8d4e8 | 9242 | |
ab78acc6 IC |
9243 | var ipad = this._ipad = new Buffer(blocksize) |
9244 | var opad = this._opad = new Buffer(blocksize) | |
ebd8d4e8 | 9245 | |
ab78acc6 IC |
9246 | for (var i = 0; i < blocksize; i++) { |
9247 | ipad[i] = key[i] ^ 0x36 | |
9248 | opad[i] = key[i] ^ 0x5C | |
9249 | } | |
ebd8d4e8 | 9250 | |
ab78acc6 IC |
9251 | this._hash = createHash(alg).update(ipad) |
9252 | } | |
ebd8d4e8 | 9253 | |
ab78acc6 | 9254 | inherits(Hmac, Transform) |
ebd8d4e8 | 9255 | |
ab78acc6 IC |
9256 | Hmac.prototype.update = function (data, enc) { |
9257 | this._hash.update(data, enc) | |
ebd8d4e8 | 9258 | |
ab78acc6 IC |
9259 | return this |
9260 | } | |
ebd8d4e8 | 9261 | |
ab78acc6 IC |
9262 | Hmac.prototype._transform = function (data, _, next) { |
9263 | this._hash.update(data) | |
ebd8d4e8 | 9264 | |
ab78acc6 IC |
9265 | next() |
9266 | } | |
ebd8d4e8 | 9267 | |
ab78acc6 IC |
9268 | Hmac.prototype._flush = function (next) { |
9269 | this.push(this.digest()) | |
ebd8d4e8 | 9270 | |
ab78acc6 IC |
9271 | next() |
9272 | } | |
ebd8d4e8 | 9273 | |
ab78acc6 IC |
9274 | Hmac.prototype.digest = function (enc) { |
9275 | var h = this._hash.digest() | |
ebd8d4e8 | 9276 | |
ab78acc6 IC |
9277 | return createHash(this._alg).update(this._opad).update(h).digest(enc) |
9278 | } | |
ebd8d4e8 | 9279 | |
ab78acc6 IC |
9280 | module.exports = function createHmac(alg, key) { |
9281 | return new Hmac(alg, key) | |
9282 | } | |
ebd8d4e8 | 9283 | |
ab78acc6 IC |
9284 | }).call(this,require("buffer").Buffer) |
9285 | },{"buffer":7,"create-hash/browser":32,"inherits":46,"stream":26}],46:[function(require,module,exports){ | |
9286 | arguments[4][12][0].apply(exports,arguments) | |
9287 | },{"dup":12}],47:[function(require,module,exports){ | |
9288 | var assert = require('assert') | |
9289 | var BigInteger = require('bigi') | |
ebd8d4e8 | 9290 | |
ab78acc6 | 9291 | var Point = require('./point') |
ebd8d4e8 IC |
9292 | |
9293 | function Curve(p, a, b, Gx, Gy, n, h) { | |
9294 | this.p = p | |
9295 | this.a = a | |
9296 | this.b = b | |
9297 | this.G = Point.fromAffine(this, Gx, Gy) | |
9298 | this.n = n | |
9299 | this.h = h | |
9300 | ||
9301 | this.infinity = new Point(this, null, null, BigInteger.ZERO) | |
9302 | ||
9303 | // result caching | |
9304 | this.pOverFour = p.add(BigInteger.ONE).shiftRight(2) | |
9305 | } | |
9306 | ||
9307 | Curve.prototype.pointFromX = function(isOdd, x) { | |
9308 | var alpha = x.pow(3).add(this.a.multiply(x)).add(this.b).mod(this.p) | |
ab78acc6 | 9309 | var beta = alpha.modPow(this.pOverFour, this.p) // XXX: not compatible with all curves |
ebd8d4e8 IC |
9310 | |
9311 | var y = beta | |
9312 | if (beta.isEven() ^ !isOdd) { | |
9313 | y = this.p.subtract(y) // -y % p | |
9314 | } | |
9315 | ||
9316 | return Point.fromAffine(this, x, y) | |
9317 | } | |
9318 | ||
9319 | Curve.prototype.isInfinity = function(Q) { | |
9320 | if (Q === this.infinity) return true | |
9321 | ||
9322 | return Q.z.signum() === 0 && Q.y.signum() !== 0 | |
9323 | } | |
9324 | ||
9325 | Curve.prototype.isOnCurve = function(Q) { | |
9326 | if (this.isInfinity(Q)) return true | |
9327 | ||
9328 | var x = Q.affineX | |
9329 | var y = Q.affineY | |
9330 | var a = this.a | |
9331 | var b = this.b | |
9332 | var p = this.p | |
9333 | ||
9334 | // Check that xQ and yQ are integers in the interval [0, p - 1] | |
9335 | if (x.signum() < 0 || x.compareTo(p) >= 0) return false | |
9336 | if (y.signum() < 0 || y.compareTo(p) >= 0) return false | |
9337 | ||
9338 | // and check that y^2 = x^3 + ax + b (mod p) | |
9339 | var lhs = y.square().mod(p) | |
9340 | var rhs = x.pow(3).add(a.multiply(x)).add(b).mod(p) | |
9341 | return lhs.equals(rhs) | |
9342 | } | |
9343 | ||
9344 | /** | |
9345 | * Validate an elliptic curve point. | |
9346 | * | |
9347 | * See SEC 1, section 3.2.2.1: Elliptic Curve Public Key Validation Primitive | |
9348 | */ | |
9349 | Curve.prototype.validate = function(Q) { | |
9350 | // Check Q != O | |
9351 | assert(!this.isInfinity(Q), 'Point is at infinity') | |
9352 | assert(this.isOnCurve(Q), 'Point is not on the curve') | |
9353 | ||
9354 | // Check nQ = O (where Q is a scalar multiple of G) | |
9355 | var nQ = Q.multiply(this.n) | |
9356 | assert(this.isInfinity(nQ), 'Point is not a scalar multiple of G') | |
9357 | ||
9358 | return true | |
9359 | } | |
9360 | ||
9361 | module.exports = Curve | |
9362 | ||
ab78acc6 | 9363 | },{"./point":51,"assert":5,"bigi":3}],48:[function(require,module,exports){ |
ebd8d4e8 IC |
9364 | module.exports={ |
9365 | "secp128r1": { | |
9366 | "p": "fffffffdffffffffffffffffffffffff", | |
9367 | "a": "fffffffdfffffffffffffffffffffffc", | |
9368 | "b": "e87579c11079f43dd824993c2cee5ed3", | |
9369 | "n": "fffffffe0000000075a30d1b9038a115", | |
9370 | "h": "01", | |
9371 | "Gx": "161ff7528b899b2d0c28607ca52c5b86", | |
9372 | "Gy": "cf5ac8395bafeb13c02da292dded7a83" | |
9373 | }, | |
9374 | "secp160k1": { | |
9375 | "p": "fffffffffffffffffffffffffffffffeffffac73", | |
9376 | "a": "00", | |
9377 | "b": "07", | |
9378 | "n": "0100000000000000000001b8fa16dfab9aca16b6b3", | |
9379 | "h": "01", | |
9380 | "Gx": "3b4c382ce37aa192a4019e763036f4f5dd4d7ebb", | |
9381 | "Gy": "938cf935318fdced6bc28286531733c3f03c4fee" | |
9382 | }, | |
9383 | "secp160r1": { | |
9384 | "p": "ffffffffffffffffffffffffffffffff7fffffff", | |
9385 | "a": "ffffffffffffffffffffffffffffffff7ffffffc", | |
9386 | "b": "1c97befc54bd7a8b65acf89f81d4d4adc565fa45", | |
9387 | "n": "0100000000000000000001f4c8f927aed3ca752257", | |
9388 | "h": "01", | |
9389 | "Gx": "4a96b5688ef573284664698968c38bb913cbfc82", | |
9390 | "Gy": "23a628553168947d59dcc912042351377ac5fb32" | |
9391 | }, | |
9392 | "secp192k1": { | |
9393 | "p": "fffffffffffffffffffffffffffffffffffffffeffffee37", | |
9394 | "a": "00", | |
9395 | "b": "03", | |
9396 | "n": "fffffffffffffffffffffffe26f2fc170f69466a74defd8d", | |
9397 | "h": "01", | |
9398 | "Gx": "db4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d", | |
9399 | "Gy": "9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d" | |
9400 | }, | |
9401 | "secp192r1": { | |
9402 | "p": "fffffffffffffffffffffffffffffffeffffffffffffffff", | |
9403 | "a": "fffffffffffffffffffffffffffffffefffffffffffffffc", | |
9404 | "b": "64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", | |
9405 | "n": "ffffffffffffffffffffffff99def836146bc9b1b4d22831", | |
9406 | "h": "01", | |
9407 | "Gx": "188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012", | |
9408 | "Gy": "07192b95ffc8da78631011ed6b24cdd573f977a11e794811" | |
9409 | }, | |
ebd8d4e8 IC |
9410 | "secp256k1": { |
9411 | "p": "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", | |
9412 | "a": "00", | |
9413 | "b": "07", | |
9414 | "n": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", | |
9415 | "h": "01", | |
9416 | "Gx": "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", | |
9417 | "Gy": "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8" | |
9418 | }, | |
9419 | "secp256r1": { | |
9420 | "p": "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff", | |
9421 | "a": "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc", | |
9422 | "b": "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", | |
9423 | "n": "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551", | |
9424 | "h": "01", | |
9425 | "Gx": "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296", | |
9426 | "Gy": "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5" | |
9427 | } | |
9428 | } | |
9429 | ||
ab78acc6 IC |
9430 | },{}],49:[function(require,module,exports){ |
9431 | var Point = require('./point') | |
9432 | var Curve = require('./curve') | |
ebd8d4e8 | 9433 | |
ab78acc6 | 9434 | var getCurveByName = require('./names') |
ebd8d4e8 IC |
9435 | |
9436 | module.exports = { | |
9437 | Curve: Curve, | |
9438 | Point: Point, | |
9439 | getCurveByName: getCurveByName | |
9440 | } | |
9441 | ||
ab78acc6 IC |
9442 | },{"./curve":47,"./names":50,"./point":51}],50:[function(require,module,exports){ |
9443 | var BigInteger = require('bigi') | |
ebd8d4e8 | 9444 | |
ab78acc6 IC |
9445 | var curves = require('./curves') |
9446 | var Curve = require('./curve') | |
ebd8d4e8 IC |
9447 | |
9448 | function getCurveByName(name) { | |
9449 | var curve = curves[name] | |
9450 | if (!curve) return null | |
9451 | ||
9452 | var p = new BigInteger(curve.p, 16) | |
9453 | var a = new BigInteger(curve.a, 16) | |
9454 | var b = new BigInteger(curve.b, 16) | |
9455 | var n = new BigInteger(curve.n, 16) | |
9456 | var h = new BigInteger(curve.h, 16) | |
9457 | var Gx = new BigInteger(curve.Gx, 16) | |
9458 | var Gy = new BigInteger(curve.Gy, 16) | |
9459 | ||
9460 | return new Curve(p, a, b, Gx, Gy, n, h) | |
9461 | } | |
9462 | ||
9463 | module.exports = getCurveByName | |
9464 | ||
ab78acc6 | 9465 | },{"./curve":47,"./curves":48,"bigi":3}],51:[function(require,module,exports){ |
ebd8d4e8 | 9466 | (function (Buffer){ |
ab78acc6 IC |
9467 | var assert = require('assert') |
9468 | var BigInteger = require('bigi') | |
ebd8d4e8 IC |
9469 | |
9470 | var THREE = BigInteger.valueOf(3) | |
9471 | ||
9472 | function Point(curve, x, y, z) { | |
9473 | assert.notStrictEqual(z, undefined, 'Missing Z coordinate') | |
9474 | ||
9475 | this.curve = curve | |
9476 | this.x = x | |
9477 | this.y = y | |
9478 | this.z = z | |
9479 | this._zInv = null | |
9480 | ||
9481 | this.compressed = true | |
9482 | } | |
9483 | ||
9484 | Object.defineProperty(Point.prototype, 'zInv', { | |
9485 | get: function() { | |
9486 | if (this._zInv === null) { | |
9487 | this._zInv = this.z.modInverse(this.curve.p) | |
9488 | } | |
9489 | ||
9490 | return this._zInv | |
9491 | } | |
9492 | }) | |
9493 | ||
9494 | Object.defineProperty(Point.prototype, 'affineX', { | |
9495 | get: function() { | |
9496 | return this.x.multiply(this.zInv).mod(this.curve.p) | |
9497 | } | |
9498 | }) | |
9499 | ||
9500 | Object.defineProperty(Point.prototype, 'affineY', { | |
9501 | get: function() { | |
9502 | return this.y.multiply(this.zInv).mod(this.curve.p) | |
9503 | } | |
9504 | }) | |
9505 | ||
9506 | Point.fromAffine = function(curve, x, y) { | |
9507 | return new Point(curve, x, y, BigInteger.ONE) | |
9508 | } | |
9509 | ||
9510 | Point.prototype.equals = function(other) { | |
9511 | if (other === this) return true | |
9512 | if (this.curve.isInfinity(this)) return this.curve.isInfinity(other) | |
9513 | if (this.curve.isInfinity(other)) return this.curve.isInfinity(this) | |
9514 | ||
9515 | // u = Y2 * Z1 - Y1 * Z2 | |
9516 | var u = other.y.multiply(this.z).subtract(this.y.multiply(other.z)).mod(this.curve.p) | |
9517 | ||
9518 | if (u.signum() !== 0) return false | |
9519 | ||
9520 | // v = X2 * Z1 - X1 * Z2 | |
9521 | var v = other.x.multiply(this.z).subtract(this.x.multiply(other.z)).mod(this.curve.p) | |
9522 | ||
9523 | return v.signum() === 0 | |
9524 | } | |
9525 | ||
9526 | Point.prototype.negate = function() { | |
9527 | var y = this.curve.p.subtract(this.y) | |
9528 | ||
9529 | return new Point(this.curve, this.x, y, this.z) | |
9530 | } | |
9531 | ||
9532 | Point.prototype.add = function(b) { | |
9533 | if (this.curve.isInfinity(this)) return b | |
9534 | if (this.curve.isInfinity(b)) return this | |
9535 | ||
9536 | var x1 = this.x | |
9537 | var y1 = this.y | |
9538 | var x2 = b.x | |
9539 | var y2 = b.y | |
9540 | ||
9541 | // u = Y2 * Z1 - Y1 * Z2 | |
9542 | var u = y2.multiply(this.z).subtract(y1.multiply(b.z)).mod(this.curve.p) | |
9543 | // v = X2 * Z1 - X1 * Z2 | |
9544 | var v = x2.multiply(this.z).subtract(x1.multiply(b.z)).mod(this.curve.p) | |
9545 | ||
9546 | if (v.signum() === 0) { | |
9547 | if (u.signum() === 0) { | |
9548 | return this.twice() // this == b, so double | |
9549 | } | |
9550 | ||
9551 | return this.curve.infinity // this = -b, so infinity | |
9552 | } | |
9553 | ||
9554 | var v2 = v.square() | |
9555 | var v3 = v2.multiply(v) | |
9556 | var x1v2 = x1.multiply(v2) | |
9557 | var zu2 = u.square().multiply(this.z) | |
9558 | ||
9559 | // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3) | |
9560 | var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.p) | |
9561 | // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3 | |
9562 | var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.p) | |
9563 | // z3 = v^3 * z1 * z2 | |
9564 | var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.p) | |
9565 | ||
9566 | return new Point(this.curve, x3, y3, z3) | |
9567 | } | |
9568 | ||
9569 | Point.prototype.twice = function() { | |
9570 | if (this.curve.isInfinity(this)) return this | |
9571 | if (this.y.signum() === 0) return this.curve.infinity | |
9572 | ||
9573 | var x1 = this.x | |
9574 | var y1 = this.y | |
9575 | ||
9576 | var y1z1 = y1.multiply(this.z) | |
9577 | var y1sqz1 = y1z1.multiply(y1).mod(this.curve.p) | |
9578 | var a = this.curve.a | |
9579 | ||
9580 | // w = 3 * x1^2 + a * z1^2 | |
9581 | var w = x1.square().multiply(THREE) | |
9582 | ||
9583 | if (a.signum() !== 0) { | |
9584 | w = w.add(this.z.square().multiply(a)) | |
9585 | } | |
9586 | ||
9587 | w = w.mod(this.curve.p) | |
9588 | // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1) | |
9589 | var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.p) | |
9590 | // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3 | |
9591 | var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.pow(3)).mod(this.curve.p) | |
9592 | // z3 = 8 * (y1 * z1)^3 | |
9593 | var z3 = y1z1.pow(3).shiftLeft(3).mod(this.curve.p) | |
9594 | ||
9595 | return new Point(this.curve, x3, y3, z3) | |
9596 | } | |
9597 | ||
9598 | // Simple NAF (Non-Adjacent Form) multiplication algorithm | |
9599 | // TODO: modularize the multiplication algorithm | |
9600 | Point.prototype.multiply = function(k) { | |
9601 | if (this.curve.isInfinity(this)) return this | |
9602 | if (k.signum() === 0) return this.curve.infinity | |
9603 | ||
9604 | var e = k | |
9605 | var h = e.multiply(THREE) | |
9606 | ||
9607 | var neg = this.negate() | |
9608 | var R = this | |
9609 | ||
9610 | for (var i = h.bitLength() - 2; i > 0; --i) { | |
9611 | R = R.twice() | |
9612 | ||
9613 | var hBit = h.testBit(i) | |
9614 | var eBit = e.testBit(i) | |
9615 | ||
9616 | if (hBit != eBit) { | |
9617 | R = R.add(hBit ? this : neg) | |
9618 | } | |
9619 | } | |
9620 | ||
9621 | return R | |
9622 | } | |
9623 | ||
9624 | // Compute this*j + x*k (simultaneous multiplication) | |
9625 | Point.prototype.multiplyTwo = function(j, x, k) { | |
9626 | var i | |
9627 | ||
9628 | if (j.bitLength() > k.bitLength()) | |
9629 | i = j.bitLength() - 1 | |
9630 | else | |
9631 | i = k.bitLength() - 1 | |
9632 | ||
9633 | var R = this.curve.infinity | |
9634 | var both = this.add(x) | |
9635 | ||
9636 | while (i >= 0) { | |
9637 | R = R.twice() | |
9638 | ||
9639 | var jBit = j.testBit(i) | |
9640 | var kBit = k.testBit(i) | |
9641 | ||
9642 | if (jBit) { | |
9643 | if (kBit) { | |
9644 | R = R.add(both) | |
9645 | ||
9646 | } else { | |
9647 | R = R.add(this) | |
9648 | } | |
9649 | ||
9650 | } else { | |
9651 | if (kBit) { | |
9652 | R = R.add(x) | |
9653 | } | |
9654 | } | |
9655 | --i | |
9656 | } | |
9657 | ||
9658 | return R | |
9659 | } | |
9660 | ||
9661 | Point.prototype.getEncoded = function(compressed) { | |
9662 | if (compressed == undefined) compressed = this.compressed | |
9663 | if (this.curve.isInfinity(this)) return new Buffer('00', 'hex') // Infinity point encoded is simply '00' | |
9664 | ||
9665 | var x = this.affineX | |
9666 | var y = this.affineY | |
9667 | ||
9668 | var buffer | |
9669 | ||
9670 | // Determine size of q in bytes | |
9671 | var byteLength = Math.floor((this.curve.p.bitLength() + 7) / 8) | |
9672 | ||
9673 | // 0x02/0x03 | X | |
9674 | if (compressed) { | |
9675 | buffer = new Buffer(1 + byteLength) | |
9676 | buffer.writeUInt8(y.isEven() ? 0x02 : 0x03, 0) | |
9677 | ||
9678 | // 0x04 | X | Y | |
9679 | } else { | |
9680 | buffer = new Buffer(1 + byteLength + byteLength) | |
9681 | buffer.writeUInt8(0x04, 0) | |
9682 | ||
9683 | y.toBuffer(byteLength).copy(buffer, 1 + byteLength) | |
9684 | } | |
9685 | ||
9686 | x.toBuffer(byteLength).copy(buffer, 1) | |
9687 | ||
9688 | return buffer | |
9689 | } | |
9690 | ||
9691 | Point.decodeFrom = function(curve, buffer) { | |
9692 | var type = buffer.readUInt8(0) | |
9693 | var compressed = (type !== 4) | |
9694 | ||
ebd8d4e8 | 9695 | var byteLength = Math.floor((curve.p.bitLength() + 7) / 8) |
ab78acc6 | 9696 | var x = BigInteger.fromBuffer(buffer.slice(1, 1 + byteLength)) |
ebd8d4e8 IC |
9697 | |
9698 | var Q | |
9699 | if (compressed) { | |
9700 | assert.equal(buffer.length, byteLength + 1, 'Invalid sequence length') | |
9701 | assert(type === 0x02 || type === 0x03, 'Invalid sequence tag') | |
9702 | ||
9703 | var isOdd = (type === 0x03) | |
9704 | Q = curve.pointFromX(isOdd, x) | |
9705 | ||
9706 | } else { | |
9707 | assert.equal(buffer.length, 1 + byteLength + byteLength, 'Invalid sequence length') | |
9708 | ||
9709 | var y = BigInteger.fromBuffer(buffer.slice(1 + byteLength)) | |
9710 | Q = Point.fromAffine(curve, x, y) | |
9711 | } | |
9712 | ||
9713 | Q.compressed = compressed | |
9714 | return Q | |
9715 | } | |
9716 | ||
9717 | Point.prototype.toString = function () { | |
9718 | if (this.curve.isInfinity(this)) return '(INFINITY)' | |
9719 | ||
9720 | return '(' + this.affineX.toString() + ',' + this.affineY.toString() + ')' | |
9721 | } | |
9722 | ||
9723 | module.exports = Point | |
9724 | ||
ab78acc6 IC |
9725 | }).call(this,require("buffer").Buffer) |
9726 | },{"assert":5,"bigi":3,"buffer":7}],52:[function(require,module,exports){ | |
9727 | (function (process,global,Buffer){ | |
9728 | 'use strict'; | |
ebd8d4e8 | 9729 | |
ab78acc6 IC |
9730 | var crypto = global.crypto || global.msCrypto |
9731 | if(crypto && crypto.getRandomValues) { | |
9732 | module.exports = randomBytes; | |
9733 | } else { | |
9734 | module.exports = oldBrowser; | |
9735 | } | |
9736 | function randomBytes(size, cb) { | |
9737 | var bytes = new Buffer(size); //in browserify, this is an extended Uint8Array | |
9738 | /* This will not work in older browsers. | |
9739 | * See https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues | |
9740 | */ | |
9741 | ||
9742 | crypto.getRandomValues(bytes); | |
9743 | if (typeof cb === 'function') { | |
9744 | return process.nextTick(function () { | |
9745 | cb(null, bytes); | |
9746 | }); | |
ebd8d4e8 | 9747 | } |
ab78acc6 IC |
9748 | return bytes; |
9749 | } | |
9750 | function oldBrowser() { | |
9751 | throw new Error( | |
9752 | 'secure random number generation not supported by this browser\n'+ | |
9753 | 'use chrome, FireFox or Internet Explorer 11' | |
9754 | ) | |
ebd8d4e8 IC |
9755 | } |
9756 | ||
ab78acc6 IC |
9757 | }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer) |
9758 | },{"_process":14,"buffer":7}],53:[function(require,module,exports){ | |
9759 | (function (Buffer){ | |
9760 | 'use strict'; | |
ebd8d4e8 | 9761 | |
ab78acc6 IC |
9762 | function getFunctionName(fn) { |
9763 | return fn.name || fn.toString().match(/function (.*?)\s*\(/)[1]; | |
9764 | } | |
9765 | ||
9766 | function getTypeTypeName(type) { | |
9767 | if (nativeTypes.Function(type)) { | |
9768 | type = type.toJSON ? type.toJSON() : getFunctionName(type); | |
ebd8d4e8 | 9769 | } |
ab78acc6 IC |
9770 | if (nativeTypes.Object(type)) return JSON.stringify(type); |
9771 | ||
9772 | return type; | |
ebd8d4e8 IC |
9773 | } |
9774 | ||
ab78acc6 IC |
9775 | function getValueTypeName(value) { |
9776 | if (nativeTypes.Null(value)) return ''; | |
ebd8d4e8 | 9777 | |
ab78acc6 IC |
9778 | return getFunctionName(value.constructor); |
9779 | } | |
9780 | ||
9781 | function tfErrorString(type, value) { | |
9782 | var typeTypeName = getTypeTypeName(type); | |
9783 | var valueTypeName = getValueTypeName(value); | |
9784 | ||
9785 | return 'Expected ' + typeTypeName + ', got ' + (valueTypeName && valueTypeName + ' ') + JSON.stringify(value); | |
9786 | } | |
9787 | ||
9788 | function tfPropertyErrorString(type, name, value) { | |
9789 | return tfErrorString('property \"' + name + '\" of type ' + getTypeTypeName(type), value); | |
9790 | } | |
9791 | ||
9792 | var nativeTypes = { | |
9793 | Array: (function (_Array) { | |
9794 | function Array(_x) { | |
9795 | return _Array.apply(this, arguments); | |
9796 | } | |
9797 | ||
9798 | Array.toString = function () { | |
9799 | return _Array.toString(); | |
9800 | }; | |
9801 | ||
9802 | return Array; | |
9803 | })(function (value) { | |
9804 | return value !== null && value !== undefined && value.constructor === Array; | |
9805 | }), | |
9806 | Boolean: function Boolean(value) { | |
9807 | return typeof value === 'boolean'; | |
9808 | }, | |
9809 | Buffer: (function (_Buffer) { | |
9810 | function Buffer(_x2) { | |
9811 | return _Buffer.apply(this, arguments); | |
9812 | } | |
9813 | ||
9814 | Buffer.toString = function () { | |
9815 | return _Buffer.toString(); | |
9816 | }; | |
9817 | ||
9818 | return Buffer; | |
9819 | })(function (value) { | |
9820 | return Buffer.isBuffer(value); | |
9821 | }), | |
9822 | Function: function Function(value) { | |
9823 | return typeof value === 'function'; | |
9824 | }, | |
9825 | Null: function Null(value) { | |
9826 | return value === undefined || value === null; | |
9827 | }, | |
9828 | Number: function Number(value) { | |
9829 | return typeof value === 'number'; | |
9830 | }, | |
9831 | Object: function Object(value) { | |
9832 | return typeof value === 'object'; | |
9833 | }, | |
9834 | String: function String(value) { | |
9835 | return typeof value === 'string'; | |
9836 | }, | |
9837 | '': function _() { | |
9838 | return true; | |
ebd8d4e8 | 9839 | } |
ab78acc6 IC |
9840 | }; |
9841 | ||
9842 | function tJSON(type) { | |
9843 | return type && type.toJSON ? type.toJSON() : type; | |
ebd8d4e8 IC |
9844 | } |
9845 | ||
ab78acc6 IC |
9846 | function sJSON(type) { |
9847 | var json = tJSON(type); | |
9848 | return nativeTypes.Object(json) ? JSON.stringify(json) : json; | |
ebd8d4e8 IC |
9849 | } |
9850 | ||
ab78acc6 IC |
9851 | var otherTypes = { |
9852 | arrayOf: function arrayOf(type) { | |
9853 | function arrayOf(value, strict) { | |
9854 | try { | |
9855 | return nativeTypes.Array(value) && value.every(function (x) { | |
9856 | return typeforce(type, x, strict); | |
9857 | }); | |
9858 | } catch (e) { | |
9859 | return false; | |
9860 | } | |
9861 | } | |
9862 | arrayOf.toJSON = function () { | |
9863 | return [tJSON(type)]; | |
9864 | }; | |
9865 | ||
9866 | return arrayOf; | |
9867 | }, | |
9868 | ||
9869 | maybe: function maybe(type) { | |
9870 | function maybe(value, strict) { | |
9871 | return nativeTypes.Null(value) || typeforce(type, value, strict); | |
9872 | } | |
9873 | maybe.toJSON = function () { | |
9874 | return '?' + sJSON(type); | |
9875 | }; | |
9876 | ||
9877 | return maybe; | |
9878 | }, | |
9879 | ||
9880 | object: function object(type) { | |
9881 | function object(value, strict) { | |
9882 | typeforce(nativeTypes.Object, value, strict); | |
9883 | ||
9884 | var propertyName, propertyType, propertyValue; | |
9885 | ||
9886 | try { | |
9887 | for (propertyName in type) { | |
9888 | propertyType = type[propertyName]; | |
9889 | propertyValue = value[propertyName]; | |
9890 | ||
9891 | typeforce(propertyType, propertyValue, strict); | |
9892 | } | |
9893 | } catch (e) { | |
9894 | throw new TypeError(tfPropertyErrorString(propertyType, propertyName, propertyValue)); | |
9895 | } | |
9896 | ||
9897 | if (strict) { | |
9898 | for (propertyName in value) { | |
9899 | if (type[propertyName]) continue; | |
9900 | ||
9901 | throw new TypeError('Unexpected property "' + propertyName + '"'); | |
9902 | } | |
9903 | } | |
9904 | ||
9905 | return true; | |
9906 | } | |
9907 | object.toJSON = function () { | |
9908 | return type; | |
9909 | }; | |
9910 | ||
9911 | return object; | |
9912 | }, | |
9913 | ||
9914 | oneOf: function oneOf() { | |
9915 | for (var _len = arguments.length, types = Array(_len), _key = 0; _key < _len; _key++) { | |
9916 | types[_key] = arguments[_key]; | |
9917 | } | |
9918 | ||
9919 | function oneOf(value, strict) { | |
9920 | return types.some(function (type) { | |
9921 | try { | |
9922 | return typeforce(type, value, strict); | |
9923 | } catch (e) { | |
9924 | return false; | |
9925 | } | |
9926 | }); | |
9927 | } | |
9928 | oneOf.toJSON = function () { | |
9929 | return types.map(sJSON).join('|'); | |
9930 | }; | |
9931 | ||
9932 | return oneOf; | |
9933 | }, | |
9934 | ||
9935 | quacksLike: function quacksLike(type) { | |
9936 | function quacksLike(value, strict) { | |
9937 | return type === getValueTypeName(value); | |
9938 | } | |
9939 | quacksLike.toJSON = function () { | |
9940 | return type; | |
9941 | }; | |
9942 | ||
9943 | return quacksLike; | |
9944 | }, | |
9945 | ||
9946 | tuple: function tuple() { | |
9947 | for (var _len2 = arguments.length, types = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { | |
9948 | types[_key2] = arguments[_key2]; | |
9949 | } | |
9950 | ||
9951 | function tuple(value, strict) { | |
9952 | return types.every(function (type, i) { | |
9953 | return typeforce(type, value[i], strict); | |
9954 | }); | |
9955 | } | |
9956 | tuple.toJSON = function () { | |
9957 | return '(' + types.map(sJSON).join(', ') + ')'; | |
9958 | }; | |
9959 | ||
9960 | return tuple; | |
9961 | }, | |
9962 | ||
9963 | value: function value(expected) { | |
9964 | function value(actual) { | |
9965 | return actual === expected; | |
9966 | } | |
9967 | value.toJSON = function () { | |
9968 | return expected; | |
9969 | }; | |
9970 | ||
9971 | return value; | |
9972 | } | |
9973 | }; | |
9974 | ||
9975 | function compile(type) { | |
9976 | if (nativeTypes.String(type)) { | |
9977 | if (type[0] === '?') return otherTypes.maybe(compile(type.slice(1))); | |
9978 | ||
9979 | return nativeTypes[type] || otherTypes.quacksLike(type); | |
9980 | } else if (type && nativeTypes.Object(type)) { | |
9981 | if (nativeTypes.Array(type)) return otherTypes.arrayOf(compile(type[0])); | |
9982 | ||
9983 | var compiled = {}; | |
9984 | ||
9985 | for (var propertyName in type) { | |
9986 | compiled[propertyName] = compile(type[propertyName]); | |
9987 | } | |
9988 | ||
9989 | return otherTypes.object(compiled); | |
9990 | } else if (nativeTypes.Function(type)) { | |
9991 | return type; | |
9992 | } | |
9993 | ||
9994 | return otherTypes.value(type); | |
ebd8d4e8 IC |
9995 | } |
9996 | ||
ab78acc6 IC |
9997 | function typeforce(_x3, _x4, _x5) { |
9998 | var _again = true; | |
9999 | ||
10000 | _function: while (_again) { | |
10001 | var type = _x3, | |
10002 | value = _x4, | |
10003 | strict = _x5; | |
10004 | _again = false; | |
10005 | ||
10006 | if (nativeTypes.Function(type)) { | |
10007 | if (type(value, strict)) return true; | |
10008 | ||
10009 | throw new TypeError(tfErrorString(type, value)); | |
10010 | } | |
10011 | ||
10012 | // JIT | |
10013 | _x3 = compile(type); | |
10014 | _x4 = value; | |
10015 | _x5 = strict; | |
10016 | _again = true; | |
10017 | continue _function; | |
10018 | } | |
ebd8d4e8 IC |
10019 | } |
10020 | ||
ab78acc6 IC |
10021 | // assign all types to typeforce function |
10022 | var typeName; | |
10023 | Object.keys(nativeTypes).forEach(function (typeName) { | |
10024 | var nativeType = nativeTypes[typeName]; | |
10025 | nativeType.toJSON = function () { | |
10026 | return typeName; | |
10027 | }; | |
10028 | ||
10029 | typeforce[typeName] = nativeType; | |
10030 | }); | |
ebd8d4e8 | 10031 | |
ab78acc6 IC |
10032 | for (typeName in otherTypes) { |
10033 | typeforce[typeName] = otherTypes[typeName]; | |
10034 | } | |
ebd8d4e8 | 10035 | |
ab78acc6 IC |
10036 | module.exports = typeforce; |
10037 | module.exports.compile = compile; | |
10038 | }).call(this,require("buffer").Buffer) | |
10039 | },{"buffer":7}],54:[function(require,module,exports){ | |
ebd8d4e8 | 10040 | (function (Buffer){ |
ab78acc6 IC |
10041 | var assert = require('assert') |
10042 | var base58check = require('bs58check') | |
10043 | var typeForce = require('typeforce') | |
10044 | var networks = require('./networks') | |
10045 | var scripts = require('./scripts') | |
ebd8d4e8 | 10046 | |
ab78acc6 | 10047 | function findScriptTypeByVersion (version) { |
ebd8d4e8 IC |
10048 | for (var networkName in networks) { |
10049 | var network = networks[networkName] | |
10050 | ||
10051 | if (version === network.pubKeyHash) return 'pubkeyhash' | |
10052 | if (version === network.scriptHash) return 'scripthash' | |
10053 | } | |
10054 | } | |
10055 | ||
ab78acc6 IC |
10056 | function Address (hash, version) { |
10057 | typeForce('Buffer', hash) | |
10058 | ||
ebd8d4e8 IC |
10059 | assert.strictEqual(hash.length, 20, 'Invalid hash length') |
10060 | assert.strictEqual(version & 0xff, version, 'Invalid version byte') | |
10061 | ||
10062 | this.hash = hash | |
10063 | this.version = version | |
10064 | } | |
10065 | ||
ab78acc6 | 10066 | Address.fromBase58Check = function (string) { |
ebd8d4e8 IC |
10067 | var payload = base58check.decode(string) |
10068 | var version = payload.readUInt8(0) | |
10069 | var hash = payload.slice(1) | |
10070 | ||
10071 | return new Address(hash, version) | |
10072 | } | |
10073 | ||
ab78acc6 | 10074 | Address.fromOutputScript = function (script, network) { |
ebd8d4e8 IC |
10075 | network = network || networks.bitcoin |
10076 | ||
ab78acc6 IC |
10077 | if (scripts.isPubKeyHashOutput(script)) return new Address(script.chunks[2], network.pubKeyHash) |
10078 | if (scripts.isScriptHashOutput(script)) return new Address(script.chunks[1], network.scriptHash) | |
ebd8d4e8 | 10079 | |
ab78acc6 | 10080 | assert(false, script.toASM() + ' has no matching Address') |
ebd8d4e8 IC |
10081 | } |
10082 | ||
ebd8d4e8 IC |
10083 | Address.prototype.toBase58Check = function () { |
10084 | var payload = new Buffer(21) | |
10085 | payload.writeUInt8(this.version, 0) | |
10086 | this.hash.copy(payload, 1) | |
10087 | ||
10088 | return base58check.encode(payload) | |
10089 | } | |
10090 | ||
ab78acc6 | 10091 | Address.prototype.toOutputScript = function () { |
ebd8d4e8 IC |
10092 | var scriptType = findScriptTypeByVersion(this.version) |
10093 | ||
10094 | if (scriptType === 'pubkeyhash') return scripts.pubKeyHashOutput(this.hash) | |
10095 | if (scriptType === 'scripthash') return scripts.scriptHashOutput(this.hash) | |
10096 | ||
ab78acc6 IC |
10097 | assert(false, this.toString() + ' has no matching Script') |
10098 | } | |
10099 | ||
10100 | Address.prototype.toString = Address.prototype.toBase58Check | |
10101 | ||
10102 | module.exports = Address | |
10103 | ||
10104 | }).call(this,require("buffer").Buffer) | |
10105 | },{"./networks":66,"./scripts":69,"assert":5,"bs58check":31,"buffer":7,"typeforce":53}],55:[function(require,module,exports){ | |
10106 | var bs58check = require('bs58check') | |
10107 | ||
10108 | function decode () { | |
10109 | console.warn('bs58check will be removed in 2.0.0. require("bs58check") instead.') | |
10110 | ||
10111 | return bs58check.decode.apply(undefined, arguments) | |
10112 | } | |
10113 | ||
10114 | function encode () { | |
10115 | console.warn('bs58check will be removed in 2.0.0. require("bs58check") instead.') | |
10116 | ||
10117 | return bs58check.encode.apply(undefined, arguments) | |
10118 | } | |
10119 | ||
10120 | module.exports = { | |
10121 | decode: decode, | |
10122 | encode: encode | |
10123 | } | |
10124 | ||
10125 | },{"bs58check":31}],56:[function(require,module,exports){ | |
10126 | (function (Buffer){ | |
10127 | var assert = require('assert') | |
10128 | var bufferutils = require('./bufferutils') | |
10129 | var crypto = require('./crypto') | |
10130 | ||
10131 | var Transaction = require('./transaction') | |
10132 | ||
10133 | function Block () { | |
10134 | this.version = 1 | |
10135 | this.prevHash = null | |
10136 | this.merkleRoot = null | |
10137 | this.timestamp = 0 | |
10138 | this.bits = 0 | |
10139 | this.nonce = 0 | |
10140 | } | |
10141 | ||
10142 | Block.fromBuffer = function (buffer) { | |
10143 | assert(buffer.length >= 80, 'Buffer too small (< 80 bytes)') | |
10144 | ||
10145 | var offset = 0 | |
10146 | function readSlice (n) { | |
10147 | offset += n | |
10148 | return buffer.slice(offset - n, offset) | |
10149 | } | |
10150 | ||
10151 | function readUInt32 () { | |
10152 | var i = buffer.readUInt32LE(offset) | |
10153 | offset += 4 | |
10154 | return i | |
10155 | } | |
10156 | ||
10157 | var block = new Block() | |
10158 | block.version = readUInt32() | |
10159 | block.prevHash = readSlice(32) | |
10160 | block.merkleRoot = readSlice(32) | |
10161 | block.timestamp = readUInt32() | |
10162 | block.bits = readUInt32() | |
10163 | block.nonce = readUInt32() | |
10164 | ||
10165 | if (buffer.length === 80) return block | |
10166 | ||
10167 | function readVarInt () { | |
10168 | var vi = bufferutils.readVarInt(buffer, offset) | |
10169 | offset += vi.size | |
10170 | return vi.number | |
10171 | } | |
10172 | ||
10173 | // FIXME: poor performance | |
10174 | function readTransaction () { | |
10175 | var tx = Transaction.fromBuffer(buffer.slice(offset), true) | |
10176 | ||
10177 | offset += tx.toBuffer().length | |
10178 | return tx | |
10179 | } | |
10180 | ||
10181 | var nTransactions = readVarInt() | |
10182 | block.transactions = [] | |
10183 | ||
10184 | for (var i = 0; i < nTransactions; ++i) { | |
10185 | var tx = readTransaction() | |
10186 | block.transactions.push(tx) | |
10187 | } | |
10188 | ||
10189 | return block | |
10190 | } | |
10191 | ||
10192 | Block.fromHex = function (hex) { | |
10193 | return Block.fromBuffer(new Buffer(hex, 'hex')) | |
10194 | } | |
10195 | ||
10196 | Block.prototype.getHash = function () { | |
10197 | return crypto.hash256(this.toBuffer(true)) | |
10198 | } | |
10199 | ||
10200 | Block.prototype.getId = function () { | |
10201 | return bufferutils.reverse(this.getHash()).toString('hex') | |
ebd8d4e8 IC |
10202 | } |
10203 | ||
ab78acc6 IC |
10204 | Block.prototype.getUTCDate = function () { |
10205 | var date = new Date(0) // epoch | |
10206 | date.setUTCSeconds(this.timestamp) | |
ebd8d4e8 | 10207 | |
ab78acc6 IC |
10208 | return date |
10209 | } | |
ebd8d4e8 | 10210 | |
ab78acc6 IC |
10211 | Block.prototype.toBuffer = function (headersOnly) { |
10212 | var buffer = new Buffer(80) | |
ebd8d4e8 | 10213 | |
ab78acc6 IC |
10214 | var offset = 0 |
10215 | function writeSlice (slice) { | |
10216 | slice.copy(buffer, offset) | |
10217 | offset += slice.length | |
10218 | } | |
ebd8d4e8 | 10219 | |
ab78acc6 IC |
10220 | function writeUInt32 (i) { |
10221 | buffer.writeUInt32LE(i, offset) | |
10222 | offset += 4 | |
10223 | } | |
ebd8d4e8 | 10224 | |
ab78acc6 IC |
10225 | writeUInt32(this.version) |
10226 | writeSlice(this.prevHash) | |
10227 | writeSlice(this.merkleRoot) | |
10228 | writeUInt32(this.timestamp) | |
10229 | writeUInt32(this.bits) | |
10230 | writeUInt32(this.nonce) | |
ebd8d4e8 | 10231 | |
ab78acc6 | 10232 | if (headersOnly || !this.transactions) return buffer |
ebd8d4e8 | 10233 | |
ab78acc6 IC |
10234 | var txLenBuffer = bufferutils.varIntBuffer(this.transactions.length) |
10235 | var txBuffers = this.transactions.map(function (tx) { | |
10236 | return tx.toBuffer() | |
10237 | }) | |
ebd8d4e8 | 10238 | |
ab78acc6 | 10239 | return Buffer.concat([buffer, txLenBuffer].concat(txBuffers)) |
ebd8d4e8 IC |
10240 | } |
10241 | ||
ab78acc6 IC |
10242 | Block.prototype.toHex = function (headersOnly) { |
10243 | return this.toBuffer(headersOnly).toString('hex') | |
ebd8d4e8 IC |
10244 | } |
10245 | ||
ab78acc6 IC |
10246 | module.exports = Block |
10247 | ||
10248 | }).call(this,require("buffer").Buffer) | |
10249 | },{"./bufferutils":57,"./crypto":58,"./transaction":70,"assert":5,"buffer":7}],57:[function(require,module,exports){ | |
10250 | (function (Buffer){ | |
10251 | var assert = require('assert') | |
10252 | var opcodes = require('./opcodes') | |
ebd8d4e8 IC |
10253 | |
10254 | // https://github.com/feross/buffer/blob/master/index.js#L1127 | |
ab78acc6 | 10255 | function verifuint (value, max) { |
ebd8d4e8 IC |
10256 | assert(typeof value === 'number', 'cannot write a non-number as a number') |
10257 | assert(value >= 0, 'specified a negative value for writing an unsigned value') | |
10258 | assert(value <= max, 'value is larger than maximum value for type') | |
10259 | assert(Math.floor(value) === value, 'value has a fractional component') | |
10260 | } | |
10261 | ||
ab78acc6 | 10262 | function pushDataSize (i) { |
ebd8d4e8 | 10263 | return i < opcodes.OP_PUSHDATA1 ? 1 |
ab78acc6 IC |
10264 | : i < 0xff ? 2 |
10265 | : i < 0xffff ? 3 | |
10266 | : 5 | |
ebd8d4e8 IC |
10267 | } |
10268 | ||
ab78acc6 | 10269 | function readPushDataInt (buffer, offset) { |
ebd8d4e8 IC |
10270 | var opcode = buffer.readUInt8(offset) |
10271 | var number, size | |
10272 | ||
10273 | // ~6 bit | |
10274 | if (opcode < opcodes.OP_PUSHDATA1) { | |
10275 | number = opcode | |
10276 | size = 1 | |
10277 | ||
10278 | // 8 bit | |
10279 | } else if (opcode === opcodes.OP_PUSHDATA1) { | |
ab78acc6 | 10280 | if (offset + 2 > buffer.length) return null |
ebd8d4e8 IC |
10281 | number = buffer.readUInt8(offset + 1) |
10282 | size = 2 | |
10283 | ||
10284 | // 16 bit | |
10285 | } else if (opcode === opcodes.OP_PUSHDATA2) { | |
ab78acc6 | 10286 | if (offset + 3 > buffer.length) return null |
ebd8d4e8 IC |
10287 | number = buffer.readUInt16LE(offset + 1) |
10288 | size = 3 | |
10289 | ||
10290 | // 32 bit | |
10291 | } else { | |
ab78acc6 | 10292 | if (offset + 5 > buffer.length) return null |
ebd8d4e8 IC |
10293 | assert.equal(opcode, opcodes.OP_PUSHDATA4, 'Unexpected opcode') |
10294 | ||
10295 | number = buffer.readUInt32LE(offset + 1) | |
10296 | size = 5 | |
ebd8d4e8 IC |
10297 | } |
10298 | ||
10299 | return { | |
10300 | opcode: opcode, | |
10301 | number: number, | |
10302 | size: size | |
10303 | } | |
10304 | } | |
10305 | ||
ab78acc6 | 10306 | function readUInt64LE (buffer, offset) { |
ebd8d4e8 IC |
10307 | var a = buffer.readUInt32LE(offset) |
10308 | var b = buffer.readUInt32LE(offset + 4) | |
10309 | b *= 0x100000000 | |
10310 | ||
10311 | verifuint(b + a, 0x001fffffffffffff) | |
10312 | ||
10313 | return b + a | |
10314 | } | |
10315 | ||
ab78acc6 | 10316 | function readVarInt (buffer, offset) { |
ebd8d4e8 IC |
10317 | var t = buffer.readUInt8(offset) |
10318 | var number, size | |
10319 | ||
10320 | // 8 bit | |
10321 | if (t < 253) { | |
10322 | number = t | |
10323 | size = 1 | |
10324 | ||
10325 | // 16 bit | |
10326 | } else if (t < 254) { | |
10327 | number = buffer.readUInt16LE(offset + 1) | |
10328 | size = 3 | |
10329 | ||
10330 | // 32 bit | |
10331 | } else if (t < 255) { | |
10332 | number = buffer.readUInt32LE(offset + 1) | |
10333 | size = 5 | |
10334 | ||
10335 | // 64 bit | |
10336 | } else { | |
10337 | number = readUInt64LE(buffer, offset + 1) | |
10338 | size = 9 | |
10339 | } | |
10340 | ||
10341 | return { | |
10342 | number: number, | |
10343 | size: size | |
10344 | } | |
10345 | } | |
10346 | ||
ab78acc6 | 10347 | function writePushDataInt (buffer, number, offset) { |
ebd8d4e8 IC |
10348 | var size = pushDataSize(number) |
10349 | ||
10350 | // ~6 bit | |
10351 | if (size === 1) { | |
10352 | buffer.writeUInt8(number, offset) | |
10353 | ||
10354 | // 8 bit | |
10355 | } else if (size === 2) { | |
10356 | buffer.writeUInt8(opcodes.OP_PUSHDATA1, offset) | |
10357 | buffer.writeUInt8(number, offset + 1) | |
10358 | ||
10359 | // 16 bit | |
10360 | } else if (size === 3) { | |
10361 | buffer.writeUInt8(opcodes.OP_PUSHDATA2, offset) | |
10362 | buffer.writeUInt16LE(number, offset + 1) | |
10363 | ||
10364 | // 32 bit | |
10365 | } else { | |
10366 | buffer.writeUInt8(opcodes.OP_PUSHDATA4, offset) | |
10367 | buffer.writeUInt32LE(number, offset + 1) | |
ebd8d4e8 IC |
10368 | } |
10369 | ||
10370 | return size | |
10371 | } | |
10372 | ||
ab78acc6 | 10373 | function writeUInt64LE (buffer, value, offset) { |
ebd8d4e8 IC |
10374 | verifuint(value, 0x001fffffffffffff) |
10375 | ||
10376 | buffer.writeInt32LE(value & -1, offset) | |
10377 | buffer.writeUInt32LE(Math.floor(value / 0x100000000), offset + 4) | |
10378 | } | |
10379 | ||
ab78acc6 IC |
10380 | function varIntSize (i) { |
10381 | return i < 253 ? 1 | |
10382 | : i < 0x10000 ? 3 | |
10383 | : i < 0x100000000 ? 5 | |
10384 | : 9 | |
ebd8d4e8 IC |
10385 | } |
10386 | ||
ab78acc6 | 10387 | function writeVarInt (buffer, number, offset) { |
ebd8d4e8 IC |
10388 | var size = varIntSize(number) |
10389 | ||
10390 | // 8 bit | |
10391 | if (size === 1) { | |
10392 | buffer.writeUInt8(number, offset) | |
10393 | ||
10394 | // 16 bit | |
10395 | } else if (size === 3) { | |
10396 | buffer.writeUInt8(253, offset) | |
10397 | buffer.writeUInt16LE(number, offset + 1) | |
10398 | ||
10399 | // 32 bit | |
10400 | } else if (size === 5) { | |
10401 | buffer.writeUInt8(254, offset) | |
10402 | buffer.writeUInt32LE(number, offset + 1) | |
10403 | ||
10404 | // 64 bit | |
10405 | } else { | |
10406 | buffer.writeUInt8(255, offset) | |
10407 | writeUInt64LE(buffer, number, offset + 1) | |
10408 | } | |
10409 | ||
10410 | return size | |
10411 | } | |
10412 | ||
ab78acc6 IC |
10413 | function varIntBuffer (i) { |
10414 | var size = varIntSize(i) | |
10415 | var buffer = new Buffer(size) | |
10416 | writeVarInt(buffer, i, 0) | |
10417 | ||
10418 | return buffer | |
10419 | } | |
10420 | ||
10421 | function reverse (buffer) { | |
10422 | var buffer2 = new Buffer(buffer) | |
10423 | Array.prototype.reverse.call(buffer2) | |
10424 | return buffer2 | |
10425 | } | |
10426 | ||
ebd8d4e8 IC |
10427 | module.exports = { |
10428 | pushDataSize: pushDataSize, | |
10429 | readPushDataInt: readPushDataInt, | |
10430 | readUInt64LE: readUInt64LE, | |
10431 | readVarInt: readVarInt, | |
ab78acc6 IC |
10432 | reverse: reverse, |
10433 | varIntBuffer: varIntBuffer, | |
ebd8d4e8 IC |
10434 | varIntSize: varIntSize, |
10435 | writePushDataInt: writePushDataInt, | |
10436 | writeUInt64LE: writeUInt64LE, | |
10437 | writeVarInt: writeVarInt | |
10438 | } | |
10439 | ||
ab78acc6 IC |
10440 | }).call(this,require("buffer").Buffer) |
10441 | },{"./opcodes":67,"assert":5,"buffer":7}],58:[function(require,module,exports){ | |
10442 | var createHash = require('create-hash') | |
ebd8d4e8 | 10443 | |
ab78acc6 | 10444 | function hash160 (buffer) { |
ebd8d4e8 IC |
10445 | return ripemd160(sha256(buffer)) |
10446 | } | |
10447 | ||
ab78acc6 | 10448 | function hash256 (buffer) { |
ebd8d4e8 IC |
10449 | return sha256(sha256(buffer)) |
10450 | } | |
10451 | ||
ab78acc6 IC |
10452 | function ripemd160 (buffer) { |
10453 | return createHash('rmd160').update(buffer).digest() | |
ebd8d4e8 IC |
10454 | } |
10455 | ||
ab78acc6 IC |
10456 | function sha1 (buffer) { |
10457 | return createHash('sha1').update(buffer).digest() | |
ebd8d4e8 IC |
10458 | } |
10459 | ||
ab78acc6 IC |
10460 | function sha256 (buffer) { |
10461 | return createHash('sha256').update(buffer).digest() | |
ebd8d4e8 IC |
10462 | } |
10463 | ||
10464 | // FIXME: Name not consistent with others | |
ab78acc6 | 10465 | var createHmac = require('create-hmac') |
ebd8d4e8 | 10466 | |
ab78acc6 IC |
10467 | function HmacSHA256 (buffer, secret) { |
10468 | console.warn('Hmac* functions are deprecated for removal in 2.0.0, use node crypto instead') | |
10469 | return createHmac('sha256', secret).update(buffer).digest() | |
10470 | } | |
ebd8d4e8 | 10471 | |
ab78acc6 IC |
10472 | function HmacSHA512 (buffer, secret) { |
10473 | console.warn('Hmac* functions are deprecated for removal in 2.0.0, use node crypto instead') | |
10474 | return createHmac('sha512', secret).update(buffer).digest() | |
ebd8d4e8 IC |
10475 | } |
10476 | ||
10477 | module.exports = { | |
10478 | ripemd160: ripemd160, | |
10479 | sha1: sha1, | |
10480 | sha256: sha256, | |
10481 | hash160: hash160, | |
10482 | hash256: hash256, | |
10483 | HmacSHA256: HmacSHA256, | |
10484 | HmacSHA512: HmacSHA512 | |
10485 | } | |
10486 | ||
ab78acc6 | 10487 | },{"create-hash":32,"create-hmac":45}],59:[function(require,module,exports){ |
ebd8d4e8 | 10488 | (function (Buffer){ |
ab78acc6 IC |
10489 | var assert = require('assert') |
10490 | var createHmac = require('create-hmac') | |
10491 | var typeForce = require('typeforce') | |
ebd8d4e8 | 10492 | |
ab78acc6 IC |
10493 | var BigInteger = require('bigi') |
10494 | var ECSignature = require('./ecsignature') | |
10495 | ||
10496 | var ZERO = new Buffer([0]) | |
10497 | var ONE = new Buffer([1]) | |
ebd8d4e8 IC |
10498 | |
10499 | // https://tools.ietf.org/html/rfc6979#section-3.2 | |
ab78acc6 IC |
10500 | function deterministicGenerateK (curve, hash, d, checkSig) { |
10501 | typeForce('Buffer', hash) | |
10502 | typeForce('BigInteger', d) | |
10503 | ||
10504 | // FIXME: remove/uncomment for 2.0.0 | |
10505 | // typeForce('Function', checkSig) | |
10506 | ||
10507 | if (typeof checkSig !== 'function') { | |
10508 | console.warn('deterministicGenerateK requires a checkSig callback in 2.0.0, see #337 for more information') | |
10509 | ||
10510 | checkSig = function (k) { | |
10511 | var G = curve.G | |
10512 | var n = curve.n | |
10513 | var e = BigInteger.fromBuffer(hash) | |
10514 | ||
10515 | var Q = G.multiply(k) | |
10516 | ||
10517 | if (curve.isInfinity(Q)) | |
10518 | return false | |
10519 | ||
10520 | var r = Q.affineX.mod(n) | |
10521 | if (r.signum() === 0) | |
10522 | return false | |
10523 | ||
10524 | var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n) | |
10525 | if (s.signum() === 0) | |
10526 | return false | |
10527 | ||
10528 | return true | |
10529 | } | |
10530 | } | |
10531 | ||
10532 | // sanity check | |
ebd8d4e8 | 10533 | assert.equal(hash.length, 32, 'Hash must be 256 bit') |
ebd8d4e8 IC |
10534 | |
10535 | var x = d.toBuffer(32) | |
10536 | var k = new Buffer(32) | |
10537 | var v = new Buffer(32) | |
10538 | ||
ab78acc6 | 10539 | // Step A, ignored as hash already provided |
ebd8d4e8 IC |
10540 | // Step B |
10541 | v.fill(1) | |
10542 | ||
10543 | // Step C | |
10544 | k.fill(0) | |
10545 | ||
10546 | // Step D | |
ab78acc6 IC |
10547 | k = createHmac('sha256', k) |
10548 | .update(v) | |
10549 | .update(ZERO) | |
10550 | .update(x) | |
10551 | .update(hash) | |
10552 | .digest() | |
ebd8d4e8 IC |
10553 | |
10554 | // Step E | |
ab78acc6 | 10555 | v = createHmac('sha256', k).update(v).digest() |
ebd8d4e8 IC |
10556 | |
10557 | // Step F | |
ab78acc6 IC |
10558 | k = createHmac('sha256', k) |
10559 | .update(v) | |
10560 | .update(ONE) | |
10561 | .update(x) | |
10562 | .update(hash) | |
10563 | .digest() | |
ebd8d4e8 IC |
10564 | |
10565 | // Step G | |
ab78acc6 | 10566 | v = createHmac('sha256', k).update(v).digest() |
ebd8d4e8 IC |
10567 | |
10568 | // Step H1/H2a, ignored as tlen === qlen (256 bit) | |
10569 | // Step H2b | |
ab78acc6 | 10570 | v = createHmac('sha256', k).update(v).digest() |
ebd8d4e8 IC |
10571 | |
10572 | var T = BigInteger.fromBuffer(v) | |
10573 | ||
ab78acc6 IC |
10574 | // Step H3, repeat until T is within the interval [1, n - 1] and is suitable for ECDSA |
10575 | while ((T.signum() <= 0) || (T.compareTo(curve.n) >= 0) || !checkSig(T)) { | |
10576 | k = createHmac('sha256', k) | |
10577 | .update(v) | |
10578 | .update(ZERO) | |
10579 | .digest() | |
10580 | ||
10581 | v = createHmac('sha256', k).update(v).digest() | |
ebd8d4e8 | 10582 | |
ab78acc6 IC |
10583 | // Step H1/H2a, again, ignored as tlen === qlen (256 bit) |
10584 | // Step H2b again | |
10585 | v = createHmac('sha256', k).update(v).digest() | |
ebd8d4e8 IC |
10586 | T = BigInteger.fromBuffer(v) |
10587 | } | |
10588 | ||
10589 | return T | |
10590 | } | |
10591 | ||
ab78acc6 IC |
10592 | function sign (curve, hash, d) { |
10593 | var r, s | |
ebd8d4e8 | 10594 | |
ab78acc6 | 10595 | var e = BigInteger.fromBuffer(hash) |
ebd8d4e8 IC |
10596 | var n = curve.n |
10597 | var G = curve.G | |
ebd8d4e8 | 10598 | |
ab78acc6 IC |
10599 | deterministicGenerateK(curve, hash, d, function (k) { |
10600 | var Q = G.multiply(k) | |
10601 | ||
10602 | if (curve.isInfinity(Q)) | |
10603 | return false | |
10604 | ||
10605 | r = Q.affineX.mod(n) | |
10606 | if (r.signum() === 0) | |
10607 | return false | |
10608 | ||
10609 | s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n) | |
10610 | if (s.signum() === 0) | |
10611 | return false | |
ebd8d4e8 | 10612 | |
ab78acc6 IC |
10613 | return true |
10614 | }) | |
ebd8d4e8 IC |
10615 | |
10616 | var N_OVER_TWO = n.shiftRight(1) | |
10617 | ||
10618 | // enforce low S values, see bip62: 'low s values in signatures' | |
10619 | if (s.compareTo(N_OVER_TWO) > 0) { | |
10620 | s = n.subtract(s) | |
10621 | } | |
10622 | ||
10623 | return new ECSignature(r, s) | |
10624 | } | |
10625 | ||
ab78acc6 | 10626 | function verifyRaw (curve, e, signature, Q) { |
ebd8d4e8 IC |
10627 | var n = curve.n |
10628 | var G = curve.G | |
10629 | ||
10630 | var r = signature.r | |
10631 | var s = signature.s | |
10632 | ||
ab78acc6 IC |
10633 | // 1.4.1 Enforce r and s are both integers in the interval [1, n − 1] |
10634 | if (r.signum() <= 0 || r.compareTo(n) >= 0) return false | |
10635 | if (s.signum() <= 0 || s.compareTo(n) >= 0) return false | |
ebd8d4e8 | 10636 | |
ab78acc6 | 10637 | // c = s^-1 mod n |
ebd8d4e8 IC |
10638 | var c = s.modInverse(n) |
10639 | ||
ab78acc6 IC |
10640 | // 1.4.4 Compute u1 = es^−1 mod n |
10641 | // u2 = rs^−1 mod n | |
ebd8d4e8 IC |
10642 | var u1 = e.multiply(c).mod(n) |
10643 | var u2 = r.multiply(c).mod(n) | |
10644 | ||
ab78acc6 IC |
10645 | // 1.4.5 Compute R = (xR, yR) = u1G + u2Q |
10646 | var R = G.multiplyTwo(u1, Q, u2) | |
10647 | var v = R.affineX.mod(n) | |
ebd8d4e8 | 10648 | |
ab78acc6 IC |
10649 | // 1.4.5 (cont.) Enforce R is not at infinity |
10650 | if (curve.isInfinity(R)) return false | |
10651 | ||
10652 | // 1.4.8 If v = r, output "valid", and if v != r, output "invalid" | |
ebd8d4e8 IC |
10653 | return v.equals(r) |
10654 | } | |
10655 | ||
ab78acc6 IC |
10656 | function verify (curve, hash, signature, Q) { |
10657 | // 1.4.2 H = Hash(M), already done by the user | |
10658 | // 1.4.3 e = H | |
10659 | var e = BigInteger.fromBuffer(hash) | |
10660 | ||
10661 | return verifyRaw(curve, e, signature, Q) | |
10662 | } | |
10663 | ||
ebd8d4e8 IC |
10664 | /** |
10665 | * Recover a public key from a signature. | |
10666 | * | |
10667 | * See SEC 1: Elliptic Curve Cryptography, section 4.1.6, "Public | |
10668 | * Key Recovery Operation". | |
10669 | * | |
10670 | * http://www.secg.org/download/aid-780/sec1-v2.pdf | |
10671 | */ | |
ab78acc6 | 10672 | function recoverPubKey (curve, e, signature, i) { |
ebd8d4e8 IC |
10673 | assert.strictEqual(i & 3, i, 'Recovery param is more than two bits') |
10674 | ||
ab78acc6 IC |
10675 | var n = curve.n |
10676 | var G = curve.G | |
10677 | ||
ebd8d4e8 IC |
10678 | var r = signature.r |
10679 | var s = signature.s | |
10680 | ||
ab78acc6 IC |
10681 | assert(r.signum() > 0 && r.compareTo(n) < 0, 'Invalid r value') |
10682 | assert(s.signum() > 0 && s.compareTo(n) < 0, 'Invalid s value') | |
10683 | ||
ebd8d4e8 IC |
10684 | // A set LSB signifies that the y-coordinate is odd |
10685 | var isYOdd = i & 1 | |
10686 | ||
10687 | // The more significant bit specifies whether we should use the | |
10688 | // first or second candidate key. | |
10689 | var isSecondKey = i >> 1 | |
10690 | ||
ebd8d4e8 IC |
10691 | // 1.1 Let x = r + jn |
10692 | var x = isSecondKey ? r.add(n) : r | |
10693 | var R = curve.pointFromX(isYOdd, x) | |
10694 | ||
10695 | // 1.4 Check that nR is at infinity | |
10696 | var nR = R.multiply(n) | |
10697 | assert(curve.isInfinity(nR), 'nR is not a valid curve point') | |
10698 | ||
10699 | // Compute -e from e | |
10700 | var eNeg = e.negate().mod(n) | |
10701 | ||
10702 | // 1.6.1 Compute Q = r^-1 (sR - eG) | |
10703 | // Q = r^-1 (sR + -eG) | |
10704 | var rInv = r.modInverse(n) | |
10705 | ||
10706 | var Q = R.multiplyTwo(s, G, eNeg).multiply(rInv) | |
10707 | curve.validate(Q) | |
10708 | ||
10709 | return Q | |
10710 | } | |
10711 | ||
10712 | /** | |
10713 | * Calculate pubkey extraction parameter. | |
10714 | * | |
10715 | * When extracting a pubkey from a signature, we have to | |
10716 | * distinguish four different cases. Rather than putting this | |
10717 | * burden on the verifier, Bitcoin includes a 2-bit value with the | |
10718 | * signature. | |
10719 | * | |
10720 | * This function simply tries all four cases and returns the value | |
10721 | * that resulted in a successful pubkey recovery. | |
10722 | */ | |
ab78acc6 | 10723 | function calcPubKeyRecoveryParam (curve, e, signature, Q) { |
ebd8d4e8 IC |
10724 | for (var i = 0; i < 4; i++) { |
10725 | var Qprime = recoverPubKey(curve, e, signature, i) | |
10726 | ||
10727 | // 1.6.2 Verify Q | |
10728 | if (Qprime.equals(Q)) { | |
10729 | return i | |
10730 | } | |
10731 | } | |
10732 | ||
10733 | throw new Error('Unable to find valid recovery factor') | |
10734 | } | |
10735 | ||
10736 | module.exports = { | |
10737 | calcPubKeyRecoveryParam: calcPubKeyRecoveryParam, | |
10738 | deterministicGenerateK: deterministicGenerateK, | |
10739 | recoverPubKey: recoverPubKey, | |
10740 | sign: sign, | |
10741 | verify: verify, | |
10742 | verifyRaw: verifyRaw | |
10743 | } | |
10744 | ||
ab78acc6 IC |
10745 | }).call(this,require("buffer").Buffer) |
10746 | },{"./ecsignature":62,"assert":5,"bigi":3,"buffer":7,"create-hmac":45,"typeforce":53}],60:[function(require,module,exports){ | |
ebd8d4e8 | 10747 | (function (Buffer){ |
ab78acc6 IC |
10748 | var assert = require('assert') |
10749 | var base58check = require('bs58check') | |
10750 | var ecdsa = require('./ecdsa') | |
10751 | var networks = require('./networks') | |
10752 | var randomBytes = require('randombytes') | |
10753 | var typeForce = require('typeforce') | |
ebd8d4e8 | 10754 | |
ab78acc6 IC |
10755 | var BigInteger = require('bigi') |
10756 | var ECPubKey = require('./ecpubkey') | |
ebd8d4e8 | 10757 | |
ab78acc6 IC |
10758 | var ecurve = require('ecurve') |
10759 | var secp256k1 = ecurve.getCurveByName('secp256k1') | |
ebd8d4e8 | 10760 | |
ab78acc6 | 10761 | function ECKey (d, compressed) { |
ebd8d4e8 | 10762 | assert(d.signum() > 0, 'Private key must be greater than 0') |
ab78acc6 | 10763 | assert(d.compareTo(ECKey.curve.n) < 0, 'Private key must be less than the curve order') |
ebd8d4e8 | 10764 | |
ab78acc6 | 10765 | var Q = ECKey.curve.G.multiply(d) |
ebd8d4e8 IC |
10766 | |
10767 | this.d = d | |
10768 | this.pub = new ECPubKey(Q, compressed) | |
10769 | } | |
10770 | ||
ab78acc6 IC |
10771 | // Constants |
10772 | ECKey.curve = secp256k1 | |
10773 | ||
ebd8d4e8 | 10774 | // Static constructors |
ab78acc6 | 10775 | ECKey.fromWIF = function (string) { |
ebd8d4e8 IC |
10776 | var payload = base58check.decode(string) |
10777 | var compressed = false | |
10778 | ||
10779 | // Ignore the version byte | |
10780 | payload = payload.slice(1) | |
10781 | ||
10782 | if (payload.length === 33) { | |
10783 | assert.strictEqual(payload[32], 0x01, 'Invalid compression flag') | |
10784 | ||
10785 | // Truncate the compression flag | |
10786 | payload = payload.slice(0, -1) | |
10787 | compressed = true | |
10788 | } | |
10789 | ||
10790 | assert.equal(payload.length, 32, 'Invalid WIF payload length') | |
10791 | ||
10792 | var d = BigInteger.fromBuffer(payload) | |
10793 | return new ECKey(d, compressed) | |
10794 | } | |
10795 | ||
ab78acc6 IC |
10796 | ECKey.makeRandom = function (compressed, rng) { |
10797 | rng = rng || randomBytes | |
ebd8d4e8 IC |
10798 | |
10799 | var buffer = rng(32) | |
ab78acc6 IC |
10800 | typeForce('Buffer', buffer) |
10801 | assert.equal(buffer.length, 32, 'Expected 256-bit Buffer from RNG') | |
ebd8d4e8 IC |
10802 | |
10803 | var d = BigInteger.fromBuffer(buffer) | |
ab78acc6 | 10804 | d = d.mod(ECKey.curve.n) |
ebd8d4e8 IC |
10805 | |
10806 | return new ECKey(d, compressed) | |
10807 | } | |
10808 | ||
10809 | // Export functions | |
ab78acc6 | 10810 | ECKey.prototype.toWIF = function (network) { |
ebd8d4e8 IC |
10811 | network = network || networks.bitcoin |
10812 | ||
10813 | var bufferLen = this.pub.compressed ? 34 : 33 | |
10814 | var buffer = new Buffer(bufferLen) | |
10815 | ||
10816 | buffer.writeUInt8(network.wif, 0) | |
10817 | this.d.toBuffer(32).copy(buffer, 1) | |
10818 | ||
10819 | if (this.pub.compressed) { | |
10820 | buffer.writeUInt8(0x01, 33) | |
10821 | } | |
10822 | ||
10823 | return base58check.encode(buffer) | |
10824 | } | |
10825 | ||
10826 | // Operations | |
ab78acc6 IC |
10827 | ECKey.prototype.sign = function (hash) { |
10828 | return ecdsa.sign(ECKey.curve, hash, this.d) | |
ebd8d4e8 IC |
10829 | } |
10830 | ||
10831 | module.exports = ECKey | |
10832 | ||
ab78acc6 IC |
10833 | }).call(this,require("buffer").Buffer) |
10834 | },{"./ecdsa":59,"./ecpubkey":61,"./networks":66,"assert":5,"bigi":3,"bs58check":31,"buffer":7,"ecurve":49,"randombytes":52,"typeforce":53}],61:[function(require,module,exports){ | |
ebd8d4e8 | 10835 | (function (Buffer){ |
ab78acc6 IC |
10836 | var crypto = require('./crypto') |
10837 | var ecdsa = require('./ecdsa') | |
10838 | var typeForce = require('typeforce') | |
10839 | var networks = require('./networks') | |
ebd8d4e8 | 10840 | |
ab78acc6 | 10841 | var Address = require('./address') |
ebd8d4e8 | 10842 | |
ab78acc6 IC |
10843 | var ecurve = require('ecurve') |
10844 | var secp256k1 = ecurve.getCurveByName('secp256k1') | |
ebd8d4e8 | 10845 | |
ab78acc6 IC |
10846 | function ECPubKey (Q, compressed) { |
10847 | if (compressed === undefined) { | |
10848 | compressed = true | |
10849 | } | |
ebd8d4e8 | 10850 | |
ab78acc6 IC |
10851 | typeForce('Point', Q) |
10852 | typeForce('Boolean', compressed) | |
ebd8d4e8 IC |
10853 | |
10854 | this.compressed = compressed | |
10855 | this.Q = Q | |
10856 | } | |
10857 | ||
ab78acc6 IC |
10858 | // Constants |
10859 | ECPubKey.curve = secp256k1 | |
10860 | ||
ebd8d4e8 | 10861 | // Static constructors |
ab78acc6 IC |
10862 | ECPubKey.fromBuffer = function (buffer) { |
10863 | var Q = ecurve.Point.decodeFrom(ECPubKey.curve, buffer) | |
ebd8d4e8 IC |
10864 | return new ECPubKey(Q, Q.compressed) |
10865 | } | |
10866 | ||
ab78acc6 | 10867 | ECPubKey.fromHex = function (hex) { |
ebd8d4e8 IC |
10868 | return ECPubKey.fromBuffer(new Buffer(hex, 'hex')) |
10869 | } | |
10870 | ||
10871 | // Operations | |
ab78acc6 | 10872 | ECPubKey.prototype.getAddress = function (network) { |
ebd8d4e8 IC |
10873 | network = network || networks.bitcoin |
10874 | ||
10875 | return new Address(crypto.hash160(this.toBuffer()), network.pubKeyHash) | |
10876 | } | |
10877 | ||
ab78acc6 IC |
10878 | ECPubKey.prototype.verify = function (hash, signature) { |
10879 | return ecdsa.verify(ECPubKey.curve, hash, signature, this.Q) | |
ebd8d4e8 IC |
10880 | } |
10881 | ||
10882 | // Export functions | |
ab78acc6 | 10883 | ECPubKey.prototype.toBuffer = function () { |
ebd8d4e8 IC |
10884 | return this.Q.getEncoded(this.compressed) |
10885 | } | |
10886 | ||
ab78acc6 | 10887 | ECPubKey.prototype.toHex = function () { |
ebd8d4e8 IC |
10888 | return this.toBuffer().toString('hex') |
10889 | } | |
10890 | ||
10891 | module.exports = ECPubKey | |
10892 | ||
ab78acc6 IC |
10893 | }).call(this,require("buffer").Buffer) |
10894 | },{"./address":54,"./crypto":58,"./ecdsa":59,"./networks":66,"buffer":7,"ecurve":49,"typeforce":53}],62:[function(require,module,exports){ | |
ebd8d4e8 | 10895 | (function (Buffer){ |
ab78acc6 IC |
10896 | var assert = require('assert') |
10897 | var typeForce = require('typeforce') | |
10898 | ||
10899 | var BigInteger = require('bigi') | |
10900 | ||
10901 | function ECSignature (r, s) { | |
10902 | typeForce('BigInteger', r) | |
10903 | typeForce('BigInteger', s) | |
ebd8d4e8 | 10904 | |
ebd8d4e8 IC |
10905 | this.r = r |
10906 | this.s = s | |
10907 | } | |
10908 | ||
ab78acc6 | 10909 | ECSignature.parseCompact = function (buffer) { |
ebd8d4e8 IC |
10910 | assert.equal(buffer.length, 65, 'Invalid signature length') |
10911 | var i = buffer.readUInt8(0) - 27 | |
10912 | ||
10913 | // At most 3 bits | |
10914 | assert.equal(i, i & 7, 'Invalid signature parameter') | |
10915 | var compressed = !!(i & 4) | |
10916 | ||
10917 | // Recovery param only | |
10918 | i = i & 3 | |
10919 | ||
10920 | var r = BigInteger.fromBuffer(buffer.slice(1, 33)) | |
10921 | var s = BigInteger.fromBuffer(buffer.slice(33)) | |
10922 | ||
10923 | return { | |
10924 | compressed: compressed, | |
10925 | i: i, | |
10926 | signature: new ECSignature(r, s) | |
10927 | } | |
10928 | } | |
10929 | ||
ab78acc6 | 10930 | ECSignature.fromDER = function (buffer) { |
ebd8d4e8 IC |
10931 | assert.equal(buffer.readUInt8(0), 0x30, 'Not a DER sequence') |
10932 | assert.equal(buffer.readUInt8(1), buffer.length - 2, 'Invalid sequence length') | |
10933 | assert.equal(buffer.readUInt8(2), 0x02, 'Expected a DER integer') | |
10934 | ||
10935 | var rLen = buffer.readUInt8(3) | |
10936 | assert(rLen > 0, 'R length is zero') | |
10937 | ||
10938 | var offset = 4 + rLen | |
10939 | assert.equal(buffer.readUInt8(offset), 0x02, 'Expected a DER integer (2)') | |
10940 | ||
10941 | var sLen = buffer.readUInt8(offset + 1) | |
10942 | assert(sLen > 0, 'S length is zero') | |
10943 | ||
10944 | var rB = buffer.slice(4, offset) | |
10945 | var sB = buffer.slice(offset + 2) | |
10946 | offset += 2 + sLen | |
10947 | ||
10948 | if (rLen > 1 && rB.readUInt8(0) === 0x00) { | |
10949 | assert(rB.readUInt8(1) & 0x80, 'R value excessively padded') | |
10950 | } | |
10951 | ||
10952 | if (sLen > 1 && sB.readUInt8(0) === 0x00) { | |
10953 | assert(sB.readUInt8(1) & 0x80, 'S value excessively padded') | |
10954 | } | |
10955 | ||
10956 | assert.equal(offset, buffer.length, 'Invalid DER encoding') | |
10957 | var r = BigInteger.fromDERInteger(rB) | |
10958 | var s = BigInteger.fromDERInteger(sB) | |
10959 | ||
10960 | assert(r.signum() >= 0, 'R value is negative') | |
10961 | assert(s.signum() >= 0, 'S value is negative') | |
10962 | ||
10963 | return new ECSignature(r, s) | |
10964 | } | |
10965 | ||
ab78acc6 IC |
10966 | // BIP62: 1 byte hashType flag (only 0x01, 0x02, 0x03, 0x81, 0x82 and 0x83 are allowed) |
10967 | ECSignature.parseScriptSignature = function (buffer) { | |
ebd8d4e8 IC |
10968 | var hashType = buffer.readUInt8(buffer.length - 1) |
10969 | var hashTypeMod = hashType & ~0x80 | |
10970 | ||
ab78acc6 | 10971 | assert(hashTypeMod > 0x00 && hashTypeMod < 0x04, 'Invalid hashType ' + hashType) |
ebd8d4e8 IC |
10972 | |
10973 | return { | |
10974 | signature: ECSignature.fromDER(buffer.slice(0, -1)), | |
10975 | hashType: hashType | |
10976 | } | |
10977 | } | |
10978 | ||
ab78acc6 IC |
10979 | ECSignature.prototype.toCompact = function (i, compressed) { |
10980 | if (compressed) { | |
10981 | i += 4 | |
10982 | } | |
10983 | ||
ebd8d4e8 IC |
10984 | i += 27 |
10985 | ||
10986 | var buffer = new Buffer(65) | |
10987 | buffer.writeUInt8(i, 0) | |
10988 | ||
10989 | this.r.toBuffer(32).copy(buffer, 1) | |
10990 | this.s.toBuffer(32).copy(buffer, 33) | |
10991 | ||
10992 | return buffer | |
10993 | } | |
10994 | ||
ab78acc6 | 10995 | ECSignature.prototype.toDER = function () { |
ebd8d4e8 IC |
10996 | var rBa = this.r.toDERInteger() |
10997 | var sBa = this.s.toDERInteger() | |
10998 | ||
10999 | var sequence = [] | |
ab78acc6 IC |
11000 | |
11001 | // INTEGER | |
11002 | sequence.push(0x02, rBa.length) | |
ebd8d4e8 IC |
11003 | sequence = sequence.concat(rBa) |
11004 | ||
ab78acc6 IC |
11005 | // INTEGER |
11006 | sequence.push(0x02, sBa.length) | |
ebd8d4e8 IC |
11007 | sequence = sequence.concat(sBa) |
11008 | ||
ab78acc6 IC |
11009 | // SEQUENCE |
11010 | sequence.unshift(0x30, sequence.length) | |
ebd8d4e8 IC |
11011 | |
11012 | return new Buffer(sequence) | |
11013 | } | |
11014 | ||
ab78acc6 IC |
11015 | ECSignature.prototype.toScriptSignature = function (hashType) { |
11016 | var hashTypeMod = hashType & ~0x80 | |
11017 | assert(hashTypeMod > 0x00 && hashTypeMod < 0x04, 'Invalid hashType ' + hashType) | |
11018 | ||
ebd8d4e8 IC |
11019 | var hashTypeBuffer = new Buffer(1) |
11020 | hashTypeBuffer.writeUInt8(hashType, 0) | |
11021 | ||
11022 | return Buffer.concat([this.toDER(), hashTypeBuffer]) | |
11023 | } | |
11024 | ||
11025 | module.exports = ECSignature | |
11026 | ||
ab78acc6 IC |
11027 | }).call(this,require("buffer").Buffer) |
11028 | },{"assert":5,"bigi":3,"buffer":7,"typeforce":53}],63:[function(require,module,exports){ | |
ebd8d4e8 | 11029 | (function (Buffer){ |
ab78acc6 IC |
11030 | var assert = require('assert') |
11031 | var base58check = require('bs58check') | |
11032 | var bcrypto = require('./crypto') | |
11033 | var createHmac = require('create-hmac') | |
11034 | var typeForce = require('typeforce') | |
11035 | var networks = require('./networks') | |
11036 | ||
11037 | var BigInteger = require('bigi') | |
11038 | var ECKey = require('./eckey') | |
11039 | var ECPubKey = require('./ecpubkey') | |
11040 | ||
11041 | var ecurve = require('ecurve') | |
ebd8d4e8 IC |
11042 | var curve = ecurve.getCurveByName('secp256k1') |
11043 | ||
ab78acc6 | 11044 | function findBIP32NetworkByVersion (version) { |
ebd8d4e8 IC |
11045 | for (var name in networks) { |
11046 | var network = networks[name] | |
11047 | ||
ab78acc6 IC |
11048 | if (version === network.bip32.private || version === network.bip32.public) { |
11049 | return network | |
ebd8d4e8 IC |
11050 | } |
11051 | } | |
11052 | ||
ab78acc6 | 11053 | assert(false, 'Could not find network for ' + version.toString(16)) |
ebd8d4e8 IC |
11054 | } |
11055 | ||
ab78acc6 | 11056 | function HDNode (K, chainCode, network) { |
ebd8d4e8 IC |
11057 | network = network || networks.bitcoin |
11058 | ||
ab78acc6 IC |
11059 | typeForce('Buffer', chainCode) |
11060 | ||
11061 | assert.equal(chainCode.length, 32, 'Expected chainCode length of 32, got ' + chainCode.length) | |
ebd8d4e8 IC |
11062 | assert(network.bip32, 'Unknown BIP32 constants for network') |
11063 | ||
11064 | this.chainCode = chainCode | |
11065 | this.depth = 0 | |
11066 | this.index = 0 | |
ab78acc6 | 11067 | this.parentFingerprint = 0x00000000 |
ebd8d4e8 IC |
11068 | this.network = network |
11069 | ||
11070 | if (K instanceof BigInteger) { | |
11071 | this.privKey = new ECKey(K, true) | |
11072 | this.pubKey = this.privKey.pub | |
ab78acc6 IC |
11073 | } else if (K instanceof ECKey) { |
11074 | assert(K.pub.compressed, 'ECKey must be compressed') | |
11075 | this.privKey = K | |
11076 | this.pubKey = K.pub | |
11077 | } else if (K instanceof ECPubKey) { | |
11078 | assert(K.compressed, 'ECPubKey must be compressed') | |
11079 | this.pubKey = K | |
ebd8d4e8 IC |
11080 | } else { |
11081 | this.pubKey = new ECPubKey(K, true) | |
11082 | } | |
11083 | } | |
11084 | ||
11085 | HDNode.MASTER_SECRET = new Buffer('Bitcoin seed') | |
11086 | HDNode.HIGHEST_BIT = 0x80000000 | |
11087 | HDNode.LENGTH = 78 | |
11088 | ||
ab78acc6 IC |
11089 | HDNode.fromSeedBuffer = function (seed, network) { |
11090 | typeForce('Buffer', seed) | |
11091 | ||
11092 | assert(seed.length >= 16, 'Seed should be at least 128 bits') | |
11093 | assert(seed.length <= 64, 'Seed should be at most 512 bits') | |
11094 | ||
11095 | var I = createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest() | |
ebd8d4e8 IC |
11096 | var IL = I.slice(0, 32) |
11097 | var IR = I.slice(32) | |
11098 | ||
11099 | // In case IL is 0 or >= n, the master key is invalid | |
11100 | // This is handled by `new ECKey` in the HDNode constructor | |
11101 | var pIL = BigInteger.fromBuffer(IL) | |
11102 | ||
11103 | return new HDNode(pIL, IR, network) | |
11104 | } | |
11105 | ||
ab78acc6 | 11106 | HDNode.fromSeedHex = function (hex, network) { |
ebd8d4e8 IC |
11107 | return HDNode.fromSeedBuffer(new Buffer(hex, 'hex'), network) |
11108 | } | |
11109 | ||
ab78acc6 IC |
11110 | HDNode.fromBase58 = function (string, network) { |
11111 | return HDNode.fromBuffer(base58check.decode(string), network, true) | |
ebd8d4e8 IC |
11112 | } |
11113 | ||
ab78acc6 IC |
11114 | // FIXME: remove in 2.x.y |
11115 | HDNode.fromBuffer = function (buffer, network, __ignoreDeprecation) { | |
11116 | if (!__ignoreDeprecation) { | |
11117 | console.warn('HDNode.fromBuffer() is deprecated for removal in 2.x.y, use fromBase58 instead') | |
11118 | } | |
11119 | ||
ebd8d4e8 IC |
11120 | assert.strictEqual(buffer.length, HDNode.LENGTH, 'Invalid buffer length') |
11121 | ||
11122 | // 4 byte: version bytes | |
11123 | var version = buffer.readUInt32BE(0) | |
ab78acc6 IC |
11124 | |
11125 | if (network) { | |
11126 | assert(version === network.bip32.private || version === network.bip32.public, "Network doesn't match") | |
11127 | ||
11128 | // auto-detect | |
11129 | } else { | |
11130 | network = findBIP32NetworkByVersion(version) | |
11131 | } | |
ebd8d4e8 IC |
11132 | |
11133 | // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, ... | |
11134 | var depth = buffer.readUInt8(4) | |
11135 | ||
11136 | // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) | |
11137 | var parentFingerprint = buffer.readUInt32BE(5) | |
11138 | if (depth === 0) { | |
11139 | assert.strictEqual(parentFingerprint, 0x00000000, 'Invalid parent fingerprint') | |
11140 | } | |
11141 | ||
11142 | // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. | |
11143 | // This is encoded in MSB order. (0x00000000 if master key) | |
11144 | var index = buffer.readUInt32BE(9) | |
11145 | assert(depth > 0 || index === 0, 'Invalid index') | |
11146 | ||
11147 | // 32 bytes: the chain code | |
11148 | var chainCode = buffer.slice(13, 45) | |
ab78acc6 | 11149 | var data, hd |
ebd8d4e8 IC |
11150 | |
11151 | // 33 bytes: private key data (0x00 + k) | |
ab78acc6 | 11152 | if (version === network.bip32.private) { |
ebd8d4e8 | 11153 | assert.strictEqual(buffer.readUInt8(45), 0x00, 'Invalid private key') |
ab78acc6 | 11154 | data = buffer.slice(46, 78) |
ebd8d4e8 | 11155 | var d = BigInteger.fromBuffer(data) |
ab78acc6 | 11156 | hd = new HDNode(d, chainCode, network) |
ebd8d4e8 IC |
11157 | |
11158 | // 33 bytes: public key data (0x02 + X or 0x03 + X) | |
11159 | } else { | |
ab78acc6 | 11160 | data = buffer.slice(45, 78) |
ebd8d4e8 IC |
11161 | var Q = ecurve.Point.decodeFrom(curve, data) |
11162 | assert.equal(Q.compressed, true, 'Invalid public key') | |
11163 | ||
11164 | // Verify that the X coordinate in the public point corresponds to a point on the curve. | |
11165 | // If not, the extended public key is invalid. | |
11166 | curve.validate(Q) | |
11167 | ||
ab78acc6 | 11168 | hd = new HDNode(Q, chainCode, network) |
ebd8d4e8 IC |
11169 | } |
11170 | ||
11171 | hd.depth = depth | |
11172 | hd.index = index | |
11173 | hd.parentFingerprint = parentFingerprint | |
11174 | ||
11175 | return hd | |
11176 | } | |
11177 | ||
ab78acc6 IC |
11178 | // FIXME: remove in 2.x.y |
11179 | HDNode.fromHex = function (hex, network) { | |
11180 | return HDNode.fromBuffer(new Buffer(hex, 'hex'), network) | |
ebd8d4e8 IC |
11181 | } |
11182 | ||
ab78acc6 IC |
11183 | HDNode.prototype.getIdentifier = function () { |
11184 | return bcrypto.hash160(this.pubKey.toBuffer()) | |
ebd8d4e8 IC |
11185 | } |
11186 | ||
ab78acc6 | 11187 | HDNode.prototype.getFingerprint = function () { |
ebd8d4e8 IC |
11188 | return this.getIdentifier().slice(0, 4) |
11189 | } | |
11190 | ||
ab78acc6 | 11191 | HDNode.prototype.getAddress = function () { |
ebd8d4e8 IC |
11192 | return this.pubKey.getAddress(this.network) |
11193 | } | |
11194 | ||
ab78acc6 IC |
11195 | HDNode.prototype.neutered = function () { |
11196 | var neutered = new HDNode(this.pubKey.Q, this.chainCode, this.network) | |
11197 | neutered.depth = this.depth | |
11198 | neutered.index = this.index | |
11199 | neutered.parentFingerprint = this.parentFingerprint | |
11200 | ||
11201 | return neutered | |
11202 | } | |
11203 | ||
11204 | HDNode.prototype.toBase58 = function (isPrivate) { | |
11205 | return base58check.encode(this.toBuffer(isPrivate, true)) | |
ebd8d4e8 IC |
11206 | } |
11207 | ||
ab78acc6 IC |
11208 | // FIXME: remove in 2.x.y |
11209 | HDNode.prototype.toBuffer = function (isPrivate, __ignoreDeprecation) { | |
11210 | if (isPrivate === undefined) { | |
11211 | isPrivate = !!this.privKey | |
11212 | ||
11213 | // FIXME: remove in 2.x.y | |
11214 | } else { | |
11215 | console.warn('isPrivate flag is deprecated, please use the .neutered() method instead') | |
11216 | } | |
11217 | ||
11218 | if (!__ignoreDeprecation) { | |
11219 | console.warn('HDNode.toBuffer() is deprecated for removal in 2.x.y, use toBase58 instead') | |
11220 | } | |
ebd8d4e8 IC |
11221 | |
11222 | // Version | |
11223 | var version = isPrivate ? this.network.bip32.private : this.network.bip32.public | |
11224 | var buffer = new Buffer(HDNode.LENGTH) | |
11225 | ||
11226 | // 4 bytes: version bytes | |
11227 | buffer.writeUInt32BE(version, 0) | |
11228 | ||
11229 | // Depth | |
11230 | // 1 byte: depth: 0x00 for master nodes, 0x01 for level-1 descendants, .... | |
11231 | buffer.writeUInt8(this.depth, 4) | |
11232 | ||
11233 | // 4 bytes: the fingerprint of the parent's key (0x00000000 if master key) | |
ab78acc6 | 11234 | buffer.writeUInt32BE(this.parentFingerprint, 5) |
ebd8d4e8 IC |
11235 | |
11236 | // 4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized. | |
11237 | // This is encoded in Big endian. (0x00000000 if master key) | |
11238 | buffer.writeUInt32BE(this.index, 9) | |
11239 | ||
11240 | // 32 bytes: the chain code | |
11241 | this.chainCode.copy(buffer, 13) | |
11242 | ||
11243 | // 33 bytes: the public key or private key data | |
11244 | if (isPrivate) { | |
ab78acc6 | 11245 | // FIXME: remove in 2.x.y |
ebd8d4e8 IC |
11246 | assert(this.privKey, 'Missing private key') |
11247 | ||
11248 | // 0x00 + k for private keys | |
11249 | buffer.writeUInt8(0, 45) | |
11250 | this.privKey.d.toBuffer(32).copy(buffer, 46) | |
11251 | } else { | |
ebd8d4e8 IC |
11252 | // X9.62 encoding for public keys |
11253 | this.pubKey.toBuffer().copy(buffer, 45) | |
11254 | } | |
11255 | ||
11256 | return buffer | |
11257 | } | |
11258 | ||
ab78acc6 IC |
11259 | // FIXME: remove in 2.x.y |
11260 | HDNode.prototype.toHex = function (isPrivate) { | |
ebd8d4e8 IC |
11261 | return this.toBuffer(isPrivate).toString('hex') |
11262 | } | |
11263 | ||
11264 | // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#child-key-derivation-ckd-functions | |
ab78acc6 | 11265 | HDNode.prototype.derive = function (index) { |
ebd8d4e8 IC |
11266 | var isHardened = index >= HDNode.HIGHEST_BIT |
11267 | var indexBuffer = new Buffer(4) | |
11268 | indexBuffer.writeUInt32BE(index, 0) | |
11269 | ||
11270 | var data | |
11271 | ||
11272 | // Hardened child | |
11273 | if (isHardened) { | |
11274 | assert(this.privKey, 'Could not derive hardened child key') | |
11275 | ||
11276 | // data = 0x00 || ser256(kpar) || ser32(index) | |
11277 | data = Buffer.concat([ | |
11278 | this.privKey.d.toBuffer(33), | |
11279 | indexBuffer | |
11280 | ]) | |
11281 | ||
11282 | // Normal child | |
11283 | } else { | |
11284 | // data = serP(point(kpar)) || ser32(index) | |
11285 | // = serP(Kpar) || ser32(index) | |
11286 | data = Buffer.concat([ | |
11287 | this.pubKey.toBuffer(), | |
11288 | indexBuffer | |
11289 | ]) | |
11290 | } | |
11291 | ||
ab78acc6 | 11292 | var I = createHmac('sha512', this.chainCode).update(data).digest() |
ebd8d4e8 IC |
11293 | var IL = I.slice(0, 32) |
11294 | var IR = I.slice(32) | |
11295 | ||
11296 | var pIL = BigInteger.fromBuffer(IL) | |
11297 | ||
11298 | // In case parse256(IL) >= n, proceed with the next value for i | |
11299 | if (pIL.compareTo(curve.n) >= 0) { | |
11300 | return this.derive(index + 1) | |
11301 | } | |
11302 | ||
11303 | // Private parent key -> private child key | |
11304 | var hd | |
11305 | if (this.privKey) { | |
11306 | // ki = parse256(IL) + kpar (mod n) | |
11307 | var ki = pIL.add(this.privKey.d).mod(curve.n) | |
11308 | ||
11309 | // In case ki == 0, proceed with the next value for i | |
11310 | if (ki.signum() === 0) { | |
11311 | return this.derive(index + 1) | |
11312 | } | |
11313 | ||
11314 | hd = new HDNode(ki, IR, this.network) | |
11315 | ||
11316 | // Public parent key -> public child key | |
11317 | } else { | |
11318 | // Ki = point(parse256(IL)) + Kpar | |
11319 | // = G*IL + Kpar | |
11320 | var Ki = curve.G.multiply(pIL).add(this.pubKey.Q) | |
11321 | ||
11322 | // In case Ki is the point at infinity, proceed with the next value for i | |
11323 | if (curve.isInfinity(Ki)) { | |
11324 | return this.derive(index + 1) | |
11325 | } | |
11326 | ||
11327 | hd = new HDNode(Ki, IR, this.network) | |
11328 | } | |
11329 | ||
11330 | hd.depth = this.depth + 1 | |
11331 | hd.index = index | |
11332 | hd.parentFingerprint = this.getFingerprint().readUInt32BE(0) | |
11333 | ||
11334 | return hd | |
11335 | } | |
11336 | ||
ab78acc6 | 11337 | HDNode.prototype.deriveHardened = function (index) { |
ebd8d4e8 IC |
11338 | // Only derives hardened private keys by default |
11339 | return this.derive(index + HDNode.HIGHEST_BIT) | |
11340 | } | |
11341 | ||
11342 | HDNode.prototype.toString = HDNode.prototype.toBase58 | |
11343 | ||
11344 | module.exports = HDNode | |
11345 | ||
ab78acc6 IC |
11346 | }).call(this,require("buffer").Buffer) |
11347 | },{"./crypto":58,"./eckey":60,"./ecpubkey":61,"./networks":66,"assert":5,"bigi":3,"bs58check":31,"buffer":7,"create-hmac":45,"ecurve":49,"typeforce":53}],64:[function(require,module,exports){ | |
ebd8d4e8 | 11348 | module.exports = { |
ab78acc6 IC |
11349 | Address: require('./address'), |
11350 | base58check: require('./base58check'), | |
11351 | Block: require('./block'), | |
11352 | bufferutils: require('./bufferutils'), | |
11353 | crypto: require('./crypto'), | |
11354 | ecdsa: require('./ecdsa'), | |
11355 | ECKey: require('./eckey'), | |
11356 | ECPubKey: require('./ecpubkey'), | |
11357 | ECSignature: require('./ecsignature'), | |
11358 | Message: require('./message'), | |
11359 | opcodes: require('./opcodes'), | |
11360 | HDNode: require('./hdnode'), | |
11361 | Script: require('./script'), | |
11362 | scripts: require('./scripts'), | |
11363 | Transaction: require('./transaction'), | |
11364 | TransactionBuilder: require('./transaction_builder'), | |
11365 | networks: require('./networks'), | |
11366 | Wallet: require('./wallet') | |
11367 | } | |
11368 | ||
11369 | },{"./address":54,"./base58check":55,"./block":56,"./bufferutils":57,"./crypto":58,"./ecdsa":59,"./eckey":60,"./ecpubkey":61,"./ecsignature":62,"./hdnode":63,"./message":65,"./networks":66,"./opcodes":67,"./script":68,"./scripts":69,"./transaction":70,"./transaction_builder":71,"./wallet":72}],65:[function(require,module,exports){ | |
ebd8d4e8 | 11370 | (function (Buffer){ |
ab78acc6 IC |
11371 | var bufferutils = require('./bufferutils') |
11372 | var crypto = require('./crypto') | |
11373 | var ecdsa = require('./ecdsa') | |
11374 | var networks = require('./networks') | |
11375 | ||
11376 | var BigInteger = require('bigi') | |
11377 | var ECPubKey = require('./ecpubkey') | |
11378 | var ECSignature = require('./ecsignature') | |
11379 | ||
11380 | var ecurve = require('ecurve') | |
ebd8d4e8 IC |
11381 | var ecparams = ecurve.getCurveByName('secp256k1') |
11382 | ||
ab78acc6 | 11383 | function magicHash (message, network) { |
ebd8d4e8 IC |
11384 | var magicPrefix = new Buffer(network.magicPrefix) |
11385 | var messageBuffer = new Buffer(message) | |
ab78acc6 | 11386 | var lengthBuffer = bufferutils.varIntBuffer(messageBuffer.length) |
ebd8d4e8 IC |
11387 | |
11388 | var buffer = Buffer.concat([magicPrefix, lengthBuffer, messageBuffer]) | |
11389 | return crypto.hash256(buffer) | |
11390 | } | |
11391 | ||
ab78acc6 | 11392 | function sign (privKey, message, network) { |
ebd8d4e8 IC |
11393 | network = network || networks.bitcoin |
11394 | ||
11395 | var hash = magicHash(message, network) | |
11396 | var signature = privKey.sign(hash) | |
11397 | var e = BigInteger.fromBuffer(hash) | |
11398 | var i = ecdsa.calcPubKeyRecoveryParam(ecparams, e, signature, privKey.pub.Q) | |
11399 | ||
11400 | return signature.toCompact(i, privKey.pub.compressed) | |
11401 | } | |
11402 | ||
11403 | // TODO: network could be implied from address | |
ab78acc6 IC |
11404 | function verify (address, signature, message, network) { |
11405 | if (!Buffer.isBuffer(signature)) { | |
11406 | signature = new Buffer(signature, 'base64') | |
ebd8d4e8 | 11407 | } |
ab78acc6 | 11408 | |
ebd8d4e8 IC |
11409 | network = network || networks.bitcoin |
11410 | ||
11411 | var hash = magicHash(message, network) | |
ab78acc6 | 11412 | var parsed = ECSignature.parseCompact(signature) |
ebd8d4e8 IC |
11413 | var e = BigInteger.fromBuffer(hash) |
11414 | var Q = ecdsa.recoverPubKey(ecparams, e, parsed.signature, parsed.i) | |
11415 | ||
11416 | var pubKey = new ECPubKey(Q, parsed.compressed) | |
ab78acc6 | 11417 | return pubKey.getAddress(network).toString() === address.toString() |
ebd8d4e8 IC |
11418 | } |
11419 | ||
11420 | module.exports = { | |
11421 | magicHash: magicHash, | |
11422 | sign: sign, | |
11423 | verify: verify | |
11424 | } | |
11425 | ||
ab78acc6 IC |
11426 | }).call(this,require("buffer").Buffer) |
11427 | },{"./bufferutils":57,"./crypto":58,"./ecdsa":59,"./ecpubkey":61,"./ecsignature":62,"./networks":66,"bigi":3,"buffer":7,"ecurve":49}],66:[function(require,module,exports){ | |
ebd8d4e8 IC |
11428 | // https://en.bitcoin.it/wiki/List_of_address_prefixes |
11429 | // Dogecoin BIP32 is a proposed standard: https://bitcointalk.org/index.php?topic=409731 | |
11430 | ||
11431 | var networks = { | |
11432 | bitcoin: { | |
11433 | magicPrefix: '\x18Bitcoin Signed Message:\n', | |
11434 | bip32: { | |
11435 | public: 0x0488b21e, | |
11436 | private: 0x0488ade4 | |
11437 | }, | |
11438 | pubKeyHash: 0x00, | |
11439 | scriptHash: 0x05, | |
11440 | wif: 0x80, | |
11441 | dustThreshold: 546, // https://github.com/bitcoin/bitcoin/blob/v0.9.2/src/core.h#L151-L162 | |
11442 | feePerKb: 10000, // https://github.com/bitcoin/bitcoin/blob/v0.9.2/src/main.cpp#L53 | |
11443 | estimateFee: estimateFee('bitcoin') | |
a9385c1b | 11444 | }, |
ab78acc6 IC |
11445 | testnet: { |
11446 | magicPrefix: '\x18Bitcoin Signed Message:\n', | |
a9385c1b | 11447 | bip32: { |
ab78acc6 IC |
11448 | public: 0x043587cf, |
11449 | private: 0x04358394 | |
a9385c1b | 11450 | }, |
ab78acc6 IC |
11451 | pubKeyHash: 0x6f, |
11452 | scriptHash: 0xc4, | |
11453 | wif: 0xef, | |
11454 | dustThreshold: 546, | |
cb325c58 | 11455 | feePerKb: 10000, |
ab78acc6 | 11456 | estimateFee: estimateFee('testnet') |
a9385c1b | 11457 | }, |
ab78acc6 IC |
11458 | litecoin: { |
11459 | magicPrefix: '\x19Litecoin Signed Message:\n', | |
a9385c1b | 11460 | bip32: { |
ab78acc6 IC |
11461 | public: 0x019da462, |
11462 | private: 0x019d9cfe | |
a9385c1b | 11463 | }, |
ab78acc6 IC |
11464 | pubKeyHash: 0x30, |
11465 | scriptHash: 0x05, | |
11466 | wif: 0xb0, | |
11467 | dustThreshold: 0, // https://github.com/litecoin-project/litecoin/blob/v0.8.7.2/src/main.cpp#L360-L365 | |
11468 | dustSoftThreshold: 100000, // https://github.com/litecoin-project/litecoin/blob/v0.8.7.2/src/main.h#L53 | |
11469 | feePerKb: 100000, // https://github.com/litecoin-project/litecoin/blob/v0.8.7.2/src/main.cpp#L56 | |
11470 | estimateFee: estimateFee('litecoin') | |
ebd8d4e8 IC |
11471 | }, |
11472 | dogecoin: { | |
11473 | magicPrefix: '\x19Dogecoin Signed Message:\n', | |
11474 | bip32: { | |
11475 | public: 0x02facafd, | |
11476 | private: 0x02fac398 | |
11477 | }, | |
11478 | pubKeyHash: 0x1e, | |
11479 | scriptHash: 0x16, | |
11480 | wif: 0x9e, | |
11481 | dustThreshold: 0, // https://github.com/dogecoin/dogecoin/blob/v1.7.1/src/core.h#L155-L160 | |
11482 | dustSoftThreshold: 100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7.1/src/main.h#L62 | |
11483 | feePerKb: 100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7.1/src/main.cpp#L58 | |
11484 | estimateFee: estimateFee('dogecoin') | |
11485 | }, | |
ab78acc6 IC |
11486 | viacoin: { |
11487 | magicPrefix: '\x18Viacoin Signed Message:\n', | |
ebd8d4e8 | 11488 | bip32: { |
ab78acc6 IC |
11489 | public: 0x0488b21e, |
11490 | private: 0x0488ade4 | |
ebd8d4e8 | 11491 | }, |
ab78acc6 IC |
11492 | pubKeyHash: 0x47, |
11493 | scriptHash: 0x21, | |
11494 | wif: 0xc7, | |
11495 | dustThreshold: 560, | |
11496 | dustSoftThreshold: 100000, | |
11497 | feePerKb: 100000, // | |
11498 | estimateFee: estimateFee('viacoin') | |
ebd8d4e8 | 11499 | }, |
ab78acc6 IC |
11500 | viacointestnet: { |
11501 | magicPrefix: '\x18Viacoin Signed Message:\n', | |
ebd8d4e8 IC |
11502 | bip32: { |
11503 | public: 0x043587cf, | |
11504 | private: 0x04358394 | |
11505 | }, | |
ab78acc6 | 11506 | pubKeyHash: 0x7f, |
ebd8d4e8 | 11507 | scriptHash: 0xc4, |
ab78acc6 IC |
11508 | wif: 0xff, |
11509 | dustThreshold: 560, | |
11510 | dustSoftThreshold: 100000, | |
11511 | feePerKb: 100000, | |
11512 | estimateFee: estimateFee('viacointestnet') | |
11513 | }, | |
11514 | gamerscoin: { | |
11515 | magicPrefix: '\x19Gamerscoin Signed Message:\n', | |
11516 | bip32: { | |
11517 | public: 0x019da462, | |
11518 | private: 0x019d9cfe | |
11519 | }, | |
11520 | pubKeyHash: 0x26, | |
11521 | scriptHash: 0x05, | |
11522 | wif: 0xA6, | |
11523 | dustThreshold: 0, // https://github.com/gamers-coin/gamers-coinv3/blob/master/src/main.cpp#L358-L363 | |
11524 | dustSoftThreshold: 100000, // https://github.com/gamers-coin/gamers-coinv3/blob/master/src/main.cpp#L51 | |
11525 | feePerKb: 100000, // https://github.com/gamers-coin/gamers-coinv3/blob/master/src/main.cpp#L54 | |
11526 | estimateFee: estimateFee('gamerscoin') | |
11527 | }, | |
11528 | jumbucks: { | |
11529 | magicPrefix: '\x19Jumbucks Signed Message:\n', | |
11530 | bip32: { | |
11531 | public: 0x037a689a, | |
11532 | private: 0x037a6460 | |
11533 | }, | |
11534 | pubKeyHash: 0x2b, | |
11535 | scriptHash: 0x05, | |
11536 | wif: 0xab, | |
11537 | dustThreshold: 0, | |
11538 | dustSoftThreshold: 10000, | |
ebd8d4e8 | 11539 | feePerKb: 10000, |
ab78acc6 IC |
11540 | estimateFee: estimateFee('jumbucks') |
11541 | }, | |
11542 | zetacoin: { | |
11543 | magicPrefix: '\x18Zetacoin Signed Message:\n', | |
11544 | bip32: { | |
11545 | public: 0x0488b21e, | |
11546 | private: 0x0488ade4 | |
11547 | }, | |
11548 | pubKeyHash: 0x50, | |
11549 | scriptHash: 0x09, | |
11550 | wif: 0xe0, | |
11551 | dustThreshold: 546, // https://github.com/zetacoin/zetacoin/blob/master/src/core.h#L159 | |
11552 | feePerKb: 10000, // https://github.com/zetacoin/zetacoin/blob/master/src/main.cpp#L54 | |
11553 | estimateFee: estimateFee('zetacoin') | |
ebd8d4e8 IC |
11554 | } |
11555 | } | |
11556 | ||
ab78acc6 IC |
11557 | function estimateFee (type) { |
11558 | return function (tx) { | |
ebd8d4e8 IC |
11559 | var network = networks[type] |
11560 | var baseFee = network.feePerKb | |
11561 | var byteSize = tx.toBuffer().length | |
11562 | ||
11563 | var fee = baseFee * Math.ceil(byteSize / 1000) | |
ab78acc6 | 11564 | if (network.dustSoftThreshold === undefined) return fee |
ebd8d4e8 | 11565 | |
ab78acc6 | 11566 | tx.outs.forEach(function (e) { |
ebd8d4e8 IC |
11567 | if (e.value < network.dustSoftThreshold) { |
11568 | fee += baseFee | |
11569 | } | |
11570 | }) | |
11571 | ||
11572 | return fee | |
11573 | } | |
11574 | } | |
11575 | ||
11576 | module.exports = networks | |
11577 | ||
ab78acc6 | 11578 | },{}],67:[function(require,module,exports){ |
ebd8d4e8 IC |
11579 | module.exports = { |
11580 | // push value | |
ab78acc6 IC |
11581 | OP_FALSE: 0, |
11582 | OP_0: 0, | |
11583 | OP_PUSHDATA1: 76, | |
11584 | OP_PUSHDATA2: 77, | |
11585 | OP_PUSHDATA4: 78, | |
11586 | OP_1NEGATE: 79, | |
11587 | OP_RESERVED: 80, | |
11588 | OP_1: 81, | |
11589 | OP_TRUE: 81, | |
11590 | OP_2: 82, | |
11591 | OP_3: 83, | |
11592 | OP_4: 84, | |
11593 | OP_5: 85, | |
11594 | OP_6: 86, | |
11595 | OP_7: 87, | |
11596 | OP_8: 88, | |
11597 | OP_9: 89, | |
11598 | OP_10: 90, | |
11599 | OP_11: 91, | |
11600 | OP_12: 92, | |
11601 | OP_13: 93, | |
11602 | OP_14: 94, | |
11603 | OP_15: 95, | |
11604 | OP_16: 96, | |
ebd8d4e8 IC |
11605 | |
11606 | // control | |
ab78acc6 IC |
11607 | OP_NOP: 97, |
11608 | OP_VER: 98, | |
11609 | OP_IF: 99, | |
11610 | OP_NOTIF: 100, | |
11611 | OP_VERIF: 101, | |
11612 | OP_VERNOTIF: 102, | |
11613 | OP_ELSE: 103, | |
11614 | OP_ENDIF: 104, | |
11615 | OP_VERIFY: 105, | |
11616 | OP_RETURN: 106, | |
ebd8d4e8 IC |
11617 | |
11618 | // stack ops | |
ab78acc6 IC |
11619 | OP_TOALTSTACK: 107, |
11620 | OP_FROMALTSTACK: 108, | |
11621 | OP_2DROP: 109, | |
11622 | OP_2DUP: 110, | |
11623 | OP_3DUP: 111, | |
11624 | OP_2OVER: 112, | |
11625 | OP_2ROT: 113, | |
11626 | OP_2SWAP: 114, | |
11627 | OP_IFDUP: 115, | |
11628 | OP_DEPTH: 116, | |
11629 | OP_DROP: 117, | |
11630 | OP_DUP: 118, | |
11631 | OP_NIP: 119, | |
11632 | OP_OVER: 120, | |
11633 | OP_PICK: 121, | |
11634 | OP_ROLL: 122, | |
11635 | OP_ROT: 123, | |
11636 | OP_SWAP: 124, | |
11637 | OP_TUCK: 125, | |
ebd8d4e8 IC |
11638 | |
11639 | // splice ops | |
ab78acc6 IC |
11640 | OP_CAT: 126, |
11641 | OP_SUBSTR: 127, | |
11642 | OP_LEFT: 128, | |
11643 | OP_RIGHT: 129, | |
11644 | OP_SIZE: 130, | |
ebd8d4e8 IC |
11645 | |
11646 | // bit logic | |
ab78acc6 IC |
11647 | OP_INVERT: 131, |
11648 | OP_AND: 132, | |
11649 | OP_OR: 133, | |
11650 | OP_XOR: 134, | |
11651 | OP_EQUAL: 135, | |
11652 | OP_EQUALVERIFY: 136, | |
11653 | OP_RESERVED1: 137, | |
11654 | OP_RESERVED2: 138, | |
ebd8d4e8 IC |
11655 | |
11656 | // numeric | |
ab78acc6 IC |
11657 | OP_1ADD: 139, |
11658 | OP_1SUB: 140, | |
11659 | OP_2MUL: 141, | |
11660 | OP_2DIV: 142, | |
11661 | OP_NEGATE: 143, | |
11662 | OP_ABS: 144, | |
11663 | OP_NOT: 145, | |
11664 | OP_0NOTEQUAL: 146, | |
11665 | ||
11666 | OP_ADD: 147, | |
11667 | OP_SUB: 148, | |
11668 | OP_MUL: 149, | |
11669 | OP_DIV: 150, | |
11670 | OP_MOD: 151, | |
11671 | OP_LSHIFT: 152, | |
11672 | OP_RSHIFT: 153, | |
11673 | ||
11674 | OP_BOOLAND: 154, | |
11675 | OP_BOOLOR: 155, | |
11676 | OP_NUMEQUAL: 156, | |
11677 | OP_NUMEQUALVERIFY: 157, | |
11678 | OP_NUMNOTEQUAL: 158, | |
11679 | OP_LESSTHAN: 159, | |
11680 | OP_GREATERTHAN: 160, | |
11681 | OP_LESSTHANOREQUAL: 161, | |
11682 | OP_GREATERTHANOREQUAL: 162, | |
11683 | OP_MIN: 163, | |
11684 | OP_MAX: 164, | |
11685 | ||
11686 | OP_WITHIN: 165, | |
ebd8d4e8 IC |
11687 | |
11688 | // crypto | |
ab78acc6 IC |
11689 | OP_RIPEMD160: 166, |
11690 | OP_SHA1: 167, | |
11691 | OP_SHA256: 168, | |
11692 | OP_HASH160: 169, | |
11693 | OP_HASH256: 170, | |
11694 | OP_CODESEPARATOR: 171, | |
11695 | OP_CHECKSIG: 172, | |
11696 | OP_CHECKSIGVERIFY: 173, | |
11697 | OP_CHECKMULTISIG: 174, | |
11698 | OP_CHECKMULTISIGVERIFY: 175, | |
ebd8d4e8 IC |
11699 | |
11700 | // expansion | |
ab78acc6 IC |
11701 | OP_NOP1: 176, |
11702 | OP_NOP2: 177, | |
11703 | OP_NOP3: 178, | |
11704 | OP_NOP4: 179, | |
11705 | OP_NOP5: 180, | |
11706 | OP_NOP6: 181, | |
11707 | OP_NOP7: 182, | |
11708 | OP_NOP8: 183, | |
11709 | OP_NOP9: 184, | |
11710 | OP_NOP10: 185, | |
ebd8d4e8 IC |
11711 | |
11712 | // template matching params | |
ab78acc6 IC |
11713 | OP_PUBKEYHASH: 253, |
11714 | OP_PUBKEY: 254, | |
11715 | OP_INVALIDOPCODE: 255 | |
ebd8d4e8 IC |
11716 | } |
11717 | ||
ab78acc6 | 11718 | },{}],68:[function(require,module,exports){ |
ebd8d4e8 | 11719 | (function (Buffer){ |
ab78acc6 IC |
11720 | var assert = require('assert') |
11721 | var bufferutils = require('./bufferutils') | |
11722 | var crypto = require('./crypto') | |
11723 | var typeForce = require('typeforce') | |
11724 | var opcodes = require('./opcodes') | |
ebd8d4e8 | 11725 | |
ab78acc6 IC |
11726 | function Script (buffer, chunks) { |
11727 | typeForce('Buffer', buffer) | |
11728 | typeForce('Array', chunks) | |
ebd8d4e8 IC |
11729 | |
11730 | this.buffer = buffer | |
11731 | this.chunks = chunks | |
11732 | } | |
11733 | ||
ab78acc6 | 11734 | Script.fromASM = function (asm) { |
ebd8d4e8 | 11735 | var strChunks = asm.split(' ') |
ab78acc6 IC |
11736 | var chunks = strChunks.map(function (strChunk) { |
11737 | // opcode | |
ebd8d4e8 IC |
11738 | if (strChunk in opcodes) { |
11739 | return opcodes[strChunk] | |
11740 | ||
ab78acc6 | 11741 | // data chunk |
ebd8d4e8 IC |
11742 | } else { |
11743 | return new Buffer(strChunk, 'hex') | |
11744 | } | |
11745 | }) | |
11746 | ||
11747 | return Script.fromChunks(chunks) | |
11748 | } | |
11749 | ||
ab78acc6 | 11750 | Script.fromBuffer = function (buffer) { |
ebd8d4e8 | 11751 | var chunks = [] |
ebd8d4e8 IC |
11752 | var i = 0 |
11753 | ||
11754 | while (i < buffer.length) { | |
11755 | var opcode = buffer.readUInt8(i) | |
11756 | ||
ab78acc6 | 11757 | // data chunk |
ebd8d4e8 IC |
11758 | if ((opcode > opcodes.OP_0) && (opcode <= opcodes.OP_PUSHDATA4)) { |
11759 | var d = bufferutils.readPushDataInt(buffer, i) | |
ab78acc6 IC |
11760 | |
11761 | // did reading a pushDataInt fail? return non-chunked script | |
11762 | if (d === null) return new Script(buffer, []) | |
ebd8d4e8 IC |
11763 | i += d.size |
11764 | ||
ab78acc6 IC |
11765 | // attempt to read too much data? |
11766 | if (i + d.number > buffer.length) return new Script(buffer, []) | |
11767 | ||
ebd8d4e8 IC |
11768 | var data = buffer.slice(i, i + d.number) |
11769 | i += d.number | |
11770 | ||
11771 | chunks.push(data) | |
11772 | ||
ab78acc6 | 11773 | // opcode |
ebd8d4e8 IC |
11774 | } else { |
11775 | chunks.push(opcode) | |
11776 | ||
11777 | i += 1 | |
11778 | } | |
11779 | } | |
11780 | ||
11781 | return new Script(buffer, chunks) | |
11782 | } | |
11783 | ||
ab78acc6 IC |
11784 | Script.fromChunks = function (chunks) { |
11785 | typeForce('Array', chunks) | |
ebd8d4e8 | 11786 | |
ab78acc6 IC |
11787 | var bufferSize = chunks.reduce(function (accum, chunk) { |
11788 | // data chunk | |
ebd8d4e8 IC |
11789 | if (Buffer.isBuffer(chunk)) { |
11790 | return accum + bufferutils.pushDataSize(chunk.length) + chunk.length | |
11791 | } | |
11792 | ||
ab78acc6 | 11793 | // opcode |
ebd8d4e8 IC |
11794 | return accum + 1 |
11795 | }, 0.0) | |
11796 | ||
11797 | var buffer = new Buffer(bufferSize) | |
11798 | var offset = 0 | |
11799 | ||
ab78acc6 IC |
11800 | chunks.forEach(function (chunk) { |
11801 | // data chunk | |
ebd8d4e8 IC |
11802 | if (Buffer.isBuffer(chunk)) { |
11803 | offset += bufferutils.writePushDataInt(buffer, chunk.length, offset) | |
11804 | ||
11805 | chunk.copy(buffer, offset) | |
11806 | offset += chunk.length | |
11807 | ||
ab78acc6 | 11808 | // opcode |
ebd8d4e8 IC |
11809 | } else { |
11810 | buffer.writeUInt8(chunk, offset) | |
11811 | offset += 1 | |
11812 | } | |
11813 | }) | |
11814 | ||
11815 | assert.equal(offset, buffer.length, 'Could not decode chunks') | |
11816 | return new Script(buffer, chunks) | |
11817 | } | |
11818 | ||
ab78acc6 | 11819 | Script.fromHex = function (hex) { |
ebd8d4e8 IC |
11820 | return Script.fromBuffer(new Buffer(hex, 'hex')) |
11821 | } | |
11822 | ||
ebd8d4e8 IC |
11823 | Script.EMPTY = Script.fromChunks([]) |
11824 | ||
ab78acc6 | 11825 | Script.prototype.getHash = function () { |
ebd8d4e8 IC |
11826 | return crypto.hash160(this.buffer) |
11827 | } | |
11828 | ||
11829 | // FIXME: doesn't work for data chunks, maybe time to use buffertools.compare... | |
ab78acc6 IC |
11830 | Script.prototype.without = function (needle) { |
11831 | return Script.fromChunks(this.chunks.filter(function (op) { | |
ebd8d4e8 IC |
11832 | return op !== needle |
11833 | })) | |
11834 | } | |
11835 | ||
ebd8d4e8 IC |
11836 | var reverseOps = [] |
11837 | for (var op in opcodes) { | |
11838 | var code = opcodes[op] | |
11839 | reverseOps[code] = op | |
11840 | } | |
11841 | ||
ab78acc6 IC |
11842 | Script.prototype.toASM = function () { |
11843 | return this.chunks.map(function (chunk) { | |
11844 | // data chunk | |
ebd8d4e8 IC |
11845 | if (Buffer.isBuffer(chunk)) { |
11846 | return chunk.toString('hex') | |
11847 | ||
ab78acc6 | 11848 | // opcode |
ebd8d4e8 IC |
11849 | } else { |
11850 | return reverseOps[chunk] | |
11851 | } | |
11852 | }).join(' ') | |
11853 | } | |
11854 | ||
ab78acc6 | 11855 | Script.prototype.toBuffer = function () { |
ebd8d4e8 IC |
11856 | return this.buffer |
11857 | } | |
11858 | ||
ab78acc6 | 11859 | Script.prototype.toHex = function () { |
ebd8d4e8 IC |
11860 | return this.toBuffer().toString('hex') |
11861 | } | |
11862 | ||
11863 | module.exports = Script | |
11864 | ||
ab78acc6 IC |
11865 | }).call(this,require("buffer").Buffer) |
11866 | },{"./bufferutils":57,"./crypto":58,"./opcodes":67,"assert":5,"buffer":7,"typeforce":53}],69:[function(require,module,exports){ | |
ebd8d4e8 | 11867 | (function (Buffer){ |
ab78acc6 IC |
11868 | var assert = require('assert') |
11869 | var ops = require('./opcodes') | |
11870 | var typeForce = require('typeforce') | |
ebd8d4e8 | 11871 | |
ab78acc6 | 11872 | var ecurve = require('ecurve') |
ebd8d4e8 IC |
11873 | var curve = ecurve.getCurveByName('secp256k1') |
11874 | ||
ab78acc6 IC |
11875 | var ECSignature = require('./ecsignature') |
11876 | var Script = require('./script') | |
ebd8d4e8 | 11877 | |
ab78acc6 | 11878 | function isCanonicalPubKey (buffer) { |
ebd8d4e8 IC |
11879 | if (!Buffer.isBuffer(buffer)) return false |
11880 | ||
11881 | try { | |
ebd8d4e8 IC |
11882 | ecurve.Point.decodeFrom(curve, buffer) |
11883 | } catch (e) { | |
ab78acc6 IC |
11884 | if (!(e.message.match(/Invalid sequence (length|tag)/))) |
11885 | throw e | |
ebd8d4e8 IC |
11886 | |
11887 | return false | |
11888 | } | |
11889 | ||
11890 | return true | |
11891 | } | |
11892 | ||
ab78acc6 | 11893 | function isCanonicalSignature (buffer) { |
ebd8d4e8 IC |
11894 | if (!Buffer.isBuffer(buffer)) return false |
11895 | ||
11896 | try { | |
11897 | ECSignature.parseScriptSignature(buffer) | |
ab78acc6 IC |
11898 | } catch (e) { |
11899 | if (!(e.message.match(/Not a DER sequence|Invalid sequence length|Expected a DER integer|R length is zero|S length is zero|R value excessively padded|S value excessively padded|R value is negative|S value is negative|Invalid hashType/))) { | |
11900 | throw e | |
11901 | } | |
ebd8d4e8 IC |
11902 | |
11903 | return false | |
11904 | } | |
11905 | ||
11906 | return true | |
11907 | } | |
11908 | ||
ab78acc6 IC |
11909 | function isPubKeyHashInput (script) { |
11910 | return script.chunks.length === 2 && | |
11911 | isCanonicalSignature(script.chunks[0]) && | |
11912 | isCanonicalPubKey(script.chunks[1]) | |
ebd8d4e8 IC |
11913 | } |
11914 | ||
ab78acc6 IC |
11915 | function isPubKeyHashOutput (script) { |
11916 | return script.chunks.length === 5 && | |
11917 | script.chunks[0] === ops.OP_DUP && | |
11918 | script.chunks[1] === ops.OP_HASH160 && | |
11919 | Buffer.isBuffer(script.chunks[2]) && | |
11920 | script.chunks[2].length === 20 && | |
11921 | script.chunks[3] === ops.OP_EQUALVERIFY && | |
11922 | script.chunks[4] === ops.OP_CHECKSIG | |
ebd8d4e8 IC |
11923 | } |
11924 | ||
ab78acc6 IC |
11925 | function isPubKeyInput (script) { |
11926 | return script.chunks.length === 1 && | |
11927 | isCanonicalSignature(script.chunks[0]) | |
ebd8d4e8 IC |
11928 | } |
11929 | ||
ab78acc6 IC |
11930 | function isPubKeyOutput (script) { |
11931 | return script.chunks.length === 2 && | |
11932 | isCanonicalPubKey(script.chunks[0]) && | |
11933 | script.chunks[1] === ops.OP_CHECKSIG | |
ebd8d4e8 IC |
11934 | } |
11935 | ||
ab78acc6 IC |
11936 | function isScriptHashInput (script, allowIncomplete) { |
11937 | if (script.chunks.length < 2) return false | |
ebd8d4e8 | 11938 | |
ab78acc6 | 11939 | var lastChunk = script.chunks[script.chunks.length - 1] |
ebd8d4e8 IC |
11940 | if (!Buffer.isBuffer(lastChunk)) return false |
11941 | ||
ab78acc6 IC |
11942 | var scriptSig = Script.fromChunks(script.chunks.slice(0, -1)) |
11943 | var redeemScript = Script.fromBuffer(lastChunk) | |
ebd8d4e8 | 11944 | |
ab78acc6 IC |
11945 | // is redeemScript a valid script? |
11946 | if (redeemScript.chunks.length === 0) return false | |
11947 | ||
11948 | return classifyInput(scriptSig, allowIncomplete) === classifyOutput(redeemScript) | |
ebd8d4e8 IC |
11949 | } |
11950 | ||
ab78acc6 IC |
11951 | function isScriptHashOutput (script) { |
11952 | return script.chunks.length === 3 && | |
11953 | script.chunks[0] === ops.OP_HASH160 && | |
11954 | Buffer.isBuffer(script.chunks[1]) && | |
11955 | script.chunks[1].length === 20 && | |
11956 | script.chunks[2] === ops.OP_EQUAL | |
ebd8d4e8 IC |
11957 | } |
11958 | ||
ab78acc6 IC |
11959 | // allowIncomplete is to account for combining signatures |
11960 | // See https://github.com/bitcoin/bitcoin/blob/f425050546644a36b0b8e0eb2f6934a3e0f6f80f/src/script/sign.cpp#L195-L197 | |
11961 | function isMultisigInput (script, allowIncomplete) { | |
11962 | if (script.chunks.length < 2) return false | |
11963 | if (script.chunks[0] !== ops.OP_0) return false | |
11964 | ||
11965 | if (allowIncomplete) { | |
11966 | return script.chunks.slice(1).every(function (chunk) { | |
11967 | return chunk === ops.OP_0 || isCanonicalSignature(chunk) | |
11968 | }) | |
11969 | } | |
11970 | ||
11971 | return script.chunks.slice(1).every(isCanonicalSignature) | |
ebd8d4e8 IC |
11972 | } |
11973 | ||
ab78acc6 IC |
11974 | function isMultisigOutput (script) { |
11975 | if (script.chunks.length < 4) return false | |
11976 | if (script.chunks[script.chunks.length - 1] !== ops.OP_CHECKMULTISIG) return false | |
ebd8d4e8 | 11977 | |
ab78acc6 IC |
11978 | var mOp = script.chunks[0] |
11979 | if (mOp === ops.OP_0) return false | |
11980 | if (mOp < ops.OP_1) return false | |
11981 | if (mOp > ops.OP_16) return false | |
ebd8d4e8 | 11982 | |
ab78acc6 IC |
11983 | var nOp = script.chunks[script.chunks.length - 2] |
11984 | if (nOp === ops.OP_0) return false | |
11985 | if (nOp < ops.OP_1) return false | |
11986 | if (nOp > ops.OP_16) return false | |
ebd8d4e8 | 11987 | |
ab78acc6 IC |
11988 | var m = mOp - (ops.OP_1 - 1) |
11989 | var n = nOp - (ops.OP_1 - 1) | |
ebd8d4e8 IC |
11990 | if (n < m) return false |
11991 | ||
ab78acc6 | 11992 | var pubKeys = script.chunks.slice(1, -2) |
ebd8d4e8 IC |
11993 | if (n < pubKeys.length) return false |
11994 | ||
11995 | return pubKeys.every(isCanonicalPubKey) | |
11996 | } | |
11997 | ||
ab78acc6 IC |
11998 | function isNullDataOutput (script) { |
11999 | return script.chunks[0] === ops.OP_RETURN | |
12000 | } | |
12001 | ||
12002 | function classifyOutput (script) { | |
12003 | typeForce('Script', script) | |
12004 | ||
12005 | if (isPubKeyHashOutput(script)) { | |
12006 | return 'pubkeyhash' | |
12007 | } else if (isScriptHashOutput(script)) { | |
12008 | return 'scripthash' | |
12009 | } else if (isMultisigOutput(script)) { | |
12010 | return 'multisig' | |
12011 | } else if (isPubKeyOutput(script)) { | |
12012 | return 'pubkey' | |
12013 | } else if (isNullDataOutput(script)) { | |
12014 | return 'nulldata' | |
12015 | } | |
12016 | ||
12017 | return 'nonstandard' | |
12018 | } | |
12019 | ||
12020 | function classifyInput (script, allowIncomplete) { | |
12021 | typeForce('Script', script) | |
12022 | ||
12023 | if (isPubKeyHashInput(script)) { | |
12024 | return 'pubkeyhash' | |
12025 | } else if (isMultisigInput(script, allowIncomplete)) { | |
12026 | return 'multisig' | |
12027 | } else if (isScriptHashInput(script, allowIncomplete)) { | |
12028 | return 'scripthash' | |
12029 | } else if (isPubKeyInput(script)) { | |
12030 | return 'pubkey' | |
12031 | } | |
12032 | ||
12033 | return 'nonstandard' | |
ebd8d4e8 IC |
12034 | } |
12035 | ||
12036 | // Standard Script Templates | |
12037 | // {pubKey} OP_CHECKSIG | |
ab78acc6 | 12038 | function pubKeyOutput (pubKey) { |
ebd8d4e8 IC |
12039 | return Script.fromChunks([ |
12040 | pubKey.toBuffer(), | |
ab78acc6 | 12041 | ops.OP_CHECKSIG |
ebd8d4e8 IC |
12042 | ]) |
12043 | } | |
12044 | ||
12045 | // OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG | |
ab78acc6 IC |
12046 | function pubKeyHashOutput (hash) { |
12047 | typeForce('Buffer', hash) | |
ebd8d4e8 IC |
12048 | |
12049 | return Script.fromChunks([ | |
ab78acc6 IC |
12050 | ops.OP_DUP, |
12051 | ops.OP_HASH160, | |
ebd8d4e8 | 12052 | hash, |
ab78acc6 IC |
12053 | ops.OP_EQUALVERIFY, |
12054 | ops.OP_CHECKSIG | |
ebd8d4e8 IC |
12055 | ]) |
12056 | } | |
12057 | ||
12058 | // OP_HASH160 {scriptHash} OP_EQUAL | |
ab78acc6 IC |
12059 | function scriptHashOutput (hash) { |
12060 | typeForce('Buffer', hash) | |
ebd8d4e8 IC |
12061 | |
12062 | return Script.fromChunks([ | |
ab78acc6 | 12063 | ops.OP_HASH160, |
ebd8d4e8 | 12064 | hash, |
ab78acc6 | 12065 | ops.OP_EQUAL |
ebd8d4e8 IC |
12066 | ]) |
12067 | } | |
12068 | ||
12069 | // m [pubKeys ...] n OP_CHECKMULTISIG | |
ab78acc6 IC |
12070 | function multisigOutput (m, pubKeys) { |
12071 | typeForce(['ECPubKey'], pubKeys) | |
12072 | ||
ebd8d4e8 IC |
12073 | assert(pubKeys.length >= m, 'Not enough pubKeys provided') |
12074 | ||
ab78acc6 | 12075 | var pubKeyBuffers = pubKeys.map(function (pubKey) { |
ebd8d4e8 IC |
12076 | return pubKey.toBuffer() |
12077 | }) | |
12078 | var n = pubKeys.length | |
12079 | ||
12080 | return Script.fromChunks([].concat( | |
ab78acc6 | 12081 | (ops.OP_1 - 1) + m, |
ebd8d4e8 | 12082 | pubKeyBuffers, |
ab78acc6 IC |
12083 | (ops.OP_1 - 1) + n, |
12084 | ops.OP_CHECKMULTISIG | |
ebd8d4e8 IC |
12085 | )) |
12086 | } | |
12087 | ||
12088 | // {signature} | |
ab78acc6 IC |
12089 | function pubKeyInput (signature) { |
12090 | typeForce('Buffer', signature) | |
ebd8d4e8 IC |
12091 | |
12092 | return Script.fromChunks([signature]) | |
12093 | } | |
12094 | ||
12095 | // {signature} {pubKey} | |
ab78acc6 IC |
12096 | function pubKeyHashInput (signature, pubKey) { |
12097 | typeForce('Buffer', signature) | |
ebd8d4e8 IC |
12098 | |
12099 | return Script.fromChunks([signature, pubKey.toBuffer()]) | |
12100 | } | |
12101 | ||
12102 | // <scriptSig> {serialized scriptPubKey script} | |
ab78acc6 | 12103 | function scriptHashInput (scriptSig, scriptPubKey) { |
ebd8d4e8 IC |
12104 | return Script.fromChunks([].concat( |
12105 | scriptSig.chunks, | |
12106 | scriptPubKey.toBuffer() | |
12107 | )) | |
12108 | } | |
12109 | ||
12110 | // OP_0 [signatures ...] | |
ab78acc6 | 12111 | function multisigInput (signatures, scriptPubKey) { |
ebd8d4e8 | 12112 | if (scriptPubKey) { |
ab78acc6 IC |
12113 | assert(isMultisigOutput(scriptPubKey)) |
12114 | ||
12115 | var mOp = scriptPubKey.chunks[0] | |
12116 | var nOp = scriptPubKey.chunks[scriptPubKey.chunks.length - 2] | |
12117 | var m = mOp - (ops.OP_1 - 1) | |
12118 | var n = nOp - (ops.OP_1 - 1) | |
ebd8d4e8 | 12119 | |
ab78acc6 IC |
12120 | assert(signatures.length >= m, 'Not enough signatures provided') |
12121 | assert(signatures.length <= n, 'Too many signatures provided') | |
ebd8d4e8 IC |
12122 | } |
12123 | ||
ab78acc6 IC |
12124 | return Script.fromChunks([].concat(ops.OP_0, signatures)) |
12125 | } | |
12126 | ||
12127 | function nullDataOutput (data) { | |
12128 | return Script.fromChunks([ops.OP_RETURN, data]) | |
ebd8d4e8 IC |
12129 | } |
12130 | ||
12131 | module.exports = { | |
ab78acc6 IC |
12132 | isCanonicalPubKey: isCanonicalPubKey, |
12133 | isCanonicalSignature: isCanonicalSignature, | |
12134 | isPubKeyHashInput: isPubKeyHashInput, | |
12135 | isPubKeyHashOutput: isPubKeyHashOutput, | |
12136 | isPubKeyInput: isPubKeyInput, | |
12137 | isPubKeyOutput: isPubKeyOutput, | |
12138 | isScriptHashInput: isScriptHashInput, | |
12139 | isScriptHashOutput: isScriptHashOutput, | |
12140 | isMultisigInput: isMultisigInput, | |
12141 | isMultisigOutput: isMultisigOutput, | |
12142 | isNullDataOutput: isNullDataOutput, | |
ebd8d4e8 | 12143 | classifyOutput: classifyOutput, |
ab78acc6 IC |
12144 | classifyInput: classifyInput, |
12145 | pubKeyOutput: pubKeyOutput, | |
ebd8d4e8 | 12146 | pubKeyHashOutput: pubKeyHashOutput, |
ab78acc6 IC |
12147 | scriptHashOutput: scriptHashOutput, |
12148 | multisigOutput: multisigOutput, | |
ebd8d4e8 | 12149 | pubKeyInput: pubKeyInput, |
ab78acc6 | 12150 | pubKeyHashInput: pubKeyHashInput, |
ebd8d4e8 | 12151 | scriptHashInput: scriptHashInput, |
ab78acc6 IC |
12152 | multisigInput: multisigInput, |
12153 | dataOutput: function (data) { | |
12154 | console.warn('dataOutput is deprecated, use nullDataOutput by 2.0.0') | |
12155 | return nullDataOutput(data) | |
12156 | }, | |
12157 | nullDataOutput: nullDataOutput | |
ebd8d4e8 IC |
12158 | } |
12159 | ||
ab78acc6 IC |
12160 | }).call(this,require("buffer").Buffer) |
12161 | },{"./ecsignature":62,"./opcodes":67,"./script":68,"assert":5,"buffer":7,"ecurve":49,"typeforce":53}],70:[function(require,module,exports){ | |
ebd8d4e8 | 12162 | (function (Buffer){ |
ab78acc6 IC |
12163 | var assert = require('assert') |
12164 | var bufferutils = require('./bufferutils') | |
12165 | var crypto = require('./crypto') | |
12166 | var typeForce = require('typeforce') | |
12167 | var opcodes = require('./opcodes') | |
12168 | var scripts = require('./scripts') | |
12169 | ||
12170 | var Address = require('./address') | |
12171 | var ECSignature = require('./ecsignature') | |
12172 | var Script = require('./script') | |
12173 | ||
12174 | function Transaction () { | |
12175 | this.version = 1 | |
12176 | this.locktime = 0 | |
12177 | this.ins = [] | |
12178 | this.outs = [] | |
12179 | } | |
ebd8d4e8 IC |
12180 | |
12181 | Transaction.DEFAULT_SEQUENCE = 0xffffffff | |
12182 | Transaction.SIGHASH_ALL = 0x01 | |
12183 | Transaction.SIGHASH_NONE = 0x02 | |
12184 | Transaction.SIGHASH_SINGLE = 0x03 | |
12185 | Transaction.SIGHASH_ANYONECANPAY = 0x80 | |
12186 | ||
ab78acc6 IC |
12187 | Transaction.fromBuffer = function (buffer, __disableAssert) { |
12188 | var offset = 0 | |
12189 | function readSlice (n) { | |
12190 | offset += n | |
12191 | return buffer.slice(offset - n, offset) | |
12192 | } | |
12193 | ||
12194 | function readUInt32 () { | |
12195 | var i = buffer.readUInt32LE(offset) | |
12196 | offset += 4 | |
12197 | return i | |
12198 | } | |
12199 | ||
12200 | function readUInt64 () { | |
12201 | var i = bufferutils.readUInt64LE(buffer, offset) | |
12202 | offset += 8 | |
12203 | return i | |
12204 | } | |
12205 | ||
12206 | function readVarInt () { | |
12207 | var vi = bufferutils.readVarInt(buffer, offset) | |
12208 | offset += vi.size | |
12209 | return vi.number | |
12210 | } | |
12211 | ||
12212 | function readScript () { | |
12213 | return Script.fromBuffer(readSlice(readVarInt())) | |
12214 | } | |
12215 | ||
12216 | function readGenerationScript () { | |
12217 | return new Script(readSlice(readVarInt()), []) | |
12218 | } | |
12219 | ||
12220 | var tx = new Transaction() | |
12221 | tx.version = readUInt32() | |
12222 | ||
12223 | var vinLen = readVarInt() | |
12224 | for (var i = 0; i < vinLen; ++i) { | |
12225 | var hash = readSlice(32) | |
12226 | ||
12227 | if (Transaction.isCoinbaseHash(hash)) { | |
12228 | tx.ins.push({ | |
12229 | hash: hash, | |
12230 | index: readUInt32(), | |
12231 | script: readGenerationScript(), | |
12232 | sequence: readUInt32() | |
12233 | }) | |
12234 | } else { | |
12235 | tx.ins.push({ | |
12236 | hash: hash, | |
12237 | index: readUInt32(), | |
12238 | script: readScript(), | |
12239 | sequence: readUInt32() | |
12240 | }) | |
12241 | } | |
12242 | } | |
12243 | ||
12244 | var voutLen = readVarInt() | |
12245 | for (i = 0; i < voutLen; ++i) { | |
12246 | tx.outs.push({ | |
12247 | value: readUInt64(), | |
12248 | script: readScript() | |
12249 | }) | |
12250 | } | |
12251 | ||
12252 | tx.locktime = readUInt32() | |
12253 | ||
12254 | if (!__disableAssert) { | |
12255 | assert.equal(offset, buffer.length, 'Transaction has unexpected data') | |
12256 | } | |
12257 | ||
12258 | return tx | |
12259 | } | |
12260 | ||
12261 | Transaction.fromHex = function (hex) { | |
12262 | return Transaction.fromBuffer(new Buffer(hex, 'hex')) | |
12263 | } | |
12264 | ||
12265 | Transaction.isCoinbaseHash = function (buffer) { | |
12266 | return Array.prototype.every.call(buffer, function (x) { | |
12267 | return x === 0 | |
12268 | }) | |
ebd8d4e8 IC |
12269 | } |
12270 | ||
12271 | /** | |
ab78acc6 | 12272 | * Create a new txIn. |
ebd8d4e8 IC |
12273 | * |
12274 | * Can be called with any of: | |
12275 | * | |
12276 | * - A transaction and an index | |
12277 | * - A transaction hash and an index | |
12278 | * | |
12279 | * Note that this method does not sign the created input. | |
12280 | */ | |
ab78acc6 IC |
12281 | Transaction.prototype.addInput = function (hash, index, sequence, script) { |
12282 | if (sequence === undefined || sequence === null) { | |
12283 | sequence = Transaction.DEFAULT_SEQUENCE | |
12284 | } | |
ebd8d4e8 | 12285 | |
ab78acc6 | 12286 | script = script || Script.EMPTY |
ebd8d4e8 | 12287 | |
ab78acc6 | 12288 | if (typeof hash === 'string') { |
ebd8d4e8 | 12289 | // TxId hex is big-endian, we need little-endian |
ab78acc6 IC |
12290 | hash = bufferutils.reverse(new Buffer(hash, 'hex')) |
12291 | } else if (hash instanceof Transaction) { | |
12292 | hash = hash.getHash() | |
ebd8d4e8 IC |
12293 | } |
12294 | ||
ab78acc6 IC |
12295 | typeForce('Buffer', hash) |
12296 | typeForce('Number', index) | |
12297 | typeForce('Number', sequence) | |
12298 | typeForce('Script', script) | |
12299 | ||
ebd8d4e8 | 12300 | assert.equal(hash.length, 32, 'Expected hash length of 32, got ' + hash.length) |
ebd8d4e8 | 12301 | |
ab78acc6 | 12302 | // Add the input and return the input's index |
ebd8d4e8 IC |
12303 | return (this.ins.push({ |
12304 | hash: hash, | |
12305 | index: index, | |
ab78acc6 | 12306 | script: script, |
ebd8d4e8 IC |
12307 | sequence: sequence |
12308 | }) - 1) | |
12309 | } | |
12310 | ||
12311 | /** | |
ab78acc6 | 12312 | * Create a new txOut. |
ebd8d4e8 IC |
12313 | * |
12314 | * Can be called with: | |
12315 | * | |
12316 | * - A base58 address string and a value | |
12317 | * - An Address object and a value | |
12318 | * - A scriptPubKey Script and a value | |
12319 | */ | |
ab78acc6 | 12320 | Transaction.prototype.addOutput = function (scriptPubKey, value) { |
ebd8d4e8 IC |
12321 | // Attempt to get a valid address if it's a base58 address string |
12322 | if (typeof scriptPubKey === 'string') { | |
12323 | scriptPubKey = Address.fromBase58Check(scriptPubKey) | |
12324 | } | |
12325 | ||
12326 | // Attempt to get a valid script if it's an Address object | |
12327 | if (scriptPubKey instanceof Address) { | |
ab78acc6 | 12328 | scriptPubKey = scriptPubKey.toOutputScript() |
ebd8d4e8 IC |
12329 | } |
12330 | ||
ab78acc6 IC |
12331 | typeForce('Script', scriptPubKey) |
12332 | typeForce('Number', value) | |
12333 | ||
12334 | // Add the output and return the output's index | |
ebd8d4e8 IC |
12335 | return (this.outs.push({ |
12336 | script: scriptPubKey, | |
ab78acc6 | 12337 | value: value |
ebd8d4e8 IC |
12338 | }) - 1) |
12339 | } | |
12340 | ||
ab78acc6 IC |
12341 | Transaction.prototype.clone = function () { |
12342 | var newTx = new Transaction() | |
12343 | newTx.version = this.version | |
12344 | newTx.locktime = this.locktime | |
12345 | ||
12346 | newTx.ins = this.ins.map(function (txIn) { | |
12347 | return { | |
12348 | hash: txIn.hash, | |
12349 | index: txIn.index, | |
12350 | script: txIn.script, | |
12351 | sequence: txIn.sequence | |
12352 | } | |
12353 | }) | |
12354 | ||
12355 | newTx.outs = this.outs.map(function (txOut) { | |
12356 | return { | |
12357 | script: txOut.script, | |
12358 | value: txOut.value | |
12359 | } | |
12360 | }) | |
12361 | ||
12362 | return newTx | |
12363 | } | |
12364 | ||
12365 | /** | |
12366 | * Hash transaction for signing a specific input. | |
12367 | * | |
12368 | * Bitcoin uses a different hash for each signed transaction input. This | |
12369 | * method copies the transaction, makes the necessary changes based on the | |
12370 | * hashType, serializes and finally hashes the result. This hash can then be | |
12371 | * used to sign the transaction input in question. | |
12372 | */ | |
12373 | Transaction.prototype.hashForSignature = function (inIndex, prevOutScript, hashType) { | |
12374 | // FIXME: remove in 2.x.y | |
12375 | if (arguments[0] instanceof Script) { | |
12376 | console.warn('hashForSignature(prevOutScript, inIndex, ...) has been deprecated. Use hashForSignature(inIndex, prevOutScript, ...)') | |
12377 | ||
12378 | // swap the arguments (must be stored in tmp, arguments is special) | |
12379 | var tmp = arguments[0] | |
12380 | inIndex = arguments[1] | |
12381 | prevOutScript = tmp | |
12382 | } | |
12383 | ||
12384 | typeForce('Number', inIndex) | |
12385 | typeForce('Script', prevOutScript) | |
12386 | typeForce('Number', hashType) | |
12387 | ||
12388 | assert(inIndex >= 0, 'Invalid vin index') | |
12389 | assert(inIndex < this.ins.length, 'Invalid vin index') | |
12390 | ||
12391 | var txTmp = this.clone() | |
12392 | var hashScript = prevOutScript.without(opcodes.OP_CODESEPARATOR) | |
12393 | ||
12394 | // Blank out other inputs' signatures | |
12395 | txTmp.ins.forEach(function (txIn) { | |
12396 | txIn.script = Script.EMPTY | |
12397 | }) | |
12398 | txTmp.ins[inIndex].script = hashScript | |
12399 | ||
12400 | var hashTypeModifier = hashType & 0x1f | |
12401 | ||
12402 | if (hashTypeModifier === Transaction.SIGHASH_NONE) { | |
12403 | assert(false, 'SIGHASH_NONE not yet supported') | |
12404 | } else if (hashTypeModifier === Transaction.SIGHASH_SINGLE) { | |
12405 | assert(false, 'SIGHASH_SINGLE not yet supported') | |
12406 | } | |
12407 | ||
12408 | if (hashType & Transaction.SIGHASH_ANYONECANPAY) { | |
12409 | assert(false, 'SIGHASH_ANYONECANPAY not yet supported') | |
12410 | } | |
12411 | ||
12412 | var hashTypeBuffer = new Buffer(4) | |
12413 | hashTypeBuffer.writeInt32LE(hashType, 0) | |
12414 | ||
12415 | var buffer = Buffer.concat([txTmp.toBuffer(), hashTypeBuffer]) | |
12416 | return crypto.hash256(buffer) | |
12417 | } | |
12418 | ||
12419 | Transaction.prototype.getHash = function () { | |
12420 | return crypto.hash256(this.toBuffer()) | |
12421 | } | |
12422 | ||
12423 | Transaction.prototype.getId = function () { | |
12424 | // TxHash is little-endian, we need big-endian | |
12425 | return bufferutils.reverse(this.getHash()).toString('hex') | |
12426 | } | |
12427 | ||
ebd8d4e8 | 12428 | Transaction.prototype.toBuffer = function () { |
ab78acc6 IC |
12429 | function scriptSize (script) { |
12430 | var length = script.buffer.length | |
ebd8d4e8 | 12431 | |
ab78acc6 IC |
12432 | return bufferutils.varIntSize(length) + length |
12433 | } | |
ebd8d4e8 IC |
12434 | |
12435 | var buffer = new Buffer( | |
12436 | 8 + | |
12437 | bufferutils.varIntSize(this.ins.length) + | |
12438 | bufferutils.varIntSize(this.outs.length) + | |
ab78acc6 IC |
12439 | this.ins.reduce(function (sum, input) { return sum + 40 + scriptSize(input.script) }, 0) + |
12440 | this.outs.reduce(function (sum, output) { return sum + 8 + scriptSize(output.script) }, 0) | |
ebd8d4e8 IC |
12441 | ) |
12442 | ||
12443 | var offset = 0 | |
ab78acc6 | 12444 | function writeSlice (slice) { |
ebd8d4e8 IC |
12445 | slice.copy(buffer, offset) |
12446 | offset += slice.length | |
12447 | } | |
ab78acc6 IC |
12448 | |
12449 | function writeUInt32 (i) { | |
ebd8d4e8 IC |
12450 | buffer.writeUInt32LE(i, offset) |
12451 | offset += 4 | |
12452 | } | |
ab78acc6 IC |
12453 | |
12454 | function writeUInt64 (i) { | |
ebd8d4e8 IC |
12455 | bufferutils.writeUInt64LE(buffer, i, offset) |
12456 | offset += 8 | |
12457 | } | |
ab78acc6 IC |
12458 | |
12459 | function writeVarInt (i) { | |
ebd8d4e8 IC |
12460 | var n = bufferutils.writeVarInt(buffer, i, offset) |
12461 | offset += n | |
12462 | } | |
12463 | ||
12464 | writeUInt32(this.version) | |
12465 | writeVarInt(this.ins.length) | |
12466 | ||
ab78acc6 IC |
12467 | this.ins.forEach(function (txIn) { |
12468 | writeSlice(txIn.hash) | |
12469 | writeUInt32(txIn.index) | |
12470 | writeVarInt(txIn.script.buffer.length) | |
12471 | writeSlice(txIn.script.buffer) | |
12472 | writeUInt32(txIn.sequence) | |
ebd8d4e8 IC |
12473 | }) |
12474 | ||
12475 | writeVarInt(this.outs.length) | |
ab78acc6 IC |
12476 | this.outs.forEach(function (txOut) { |
12477 | writeUInt64(txOut.value) | |
12478 | writeVarInt(txOut.script.buffer.length) | |
12479 | writeSlice(txOut.script.buffer) | |
ebd8d4e8 IC |
12480 | }) |
12481 | ||
12482 | writeUInt32(this.locktime) | |
12483 | ||
12484 | return buffer | |
12485 | } | |
12486 | ||
ab78acc6 | 12487 | Transaction.prototype.toHex = function () { |
ebd8d4e8 IC |
12488 | return this.toBuffer().toString('hex') |
12489 | } | |
12490 | ||
ab78acc6 IC |
12491 | Transaction.prototype.setInputScript = function (index, script) { |
12492 | typeForce('Number', index) | |
12493 | typeForce('Script', script) | |
12494 | ||
12495 | this.ins[index].script = script | |
12496 | } | |
12497 | ||
12498 | // FIXME: remove in 2.x.y | |
12499 | Transaction.prototype.sign = function (index, privKey, hashType) { | |
12500 | console.warn('Transaction.prototype.sign is deprecated. Use TransactionBuilder instead.') | |
12501 | ||
12502 | var prevOutScript = privKey.pub.getAddress().toOutputScript() | |
12503 | var signature = this.signInput(index, prevOutScript, privKey, hashType) | |
12504 | ||
12505 | var scriptSig = scripts.pubKeyHashInput(signature, privKey.pub) | |
12506 | this.setInputScript(index, scriptSig) | |
12507 | } | |
12508 | ||
12509 | // FIXME: remove in 2.x.y | |
12510 | Transaction.prototype.signInput = function (index, prevOutScript, privKey, hashType) { | |
12511 | console.warn('Transaction.prototype.signInput is deprecated. Use TransactionBuilder instead.') | |
12512 | ||
12513 | hashType = hashType || Transaction.SIGHASH_ALL | |
12514 | ||
12515 | var hash = this.hashForSignature(index, prevOutScript, hashType) | |
12516 | var signature = privKey.sign(hash) | |
12517 | ||
12518 | return signature.toScriptSignature(hashType) | |
12519 | } | |
12520 | ||
12521 | // FIXME: remove in 2.x.y | |
12522 | Transaction.prototype.validateInput = function (index, prevOutScript, pubKey, buffer) { | |
12523 | console.warn('Transaction.prototype.validateInput is deprecated. Use TransactionBuilder instead.') | |
12524 | ||
12525 | var parsed = ECSignature.parseScriptSignature(buffer) | |
12526 | var hash = this.hashForSignature(index, prevOutScript, parsed.hashType) | |
12527 | ||
12528 | return pubKey.verify(hash, parsed.signature) | |
12529 | } | |
12530 | ||
12531 | module.exports = Transaction | |
12532 | ||
12533 | }).call(this,require("buffer").Buffer) | |
12534 | },{"./address":54,"./bufferutils":57,"./crypto":58,"./ecsignature":62,"./opcodes":67,"./script":68,"./scripts":69,"assert":5,"buffer":7,"typeforce":53}],71:[function(require,module,exports){ | |
12535 | (function (Buffer){ | |
12536 | var assert = require('assert') | |
12537 | var ops = require('./opcodes') | |
12538 | var scripts = require('./scripts') | |
12539 | ||
12540 | var ECPubKey = require('./ecpubkey') | |
12541 | var ECSignature = require('./ecsignature') | |
12542 | var Script = require('./script') | |
12543 | var Transaction = require('./transaction') | |
12544 | ||
12545 | function extractInput (txIn) { | |
12546 | var redeemScript | |
12547 | var scriptSig = txIn.script | |
12548 | var prevOutScript | |
12549 | var prevOutType = scripts.classifyInput(scriptSig, true) | |
12550 | var scriptType | |
12551 | ||
12552 | // Re-classify if scriptHash | |
12553 | if (prevOutType === 'scripthash') { | |
12554 | redeemScript = Script.fromBuffer(scriptSig.chunks.slice(-1)[0]) | |
12555 | prevOutScript = scripts.scriptHashOutput(redeemScript.getHash()) | |
12556 | ||
12557 | scriptSig = Script.fromChunks(scriptSig.chunks.slice(0, -1)) | |
12558 | scriptType = scripts.classifyInput(scriptSig, true) | |
12559 | } else { | |
12560 | scriptType = prevOutType | |
12561 | } | |
12562 | ||
12563 | // Extract hashType, pubKeys and signatures | |
12564 | var hashType, parsed, pubKeys, signatures | |
12565 | ||
12566 | switch (scriptType) { | |
12567 | case 'pubkeyhash': { | |
12568 | parsed = ECSignature.parseScriptSignature(scriptSig.chunks[0]) | |
12569 | hashType = parsed.hashType | |
12570 | pubKeys = [ECPubKey.fromBuffer(scriptSig.chunks[1])] | |
12571 | signatures = [parsed.signature] | |
12572 | prevOutScript = pubKeys[0].getAddress().toOutputScript() | |
12573 | ||
12574 | break | |
12575 | } | |
12576 | ||
12577 | case 'pubkey': { | |
12578 | parsed = ECSignature.parseScriptSignature(scriptSig.chunks[0]) | |
12579 | hashType = parsed.hashType | |
12580 | signatures = [parsed.signature] | |
12581 | ||
12582 | if (redeemScript) { | |
12583 | pubKeys = [ECPubKey.fromBuffer(redeemScript.chunks[0])] | |
12584 | } | |
12585 | ||
12586 | break | |
12587 | } | |
12588 | ||
12589 | case 'multisig': { | |
12590 | signatures = scriptSig.chunks.slice(1).map(function (chunk) { | |
12591 | if (chunk === ops.OP_0) return chunk | |
12592 | ||
12593 | var parsed = ECSignature.parseScriptSignature(chunk) | |
12594 | hashType = parsed.hashType | |
12595 | ||
12596 | return parsed.signature | |
12597 | }) | |
12598 | ||
12599 | if (redeemScript) { | |
12600 | pubKeys = redeemScript.chunks.slice(1, -2).map(ECPubKey.fromBuffer) | |
12601 | } | |
12602 | ||
12603 | break | |
12604 | } | |
12605 | } | |
12606 | ||
12607 | return { | |
12608 | hashType: hashType, | |
12609 | prevOutScript: prevOutScript, | |
12610 | prevOutType: prevOutType, | |
12611 | pubKeys: pubKeys, | |
12612 | redeemScript: redeemScript, | |
12613 | scriptType: scriptType, | |
12614 | signatures: signatures | |
12615 | } | |
12616 | } | |
12617 | ||
12618 | function TransactionBuilder () { | |
12619 | this.prevTxMap = {} | |
12620 | this.prevOutScripts = {} | |
12621 | this.prevOutTypes = {} | |
12622 | ||
12623 | this.inputs = [] | |
12624 | this.tx = new Transaction() | |
12625 | } | |
12626 | ||
12627 | TransactionBuilder.fromTransaction = function (transaction) { | |
12628 | var txb = new TransactionBuilder() | |
12629 | ||
12630 | // Copy other transaction fields | |
12631 | txb.tx.version = transaction.version | |
12632 | txb.tx.locktime = transaction.locktime | |
12633 | ||
12634 | // Extract/add inputs | |
12635 | transaction.ins.forEach(function (txIn) { | |
12636 | txb.addInput(txIn.hash, txIn.index, txIn.sequence) | |
12637 | }) | |
12638 | ||
12639 | // Extract/add outputs | |
12640 | transaction.outs.forEach(function (txOut) { | |
12641 | txb.addOutput(txOut.script, txOut.value) | |
12642 | }) | |
12643 | ||
12644 | // Extract/add signatures | |
12645 | txb.inputs = transaction.ins.map(function (txIn) { | |
12646 | // TODO: remove me after testcase added | |
12647 | assert(!Transaction.isCoinbaseHash(txIn.hash), 'coinbase inputs not supported') | |
12648 | ||
12649 | // Ignore empty scripts | |
12650 | if (txIn.script.buffer.length === 0) return {} | |
12651 | ||
12652 | return extractInput(txIn) | |
12653 | }) | |
12654 | ||
12655 | return txb | |
12656 | } | |
12657 | ||
12658 | TransactionBuilder.prototype.addInput = function (prevTx, index, sequence, prevOutScript) { | |
12659 | var prevOutHash | |
12660 | ||
12661 | // txId | |
12662 | if (typeof prevTx === 'string') { | |
12663 | prevOutHash = new Buffer(prevTx, 'hex') | |
12664 | ||
12665 | // TxId hex is big-endian, we want little-endian hash | |
12666 | Array.prototype.reverse.call(prevOutHash) | |
12667 | ||
12668 | // Transaction | |
12669 | } else if (prevTx instanceof Transaction) { | |
12670 | prevOutHash = prevTx.getHash() | |
12671 | prevOutScript = prevTx.outs[index].script | |
12672 | ||
12673 | // txHash | |
12674 | } else { | |
12675 | prevOutHash = prevTx | |
12676 | } | |
12677 | ||
12678 | var input = {} | |
12679 | if (prevOutScript) { | |
12680 | var prevOutType = scripts.classifyOutput(prevOutScript) | |
12681 | ||
12682 | // if we can, extract pubKey information | |
12683 | switch (prevOutType) { | |
12684 | case 'multisig': { | |
12685 | input.pubKeys = prevOutScript.chunks.slice(1, -2).map(ECPubKey.fromBuffer) | |
12686 | break | |
12687 | } | |
12688 | ||
12689 | case 'pubkey': { | |
12690 | input.pubKeys = prevOutScript.chunks.slice(0, 1).map(ECPubKey.fromBuffer) | |
12691 | break | |
12692 | } | |
12693 | } | |
12694 | ||
12695 | if (prevOutType !== 'scripthash') { | |
12696 | input.scriptType = prevOutType | |
12697 | } | |
12698 | ||
12699 | input.prevOutScript = prevOutScript | |
12700 | input.prevOutType = prevOutType | |
12701 | } | |
12702 | ||
12703 | assert(this.inputs.every(function (input2) { | |
12704 | if (input2.hashType === undefined) return true | |
12705 | ||
12706 | return input2.hashType & Transaction.SIGHASH_ANYONECANPAY | |
12707 | }), 'No, this would invalidate signatures') | |
12708 | ||
12709 | var prevOut = prevOutHash.toString('hex') + ':' + index | |
12710 | assert(!(prevOut in this.prevTxMap), 'Transaction is already an input') | |
12711 | ||
12712 | var vin = this.tx.addInput(prevOutHash, index, sequence) | |
12713 | this.inputs[vin] = input | |
12714 | this.prevTxMap[prevOut] = vin | |
12715 | ||
12716 | return vin | |
12717 | } | |
12718 | ||
12719 | TransactionBuilder.prototype.addOutput = function (scriptPubKey, value) { | |
12720 | assert(this.inputs.every(function (input) { | |
12721 | if (input.hashType === undefined) return true | |
ebd8d4e8 | 12722 | |
ab78acc6 IC |
12723 | return (input.hashType & 0x1f) === Transaction.SIGHASH_SINGLE |
12724 | }), 'No, this would invalidate signatures') | |
ebd8d4e8 | 12725 | |
ab78acc6 IC |
12726 | return this.tx.addOutput(scriptPubKey, value) |
12727 | } | |
ebd8d4e8 | 12728 | |
ab78acc6 IC |
12729 | TransactionBuilder.prototype.build = function () { |
12730 | return this.__build(false) | |
12731 | } | |
12732 | TransactionBuilder.prototype.buildIncomplete = function () { | |
12733 | return this.__build(true) | |
12734 | } | |
ebd8d4e8 | 12735 | |
ab78acc6 IC |
12736 | var canSignTypes = { |
12737 | 'pubkeyhash': true, | |
12738 | 'multisig': true, | |
12739 | 'pubkey': true | |
12740 | } | |
ebd8d4e8 | 12741 | |
ab78acc6 IC |
12742 | TransactionBuilder.prototype.__build = function (allowIncomplete) { |
12743 | if (!allowIncomplete) { | |
12744 | assert(this.tx.ins.length > 0, 'Transaction has no inputs') | |
12745 | assert(this.tx.outs.length > 0, 'Transaction has no outputs') | |
ebd8d4e8 IC |
12746 | } |
12747 | ||
ab78acc6 | 12748 | var tx = this.tx.clone() |
ebd8d4e8 | 12749 | |
ab78acc6 IC |
12750 | // Create script signatures from signature meta-data |
12751 | this.inputs.forEach(function (input, index) { | |
12752 | var scriptType = input.scriptType | |
12753 | var scriptSig | |
ebd8d4e8 | 12754 | |
ab78acc6 IC |
12755 | if (!allowIncomplete) { |
12756 | assert(!!scriptType, 'Transaction is not complete') | |
12757 | assert(scriptType in canSignTypes, scriptType + ' not supported') | |
12758 | assert(input.signatures, 'Transaction is missing signatures') | |
12759 | } | |
ebd8d4e8 | 12760 | |
ab78acc6 IC |
12761 | if (input.signatures) { |
12762 | switch (scriptType) { | |
12763 | case 'pubkeyhash': { | |
12764 | var pkhSignature = input.signatures[0].toScriptSignature(input.hashType) | |
12765 | scriptSig = scripts.pubKeyHashInput(pkhSignature, input.pubKeys[0]) | |
12766 | break | |
12767 | } | |
ebd8d4e8 | 12768 | |
ab78acc6 IC |
12769 | case 'multisig': { |
12770 | // Array.prototype.map is sparse-compatible | |
12771 | var msSignatures = input.signatures.map(function (signature) { | |
12772 | return signature && signature.toScriptSignature(input.hashType) | |
12773 | }) | |
ebd8d4e8 | 12774 | |
ab78acc6 IC |
12775 | // fill in blanks with OP_0 |
12776 | if (allowIncomplete) { | |
12777 | for (var i = 0; i < msSignatures.length; ++i) { | |
12778 | if (msSignatures[i]) continue | |
ebd8d4e8 | 12779 | |
ab78acc6 IC |
12780 | msSignatures[i] = ops.OP_0 |
12781 | } | |
12782 | } else { | |
12783 | // Array.prototype.filter returns non-sparse array | |
12784 | msSignatures = msSignatures.filter(function (x) { return x }) | |
12785 | } | |
ebd8d4e8 | 12786 | |
ab78acc6 IC |
12787 | var redeemScript = allowIncomplete ? undefined : input.redeemScript |
12788 | scriptSig = scripts.multisigInput(msSignatures, redeemScript) | |
12789 | break | |
12790 | } | |
ebd8d4e8 | 12791 | |
ab78acc6 IC |
12792 | case 'pubkey': { |
12793 | var pkSignature = input.signatures[0].toScriptSignature(input.hashType) | |
12794 | scriptSig = scripts.pubKeyInput(pkSignature) | |
12795 | break | |
12796 | } | |
12797 | } | |
ebd8d4e8 | 12798 | } |
ebd8d4e8 | 12799 | |
ab78acc6 IC |
12800 | // did we build a scriptSig? |
12801 | if (scriptSig) { | |
12802 | // wrap as scriptHash if necessary | |
12803 | if (input.prevOutType === 'scripthash') { | |
12804 | scriptSig = scripts.scriptHashInput(scriptSig, input.redeemScript) | |
12805 | } | |
12806 | ||
12807 | tx.setInputScript(index, scriptSig) | |
ebd8d4e8 IC |
12808 | } |
12809 | }) | |
12810 | ||
ab78acc6 | 12811 | return tx |
ebd8d4e8 IC |
12812 | } |
12813 | ||
ab78acc6 IC |
12814 | TransactionBuilder.prototype.sign = function (index, privKey, redeemScript, hashType) { |
12815 | assert(index in this.inputs, 'No input at index: ' + index) | |
12816 | hashType = hashType || Transaction.SIGHASH_ALL | |
ebd8d4e8 | 12817 | |
ab78acc6 IC |
12818 | var input = this.inputs[index] |
12819 | var canSign = input.hashType && | |
12820 | input.prevOutScript && | |
12821 | input.prevOutType && | |
12822 | input.pubKeys && | |
12823 | input.scriptType && | |
12824 | input.signatures | |
ebd8d4e8 | 12825 | |
ab78acc6 IC |
12826 | // are we almost ready to sign? |
12827 | if (canSign) { | |
12828 | // if redeemScript was provided, enforce consistency | |
12829 | if (redeemScript) { | |
12830 | assert.deepEqual(input.redeemScript, redeemScript, 'Inconsistent redeemScript') | |
12831 | } | |
ebd8d4e8 | 12832 | |
ab78acc6 | 12833 | assert.equal(input.hashType, hashType, 'Inconsistent hashType') |
ebd8d4e8 | 12834 | |
ab78acc6 IC |
12835 | // no? prepare |
12836 | } else { | |
12837 | // must be pay-to-scriptHash? | |
12838 | if (redeemScript) { | |
12839 | // if we have a prevOutScript, enforce scriptHash equality to the redeemScript | |
12840 | if (input.prevOutScript) { | |
12841 | assert.equal(input.prevOutType, 'scripthash', 'PrevOutScript must be P2SH') | |
12842 | ||
12843 | var scriptHash = input.prevOutScript.chunks[1] | |
12844 | assert.deepEqual(scriptHash, redeemScript.getHash(), 'RedeemScript does not match ' + scriptHash.toString('hex')) | |
12845 | } | |
ebd8d4e8 | 12846 | |
ab78acc6 IC |
12847 | var scriptType = scripts.classifyOutput(redeemScript) |
12848 | assert(scriptType in canSignTypes, 'RedeemScript not supported (' + scriptType + ')') | |
ebd8d4e8 | 12849 | |
ab78acc6 IC |
12850 | var pubKeys = [] |
12851 | switch (scriptType) { | |
12852 | case 'multisig': { | |
12853 | pubKeys = redeemScript.chunks.slice(1, -2).map(ECPubKey.fromBuffer) | |
12854 | break | |
12855 | } | |
ebd8d4e8 | 12856 | |
ab78acc6 IC |
12857 | case 'pubkeyhash': { |
12858 | var pkh1 = redeemScript.chunks[2] | |
12859 | var pkh2 = privKey.pub.getAddress().hash | |
ebd8d4e8 | 12860 | |
ab78acc6 IC |
12861 | assert.deepEqual(pkh1, pkh2, 'privateKey cannot sign for this input') |
12862 | pubKeys = [privKey.pub] | |
12863 | break | |
12864 | } | |
ebd8d4e8 | 12865 | |
ab78acc6 IC |
12866 | case 'pubkey': { |
12867 | pubKeys = redeemScript.chunks.slice(0, 1).map(ECPubKey.fromBuffer) | |
12868 | break | |
12869 | } | |
12870 | } | |
ebd8d4e8 | 12871 | |
ab78acc6 IC |
12872 | if (!input.prevOutScript) { |
12873 | input.prevOutScript = scripts.scriptHashOutput(redeemScript.getHash()) | |
12874 | input.prevOutType = 'scripthash' | |
12875 | } | |
ebd8d4e8 | 12876 | |
ab78acc6 IC |
12877 | input.pubKeys = pubKeys |
12878 | input.redeemScript = redeemScript | |
12879 | input.scriptType = scriptType | |
ebd8d4e8 | 12880 | |
ab78acc6 IC |
12881 | // cannot be pay-to-scriptHash |
12882 | } else { | |
12883 | assert.notEqual(input.prevOutType, 'scripthash', 'PrevOutScript is P2SH, missing redeemScript') | |
ebd8d4e8 | 12884 | |
ab78acc6 IC |
12885 | // can we otherwise sign this? |
12886 | if (input.scriptType) { | |
12887 | assert(input.pubKeys, input.scriptType + ' not supported') | |
ebd8d4e8 | 12888 | |
ab78acc6 IC |
12889 | // we know nothin' Jon Snow, assume pubKeyHash |
12890 | } else { | |
12891 | input.prevOutScript = privKey.pub.getAddress().toOutputScript() | |
12892 | input.prevOutType = 'pubkeyhash' | |
12893 | input.pubKeys = [privKey.pub] | |
12894 | input.scriptType = input.prevOutType | |
12895 | } | |
12896 | } | |
ebd8d4e8 | 12897 | |
ab78acc6 IC |
12898 | input.hashType = hashType |
12899 | input.signatures = input.signatures || [] | |
12900 | } | |
12901 | ||
12902 | var signatureScript = input.redeemScript || input.prevOutScript | |
12903 | var signatureHash = this.tx.hashForSignature(index, signatureScript, hashType) | |
12904 | ||
12905 | // enforce signature order matches public keys | |
12906 | if (input.scriptType === 'multisig' && input.redeemScript && input.signatures.length !== input.pubKeys.length) { | |
12907 | // maintain a local copy of unmatched signatures | |
12908 | var unmatched = input.signatures.slice() | |
12909 | ||
12910 | input.signatures = input.pubKeys.map(function (pubKey) { | |
12911 | var match | |
12912 | ||
12913 | // check for any matching signatures | |
12914 | unmatched.some(function (signature, i) { | |
12915 | if (!pubKey.verify(signatureHash, signature)) return false | |
12916 | match = signature | |
12917 | ||
12918 | // remove matched signature from unmatched | |
12919 | unmatched.splice(i, 1) | |
12920 | ||
12921 | return true | |
12922 | }) | |
12923 | ||
12924 | return match || undefined | |
12925 | }) | |
12926 | } | |
12927 | ||
12928 | // enforce in order signing of public keys | |
12929 | assert(input.pubKeys.some(function (pubKey, i) { | |
12930 | if (!privKey.pub.Q.equals(pubKey.Q)) return false | |
12931 | ||
12932 | assert(!input.signatures[i], 'Signature already exists') | |
12933 | var signature = privKey.sign(signatureHash) | |
12934 | input.signatures[i] = signature | |
12935 | ||
12936 | return true | |
12937 | }, this), 'privateKey cannot sign for this input') | |
ebd8d4e8 IC |
12938 | } |
12939 | ||
ab78acc6 | 12940 | module.exports = TransactionBuilder |
ebd8d4e8 | 12941 | |
ab78acc6 IC |
12942 | }).call(this,require("buffer").Buffer) |
12943 | },{"./ecpubkey":61,"./ecsignature":62,"./opcodes":67,"./script":68,"./scripts":69,"./transaction":70,"assert":5,"buffer":7}],72:[function(require,module,exports){ | |
ebd8d4e8 | 12944 | (function (Buffer){ |
ab78acc6 IC |
12945 | var assert = require('assert') |
12946 | var bufferutils = require('./bufferutils') | |
12947 | var typeForce = require('typeforce') | |
12948 | var networks = require('./networks') | |
12949 | var randomBytes = require('randombytes') | |
ebd8d4e8 | 12950 | |
ab78acc6 IC |
12951 | var Address = require('./address') |
12952 | var HDNode = require('./hdnode') | |
12953 | var TransactionBuilder = require('./transaction_builder') | |
12954 | var Script = require('./script') | |
ebd8d4e8 | 12955 | |
ab78acc6 IC |
12956 | function Wallet (seed, network) { |
12957 | console.warn('Wallet is deprecated and will be removed in 2.0.0, see #296') | |
12958 | ||
12959 | seed = seed || randomBytes(32) | |
ebd8d4e8 IC |
12960 | network = network || networks.bitcoin |
12961 | ||
12962 | // Stored in a closure to make accidental serialization less likely | |
ab78acc6 IC |
12963 | var masterKey = HDNode.fromSeedBuffer(seed, network) |
12964 | ||
12965 | // HD first-level child derivation method should be hardened | |
12966 | // See https://bitcointalk.org/index.php?topic=405179.msg4415254#msg4415254 | |
12967 | var accountZero = masterKey.deriveHardened(0) | |
12968 | var externalAccount = accountZero.derive(0) | |
12969 | var internalAccount = accountZero.derive(1) | |
ebd8d4e8 | 12970 | |
ebd8d4e8 IC |
12971 | this.addresses = [] |
12972 | this.changeAddresses = [] | |
ab78acc6 IC |
12973 | this.network = network |
12974 | this.unspents = [] | |
ebd8d4e8 | 12975 | |
ab78acc6 IC |
12976 | // FIXME: remove in 2.0.0 |
12977 | this.unspentMap = {} | |
ebd8d4e8 | 12978 | |
ab78acc6 IC |
12979 | // FIXME: remove in 2.0.0 |
12980 | var me = this | |
12981 | this.newMasterKey = function (seed) { | |
12982 | console.warn('newMasterKey is deprecated, please make a new Wallet instance instead') | |
12983 | ||
12984 | seed = seed || randomBytes(32) | |
12985 | masterKey = HDNode.fromSeedBuffer(seed, network) | |
ebd8d4e8 | 12986 | |
ab78acc6 | 12987 | accountZero = masterKey.deriveHardened(0) |
ebd8d4e8 IC |
12988 | externalAccount = accountZero.derive(0) |
12989 | internalAccount = accountZero.derive(1) | |
12990 | ||
12991 | me.addresses = [] | |
12992 | me.changeAddresses = [] | |
12993 | ||
ab78acc6 IC |
12994 | me.unspents = [] |
12995 | me.unspentMap = {} | |
ebd8d4e8 IC |
12996 | } |
12997 | ||
ab78acc6 IC |
12998 | this.getMasterKey = function () { |
12999 | return masterKey | |
ebd8d4e8 | 13000 | } |
ab78acc6 IC |
13001 | this.getAccountZero = function () { |
13002 | return accountZero | |
ebd8d4e8 | 13003 | } |
ab78acc6 IC |
13004 | this.getExternalAccount = function () { |
13005 | return externalAccount | |
13006 | } | |
13007 | this.getInternalAccount = function () { | |
13008 | return internalAccount | |
ebd8d4e8 | 13009 | } |
ab78acc6 | 13010 | } |
ebd8d4e8 | 13011 | |
ab78acc6 IC |
13012 | Wallet.prototype.createTransaction = function (to, value, options) { |
13013 | // FIXME: remove in 2.0.0 | |
13014 | if (typeof options !== 'object') { | |
13015 | if (options !== undefined) { | |
13016 | console.warn('Non options object parameters are deprecated, use options object instead') | |
ebd8d4e8 | 13017 | |
ab78acc6 IC |
13018 | options = { |
13019 | fixedFee: arguments[2], | |
13020 | changeAddress: arguments[3] | |
13021 | } | |
ebd8d4e8 | 13022 | } |
ebd8d4e8 IC |
13023 | } |
13024 | ||
ab78acc6 | 13025 | options = options || {} |
ebd8d4e8 | 13026 | |
ab78acc6 | 13027 | assert(value > this.network.dustThreshold, value + ' must be above dust threshold (' + this.network.dustThreshold + ' Satoshis)') |
ebd8d4e8 | 13028 | |
ab78acc6 IC |
13029 | var changeAddress = options.changeAddress |
13030 | var fixedFee = options.fixedFee | |
13031 | var minConf = options.minConf === undefined ? 0 : options.minConf // FIXME: change minConf:1 by default in 2.0.0 | |
ebd8d4e8 | 13032 | |
ab78acc6 IC |
13033 | // filter by minConf, then pending and sort by descending value |
13034 | var unspents = this.unspents.filter(function (unspent) { | |
13035 | return unspent.confirmations >= minConf | |
13036 | }).filter(function (unspent) { | |
13037 | return !unspent.pending | |
13038 | }).sort(function (o1, o2) { | |
13039 | return o2.value - o1.value | |
13040 | }) | |
ebd8d4e8 | 13041 | |
ab78acc6 IC |
13042 | var accum = 0 |
13043 | var addresses = [] | |
13044 | var subTotal = value | |
ebd8d4e8 | 13045 | |
ab78acc6 IC |
13046 | var txb = new TransactionBuilder() |
13047 | txb.addOutput(to, value) | |
ebd8d4e8 | 13048 | |
ab78acc6 IC |
13049 | for (var i = 0; i < unspents.length; ++i) { |
13050 | var unspent = unspents[i] | |
13051 | addresses.push(unspent.address) | |
ebd8d4e8 | 13052 | |
ab78acc6 IC |
13053 | txb.addInput(unspent.txHash, unspent.index) |
13054 | ||
13055 | var fee = fixedFee === undefined ? estimatePaddedFee(txb.buildIncomplete(), this.network) : fixedFee | |
ebd8d4e8 | 13056 | |
ab78acc6 IC |
13057 | accum += unspent.value |
13058 | subTotal = value + fee | |
13059 | ||
13060 | if (accum >= subTotal) { | |
13061 | var change = accum - subTotal | |
13062 | ||
13063 | if (change > this.network.dustThreshold) { | |
13064 | txb.addOutput(changeAddress || this.getChangeAddress(), change) | |
ebd8d4e8 | 13065 | } |
ebd8d4e8 | 13066 | |
ab78acc6 | 13067 | break |
ebd8d4e8 IC |
13068 | } |
13069 | } | |
13070 | ||
ab78acc6 | 13071 | assert(accum >= subTotal, 'Not enough funds (incl. fee): ' + accum + ' < ' + subTotal) |
ebd8d4e8 | 13072 | |
ab78acc6 IC |
13073 | return this.signWith(txb, addresses).build() |
13074 | } | |
ebd8d4e8 | 13075 | |
ab78acc6 IC |
13076 | // FIXME: remove in 2.0.0 |
13077 | Wallet.prototype.processPendingTx = function (tx) { | |
13078 | this.__processTx(tx, true) | |
13079 | } | |
ebd8d4e8 | 13080 | |
ab78acc6 IC |
13081 | // FIXME: remove in 2.0.0 |
13082 | Wallet.prototype.processConfirmedTx = function (tx) { | |
13083 | this.__processTx(tx, false) | |
13084 | } | |
ebd8d4e8 | 13085 | |
ab78acc6 IC |
13086 | // FIXME: remove in 2.0.0 |
13087 | Wallet.prototype.__processTx = function (tx, isPending) { | |
13088 | console.warn('processTransaction is considered harmful, see issue #260 for more information') | |
ebd8d4e8 | 13089 | |
ab78acc6 IC |
13090 | var txId = tx.getId() |
13091 | var txHash = tx.getHash() | |
ebd8d4e8 | 13092 | |
ab78acc6 IC |
13093 | tx.outs.forEach(function (txOut, i) { |
13094 | var address | |
ebd8d4e8 | 13095 | |
ab78acc6 IC |
13096 | try { |
13097 | address = Address.fromOutputScript(txOut.script, this.network).toString() | |
13098 | } catch (e) { | |
13099 | if (!(e.message.match(/has no matching Address/))) | |
13100 | throw e | |
13101 | } | |
13102 | ||
13103 | var myAddresses = this.addresses.concat(this.changeAddresses) | |
13104 | if (myAddresses.indexOf(address) > -1) { | |
13105 | var lookup = txId + ':' + i | |
13106 | if (lookup in this.unspentMap) return | |
13107 | ||
13108 | // its unique, add it | |
13109 | var unspent = { | |
13110 | address: address, | |
13111 | confirmations: 0, // no way to determine this without more information | |
13112 | index: i, | |
13113 | txHash: txHash, | |
13114 | txId: txId, | |
13115 | value: txOut.value, | |
13116 | pending: isPending | |
ebd8d4e8 | 13117 | } |
ebd8d4e8 | 13118 | |
ab78acc6 IC |
13119 | this.unspentMap[lookup] = unspent |
13120 | this.unspents.push(unspent) | |
13121 | } | |
13122 | }, this) | |
ebd8d4e8 | 13123 | |
ab78acc6 IC |
13124 | tx.ins.forEach(function (txIn) { |
13125 | // copy and convert to big-endian hex | |
13126 | var txInId = bufferutils.reverse(txIn.hash).toString('hex') | |
ebd8d4e8 | 13127 | |
ab78acc6 IC |
13128 | var lookup = txInId + ':' + txIn.index |
13129 | if (!(lookup in this.unspentMap)) return | |
ebd8d4e8 | 13130 | |
ab78acc6 | 13131 | var unspent = this.unspentMap[lookup] |
ebd8d4e8 | 13132 | |
ab78acc6 IC |
13133 | if (isPending) { |
13134 | unspent.pending = true | |
13135 | unspent.spent = true | |
13136 | } else { | |
13137 | delete this.unspentMap[lookup] | |
ebd8d4e8 | 13138 | |
ab78acc6 IC |
13139 | this.unspents = this.unspents.filter(function (unspent2) { |
13140 | return unspent !== unspent2 | |
13141 | }) | |
13142 | } | |
13143 | }, this) | |
13144 | } | |
ebd8d4e8 | 13145 | |
ab78acc6 IC |
13146 | Wallet.prototype.generateAddress = function () { |
13147 | var k = this.addresses.length | |
13148 | var address = this.getExternalAccount().derive(k).getAddress() | |
ebd8d4e8 | 13149 | |
ab78acc6 | 13150 | this.addresses.push(address.toString()) |
ebd8d4e8 | 13151 | |
ab78acc6 IC |
13152 | return this.getReceiveAddress() |
13153 | } | |
ebd8d4e8 | 13154 | |
ab78acc6 IC |
13155 | Wallet.prototype.generateChangeAddress = function () { |
13156 | var k = this.changeAddresses.length | |
13157 | var address = this.getInternalAccount().derive(k).getAddress() | |
ebd8d4e8 | 13158 | |
ab78acc6 | 13159 | this.changeAddresses.push(address.toString()) |
ebd8d4e8 | 13160 | |
ab78acc6 IC |
13161 | return this.getChangeAddress() |
13162 | } | |
ebd8d4e8 | 13163 | |
ab78acc6 IC |
13164 | Wallet.prototype.getAddress = function () { |
13165 | if (this.addresses.length === 0) { | |
13166 | this.generateAddress() | |
ebd8d4e8 IC |
13167 | } |
13168 | ||
ab78acc6 IC |
13169 | return this.addresses[this.addresses.length - 1] |
13170 | } | |
ebd8d4e8 | 13171 | |
ab78acc6 IC |
13172 | Wallet.prototype.getBalance = function (minConf) { |
13173 | minConf = minConf || 0 | |
ebd8d4e8 | 13174 | |
ab78acc6 IC |
13175 | return this.unspents.filter(function (unspent) { |
13176 | return unspent.confirmations >= minConf | |
13177 | ||
13178 | // FIXME: remove spent filter in 2.0.0 | |
13179 | }).filter(function (unspent) { | |
13180 | return !unspent.spent | |
13181 | }).reduce(function (accum, unspent) { | |
13182 | return accum + unspent.value | |
13183 | }, 0) | |
13184 | } | |
ebd8d4e8 | 13185 | |
ab78acc6 IC |
13186 | Wallet.prototype.getChangeAddress = function () { |
13187 | if (this.changeAddresses.length === 0) { | |
13188 | this.generateChangeAddress() | |
ebd8d4e8 IC |
13189 | } |
13190 | ||
ab78acc6 IC |
13191 | return this.changeAddresses[this.changeAddresses.length - 1] |
13192 | } | |
13193 | ||
13194 | Wallet.prototype.getInternalPrivateKey = function (index) { | |
13195 | return this.getInternalAccount().derive(index).privKey | |
13196 | } | |
13197 | ||
13198 | Wallet.prototype.getPrivateKey = function (index) { | |
13199 | return this.getExternalAccount().derive(index).privKey | |
13200 | } | |
13201 | ||
13202 | Wallet.prototype.getPrivateKeyForAddress = function (address) { | |
13203 | var index | |
ebd8d4e8 | 13204 | |
ab78acc6 IC |
13205 | if ((index = this.addresses.indexOf(address)) > -1) { |
13206 | return this.getPrivateKey(index) | |
ebd8d4e8 IC |
13207 | } |
13208 | ||
ab78acc6 IC |
13209 | if ((index = this.changeAddresses.indexOf(address)) > -1) { |
13210 | return this.getInternalPrivateKey(index) | |
ebd8d4e8 IC |
13211 | } |
13212 | ||
ab78acc6 IC |
13213 | assert(false, 'Unknown address. Make sure the address is from the keychain and has been generated') |
13214 | } | |
ebd8d4e8 | 13215 | |
ab78acc6 IC |
13216 | Wallet.prototype.getUnspentOutputs = function (minConf) { |
13217 | minConf = minConf || 0 | |
ebd8d4e8 | 13218 | |
ab78acc6 IC |
13219 | return this.unspents.filter(function (unspent) { |
13220 | return unspent.confirmations >= minConf | |
ebd8d4e8 | 13221 | |
ab78acc6 IC |
13222 | // FIXME: remove spent filter in 2.0.0 |
13223 | }).filter(function (unspent) { | |
13224 | return !unspent.spent | |
13225 | }).map(function (unspent) { | |
13226 | return { | |
13227 | address: unspent.address, | |
13228 | confirmations: unspent.confirmations, | |
13229 | index: unspent.index, | |
13230 | txId: unspent.txId, | |
13231 | value: unspent.value, | |
13232 | ||
13233 | // FIXME: remove in 2.0.0 | |
13234 | hash: unspent.txId, | |
13235 | pending: unspent.pending | |
13236 | } | |
13237 | }) | |
13238 | } | |
ebd8d4e8 | 13239 | |
ab78acc6 IC |
13240 | Wallet.prototype.setUnspentOutputs = function (unspents) { |
13241 | this.unspentMap = {} | |
13242 | this.unspents = unspents.map(function (unspent) { | |
13243 | // FIXME: remove unspent.hash in 2.0.0 | |
13244 | var txId = unspent.txId || unspent.hash | |
13245 | var index = unspent.index | |
ebd8d4e8 | 13246 | |
ab78acc6 IC |
13247 | // FIXME: remove in 2.0.0 |
13248 | if (unspent.hash !== undefined) { | |
13249 | console.warn('unspent.hash is deprecated, use unspent.txId instead') | |
13250 | } | |
ebd8d4e8 | 13251 | |
ab78acc6 IC |
13252 | // FIXME: remove in 2.0.0 |
13253 | if (index === undefined) { | |
13254 | console.warn('unspent.outputIndex is deprecated, use unspent.index instead') | |
13255 | index = unspent.outputIndex | |
13256 | } | |
ebd8d4e8 | 13257 | |
ab78acc6 IC |
13258 | typeForce('String', txId) |
13259 | typeForce('Number', index) | |
13260 | typeForce('Number', unspent.value) | |
13261 | ||
13262 | assert.equal(txId.length, 64, 'Expected valid txId, got ' + txId) | |
13263 | assert.doesNotThrow(function () { | |
13264 | Address.fromBase58Check(unspent.address) | |
13265 | }, 'Expected Base58 Address, got ' + unspent.address) | |
13266 | assert(isFinite(index), 'Expected finite index, got ' + index) | |
13267 | ||
13268 | // FIXME: remove branch in 2.0.0 | |
13269 | if (unspent.confirmations !== undefined) { | |
13270 | typeForce('Number', unspent.confirmations) | |
ebd8d4e8 | 13271 | } |
ebd8d4e8 | 13272 | |
ab78acc6 | 13273 | var txHash = bufferutils.reverse(new Buffer(txId, 'hex')) |
ebd8d4e8 | 13274 | |
ab78acc6 IC |
13275 | unspent = { |
13276 | address: unspent.address, | |
13277 | confirmations: unspent.confirmations || 0, | |
13278 | index: index, | |
13279 | txHash: txHash, | |
13280 | txId: txId, | |
13281 | value: unspent.value, | |
ebd8d4e8 | 13282 | |
ab78acc6 IC |
13283 | // FIXME: remove in 2.0.0 |
13284 | pending: unspent.pending || false | |
13285 | } | |
13286 | ||
13287 | // FIXME: remove in 2.0.0 | |
13288 | this.unspentMap[txId + ':' + index] = unspent | |
13289 | ||
13290 | return unspent | |
13291 | }, this) | |
13292 | } | |
13293 | ||
13294 | Wallet.prototype.signWith = function (tx, addresses) { | |
13295 | addresses.forEach(function (address, i) { | |
13296 | var privKey = this.getPrivateKeyForAddress(address) | |
13297 | ||
13298 | tx.sign(i, privKey) | |
13299 | }, this) | |
13300 | ||
13301 | return tx | |
13302 | } | |
13303 | ||
13304 | function estimatePaddedFee (tx, network) { | |
13305 | var tmpTx = tx.clone() | |
13306 | tmpTx.addOutput(Script.EMPTY, network.dustSoftThreshold || 0) | |
13307 | ||
13308 | return network.estimateFee(tmpTx) | |
ebd8d4e8 IC |
13309 | } |
13310 | ||
ab78acc6 IC |
13311 | // FIXME: 1.0.0 shims, remove in 2.0.0 |
13312 | Wallet.prototype.getReceiveAddress = Wallet.prototype.getAddress | |
13313 | Wallet.prototype.createTx = Wallet.prototype.createTransaction | |
13314 | ||
ebd8d4e8 IC |
13315 | module.exports = Wallet |
13316 | ||
ab78acc6 IC |
13317 | }).call(this,require("buffer").Buffer) |
13318 | },{"./address":54,"./bufferutils":57,"./hdnode":63,"./networks":66,"./script":68,"./transaction_builder":71,"assert":5,"buffer":7,"randombytes":52,"typeforce":53}]},{},[64])(64) | |
13319 | });</script> | |
d5dc92fd IC |
13320 | <script>bitcoin.networks.shadow = { |
13321 | magicPrefix: '\x19ShadowCash Signed Message:\n', | |
13322 | bip32: { | |
13323 | public: 0xEE80286A, | |
13324 | private: 0xEE8031E8 | |
13325 | }, | |
13326 | pubKeyHash: 0x3f, | |
13327 | scriptHash: 0x7d, | |
13328 | wif: 0xbf, | |
13329 | dustThreshold: 0, | |
13330 | feePerKb: 1000, | |
13331 | estimateFee: function() { return "unused in this app" }, | |
13332 | }; | |
13333 | ||
13334 | bitcoin.networks.shadowtn = { | |
13335 | magicPrefix: '\x19ShadowCash Signed Message:\n', | |
13336 | bip32: { | |
13337 | public: 0x76C0FDFB, | |
13338 | private: 0x76C1077A | |
13339 | }, | |
13340 | pubKeyHash: 0x7f, | |
13341 | scriptHash: 0xc4, | |
13342 | wif: 0xff, | |
13343 | dustThreshold: 0, | |
13344 | feePerKb: 1000, | |
13345 | estimateFee: function() { return "unused in this app" }, | |
13346 | }; | |
5c434a8a CM |
13347 | |
13348 | bitcoin.networks.clam = { | |
13349 | bip32: { | |
13350 | public: 0xa8c26d64, | |
13351 | private: 0xa8c17826 | |
13352 | }, | |
13353 | pubKeyHash: 0x89, | |
13354 | wif: 0x85, | |
13355 | }; | |
5493efc3 | 13356 | |
13357 | bitcoin.networks.dash = { | |
13358 | bip32: { | |
13359 | public: 0x0488b21e, | |
13360 | private: 0x0488ade4 | |
13361 | }, | |
13362 | pubKeyHash: 0x4e, | |
13363 | scriptHash: 0x10, | |
13364 | wif: 0xcc, | |
13365 | }; | |
13366 | ||
d5dc92fd | 13367 | </script> |
ab78acc6 | 13368 | <script>// Select components from sjcl to suit the crypto operations bip39 requires. |
80c4dd2a IC |
13369 | |
13370 | //// base.js | |
13371 | ||
13372 | /** @fileOverview Javascript cryptography implementation. | |
13373 | * | |
13374 | * Crush to remove comments, shorten variable names and | |
13375 | * generally reduce transmission size. | |
13376 | * | |
13377 | * @author Emily Stark | |
13378 | * @author Mike Hamburg | |
13379 | * @author Dan Boneh | |
13380 | */ | |
13381 | ||
13382 | "use strict"; | |
13383 | /*jslint indent: 2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */ | |
13384 | /*global document, window, escape, unescape, module, require, Uint32Array */ | |
13385 | ||
13386 | /** @namespace The Stanford Javascript Crypto Library, top-level namespace. */ | |
13387 | var sjcl = { | |
13388 | /** @namespace Symmetric ciphers. */ | |
13389 | cipher: {}, | |
13390 | ||
13391 | /** @namespace Hash functions. Right now only SHA256 is implemented. */ | |
13392 | hash: {}, | |
13393 | ||
13394 | /** @namespace Key exchange functions. Right now only SRP is implemented. */ | |
13395 | keyexchange: {}, | |
13396 | ||
13397 | /** @namespace Block cipher modes of operation. */ | |
13398 | mode: {}, | |
13399 | ||
13400 | /** @namespace Miscellaneous. HMAC and PBKDF2. */ | |
13401 | misc: {}, | |
13402 | ||
13403 | /** | |
13404 | * @namespace Bit array encoders and decoders. | |
13405 | * | |
13406 | * @description | |
13407 | * The members of this namespace are functions which translate between | |
13408 | * SJCL's bitArrays and other objects (usually strings). Because it | |
13409 | * isn't always clear which direction is encoding and which is decoding, | |
13410 | * the method names are "fromBits" and "toBits". | |
13411 | */ | |
13412 | codec: {}, | |
13413 | ||
13414 | /** @namespace Exceptions. */ | |
13415 | exception: { | |
13416 | /** @constructor Ciphertext is corrupt. */ | |
13417 | corrupt: function(message) { | |
13418 | this.toString = function() { return "CORRUPT: "+this.message; }; | |
13419 | this.message = message; | |
13420 | }, | |
13421 | ||
13422 | /** @constructor Invalid parameter. */ | |
13423 | invalid: function(message) { | |
13424 | this.toString = function() { return "INVALID: "+this.message; }; | |
13425 | this.message = message; | |
13426 | }, | |
13427 | ||
13428 | /** @constructor Bug or missing feature in SJCL. @constructor */ | |
13429 | bug: function(message) { | |
13430 | this.toString = function() { return "BUG: "+this.message; }; | |
13431 | this.message = message; | |
13432 | }, | |
13433 | ||
13434 | /** @constructor Something isn't ready. */ | |
13435 | notReady: function(message) { | |
13436 | this.toString = function() { return "NOT READY: "+this.message; }; | |
13437 | this.message = message; | |
ebd8d4e8 | 13438 | } |
80c4dd2a IC |
13439 | } |
13440 | }; | |
13441 | ||
13442 | if(typeof module !== 'undefined' && module.exports){ | |
13443 | module.exports = sjcl; | |
13444 | } | |
13445 | if (typeof define === "function") { | |
13446 | define([], function () { | |
13447 | return sjcl; | |
13448 | }); | |
13449 | } | |
13450 | ||
13451 | ||
13452 | //// bitArray.js | |
13453 | ||
13454 | /** @fileOverview Arrays of bits, encoded as arrays of Numbers. | |
13455 | * | |
13456 | * @author Emily Stark | |
13457 | * @author Mike Hamburg | |
13458 | * @author Dan Boneh | |
13459 | */ | |
13460 | ||
13461 | /** @namespace Arrays of bits, encoded as arrays of Numbers. | |
13462 | * | |
13463 | * @description | |
13464 | * <p> | |
13465 | * These objects are the currency accepted by SJCL's crypto functions. | |
13466 | * </p> | |
13467 | * | |
13468 | * <p> | |
13469 | * Most of our crypto primitives operate on arrays of 4-byte words internally, | |
13470 | * but many of them can take arguments that are not a multiple of 4 bytes. | |
13471 | * This library encodes arrays of bits (whose size need not be a multiple of 8 | |
13472 | * bits) as arrays of 32-bit words. The bits are packed, big-endian, into an | |
13473 | * array of words, 32 bits at a time. Since the words are double-precision | |
13474 | * floating point numbers, they fit some extra data. We use this (in a private, | |
13475 | * possibly-changing manner) to encode the number of bits actually present | |
13476 | * in the last word of the array. | |
13477 | * </p> | |
13478 | * | |
13479 | * <p> | |
13480 | * Because bitwise ops clear this out-of-band data, these arrays can be passed | |
13481 | * to ciphers like AES which want arrays of words. | |
13482 | * </p> | |
13483 | */ | |
13484 | sjcl.bitArray = { | |
13485 | /** | |
13486 | * Array slices in units of bits. | |
13487 | * @param {bitArray} a The array to slice. | |
13488 | * @param {Number} bstart The offset to the start of the slice, in bits. | |
13489 | * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined, | |
13490 | * slice until the end of the array. | |
13491 | * @return {bitArray} The requested slice. | |
13492 | */ | |
13493 | bitSlice: function (a, bstart, bend) { | |
13494 | a = sjcl.bitArray._shiftRight(a.slice(bstart/32), 32 - (bstart & 31)).slice(1); | |
13495 | return (bend === undefined) ? a : sjcl.bitArray.clamp(a, bend-bstart); | |
13496 | }, | |
13497 | ||
13498 | /** | |
13499 | * Extract a number packed into a bit array. | |
13500 | * @param {bitArray} a The array to slice. | |
13501 | * @param {Number} bstart The offset to the start of the slice, in bits. | |
13502 | * @param {Number} length The length of the number to extract. | |
13503 | * @return {Number} The requested slice. | |
13504 | */ | |
13505 | extract: function(a, bstart, blength) { | |
13506 | // FIXME: this Math.floor is not necessary at all, but for some reason | |
13507 | // seems to suppress a bug in the Chromium JIT. | |
13508 | var x, sh = Math.floor((-bstart-blength) & 31); | |
13509 | if ((bstart + blength - 1 ^ bstart) & -32) { | |
13510 | // it crosses a boundary | |
13511 | x = (a[bstart/32|0] << (32 - sh)) ^ (a[bstart/32+1|0] >>> sh); | |
13512 | } else { | |
13513 | // within a single word | |
13514 | x = a[bstart/32|0] >>> sh; | |
ebd8d4e8 | 13515 | } |
80c4dd2a IC |
13516 | return x & ((1<<blength) - 1); |
13517 | }, | |
13518 | ||
13519 | /** | |
13520 | * Concatenate two bit arrays. | |
13521 | * @param {bitArray} a1 The first array. | |
13522 | * @param {bitArray} a2 The second array. | |
13523 | * @return {bitArray} The concatenation of a1 and a2. | |
13524 | */ | |
13525 | concat: function (a1, a2) { | |
13526 | if (a1.length === 0 || a2.length === 0) { | |
13527 | return a1.concat(a2); | |
13528 | } | |
13529 | ||
13530 | var last = a1[a1.length-1], shift = sjcl.bitArray.getPartial(last); | |
13531 | if (shift === 32) { | |
13532 | return a1.concat(a2); | |
13533 | } else { | |
13534 | return sjcl.bitArray._shiftRight(a2, shift, last|0, a1.slice(0,a1.length-1)); | |
ebd8d4e8 | 13535 | } |
80c4dd2a IC |
13536 | }, |
13537 | ||
13538 | /** | |
13539 | * Find the length of an array of bits. | |
13540 | * @param {bitArray} a The array. | |
13541 | * @return {Number} The length of a, in bits. | |
13542 | */ | |
13543 | bitLength: function (a) { | |
13544 | var l = a.length, x; | |
13545 | if (l === 0) { return 0; } | |
13546 | x = a[l - 1]; | |
13547 | return (l-1) * 32 + sjcl.bitArray.getPartial(x); | |
13548 | }, | |
13549 | ||
13550 | /** | |
13551 | * Truncate an array. | |
13552 | * @param {bitArray} a The array. | |
13553 | * @param {Number} len The length to truncate to, in bits. | |
13554 | * @return {bitArray} A new array, truncated to len bits. | |
13555 | */ | |
13556 | clamp: function (a, len) { | |
13557 | if (a.length * 32 < len) { return a; } | |
13558 | a = a.slice(0, Math.ceil(len / 32)); | |
13559 | var l = a.length; | |
13560 | len = len & 31; | |
13561 | if (l > 0 && len) { | |
13562 | a[l-1] = sjcl.bitArray.partial(len, a[l-1] & 0x80000000 >> (len-1), 1); | |
13563 | } | |
13564 | return a; | |
13565 | }, | |
13566 | ||
13567 | /** | |
13568 | * Make a partial word for a bit array. | |
13569 | * @param {Number} len The number of bits in the word. | |
13570 | * @param {Number} x The bits. | |
13571 | * @param {Number} [0] _end Pass 1 if x has already been shifted to the high side. | |
13572 | * @return {Number} The partial word. | |
13573 | */ | |
13574 | partial: function (len, x, _end) { | |
13575 | if (len === 32) { return x; } | |
13576 | return (_end ? x|0 : x << (32-len)) + len * 0x10000000000; | |
13577 | }, | |
13578 | ||
13579 | /** | |
13580 | * Get the number of bits used by a partial word. | |
13581 | * @param {Number} x The partial word. | |
13582 | * @return {Number} The number of bits used by the partial word. | |
13583 | */ | |
13584 | getPartial: function (x) { | |
13585 | return Math.round(x/0x10000000000) || 32; | |
13586 | }, | |
13587 | ||
13588 | /** | |
13589 | * Compare two arrays for equality in a predictable amount of time. | |
13590 | * @param {bitArray} a The first array. | |
13591 | * @param {bitArray} b The second array. | |
13592 | * @return {boolean} true if a == b; false otherwise. | |
13593 | */ | |
13594 | equal: function (a, b) { | |
13595 | if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) { | |
13596 | return false; | |
ebd8d4e8 | 13597 | } |
80c4dd2a IC |
13598 | var x = 0, i; |
13599 | for (i=0; i<a.length; i++) { | |
13600 | x |= a[i]^b[i]; | |
ebd8d4e8 | 13601 | } |
80c4dd2a IC |
13602 | return (x === 0); |
13603 | }, | |
13604 | ||
13605 | /** Shift an array right. | |
13606 | * @param {bitArray} a The array to shift. | |
13607 | * @param {Number} shift The number of bits to shift. | |
13608 | * @param {Number} [carry=0] A byte to carry in | |
13609 | * @param {bitArray} [out=[]] An array to prepend to the output. | |
13610 | * @private | |
13611 | */ | |
13612 | _shiftRight: function (a, shift, carry, out) { | |
13613 | var i, last2=0, shift2; | |
13614 | if (out === undefined) { out = []; } | |
13615 | ||
13616 | for (; shift >= 32; shift -= 32) { | |
13617 | out.push(carry); | |
13618 | carry = 0; | |
13619 | } | |
13620 | if (shift === 0) { | |
13621 | return out.concat(a); | |
13622 | } | |
13623 | ||
13624 | for (i=0; i<a.length; i++) { | |
13625 | out.push(carry | a[i]>>>shift); | |
13626 | carry = a[i] << (32-shift); | |
13627 | } | |
13628 | last2 = a.length ? a[a.length-1] : 0; | |
13629 | shift2 = sjcl.bitArray.getPartial(last2); | |
13630 | out.push(sjcl.bitArray.partial(shift+shift2 & 31, (shift + shift2 > 32) ? carry : out.pop(),1)); | |
13631 | return out; | |
13632 | }, | |
13633 | ||
13634 | /** xor a block of 4 words together. | |
13635 | * @private | |
13636 | */ | |
13637 | _xor4: function(x,y) { | |
13638 | return [x[0]^y[0],x[1]^y[1],x[2]^y[2],x[3]^y[3]]; | |
13639 | }, | |
13640 | ||
13641 | /** byteswap a word array inplace. | |
13642 | * (does not handle partial words) | |
13643 | * @param {sjcl.bitArray} a word array | |
13644 | * @return {sjcl.bitArray} byteswapped array | |
13645 | */ | |
13646 | byteswapM: function(a) { | |
13647 | var i, v, m = 0xff00; | |
13648 | for (i = 0; i < a.length; ++i) { | |
13649 | v = a[i]; | |
13650 | a[i] = (v >>> 24) | ((v >>> 8) & m) | ((v & m) << 8) | (v << 24); | |
ebd8d4e8 | 13651 | } |
80c4dd2a IC |
13652 | return a; |
13653 | } | |
13654 | }; | |
13655 | ||
13656 | ||
13657 | //// codecString.js | |
13658 | ||
13659 | /** @fileOverview Bit array codec implementations. | |
13660 | * | |
13661 | * @author Emily Stark | |
13662 | * @author Mike Hamburg | |
13663 | * @author Dan Boneh | |
13664 | */ | |
13665 | ||
13666 | /** @namespace UTF-8 strings */ | |
13667 | sjcl.codec.utf8String = { | |
13668 | /** Convert from a bitArray to a UTF-8 string. */ | |
13669 | fromBits: function (arr) { | |
13670 | var out = "", bl = sjcl.bitArray.bitLength(arr), i, tmp; | |
13671 | for (i=0; i<bl/8; i++) { | |
13672 | if ((i&3) === 0) { | |
13673 | tmp = arr[i/4]; | |
13674 | } | |
13675 | out += String.fromCharCode(tmp >>> 24); | |
13676 | tmp <<= 8; | |
ebd8d4e8 | 13677 | } |
80c4dd2a IC |
13678 | return decodeURIComponent(escape(out)); |
13679 | }, | |
13680 | ||
13681 | /** Convert from a UTF-8 string to a bitArray. */ | |
13682 | toBits: function (str) { | |
13683 | str = unescape(encodeURIComponent(str)); | |
13684 | var out = [], i, tmp=0; | |
13685 | for (i=0; i<str.length; i++) { | |
13686 | tmp = tmp << 8 | str.charCodeAt(i); | |
13687 | if ((i&3) === 3) { | |
13688 | out.push(tmp); | |
13689 | tmp = 0; | |
13690 | } | |
ebd8d4e8 | 13691 | } |
80c4dd2a IC |
13692 | if (i&3) { |
13693 | out.push(sjcl.bitArray.partial(8*(i&3), tmp)); | |
ebd8d4e8 | 13694 | } |
80c4dd2a IC |
13695 | return out; |
13696 | } | |
13697 | }; | |
13698 | ||
13699 | ||
13700 | //// codecHex.js | |
13701 | ||
13702 | /** @fileOverview Bit array codec implementations. | |
13703 | * | |
13704 | * @author Emily Stark | |
13705 | * @author Mike Hamburg | |
13706 | * @author Dan Boneh | |
13707 | */ | |
13708 | ||
13709 | /** @namespace Hexadecimal */ | |
13710 | sjcl.codec.hex = { | |
13711 | /** Convert from a bitArray to a hex string. */ | |
13712 | fromBits: function (arr) { | |
13713 | var out = "", i; | |
13714 | for (i=0; i<arr.length; i++) { | |
13715 | out += ((arr[i]|0)+0xF00000000000).toString(16).substr(4); | |
ebd8d4e8 | 13716 | } |
80c4dd2a IC |
13717 | return out.substr(0, sjcl.bitArray.bitLength(arr)/4);//.replace(/(.{8})/g, "$1 "); |
13718 | }, | |
13719 | /** Convert from a hex string to a bitArray. */ | |
13720 | toBits: function (str) { | |
13721 | var i, out=[], len; | |
13722 | str = str.replace(/\s|0x/g, ""); | |
13723 | len = str.length; | |
13724 | str = str + "00000000"; | |
13725 | for (i=0; i<str.length; i+=8) { | |
13726 | out.push(parseInt(str.substr(i,8),16)^0); | |
ebd8d4e8 | 13727 | } |
80c4dd2a IC |
13728 | return sjcl.bitArray.clamp(out, len*4); |
13729 | } | |
13730 | }; | |
13731 | ||
13732 | ||
13733 | //// sha512.js | |
13734 | ||
13735 | /** @fileOverview Javascript SHA-512 implementation. | |
13736 | * | |
13737 | * This implementation was written for CryptoJS by Jeff Mott and adapted for | |
13738 | * SJCL by Stefan Thomas. | |
13739 | * | |
13740 | * CryptoJS (c) 2009–2012 by Jeff Mott. All rights reserved. | |
13741 | * Released with New BSD License | |
13742 | * | |
13743 | * @author Emily Stark | |
13744 | * @author Mike Hamburg | |
13745 | * @author Dan Boneh | |
13746 | * @author Jeff Mott | |
13747 | * @author Stefan Thomas | |
13748 | */ | |
13749 | ||
13750 | /** | |
13751 | * Context for a SHA-512 operation in progress. | |
13752 | * @constructor | |
13753 | * @class Secure Hash Algorithm, 512 bits. | |
13754 | */ | |
13755 | sjcl.hash.sha512 = function (hash) { | |
13756 | if (!this._key[0]) { this._precompute(); } | |
13757 | if (hash) { | |
13758 | this._h = hash._h.slice(0); | |
13759 | this._buffer = hash._buffer.slice(0); | |
13760 | this._length = hash._length; | |
13761 | } else { | |
13762 | this.reset(); | |
13763 | } | |
13764 | }; | |
13765 | ||
13766 | /** | |
13767 | * Hash a string or an array of words. | |
13768 | * @static | |
13769 | * @param {bitArray|String} data the data to hash. | |
13770 | * @return {bitArray} The hash value, an array of 16 big-endian words. | |
13771 | */ | |
13772 | sjcl.hash.sha512.hash = function (data) { | |
13773 | return (new sjcl.hash.sha512()).update(data).finalize(); | |
13774 | }; | |
13775 | ||
13776 | sjcl.hash.sha512.prototype = { | |
13777 | /** | |
13778 | * The hash's block size, in bits. | |
13779 | * @constant | |
13780 | */ | |
13781 | blockSize: 1024, | |
13782 | ||
13783 | /** | |
13784 | * Reset the hash state. | |
13785 | * @return this | |
13786 | */ | |
13787 | reset:function () { | |
13788 | this._h = this._init.slice(0); | |
13789 | this._buffer = []; | |
13790 | this._length = 0; | |
13791 | return this; | |
13792 | }, | |
13793 | ||
13794 | /** | |
13795 | * Input several words to the hash. | |
13796 | * @param {bitArray|String} data the data to hash. | |
13797 | * @return this | |
13798 | */ | |
13799 | update: function (data) { | |
13800 | if (typeof data === "string") { | |
13801 | data = sjcl.codec.utf8String.toBits(data); | |
ebd8d4e8 | 13802 | } |
80c4dd2a IC |
13803 | var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), |
13804 | ol = this._length, | |
13805 | nl = this._length = ol + sjcl.bitArray.bitLength(data); | |
13806 | for (i = 1024+ol & -1024; i <= nl; i+= 1024) { | |
13807 | this._block(b.splice(0,32)); | |
ebd8d4e8 | 13808 | } |
80c4dd2a IC |
13809 | return this; |
13810 | }, | |
13811 | ||
13812 | /** | |
13813 | * Complete hashing and output the hash value. | |
13814 | * @return {bitArray} The hash value, an array of 16 big-endian words. | |
13815 | */ | |
13816 | finalize:function () { | |
13817 | var i, b = this._buffer, h = this._h; | |
13818 | ||
13819 | // Round out and push the buffer | |
13820 | b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); | |
13821 | ||
13822 | // Round out the buffer to a multiple of 32 words, less the 4 length words. | |
13823 | for (i = b.length + 4; i & 31; i++) { | |
13824 | b.push(0); | |
ebd8d4e8 | 13825 | } |
80c4dd2a IC |
13826 | |
13827 | // append the length | |
13828 | b.push(0); | |
13829 | b.push(0); | |
13830 | b.push(Math.floor(this._length / 0x100000000)); | |
13831 | b.push(this._length | 0); | |
13832 | ||
13833 | while (b.length) { | |
13834 | this._block(b.splice(0,32)); | |
ebd8d4e8 | 13835 | } |
80c4dd2a IC |
13836 | |
13837 | this.reset(); | |
13838 | return h; | |
13839 | }, | |
13840 | ||
13841 | /** | |
13842 | * The SHA-512 initialization vector, to be precomputed. | |
13843 | * @private | |
13844 | */ | |
13845 | _init:[], | |
13846 | ||
13847 | /** | |
13848 | * Least significant 24 bits of SHA512 initialization values. | |
13849 | * | |
13850 | * Javascript only has 53 bits of precision, so we compute the 40 most | |
13851 | * significant bits and add the remaining 24 bits as constants. | |
13852 | * | |
13853 | * @private | |
13854 | */ | |
13855 | _initr: [ 0xbcc908, 0xcaa73b, 0x94f82b, 0x1d36f1, 0xe682d1, 0x3e6c1f, 0x41bd6b, 0x7e2179 ], | |
13856 | ||
13857 | /* | |
13858 | _init: | |
13859 | [0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1, | |
13860 | 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179], | |
13861 | */ | |
13862 | ||
13863 | /** | |
13864 | * The SHA-512 hash key, to be precomputed. | |
13865 | * @private | |
13866 | */ | |
13867 | _key:[], | |
13868 | ||
13869 | /** | |
13870 | * Least significant 24 bits of SHA512 key values. | |
13871 | * @private | |
13872 | */ | |
13873 | _keyr: | |
13874 | [0x28ae22, 0xef65cd, 0x4d3b2f, 0x89dbbc, 0x48b538, 0x05d019, 0x194f9b, 0x6d8118, | |
13875 | 0x030242, 0x706fbe, 0xe4b28c, 0xffb4e2, 0x7b896f, 0x1696b1, 0xc71235, 0x692694, | |
13876 | 0xf14ad2, 0x4f25e3, 0x8cd5b5, 0xac9c65, 0x2b0275, 0xa6e483, 0x41fbd4, 0x1153b5, | |
13877 | 0x66dfab, 0xb43210, 0xfb213f, 0xef0ee4, 0xa88fc2, 0x0aa725, 0x03826f, 0x0e6e70, | |
13878 | 0xd22ffc, 0x26c926, 0xc42aed, 0x95b3df, 0xaf63de, 0x77b2a8, 0xedaee6, 0x82353b, | |
13879 | 0xf10364, 0x423001, 0xf89791, 0x54be30, 0xef5218, 0x65a910, 0x71202a, 0xbbd1b8, | |
13880 | 0xd2d0c8, 0x41ab53, 0x8eeb99, 0x9b48a8, 0xc95a63, 0x418acb, 0x63e373, 0xb2b8a3, | |
13881 | 0xefb2fc, 0x172f60, 0xf0ab72, 0x6439ec, 0x631e28, 0x82bde9, 0xc67915, 0x72532b, | |
13882 | 0x26619c, 0xc0c207, 0xe0eb1e, 0x6ed178, 0x176fba, 0xc898a6, 0xf90dae, 0x1c471b, | |
13883 | 0x047d84, 0xc72493, 0xc9bebc, 0x100d4c, 0x3e42b6, 0x657e2a, 0xd6faec, 0x475817], | |
13884 | ||
13885 | /* | |
13886 | _key: | |
13887 | [0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, | |
13888 | 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, | |
13889 | 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, | |
13890 | 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, | |
13891 | 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, | |
13892 | 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, | |
13893 | 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, | |
13894 | 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, | |
13895 | 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, | |
13896 | 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, | |
13897 | 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, | |
13898 | 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, | |
13899 | 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, | |
13900 | 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, | |
13901 | 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, | |
13902 | 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, | |
13903 | 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, | |
13904 | 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, | |
13905 | 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, | |
13906 | 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817], | |
13907 | */ | |
13908 | ||
13909 | /** | |
13910 | * Function to precompute _init and _key. | |
13911 | * @private | |
13912 | */ | |
13913 | _precompute: function () { | |
13914 | // XXX: This code is for precomputing the SHA256 constants, change for | |
13915 | // SHA512 and re-enable. | |
13916 | var i = 0, prime = 2, factor; | |
13917 | ||
13918 | function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } | |
13919 | function frac2(x) { return (x-Math.floor(x)) * 0x10000000000 & 0xff; } | |
13920 | ||
13921 | outer: for (; i<80; prime++) { | |
13922 | for (factor=2; factor*factor <= prime; factor++) { | |
13923 | if (prime % factor === 0) { | |
13924 | // not a prime | |
13925 | continue outer; | |
ebd8d4e8 | 13926 | } |
80c4dd2a IC |
13927 | } |
13928 | ||
13929 | if (i<8) { | |
13930 | this._init[i*2] = frac(Math.pow(prime, 1/2)); | |
13931 | this._init[i*2+1] = (frac2(Math.pow(prime, 1/2)) << 24) | this._initr[i]; | |
13932 | } | |
13933 | this._key[i*2] = frac(Math.pow(prime, 1/3)); | |
13934 | this._key[i*2+1] = (frac2(Math.pow(prime, 1/3)) << 24) | this._keyr[i]; | |
13935 | i++; | |
ebd8d4e8 | 13936 | } |
80c4dd2a IC |
13937 | }, |
13938 | ||
13939 | /** | |
13940 | * Perform one cycle of SHA-512. | |
13941 | * @param {bitArray} words one block of words. | |
13942 | * @private | |
13943 | */ | |
13944 | _block:function (words) { | |
13945 | var i, wrh, wrl, | |
13946 | w = words.slice(0), | |
13947 | h = this._h, | |
13948 | k = this._key, | |
13949 | h0h = h[ 0], h0l = h[ 1], h1h = h[ 2], h1l = h[ 3], | |
13950 | h2h = h[ 4], h2l = h[ 5], h3h = h[ 6], h3l = h[ 7], | |
13951 | h4h = h[ 8], h4l = h[ 9], h5h = h[10], h5l = h[11], | |
13952 | h6h = h[12], h6l = h[13], h7h = h[14], h7l = h[15]; | |
13953 | ||
13954 | // Working variables | |
13955 | var ah = h0h, al = h0l, bh = h1h, bl = h1l, | |
13956 | ch = h2h, cl = h2l, dh = h3h, dl = h3l, | |
13957 | eh = h4h, el = h4l, fh = h5h, fl = h5l, | |
13958 | gh = h6h, gl = h6l, hh = h7h, hl = h7l; | |
13959 | ||
13960 | for (i=0; i<80; i++) { | |
13961 | // load up the input word for this round | |
13962 | if (i<16) { | |
13963 | wrh = w[i * 2]; | |
13964 | wrl = w[i * 2 + 1]; | |
13965 | } else { | |
13966 | // Gamma0 | |
13967 | var gamma0xh = w[(i-15) * 2]; | |
13968 | var gamma0xl = w[(i-15) * 2 + 1]; | |
13969 | var gamma0h = | |
13970 | ((gamma0xl << 31) | (gamma0xh >>> 1)) ^ | |
13971 | ((gamma0xl << 24) | (gamma0xh >>> 8)) ^ | |
13972 | (gamma0xh >>> 7); | |
13973 | var gamma0l = | |
13974 | ((gamma0xh << 31) | (gamma0xl >>> 1)) ^ | |
13975 | ((gamma0xh << 24) | (gamma0xl >>> 8)) ^ | |
13976 | ((gamma0xh << 25) | (gamma0xl >>> 7)); | |
13977 | ||
13978 | // Gamma1 | |
13979 | var gamma1xh = w[(i-2) * 2]; | |
13980 | var gamma1xl = w[(i-2) * 2 + 1]; | |
13981 | var gamma1h = | |
13982 | ((gamma1xl << 13) | (gamma1xh >>> 19)) ^ | |
13983 | ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ | |
13984 | (gamma1xh >>> 6); | |
13985 | var gamma1l = | |
13986 | ((gamma1xh << 13) | (gamma1xl >>> 19)) ^ | |
13987 | ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ | |
13988 | ((gamma1xh << 26) | (gamma1xl >>> 6)); | |
13989 | ||
13990 | // Shortcuts | |
13991 | var wr7h = w[(i-7) * 2]; | |
13992 | var wr7l = w[(i-7) * 2 + 1]; | |
13993 | ||
13994 | var wr16h = w[(i-16) * 2]; | |
13995 | var wr16l = w[(i-16) * 2 + 1]; | |
13996 | ||
13997 | // W(round) = gamma0 + W(round - 7) + gamma1 + W(round - 16) | |
13998 | wrl = gamma0l + wr7l; | |
13999 | wrh = gamma0h + wr7h + ((wrl >>> 0) < (gamma0l >>> 0) ? 1 : 0); | |
14000 | wrl += gamma1l; | |
14001 | wrh += gamma1h + ((wrl >>> 0) < (gamma1l >>> 0) ? 1 : 0); | |
14002 | wrl += wr16l; | |
14003 | wrh += wr16h + ((wrl >>> 0) < (wr16l >>> 0) ? 1 : 0); | |
14004 | } | |
14005 | ||
14006 | w[i*2] = wrh |= 0; | |
14007 | w[i*2 + 1] = wrl |= 0; | |
14008 | ||
14009 | // Ch | |
14010 | var chh = (eh & fh) ^ (~eh & gh); | |
14011 | var chl = (el & fl) ^ (~el & gl); | |
14012 | ||
14013 | // Maj | |
14014 | var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); | |
14015 | var majl = (al & bl) ^ (al & cl) ^ (bl & cl); | |
14016 | ||
14017 | // Sigma0 | |
14018 | var sigma0h = ((al << 4) | (ah >>> 28)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); | |
14019 | var sigma0l = ((ah << 4) | (al >>> 28)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); | |
14020 | ||
14021 | // Sigma1 | |
14022 | var sigma1h = ((el << 18) | (eh >>> 14)) ^ ((el << 14) | (eh >>> 18)) ^ ((eh << 23) | (el >>> 9)); | |
14023 | var sigma1l = ((eh << 18) | (el >>> 14)) ^ ((eh << 14) | (el >>> 18)) ^ ((el << 23) | (eh >>> 9)); | |
14024 | ||
14025 | // K(round) | |
14026 | var krh = k[i*2]; | |
14027 | var krl = k[i*2+1]; | |
14028 | ||
14029 | // t1 = h + sigma1 + ch + K(round) + W(round) | |
14030 | var t1l = hl + sigma1l; | |
14031 | var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); | |
14032 | t1l += chl; | |
14033 | t1h += chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); | |
14034 | t1l += krl; | |
14035 | t1h += krh + ((t1l >>> 0) < (krl >>> 0) ? 1 : 0); | |
14036 | t1l = t1l + wrl|0; // FF32..FF34 perf issue https://bugzilla.mozilla.org/show_bug.cgi?id=1054972 | |
14037 | t1h += wrh + ((t1l >>> 0) < (wrl >>> 0) ? 1 : 0); | |
14038 | ||
14039 | // t2 = sigma0 + maj | |
14040 | var t2l = sigma0l + majl; | |
14041 | var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); | |
14042 | ||
14043 | // Update working variables | |
14044 | hh = gh; | |
14045 | hl = gl; | |
14046 | gh = fh; | |
14047 | gl = fl; | |
14048 | fh = eh; | |
14049 | fl = el; | |
14050 | el = (dl + t1l) | 0; | |
14051 | eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; | |
14052 | dh = ch; | |
14053 | dl = cl; | |
14054 | ch = bh; | |
14055 | cl = bl; | |
14056 | bh = ah; | |
14057 | bl = al; | |
14058 | al = (t1l + t2l) | 0; | |
14059 | ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; | |
14060 | } | |
14061 | ||
14062 | // Intermediate hash | |
14063 | h0l = h[1] = (h0l + al) | 0; | |
14064 | h[0] = (h0h + ah + ((h0l >>> 0) < (al >>> 0) ? 1 : 0)) | 0; | |
14065 | h1l = h[3] = (h1l + bl) | 0; | |
14066 | h[2] = (h1h + bh + ((h1l >>> 0) < (bl >>> 0) ? 1 : 0)) | 0; | |
14067 | h2l = h[5] = (h2l + cl) | 0; | |
14068 | h[4] = (h2h + ch + ((h2l >>> 0) < (cl >>> 0) ? 1 : 0)) | 0; | |
14069 | h3l = h[7] = (h3l + dl) | 0; | |
14070 | h[6] = (h3h + dh + ((h3l >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; | |
14071 | h4l = h[9] = (h4l + el) | 0; | |
14072 | h[8] = (h4h + eh + ((h4l >>> 0) < (el >>> 0) ? 1 : 0)) | 0; | |
14073 | h5l = h[11] = (h5l + fl) | 0; | |
14074 | h[10] = (h5h + fh + ((h5l >>> 0) < (fl >>> 0) ? 1 : 0)) | 0; | |
14075 | h6l = h[13] = (h6l + gl) | 0; | |
14076 | h[12] = (h6h + gh + ((h6l >>> 0) < (gl >>> 0) ? 1 : 0)) | 0; | |
14077 | h7l = h[15] = (h7l + hl) | 0; | |
14078 | h[14] = (h7h + hh + ((h7l >>> 0) < (hl >>> 0) ? 1 : 0)) | 0; | |
14079 | } | |
14080 | }; | |
14081 | ||
14082 | ||
14083 | //// hmac.js | |
14084 | ||
14085 | /** @fileOverview HMAC implementation. | |
14086 | * | |
14087 | * @author Emily Stark | |
14088 | * @author Mike Hamburg | |
14089 | * @author Dan Boneh | |
14090 | */ | |
14091 | ||
14092 | /** HMAC with the specified hash function. | |
14093 | * @constructor | |
14094 | * @param {bitArray} key the key for HMAC. | |
14095 | * @param {Object} [hash=sjcl.hash.sha256] The hash function to use. | |
14096 | */ | |
14097 | sjcl.misc.hmac = function (key, Hash) { | |
14098 | this._hash = Hash = Hash || sjcl.hash.sha256; | |
14099 | var exKey = [[],[]], i, | |
14100 | bs = Hash.prototype.blockSize / 32; | |
14101 | this._baseHash = [new Hash(), new Hash()]; | |
14102 | ||
14103 | if (key.length > bs) { | |
14104 | key = Hash.hash(key); | |
14105 | } | |
14106 | ||
14107 | for (i=0; i<bs; i++) { | |
14108 | exKey[0][i] = key[i]^0x36363636; | |
14109 | exKey[1][i] = key[i]^0x5C5C5C5C; | |
14110 | } | |
14111 | ||
14112 | this._baseHash[0].update(exKey[0]); | |
14113 | this._baseHash[1].update(exKey[1]); | |
14114 | this._resultHash = new Hash(this._baseHash[0]); | |
14115 | }; | |
14116 | ||
14117 | /** HMAC with the specified hash function. Also called encrypt since it's a prf. | |
14118 | * @param {bitArray|String} data The data to mac. | |
14119 | */ | |
14120 | sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (data) { | |
14121 | if (!this._updated) { | |
14122 | this.update(data); | |
14123 | return this.digest(data); | |
14124 | } else { | |
14125 | throw new sjcl.exception.invalid("encrypt on already updated hmac called!"); | |
14126 | } | |
14127 | }; | |
14128 | ||
14129 | sjcl.misc.hmac.prototype.reset = function () { | |
14130 | this._resultHash = new this._hash(this._baseHash[0]); | |
14131 | this._updated = false; | |
14132 | }; | |
14133 | ||
14134 | sjcl.misc.hmac.prototype.update = function (data) { | |
14135 | this._updated = true; | |
14136 | this._resultHash.update(data); | |
14137 | }; | |
14138 | ||
14139 | sjcl.misc.hmac.prototype.digest = function () { | |
14140 | var w = this._resultHash.finalize(), result = new (this._hash)(this._baseHash[1]).update(w).finalize(); | |
14141 | ||
14142 | this.reset(); | |
14143 | ||
14144 | return result; | |
14145 | }; | |
14146 | ||
14147 | ||
14148 | //// pbkdf2.js | |
14149 | ||
14150 | ||
14151 | /** @fileOverview Password-based key-derivation function, version 2.0. | |
14152 | * | |
14153 | * @author Emily Stark | |
14154 | * @author Mike Hamburg | |
14155 | * @author Dan Boneh | |
14156 | */ | |
14157 | ||
14158 | /** Password-Based Key-Derivation Function, version 2.0. | |
14159 | * | |
14160 | * Generate keys from passwords using PBKDF2-HMAC-SHA256. | |
14161 | * | |
14162 | * This is the method specified by RSA's PKCS #5 standard. | |
14163 | * | |
14164 | * @param {bitArray|String} password The password. | |
14165 | * @param {bitArray|String} salt The salt. Should have lots of entropy. | |
14166 | * @param {Number} [count=1000] The number of iterations. Higher numbers make the function slower but more secure. | |
14167 | * @param {Number} [length] The length of the derived key. Defaults to the | |
14168 | output size of the hash function. | |
14169 | * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family. | |
14170 | * @return {bitArray} the derived key. | |
14171 | */ | |
14172 | sjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) { | |
14173 | count = count || 1000; | |
14174 | ||
14175 | if (length < 0 || count < 0) { | |
14176 | throw sjcl.exception.invalid("invalid params to pbkdf2"); | |
14177 | } | |
14178 | ||
14179 | if (typeof password === "string") { | |
14180 | password = sjcl.codec.utf8String.toBits(password); | |
14181 | } | |
14182 | ||
14183 | if (typeof salt === "string") { | |
14184 | salt = sjcl.codec.utf8String.toBits(salt); | |
14185 | } | |
14186 | ||
14187 | Prff = Prff || sjcl.misc.hmac; | |
14188 | ||
14189 | var prf = new Prff(password), | |
14190 | u, ui, i, j, k, out = [], b = sjcl.bitArray; | |
14191 | ||
14192 | for (k = 1; 32 * out.length < (length || 1); k++) { | |
14193 | u = ui = prf.encrypt(b.concat(salt,[k])); | |
14194 | ||
14195 | for (i=1; i<count; i++) { | |
14196 | ui = prf.encrypt(ui); | |
14197 | for (j=0; j<ui.length; j++) { | |
14198 | u[j] ^= ui[j]; | |
14199 | } | |
ebd8d4e8 | 14200 | } |
80c4dd2a IC |
14201 | |
14202 | out = out.concat(u); | |
14203 | } | |
14204 | ||
14205 | if (length) { out = b.clamp(out, length); } | |
14206 | ||
14207 | return out; | |
14208 | }; | |
14209 | ||
14210 | ||
14211 | //// sha256.js | |
14212 | ||
14213 | /** @fileOverview Javascript SHA-256 implementation. | |
14214 | * | |
14215 | * An older version of this implementation is available in the public | |
14216 | * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh, | |
14217 | * Stanford University 2008-2010 and BSD-licensed for liability | |
14218 | * reasons. | |
14219 | * | |
14220 | * Special thanks to Aldo Cortesi for pointing out several bugs in | |
14221 | * this code. | |
14222 | * | |
14223 | * @author Emily Stark | |
14224 | * @author Mike Hamburg | |
14225 | * @author Dan Boneh | |
14226 | */ | |
14227 | ||
14228 | /** | |
14229 | * Context for a SHA-256 operation in progress. | |
14230 | * @constructor | |
14231 | * @class Secure Hash Algorithm, 256 bits. | |
14232 | */ | |
14233 | sjcl.hash.sha256 = function (hash) { | |
14234 | if (!this._key[0]) { this._precompute(); } | |
14235 | if (hash) { | |
14236 | this._h = hash._h.slice(0); | |
14237 | this._buffer = hash._buffer.slice(0); | |
14238 | this._length = hash._length; | |
14239 | } else { | |
14240 | this.reset(); | |
14241 | } | |
14242 | }; | |
14243 | ||
14244 | /** | |
14245 | * Hash a string or an array of words. | |
14246 | * @static | |
14247 | * @param {bitArray|String} data the data to hash. | |
14248 | * @return {bitArray} The hash value, an array of 16 big-endian words. | |
14249 | */ | |
14250 | sjcl.hash.sha256.hash = function (data) { | |
14251 | return (new sjcl.hash.sha256()).update(data).finalize(); | |
14252 | }; | |
14253 | ||
14254 | sjcl.hash.sha256.prototype = { | |
14255 | /** | |
14256 | * The hash's block size, in bits. | |
14257 | * @constant | |
14258 | */ | |
14259 | blockSize: 512, | |
14260 | ||
14261 | /** | |
14262 | * Reset the hash state. | |
14263 | * @return this | |
14264 | */ | |
14265 | reset:function () { | |
14266 | this._h = this._init.slice(0); | |
14267 | this._buffer = []; | |
14268 | this._length = 0; | |
14269 | return this; | |
14270 | }, | |
14271 | ||
14272 | /** | |
14273 | * Input several words to the hash. | |
14274 | * @param {bitArray|String} data the data to hash. | |
14275 | * @return this | |
14276 | */ | |
14277 | update: function (data) { | |
14278 | if (typeof data === "string") { | |
14279 | data = sjcl.codec.utf8String.toBits(data); | |
14280 | } | |
14281 | var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data), | |
14282 | ol = this._length, | |
14283 | nl = this._length = ol + sjcl.bitArray.bitLength(data); | |
14284 | for (i = 512+ol & -512; i <= nl; i+= 512) { | |
14285 | this._block(b.splice(0,16)); | |
ebd8d4e8 | 14286 | } |
3af2954a | 14287 | return this; |
80c4dd2a IC |
14288 | }, |
14289 | ||
14290 | /** | |
14291 | * Complete hashing and output the hash value. | |
14292 | * @return {bitArray} The hash value, an array of 8 big-endian words. | |
14293 | */ | |
14294 | finalize:function () { | |
14295 | var i, b = this._buffer, h = this._h; | |
14296 | ||
14297 | // Round out and push the buffer | |
14298 | b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(1,1)]); | |
14299 | ||
14300 | // Round out the buffer to a multiple of 16 words, less the 2 length words. | |
14301 | for (i = b.length + 2; i & 15; i++) { | |
14302 | b.push(0); | |
14303 | } | |
14304 | ||
14305 | // append the length | |
14306 | b.push(Math.floor(this._length / 0x100000000)); | |
14307 | b.push(this._length | 0); | |
14308 | ||
14309 | while (b.length) { | |
14310 | this._block(b.splice(0,16)); | |
14311 | } | |
14312 | ||
14313 | this.reset(); | |
14314 | return h; | |
14315 | }, | |
14316 | ||
14317 | /** | |
14318 | * The SHA-256 initialization vector, to be precomputed. | |
14319 | * @private | |
14320 | */ | |
14321 | _init:[], | |
14322 | /* | |
14323 | _init:[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19], | |
14324 | */ | |
14325 | ||
14326 | /** | |
14327 | * The SHA-256 hash key, to be precomputed. | |
14328 | * @private | |
14329 | */ | |
14330 | _key:[], | |
14331 | /* | |
14332 | _key: | |
14333 | [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, | |
14334 | 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, | |
14335 | 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, | |
14336 | 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, | |
14337 | 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, | |
14338 | 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, | |
14339 | 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, | |
14340 | 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2], | |
14341 | */ | |
14342 | ||
14343 | ||
14344 | /** | |
14345 | * Function to precompute _init and _key. | |
14346 | * @private | |
14347 | */ | |
14348 | _precompute: function () { | |
14349 | var i = 0, prime = 2, factor; | |
14350 | ||
14351 | function frac(x) { return (x-Math.floor(x)) * 0x100000000 | 0; } | |
14352 | ||
14353 | outer: for (; i<64; prime++) { | |
14354 | for (factor=2; factor*factor <= prime; factor++) { | |
14355 | if (prime % factor === 0) { | |
14356 | // not a prime | |
14357 | continue outer; | |
ebd8d4e8 | 14358 | } |
80c4dd2a IC |
14359 | } |
14360 | ||
14361 | if (i<8) { | |
14362 | this._init[i] = frac(Math.pow(prime, 1/2)); | |
14363 | } | |
14364 | this._key[i] = frac(Math.pow(prime, 1/3)); | |
14365 | i++; | |
ebd8d4e8 | 14366 | } |
80c4dd2a IC |
14367 | }, |
14368 | ||
14369 | /** | |
14370 | * Perform one cycle of SHA-256. | |
14371 | * @param {bitArray} words one block of words. | |
14372 | * @private | |
14373 | */ | |
14374 | _block:function (words) { | |
14375 | var i, tmp, a, b, | |
14376 | w = words.slice(0), | |
14377 | h = this._h, | |
14378 | k = this._key, | |
14379 | h0 = h[0], h1 = h[1], h2 = h[2], h3 = h[3], | |
14380 | h4 = h[4], h5 = h[5], h6 = h[6], h7 = h[7]; | |
14381 | ||
14382 | /* Rationale for placement of |0 : | |
14383 | * If a value can overflow is original 32 bits by a factor of more than a few | |
14384 | * million (2^23 ish), there is a possibility that it might overflow the | |
14385 | * 53-bit mantissa and lose precision. | |
14386 | * | |
14387 | * To avoid this, we clamp back to 32 bits by |'ing with 0 on any value that | |
14388 | * propagates around the loop, and on the hash state h[]. I don't believe | |
14389 | * that the clamps on h4 and on h0 are strictly necessary, but it's close | |
14390 | * (for h4 anyway), and better safe than sorry. | |
14391 | * | |
14392 | * The clamps on h[] are necessary for the output to be correct even in the | |
14393 | * common case and for short inputs. | |
14394 | */ | |
14395 | for (i=0; i<64; i++) { | |
14396 | // load up the input word for this round | |
14397 | if (i<16) { | |
14398 | tmp = w[i]; | |
14399 | } else { | |
14400 | a = w[(i+1 ) & 15]; | |
14401 | b = w[(i+14) & 15]; | |
14402 | tmp = w[i&15] = ((a>>>7 ^ a>>>18 ^ a>>>3 ^ a<<25 ^ a<<14) + | |
14403 | (b>>>17 ^ b>>>19 ^ b>>>10 ^ b<<15 ^ b<<13) + | |
14404 | w[i&15] + w[(i+9) & 15]) | 0; | |
14405 | } | |
14406 | ||
14407 | tmp = (tmp + h7 + (h4>>>6 ^ h4>>>11 ^ h4>>>25 ^ h4<<26 ^ h4<<21 ^ h4<<7) + (h6 ^ h4&(h5^h6)) + k[i]); // | 0; | |
14408 | ||
14409 | // shift register | |
14410 | h7 = h6; h6 = h5; h5 = h4; | |
14411 | h4 = h3 + tmp | 0; | |
14412 | h3 = h2; h2 = h1; h1 = h0; | |
14413 | ||
14414 | h0 = (tmp + ((h1&h2) ^ (h3&(h1^h2))) + (h1>>>2 ^ h1>>>13 ^ h1>>>22 ^ h1<<30 ^ h1<<19 ^ h1<<10)) | 0; | |
14415 | } | |
14416 | ||
14417 | h[0] = h[0]+h0 | 0; | |
14418 | h[1] = h[1]+h1 | 0; | |
14419 | h[2] = h[2]+h2 | 0; | |
14420 | h[3] = h[3]+h3 | 0; | |
14421 | h[4] = h[4]+h4 | 0; | |
14422 | h[5] = h[5]+h5 | 0; | |
14423 | h[6] = h[6]+h6 | 0; | |
14424 | h[7] = h[7]+h7 | 0; | |
14425 | } | |
14426 | }; | |
dc55c6b0 | 14427 | </script> |
ab78acc6 | 14428 | <script>WORDLISTS = typeof WORDLISTS == "undefined" ? {} : WORDLISTS; |
3af2954a | 14429 | WORDLISTS["english"] = [ |
ebd8d4e8 IC |
14430 | "abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse", |
14431 | "access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act", | |
14432 | "action","actor","actress","actual","adapt","add","addict","address","adjust","admit", | |
14433 | "adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent", | |
14434 | "agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert", | |
14435 | "alien","all","alley","allow","almost","alone","alpha","already","also","alter", | |
14436 | "always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger", | |
14437 | "angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique", | |
14438 | "anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic", | |
14439 | "area","arena","argue","arm","armed","armor","army","around","arrange","arrest", | |
14440 | "arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset", | |
14441 | "assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction", | |
14442 | "audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake", | |
14443 | "aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge", | |
14444 | "bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain", | |
14445 | "barrel","base","basic","basket","battle","beach","bean","beauty","because","become", | |
14446 | "beef","before","begin","behave","behind","believe","below","belt","bench","benefit", | |
14447 | "best","betray","better","between","beyond","bicycle","bid","bike","bind","biology", | |
14448 | "bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless", | |
14449 | "blind","blood","blossom","blouse","blue","blur","blush","board","boat","body", | |
14450 | "boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss", | |
14451 | "bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread", | |
14452 | "breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze", | |
14453 | "broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb", | |
14454 | "bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy", | |
14455 | "butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call", | |
14456 | "calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas", | |
14457 | "canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry", | |
14458 | "cart","case","cash","casino","castle","casual","cat","catalog","catch","category", | |
14459 | "cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century", | |
14460 | "cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase", | |
14461 | "chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child", | |
14462 | "chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle", | |
14463 | "citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk", | |
14464 | "clever","click","client","cliff","climb","clinic","clip","clock","clog","close", | |
14465 | "cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut", | |
14466 | "code","coffee","coil","coin","collect","color","column","combine","come","comfort", | |
14467 | "comic","common","company","concert","conduct","confirm","congress","connect","consider","control", | |
14468 | "convince","cook","cool","copper","copy","coral","core","corn","correct","cost", | |
14469 | "cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle", | |
14470 | "craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek", | |
14471 | "crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial", | |
14472 | "cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup", | |
14473 | "cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad", | |
14474 | "damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal", | |
14475 | "debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense", | |
14476 | "define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny", | |
14477 | "depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk", | |
14478 | "despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond", | |
14479 | "diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur", | |
14480 | "direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance", | |
14481 | "divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain", | |
14482 | "donate","donkey","donor","door","dose","double","dove","draft","dragon","drama", | |
14483 | "drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop", | |
14484 | "drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf", | |
14485 | "dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo", | |
14486 | "ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow", | |
14487 | "elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody", | |
14488 | "embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless", | |
14489 | "endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough", | |
14490 | "enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip", | |
14491 | "era","erase","erode","erosion","error","erupt","escape","essay","essence","estate", | |
14492 | "eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange", | |
14493 | "excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit", | |
14494 | "exotic","expand","expect","expire","explain","expose","express","extend","extra","eye", | |
14495 | "eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame", | |
14496 | "family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father", | |
14497 | "fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female", | |
14498 | "fence","festival","fetch","fever","few","fiber","fiction","field","figure","file", | |
14499 | "film","filter","final","find","fine","finger","finish","fire","firm","first", | |
14500 | "fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor", | |
14501 | "flee","flight","flip","float","flock","floor","flower","fluid","flush","fly", | |
14502 | "foam","focus","fog","foil","fold","follow","food","foot","force","forest", | |
14503 | "forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile", | |
14504 | "frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen", | |
14505 | "fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy", | |
14506 | "gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp", | |
14507 | "gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture", | |
14508 | "ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance", | |
14509 | "glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue", | |
14510 | "goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown", | |
14511 | "grab","grace","grain","grant","grape","grass","gravity","great","green","grid", | |
14512 | "grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt", | |
14513 | "guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy", | |
14514 | "harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health", | |
14515 | "heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden", | |
14516 | "high","hill","hint","hip","hire","history","hobby","hockey","hold","hole", | |
14517 | "holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital", | |
14518 | "host","hotel","hour","hover","hub","huge","human","humble","humor","hundred", | |
14519 | "hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea", | |
14520 | "identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune", | |
14521 | "impact","impose","improve","impulse","inch","include","income","increase","index","indicate", | |
14522 | "indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury", | |
14523 | "inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install", | |
14524 | "intact","interest","into","invest","invite","involve","iron","island","isolate","issue", | |
14525 | "item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel", | |
14526 | "job","join","joke","journey","joy","judge","juice","jump","jungle","junior", | |
14527 | "junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney", | |
14528 | "kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife", | |
14529 | "knock","know","lab","label","labor","ladder","lady","lake","lamp","language", | |
14530 | "laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit", | |
14531 | "layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal", | |
14532 | "legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level", | |
14533 | "liar","liberty","library","license","life","lift","light","like","limb","limit", | |
14534 | "link","lion","liquid","list","little","live","lizard","load","loan","lobster", | |
14535 | "local","lock","logic","lonely","long","loop","lottery","loud","lounge","love", | |
14536 | "loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad", | |
14537 | "magic","magnet","maid","mail","main","major","make","mammal","man","manage", | |
14538 | "mandate","mango","mansion","manual","maple","marble","march","margin","marine","market", | |
14539 | "marriage","mask","mass","master","match","material","math","matrix","matter","maximum", | |
14540 | "maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt", | |
14541 | "member","memory","mention","menu","mercy","merge","merit","merry","mesh","message", | |
14542 | "metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor", | |
14543 | "minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile", | |
14544 | "model","modify","mom","moment","monitor","monkey","monster","month","moon","moral", | |
14545 | "more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie", | |
14546 | "much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual", | |
14547 | "myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature", | |
14548 | "near","neck","need","negative","neglect","neither","nephew","nerve","nest","net", | |
14549 | "network","neutral","never","news","next","nice","night","noble","noise","nominee", | |
14550 | "noodle","normal","north","nose","notable","note","nothing","notice","novel","now", | |
14551 | "nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe", | |
14552 | "obtain","obvious","occur","ocean","october","odor","off","offer","office","often", | |
14553 | "oil","okay","old","olive","olympic","omit","once","one","onion","online", | |
14554 | "only","open","opera","opinion","oppose","option","orange","orbit","orchard","order", | |
14555 | "ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output", | |
14556 | "outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact", | |
14557 | "paddle","page","pair","palace","palm","panda","panel","panic","panther","paper", | |
14558 | "parade","parent","park","parrot","party","pass","patch","path","patient","patrol", | |
14559 | "pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen", | |
14560 | "penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo", | |
14561 | "phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot", | |
14562 | "pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate", | |
14563 | "play","please","pledge","pluck","plug","plunge","poem","poet","point","polar", | |
14564 | "pole","police","pond","pony","pool","popular","portion","position","possible","post", | |
14565 | "potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare", | |
14566 | "present","pretty","prevent","price","pride","primary","print","priority","prison","private", | |
14567 | "prize","problem","process","produce","profit","program","project","promote","proof","property", | |
14568 | "prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin", | |
14569 | "punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle", | |
14570 | "pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit", | |
14571 | "raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp", | |
14572 | "ranch","random","range","rapid","rare","rate","rather","raven","raw","razor", | |
14573 | "ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle", | |
14574 | "reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release", | |
14575 | "relief","rely","remain","remember","remind","remove","render","renew","rent","reopen", | |
14576 | "repair","repeat","replace","report","require","rescue","resemble","resist","resource","response", | |
14577 | "result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib", | |
14578 | "ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot", | |
14579 | "ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket", | |
14580 | "romance","roof","rookie","room","rose","rotate","rough","round","route","royal", | |
14581 | "rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness", | |
14582 | "safe","sail","salad","salmon","salon","salt","salute","same","sample","sand", | |
14583 | "satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter", | |
14584 | "scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script", | |
14585 | "scrub","sea","search","season","seat","second","secret","section","security","seed", | |
14586 | "seek","segment","select","sell","seminar","senior","sense","sentence","series","service", | |
14587 | "session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell", | |
14588 | "sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop", | |
14589 | "short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side", | |
14590 | "siege","sight","sign","silent","silk","silly","silver","similar","simple","since", | |
14591 | "sing","siren","sister","situate","six","size","skate","sketch","ski","skill", | |
14592 | "skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight", | |
14593 | "slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth", | |
14594 | "snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda", | |
14595 | "soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry", | |
14596 | "sort","soul","sound","soup","source","south","space","spare","spatial","spawn", | |
14597 | "speak","special","speed","spell","spend","sphere","spice","spider","spike","spin", | |
14598 | "spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring", | |
14599 | "spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp", | |
14600 | "stand","start","state","stay","steak","steel","stem","step","stereo","stick", | |
14601 | "still","sting","stock","stomach","stone","stool","story","stove","strategy","street", | |
14602 | "strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway", | |
14603 | "success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny", | |
14604 | "sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey", | |
14605 | "suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim", | |
14606 | "swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag", | |
14607 | "tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi", | |
14608 | "teach","team","tell","ten","tenant","tennis","tent","term","test","text", | |
14609 | "thank","that","theme","then","theory","there","they","thing","this","thought", | |
14610 | "three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber", | |
14611 | "time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler", | |
14612 | "toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool", | |
14613 | "tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist", | |
14614 | "toward","tower","town","toy","track","trade","traffic","tragic","train","transfer", | |
14615 | "trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick", | |
14616 | "trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust", | |
14617 | "truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle", | |
14618 | "twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella", | |
14619 | "unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform", | |
14620 | "unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade", | |
14621 | "uphold","upon","upper","upset","urban","urge","usage","use","used","useful", | |
14622 | "useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van", | |
14623 | "vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue", | |
14624 | "verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory", | |
14625 | "video","view","village","vintage","violin","virtual","virus","visa","visit","visual", | |
14626 | "vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage", | |
14627 | "wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash", | |
14628 | "wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather", | |
14629 | "web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat", | |
14630 | "wheel","when","where","whip","whisper","wide","width","wife","wild","will", | |
14631 | "win","window","wine","wing","wink","winner","winter","wire","wisdom","wise", | |
14632 | "wish","witness","wolf","woman","wonder","wood","wool","word","work","world", | |
14633 | "worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year", | |
14634 | "yellow","you","young","youth","zebra","zero","zone","zoo"] | |
dc55c6b0 | 14635 | </script> |
ab78acc6 | 14636 | <script>/* |
3af2954a IC |
14637 | * Copyright (c) 2013 Pavol Rusnak |
14638 | * | |
14639 | * Permission is hereby granted, free of charge, to any person obtaining a copy of | |
14640 | * this software and associated documentation files (the "Software"), to deal in | |
14641 | * the Software without restriction, including without limitation the rights to | |
14642 | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |
14643 | * of the Software, and to permit persons to whom the Software is furnished to do | |
14644 | * so, subject to the following conditions: | |
14645 | * | |
14646 | * The above copyright notice and this permission notice shall be included in all | |
14647 | * copies or substantial portions of the Software. | |
14648 | * | |
14649 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
14650 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
14651 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
14652 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
14653 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
14654 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
14655 | */ | |
14656 | ||
14657 | /* | |
14658 | * Javascript port from python by Ian Coleman | |
14659 | * | |
80c4dd2a IC |
14660 | * Requires code from sjcl |
14661 | * https://github.com/bitwiseshiftleft/sjcl | |
3af2954a IC |
14662 | */ |
14663 | ||
14664 | var Mnemonic = function(language) { | |
14665 | ||
14666 | var PBKDF2_ROUNDS = 2048; | |
14667 | var RADIX = 2048; | |
14668 | ||
14669 | var self = this; | |
14670 | var wordlist = []; | |
14671 | ||
80c4dd2a IC |
14672 | var hmacSHA512 = function(key) { |
14673 | var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha512); | |
14674 | this.encrypt = function() { | |
14675 | return hasher.encrypt.apply(hasher, arguments); | |
14676 | }; | |
14677 | }; | |
14678 | ||
3af2954a IC |
14679 | function init() { |
14680 | wordlist = WORDLISTS[language]; | |
14681 | if (wordlist.length != RADIX) { | |
14682 | err = 'Wordlist should contain ' + RADIX + ' words, but it contains ' + wordlist.length + ' words.'; | |
14683 | throw err; | |
14684 | } | |
14685 | } | |
14686 | ||
14687 | self.generate = function(strength) { | |
14688 | strength = strength || 128; | |
14689 | var r = strength % 32; | |
14690 | if (r > 0) { | |
14691 | throw 'Strength should be divisible by 32, but it is not (' + r + ').'; | |
14692 | } | |
14693 | var hasStrongCrypto = 'crypto' in window && window['crypto'] !== null; | |
14694 | if (!hasStrongCrypto) { | |
14695 | throw 'Mnemonic should be generated with strong randomness, but crypto.getRandomValues is unavailable'; | |
14696 | } | |
14697 | var buffer = new Uint8Array(strength / 8); | |
14698 | var data = crypto.getRandomValues(buffer); | |
14699 | return self.toMnemonic(data); | |
14700 | } | |
14701 | ||
80c4dd2a IC |
14702 | self.toMnemonic = function(byteArray) { |
14703 | if (byteArray.length % 4 > 0) { | |
14704 | throw 'Data length in bits should be divisible by 32, but it is not (' + byteArray.length + ' bytes = ' + byteArray.length*8 + ' bits).' | |
3af2954a IC |
14705 | } |
14706 | ||
14707 | //h = hashlib.sha256(data).hexdigest() | |
80c4dd2a IC |
14708 | var data = byteArrayToWordArray(byteArray); |
14709 | var hash = sjcl.hash.sha256.hash(data); | |
14710 | var h = sjcl.codec.hex.fromBits(hash); | |
3af2954a IC |
14711 | |
14712 | // b is a binary string, eg '00111010101100...' | |
14713 | //b = bin(int(binascii.hexlify(data), 16))[2:].zfill(len(data) * 8) + \ | |
14714 | // bin(int(h, 16))[2:].zfill(256)[:len(data) * 8 / 32] | |
14715 | // | |
14716 | // a = bin(int(binascii.hexlify(data), 16))[2:].zfill(len(data) * 8) | |
14717 | // c = bin(int(h, 16))[2:].zfill(256) | |
14718 | // d = c[:len(data) * 8 / 32] | |
80c4dd2a IC |
14719 | var a = byteArrayToBinaryString(byteArray); |
14720 | var c = zfill(hexStringToBinaryString(h), 256); | |
14721 | var d = c.substring(0, byteArray.length * 8 / 32); | |
3af2954a IC |
14722 | // b = line1 + line2 |
14723 | var b = a + d; | |
14724 | ||
14725 | var result = []; | |
14726 | var blen = b.length / 11; | |
14727 | for (var i=0; i<blen; i++) { | |
14728 | var idx = parseInt(b.substring(i * 11, (i + 1) * 11), 2); | |
14729 | result.push(wordlist[idx]); | |
14730 | } | |
14731 | return result.join(' '); | |
14732 | } | |
14733 | ||
14734 | self.check = function(mnemonic) { | |
14735 | var mnemonic = mnemonic.split(' ') | |
14736 | if (mnemonic.length % 3 > 0) { | |
14737 | return false | |
14738 | } | |
14739 | // idx = map(lambda x: bin(self.wordlist.index(x))[2:].zfill(11), mnemonic) | |
14740 | var idx = []; | |
14741 | for (var i=0; i<mnemonic.length; i++) { | |
14742 | var word = mnemonic[i]; | |
14743 | var wordIndex = wordlist.indexOf(word); | |
14744 | if (wordIndex == -1) { | |
14745 | return false; | |
14746 | } | |
14747 | var binaryIndex = zfill(wordIndex.toString(2), 11); | |
14748 | idx.push(binaryIndex); | |
14749 | } | |
14750 | var b = idx.join(''); | |
14751 | var l = b.length; | |
14752 | //d = b[:l / 33 * 32] | |
14753 | //h = b[-l / 33:] | |
14754 | var d = b.substring(0, l / 33 * 32); | |
14755 | var h = b.substring(l - l / 33, l); | |
14756 | //nd = binascii.unhexlify(hex(int(d, 2))[2:].rstrip('L').zfill(l / 33 * 8)) | |
80c4dd2a | 14757 | var nd = binaryStringToWordArray(d); |
3af2954a | 14758 | //nh = bin(int(hashlib.sha256(nd).hexdigest(), 16))[2:].zfill(256)[:l / 33] |
80c4dd2a IC |
14759 | var ndHash = sjcl.hash.sha256.hash(nd); |
14760 | var ndHex = sjcl.codec.hex.fromBits(ndHash); | |
14761 | var ndBstr = zfill(hexStringToBinaryString(ndHex), 256); | |
3af2954a IC |
14762 | var nh = ndBstr.substring(0,l/33); |
14763 | return h == nh; | |
14764 | } | |
14765 | ||
14766 | self.toSeed = function(mnemonic, passphrase) { | |
14767 | passphrase = passphrase || ''; | |
7772c641 | 14768 | mnemonic = self.normalizeString(mnemonic).split(' ').filter(function(x) { return x.length; }).join(' '); |
3af2954a IC |
14769 | passphrase = self.normalizeString(passphrase) |
14770 | passphrase = "mnemonic" + passphrase; | |
80c4dd2a IC |
14771 | var mnemonicBits = sjcl.codec.utf8String.toBits(mnemonic); |
14772 | var passphraseBits = sjcl.codec.utf8String.toBits(passphrase); | |
14773 | var result = sjcl.misc.pbkdf2(mnemonicBits, passphraseBits, PBKDF2_ROUNDS, 512, hmacSHA512); | |
14774 | var hashHex = sjcl.codec.hex.fromBits(result); | |
14775 | return hashHex; | |
3af2954a IC |
14776 | } |
14777 | ||
14778 | self.normalizeString = function(str) { | |
14779 | if (typeof str.normalize == "function") { | |
14780 | return str.normalize("NFKD"); | |
14781 | } | |
14782 | else { | |
14783 | // TODO decide how to handle this in the future. | |
14784 | // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize | |
14785 | return str; | |
14786 | } | |
14787 | } | |
14788 | ||
80c4dd2a IC |
14789 | function byteArrayToWordArray(data) { |
14790 | var a = []; | |
14791 | for (var i=0; i<data.length/4; i++) { | |
14792 | v = 0; | |
14793 | v += data[i*4 + 0] << 8 * 3; | |
14794 | v += data[i*4 + 1] << 8 * 2; | |
14795 | v += data[i*4 + 2] << 8 * 1; | |
14796 | v += data[i*4 + 3] << 8 * 0; | |
14797 | a.push(v); | |
14798 | } | |
14799 | return a; | |
14800 | } | |
14801 | ||
3af2954a IC |
14802 | function byteArrayToBinaryString(data) { |
14803 | var bin = ""; | |
14804 | for (var i=0; i<data.length; i++) { | |
14805 | bin += zfill(data[i].toString(2), 8); | |
14806 | } | |
14807 | return bin; | |
14808 | } | |
14809 | ||
80c4dd2a IC |
14810 | function hexStringToBinaryString(hexString) { |
14811 | binaryString = ""; | |
14812 | for (var i=0; i<hexString.length; i++) { | |
14813 | binaryString += zfill(parseInt(hexString[i], 16).toString(2),4); | |
14814 | } | |
14815 | return binaryString; | |
14816 | } | |
14817 | ||
14818 | function binaryStringToWordArray(binary) { | |
14819 | var aLen = binary.length / 32; | |
14820 | var a = []; | |
14821 | for (var i=0; i<aLen; i++) { | |
14822 | var valueStr = binary.substring(0,32); | |
3af2954a | 14823 | var value = parseInt(valueStr, 2); |
80c4dd2a IC |
14824 | a.push(value); |
14825 | binary = binary.slice(32); | |
3af2954a | 14826 | } |
80c4dd2a | 14827 | return a; |
3af2954a IC |
14828 | } |
14829 | ||
14830 | // Pad a numeric string on the left with zero digits until the given width | |
14831 | // is reached. | |
14832 | // Note this differs to the python implementation because it does not | |
14833 | // handle numbers starting with a sign. | |
14834 | function zfill(source, length) { | |
14835 | source = source.toString(); | |
14836 | while (source.length < length) { | |
14837 | source = '0' + source; | |
14838 | } | |
14839 | return source; | |
14840 | } | |
14841 | ||
14842 | init(); | |
ebd8d4e8 | 14843 | |
3af2954a | 14844 | } |
dc55c6b0 | 14845 | </script> |
ab78acc6 | 14846 | <script>(function() { |
ebd8d4e8 IC |
14847 | |
14848 | var mnemonic = new Mnemonic("english"); | |
73161a92 | 14849 | var seed = null |
ebd8d4e8 IC |
14850 | var bip32RootKey = null; |
14851 | var bip32ExtendedKey = null; | |
ab78acc6 | 14852 | var network = bitcoin.networks.bitcoin; |
ebd8d4e8 IC |
14853 | var addressRowTemplate = $("#address-row-template"); |
14854 | ||
80c4dd2a IC |
14855 | var showIndex = true; |
14856 | var showAddress = true; | |
14857 | var showPrivKey = true; | |
14858 | ||
ebd8d4e8 | 14859 | var phraseChangeTimeoutEvent = null; |
efe41586 | 14860 | var rootKeyChangedTimeoutEvent = null; |
ebd8d4e8 IC |
14861 | |
14862 | var DOM = {}; | |
d6cedc94 IC |
14863 | DOM.network = $(".network"); |
14864 | DOM.phraseNetwork = $("#network-phrase"); | |
ebd8d4e8 | 14865 | DOM.phrase = $(".phrase"); |
721b7284 | 14866 | DOM.passphrase = $(".passphrase"); |
ebd8d4e8 | 14867 | DOM.generate = $(".generate"); |
73161a92 | 14868 | DOM.seed = $(".seed"); |
ebd8d4e8 IC |
14869 | DOM.rootKey = $(".root-key"); |
14870 | DOM.extendedPrivKey = $(".extended-priv-key"); | |
14871 | DOM.extendedPubKey = $(".extended-pub-key"); | |
d6cedc94 IC |
14872 | DOM.bip32tab = $("#bip32-tab"); |
14873 | DOM.bip44tab = $("#bip44-tab"); | |
14874 | DOM.bip32panel = $("#bip32"); | |
14875 | DOM.bip44panel = $("#bip44"); | |
ebd8d4e8 IC |
14876 | DOM.bip32path = $("#bip32-path"); |
14877 | DOM.bip44path = $("#bip44-path"); | |
14878 | DOM.bip44purpose = $("#bip44 .purpose"); | |
14879 | DOM.bip44coin = $("#bip44 .coin"); | |
14880 | DOM.bip44account = $("#bip44 .account"); | |
14881 | DOM.bip44change = $("#bip44 .change"); | |
14882 | DOM.strength = $(".strength"); | |
1975bfbc | 14883 | DOM.hardenedAddresses = $(".hardened-addresses"); |
ebd8d4e8 IC |
14884 | DOM.addresses = $(".addresses"); |
14885 | DOM.rowsToAdd = $(".rows-to-add"); | |
14886 | DOM.more = $(".more"); | |
14887 | DOM.feedback = $(".feedback"); | |
14888 | DOM.tab = $(".derivation-type a"); | |
14889 | DOM.indexToggle = $(".index-toggle"); | |
14890 | DOM.addressToggle = $(".address-toggle"); | |
14891 | DOM.privateKeyToggle = $(".private-key-toggle"); | |
14892 | ||
ebd8d4e8 IC |
14893 | function init() { |
14894 | // Events | |
d6cedc94 | 14895 | DOM.network.on("change", networkChanged); |
a19a5498 IC |
14896 | DOM.phrase.on("input", delayedPhraseChanged); |
14897 | DOM.passphrase.on("input", delayedPhraseChanged); | |
ebd8d4e8 IC |
14898 | DOM.generate.on("click", generateClicked); |
14899 | DOM.more.on("click", showMore); | |
efe41586 IC |
14900 | DOM.rootKey.on("input", delayedRootKeyChanged); |
14901 | DOM.bip32path.on("input", calcForDerivationPath); | |
14902 | DOM.bip44purpose.on("input", calcForDerivationPath); | |
14903 | DOM.bip44coin.on("input", calcForDerivationPath); | |
14904 | DOM.bip44account.on("input", calcForDerivationPath); | |
14905 | DOM.bip44change.on("input", calcForDerivationPath); | |
14906 | DOM.tab.on("shown.bs.tab", calcForDerivationPath); | |
1975bfbc | 14907 | DOM.hardenedAddresses.on("change", calcForDerivationPath); |
ebd8d4e8 IC |
14908 | DOM.indexToggle.on("click", toggleIndexes); |
14909 | DOM.addressToggle.on("click", toggleAddresses); | |
14910 | DOM.privateKeyToggle.on("click", togglePrivateKeys); | |
14911 | disableForms(); | |
14912 | hidePending(); | |
14913 | hideValidationError(); | |
ab78acc6 | 14914 | populateNetworkSelect(); |
ebd8d4e8 IC |
14915 | } |
14916 | ||
14917 | // Event handlers | |
14918 | ||
d6cedc94 | 14919 | function networkChanged(e) { |
54563907 IC |
14920 | var networkIndex = e.target.value; |
14921 | networks[networkIndex].onSelect(); | |
14922 | if (seed != null) { | |
14923 | phraseChanged(); | |
14924 | } | |
14925 | else { | |
14926 | rootKeyChanged(); | |
14927 | } | |
d6cedc94 IC |
14928 | } |
14929 | ||
ebd8d4e8 IC |
14930 | function delayedPhraseChanged() { |
14931 | hideValidationError(); | |
14932 | showPending(); | |
14933 | if (phraseChangeTimeoutEvent != null) { | |
14934 | clearTimeout(phraseChangeTimeoutEvent); | |
14935 | } | |
14936 | phraseChangeTimeoutEvent = setTimeout(phraseChanged, 400); | |
14937 | } | |
14938 | ||
14939 | function phraseChanged() { | |
14940 | showPending(); | |
14941 | hideValidationError(); | |
14942 | // Get the mnemonic phrase | |
14943 | var phrase = DOM.phrase.val(); | |
14944 | var errorText = findPhraseErrors(phrase); | |
14945 | if (errorText) { | |
14946 | showValidationError(errorText); | |
14947 | return; | |
14948 | } | |
efe41586 IC |
14949 | // Calculate and display |
14950 | var passphrase = DOM.passphrase.val(); | |
14951 | calcBip32RootKeyFromSeed(phrase, passphrase); | |
14952 | calcForDerivationPath(); | |
14953 | hidePending(); | |
14954 | } | |
14955 | ||
14956 | function delayedRootKeyChanged() { | |
14957 | // Warn if there is an existing mnemonic or passphrase. | |
14958 | if (DOM.phrase.val().length > 0 || DOM.passphrase.val().length > 0) { | |
14959 | if (!confirm("This will clear existing mnemonic and passphrase")) { | |
14960 | DOM.rootKey.val(bip32RootKey); | |
14961 | return | |
14962 | } | |
14963 | } | |
14964 | hideValidationError(); | |
14965 | showPending(); | |
14966 | // Clear existing mnemonic and passphrase | |
14967 | DOM.phrase.val(""); | |
14968 | DOM.passphrase.val(""); | |
14969 | seed = null; | |
14970 | if (rootKeyChangedTimeoutEvent != null) { | |
14971 | clearTimeout(rootKeyChangedTimeoutEvent); | |
14972 | } | |
14973 | rootKeyChangedTimeoutEvent = setTimeout(rootKeyChanged, 400); | |
14974 | } | |
14975 | ||
14976 | function rootKeyChanged() { | |
14977 | showPending(); | |
14978 | hideValidationError(); | |
14979 | // Validate the root key TODO | |
14980 | var rootKeyBase58 = DOM.rootKey.val(); | |
14981 | var errorText = validateRootKey(rootKeyBase58); | |
14982 | if (errorText) { | |
14983 | showValidationError(errorText); | |
14984 | return; | |
14985 | } | |
14986 | // Calculate and display | |
14987 | calcBip32RootKeyFromBase58(rootKeyBase58); | |
14988 | calcForDerivationPath(); | |
14989 | hidePending(); | |
14990 | } | |
14991 | ||
14992 | function calcForDerivationPath() { | |
14993 | showPending(); | |
14994 | hideValidationError(); | |
ebd8d4e8 | 14995 | // Get the derivation path |
38523d36 IC |
14996 | var derivationPath = getDerivationPath(); |
14997 | var errorText = findDerivationPathErrors(derivationPath); | |
ebd8d4e8 IC |
14998 | if (errorText) { |
14999 | showValidationError(errorText); | |
15000 | return; | |
15001 | } | |
efe41586 | 15002 | calcBip32ExtendedKey(derivationPath); |
ebd8d4e8 IC |
15003 | displayBip32Info(); |
15004 | hidePending(); | |
15005 | } | |
15006 | ||
15007 | function generateClicked() { | |
15008 | clearDisplay(); | |
15009 | showPending(); | |
15010 | setTimeout(function() { | |
15011 | var phrase = generateRandomPhrase(); | |
15012 | if (!phrase) { | |
15013 | return; | |
15014 | } | |
15015 | phraseChanged(); | |
15016 | }, 50); | |
15017 | } | |
15018 | ||
ebd8d4e8 | 15019 | function toggleIndexes() { |
80c4dd2a | 15020 | showIndex = !showIndex; |
ebd8d4e8 IC |
15021 | $("td.index span").toggleClass("invisible"); |
15022 | } | |
15023 | ||
15024 | function toggleAddresses() { | |
80c4dd2a | 15025 | showAddress = !showAddress; |
ebd8d4e8 IC |
15026 | $("td.address span").toggleClass("invisible"); |
15027 | } | |
15028 | ||
15029 | function togglePrivateKeys() { | |
80c4dd2a | 15030 | showPrivKey = !showPrivKey; |
ebd8d4e8 IC |
15031 | $("td.privkey span").toggleClass("invisible"); |
15032 | } | |
15033 | ||
15034 | // Private methods | |
15035 | ||
15036 | function generateRandomPhrase() { | |
15037 | if (!hasStrongRandom()) { | |
15038 | var errorText = "This browser does not support strong randomness"; | |
15039 | showValidationError(errorText); | |
15040 | return; | |
15041 | } | |
15042 | var numWords = parseInt(DOM.strength.val()); | |
ebd8d4e8 IC |
15043 | var strength = numWords / 3 * 32; |
15044 | var words = mnemonic.generate(strength); | |
15045 | DOM.phrase.val(words); | |
15046 | return words; | |
15047 | } | |
15048 | ||
efe41586 | 15049 | function calcBip32RootKeyFromSeed(phrase, passphrase) { |
73161a92 | 15050 | seed = mnemonic.toSeed(phrase, passphrase); |
ab78acc6 | 15051 | bip32RootKey = bitcoin.HDNode.fromSeedHex(seed, network); |
efe41586 IC |
15052 | } |
15053 | ||
15054 | function calcBip32RootKeyFromBase58(rootKeyBase58) { | |
15055 | bip32RootKey = bitcoin.HDNode.fromBase58(rootKeyBase58); | |
15056 | } | |
15057 | ||
15058 | function calcBip32ExtendedKey(path) { | |
ebd8d4e8 IC |
15059 | bip32ExtendedKey = bip32RootKey; |
15060 | // Derive the key from the path | |
15061 | var pathBits = path.split("/"); | |
15062 | for (var i=0; i<pathBits.length; i++) { | |
15063 | var bit = pathBits[i]; | |
15064 | var index = parseInt(bit); | |
15065 | if (isNaN(index)) { | |
15066 | continue; | |
15067 | } | |
15068 | var hardened = bit[bit.length-1] == "'"; | |
15069 | if (hardened) { | |
15070 | bip32ExtendedKey = bip32ExtendedKey.deriveHardened(index); | |
15071 | } | |
15072 | else { | |
15073 | bip32ExtendedKey = bip32ExtendedKey.derive(index); | |
15074 | } | |
15075 | } | |
15076 | } | |
15077 | ||
15078 | function showValidationError(errorText) { | |
15079 | DOM.feedback | |
15080 | .text(errorText) | |
15081 | .show(); | |
15082 | } | |
15083 | ||
15084 | function hideValidationError() { | |
15085 | DOM.feedback | |
15086 | .text("") | |
15087 | .hide(); | |
15088 | } | |
15089 | ||
15090 | function findPhraseErrors(phrase) { | |
15091 | // TODO make this right | |
15092 | // Preprocess the words | |
783981de | 15093 | phrase = mnemonic.normalizeString(phrase); |
ebd8d4e8 IC |
15094 | var parts = phrase.split(" "); |
15095 | var proper = []; | |
15096 | for (var i=0; i<parts.length; i++) { | |
15097 | var part = parts[i]; | |
15098 | if (part.length > 0) { | |
15099 | // TODO check that lowercasing is always valid to do | |
15100 | proper.push(part.toLowerCase()); | |
15101 | } | |
15102 | } | |
ebd8d4e8 | 15103 | var properPhrase = proper.join(' '); |
563e401a IC |
15104 | // Check each word |
15105 | for (var i=0; i<proper.length; i++) { | |
15106 | var word = proper[i]; | |
15107 | if (WORDLISTS["english"].indexOf(word) == -1) { | |
15108 | console.log("Finding closest match to " + word); | |
15109 | var nearestWord = findNearestWord(word); | |
15110 | return word + " not in wordlist, did you mean " + nearestWord + "?"; | |
15111 | } | |
15112 | } | |
ebd8d4e8 IC |
15113 | // Check the words are valid |
15114 | var isValid = mnemonic.check(properPhrase); | |
15115 | if (!isValid) { | |
15116 | return "Invalid mnemonic"; | |
15117 | } | |
15118 | return false; | |
15119 | } | |
15120 | ||
efe41586 IC |
15121 | function validateRootKey(rootKeyBase58) { |
15122 | try { | |
15123 | bitcoin.HDNode.fromBase58(rootKeyBase58); | |
15124 | } | |
15125 | catch (e) { | |
15126 | return "Invalid root key"; | |
15127 | } | |
15128 | return ""; | |
15129 | } | |
15130 | ||
38523d36 IC |
15131 | function getDerivationPath() { |
15132 | if (DOM.bip44tab.hasClass("active")) { | |
15133 | var purpose = parseIntNoNaN(DOM.bip44purpose.val(), 44); | |
15134 | var coin = parseIntNoNaN(DOM.bip44coin.val(), 0); | |
15135 | var account = parseIntNoNaN(DOM.bip44account.val(), 0); | |
15136 | var change = parseIntNoNaN(DOM.bip44change.val(), 0); | |
15137 | var path = "m/"; | |
15138 | path += purpose + "'/"; | |
15139 | path += coin + "'/"; | |
15140 | path += account + "'/"; | |
15141 | path += change; | |
15142 | DOM.bip44path.val(path); | |
15143 | var derivationPath = DOM.bip44path.val(); | |
15144 | console.log("Using derivation path from BIP44 tab: " + derivationPath); | |
15145 | return derivationPath; | |
15146 | } | |
15147 | else if (DOM.bip32tab.hasClass("active")) { | |
15148 | var derivationPath = DOM.bip32path.val(); | |
15149 | console.log("Using derivation path from BIP32 tab: " + derivationPath); | |
15150 | return derivationPath; | |
15151 | } | |
15152 | else { | |
15153 | console.log("Unknown derivation path"); | |
15154 | } | |
15155 | } | |
15156 | ||
ebd8d4e8 | 15157 | function findDerivationPathErrors(path) { |
30c9e79d IC |
15158 | // TODO is not perfect but is better than nothing |
15159 | // Inspired by | |
15160 | // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#test-vectors | |
15161 | // and | |
15162 | // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#extended-keys | |
15163 | var maxDepth = 255; // TODO verify this!! | |
15164 | var maxIndexValue = Math.pow(2, 31); // TODO verify this!! | |
15165 | if (path[0] != "m") { | |
15166 | return "First character must be 'm'"; | |
15167 | } | |
15168 | if (path.length > 1) { | |
15169 | if (path[1] != "/") { | |
15170 | return "Separator must be '/'"; | |
15171 | } | |
15172 | var indexes = path.split("/"); | |
15173 | if (indexes.length > maxDepth) { | |
15174 | return "Derivation depth is " + indexes.length + ", must be less than " + maxDepth; | |
15175 | } | |
15176 | for (var depth = 1; depth<indexes.length; depth++) { | |
15177 | var index = indexes[depth]; | |
15178 | var invalidChars = index.replace(/^[0-9]+'?$/g, "") | |
15179 | if (invalidChars.length > 0) { | |
15180 | return "Invalid characters " + invalidChars + " found at depth " + depth; | |
15181 | } | |
15182 | var indexValue = parseInt(index.replace("'", "")); | |
15183 | if (isNaN(depth)) { | |
15184 | return "Invalid number at depth " + depth; | |
15185 | } | |
15186 | if (indexValue > maxIndexValue) { | |
15187 | return "Value of " + indexValue + " at depth " + depth + " must be less than " + maxIndexValue; | |
15188 | } | |
15189 | } | |
15190 | } | |
ebd8d4e8 IC |
15191 | return false; |
15192 | } | |
15193 | ||
15194 | function displayBip32Info() { | |
15195 | // Display the key | |
73161a92 | 15196 | DOM.seed.val(seed); |
ebd8d4e8 IC |
15197 | var rootKey = bip32RootKey.toBase58(); |
15198 | DOM.rootKey.val(rootKey); | |
15199 | var extendedPrivKey = bip32ExtendedKey.toBase58(); | |
15200 | DOM.extendedPrivKey.val(extendedPrivKey); | |
15201 | var extendedPubKey = bip32ExtendedKey.toBase58(false); | |
15202 | DOM.extendedPubKey.val(extendedPubKey); | |
15203 | // Display the addresses and privkeys | |
15204 | clearAddressesList(); | |
15205 | displayAddresses(0, 20); | |
15206 | } | |
15207 | ||
15208 | function displayAddresses(start, total) { | |
15209 | for (var i=0; i<total; i++) { | |
80c4dd2a IC |
15210 | var index = i + start; |
15211 | new TableRow(index); | |
15212 | } | |
15213 | } | |
15214 | ||
15215 | function TableRow(index) { | |
15216 | ||
1975bfbc IC |
15217 | var useHardenedAddresses = DOM.hardenedAddresses.prop("checked"); |
15218 | ||
80c4dd2a IC |
15219 | function init() { |
15220 | calculateValues(); | |
15221 | } | |
15222 | ||
15223 | function calculateValues() { | |
15224 | setTimeout(function() { | |
1975bfbc IC |
15225 | var key = ""; |
15226 | if (useHardenedAddresses) { | |
15227 | key = bip32ExtendedKey.deriveHardened(index); | |
15228 | } | |
15229 | else { | |
15230 | key = bip32ExtendedKey.derive(index); | |
15231 | } | |
80c4dd2a IC |
15232 | var address = key.getAddress().toString(); |
15233 | var privkey = key.privKey.toWIF(network); | |
38523d36 | 15234 | var indexText = getDerivationPath() + "/" + index; |
1975bfbc IC |
15235 | if (useHardenedAddresses) { |
15236 | indexText = indexText + "'"; | |
15237 | } | |
38523d36 | 15238 | addAddressToList(indexText, address, privkey); |
80c4dd2a | 15239 | }, 50) |
ebd8d4e8 | 15240 | } |
80c4dd2a IC |
15241 | |
15242 | init(); | |
15243 | ||
ebd8d4e8 IC |
15244 | } |
15245 | ||
15246 | function showMore() { | |
15247 | var start = DOM.addresses.children().length; | |
15248 | var rowsToAdd = parseInt(DOM.rowsToAdd.val()); | |
15249 | if (isNaN(rowsToAdd)) { | |
15250 | rowsToAdd = 20; | |
15251 | DOM.rowsToAdd.val("20"); | |
15252 | } | |
15253 | if (rowsToAdd > 200) { | |
15254 | var msg = "Generating " + rowsToAdd + " rows could take a while. "; | |
15255 | msg += "Do you want to continue?"; | |
15256 | if (!confirm(msg)) { | |
15257 | return; | |
15258 | } | |
15259 | } | |
ebd8d4e8 | 15260 | displayAddresses(start, rowsToAdd); |
ebd8d4e8 IC |
15261 | } |
15262 | ||
15263 | function clearDisplay() { | |
15264 | clearAddressesList(); | |
15265 | clearKey(); | |
15266 | hideValidationError(); | |
15267 | } | |
15268 | ||
15269 | function clearAddressesList() { | |
15270 | DOM.addresses.empty(); | |
15271 | } | |
15272 | ||
15273 | function clearKey() { | |
15274 | DOM.rootKey.val(""); | |
15275 | DOM.extendedPrivKey.val(""); | |
15276 | DOM.extendedPubKey.val(""); | |
15277 | } | |
15278 | ||
38523d36 | 15279 | function addAddressToList(indexText, address, privkey) { |
ebd8d4e8 | 15280 | var row = $(addressRowTemplate.html()); |
80c4dd2a IC |
15281 | // Elements |
15282 | var indexCell = row.find(".index span"); | |
15283 | var addressCell = row.find(".address span"); | |
15284 | var privkeyCell = row.find(".privkey span"); | |
15285 | // Content | |
ae30fed8 | 15286 | indexCell.text(indexText); |
80c4dd2a IC |
15287 | addressCell.text(address); |
15288 | privkeyCell.text(privkey); | |
15289 | // Visibility | |
15290 | if (!showIndex) { | |
15291 | indexCell.addClass("invisible"); | |
15292 | } | |
15293 | if (!showAddress) { | |
15294 | addressCell.addClass("invisible"); | |
15295 | } | |
15296 | if (!showPrivKey) { | |
6d628db7 | 15297 | privkeyCell.addClass("invisible"); |
80c4dd2a | 15298 | } |
ebd8d4e8 IC |
15299 | DOM.addresses.append(row); |
15300 | } | |
15301 | ||
15302 | function hasStrongRandom() { | |
15303 | return 'crypto' in window && window['crypto'] !== null; | |
15304 | } | |
15305 | ||
15306 | function disableForms() { | |
15307 | $("form").on("submit", function(e) { | |
15308 | e.preventDefault(); | |
15309 | }); | |
15310 | } | |
15311 | ||
ebd8d4e8 IC |
15312 | function parseIntNoNaN(val, defaultVal) { |
15313 | var v = parseInt(val); | |
15314 | if (isNaN(v)) { | |
15315 | return defaultVal; | |
15316 | } | |
15317 | return v; | |
15318 | } | |
15319 | ||
15320 | function showPending() { | |
15321 | DOM.feedback | |
15322 | .text("Calculating...") | |
15323 | .show(); | |
15324 | } | |
15325 | ||
563e401a IC |
15326 | function findNearestWord(word) { |
15327 | var words = WORDLISTS["english"]; | |
15328 | var minDistance = 99; | |
15329 | var closestWord = words[0]; | |
15330 | for (var i=0; i<words.length; i++) { | |
15331 | var comparedTo = words[i]; | |
15332 | var distance = Levenshtein.get(word, comparedTo); | |
15333 | if (distance < minDistance) { | |
15334 | closestWord = comparedTo; | |
15335 | minDistance = distance; | |
15336 | } | |
15337 | } | |
15338 | return closestWord; | |
15339 | } | |
15340 | ||
ebd8d4e8 IC |
15341 | function hidePending() { |
15342 | DOM.feedback | |
15343 | .text("") | |
15344 | .hide(); | |
15345 | } | |
15346 | ||
ab78acc6 IC |
15347 | function populateNetworkSelect() { |
15348 | for (var i=0; i<networks.length; i++) { | |
15349 | var network = networks[i]; | |
15350 | var option = $("<option>"); | |
15351 | option.attr("value", i); | |
15352 | option.text(network.name); | |
15353 | DOM.phraseNetwork.append(option); | |
15354 | } | |
15355 | } | |
15356 | ||
15357 | var networks = [ | |
15358 | { | |
15359 | name: "Bitcoin", | |
15360 | onSelect: function() { | |
15361 | network = bitcoin.networks.bitcoin; | |
15362 | DOM.bip44coin.val(0); | |
ab78acc6 IC |
15363 | }, |
15364 | }, | |
15365 | { | |
15366 | name: "Bitcoin Testnet", | |
15367 | onSelect: function() { | |
15368 | network = bitcoin.networks.testnet; | |
15369 | DOM.bip44coin.val(1); | |
ab78acc6 IC |
15370 | }, |
15371 | }, | |
15372 | { | |
15373 | name: "Litecoin", | |
15374 | onSelect: function() { | |
15375 | network = bitcoin.networks.litecoin; | |
15376 | DOM.bip44coin.val(2); | |
15377 | }, | |
15378 | }, | |
15379 | { | |
15380 | name: "Dogecoin", | |
15381 | onSelect: function() { | |
15382 | network = bitcoin.networks.dogecoin; | |
15383 | DOM.bip44coin.val(3); | |
15384 | }, | |
15385 | }, | |
d5dc92fd IC |
15386 | { |
15387 | name: "ShadowCash", | |
15388 | onSelect: function() { | |
15389 | network = bitcoin.networks.shadow; | |
15390 | DOM.bip44coin.val(35); | |
15391 | }, | |
15392 | }, | |
15393 | { | |
15394 | name: "ShadowCash Testnet", | |
15395 | onSelect: function() { | |
15396 | network = bitcoin.networks.shadowtn; | |
15397 | DOM.bip44coin.val(1); | |
15398 | }, | |
15399 | }, | |
a3baa26e IC |
15400 | { |
15401 | name: "Viacoin", | |
15402 | onSelect: function() { | |
15403 | network = bitcoin.networks.viacoin; | |
15404 | DOM.bip44coin.val(14); | |
15405 | }, | |
15406 | }, | |
15407 | { | |
15408 | name: "Viacoin Testnet", | |
15409 | onSelect: function() { | |
15410 | network = bitcoin.networks.viacointestnet; | |
15411 | DOM.bip44coin.val(1); | |
15412 | }, | |
15413 | }, | |
15414 | { | |
15415 | name: "Jumbucks", | |
15416 | onSelect: function() { | |
15417 | network = bitcoin.networks.jumbucks; | |
15418 | DOM.bip44coin.val(26); | |
15419 | }, | |
15420 | }, | |
5c434a8a CM |
15421 | { |
15422 | name: "CLAM", | |
15423 | onSelect: function() { | |
15424 | network = bitcoin.networks.clam; | |
15425 | DOM.bip44coin.val(23); | |
15426 | }, | |
15427 | }, | |
5493efc3 | 15428 | { |
15429 | name: "DASH", | |
15430 | onSelect: function() { | |
15431 | network = bitcoin.networks.dash; | |
15432 | DOM.bip44coin.val(5); | |
15433 | }, | |
15434 | }, | |
ab78acc6 IC |
15435 | ] |
15436 | ||
ebd8d4e8 IC |
15437 | init(); |
15438 | ||
15439 | })(); | |
dc55c6b0 | 15440 | </script> |
ebd8d4e8 IC |
15441 | </body> |
15442 | </html> |