From 0ffef469df0b6152f88b609a49d4b827bbd159fb Mon Sep 17 00:00:00 2001 From: Jason Dreyzehner Date: Thu, 10 Aug 2017 17:53:43 -0400 Subject: [PATCH] chore: rm the old, in with the new --- .bowerrc | 3 - .editorconfig | 17 - .gitignore | 51 +- .jshintrc | 43 - .npmignore | 39 - .travis.yml | 24 +- Gruntfile.js | 148 - README.md | 121 +- app/package.json | 1 - bitcore-node/index.js | 48 - bitcore-node/service.js | 91 - bower.json | 19 - package.json | 64 +- po/de_DE.po | 474 - po/es.po | 470 - po/ja.po | 617 - public/css/main.min.css | 5 - public/fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes public/fonts/glyphicons-halflings-regular.svg | 229 - public/fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes public/img/.gitignore | 0 public/img/angularjs.png | Bin 14875 -> 0 bytes public/img/icons/copy.png | Bin 148 -> 0 bytes public/img/icons/favicon.ico | Bin 1150 -> 0 bytes public/img/leveldb.png | Bin 12009 -> 0 bytes public/img/loading.gif | Bin 723 -> 0 bytes public/img/logo.svg | 29 - public/img/nodejs.png | Bin 3253 -> 0 bytes public/index-template.html | 74 - public/js/angularjs-all.min.js | 11 - public/js/main.min.js | 3 - public/js/vendors.min.js | 5 - public/lib/zeroclipboard/ZeroClipboard.swf | Bin 2157 -> 0 bytes public/robots.txt | 4 - public/sound/transaction.mp3 | Bin 12539 -> 0 bytes public/src/css/common.css | 852 - public/src/js/app.js | 39 - public/src/js/config.js | 77 - public/src/js/controllers/address.js | 60 - public/src/js/controllers/blocks.js | 100 - public/src/js/controllers/connection.js | 53 - public/src/js/controllers/currency.js | 64 - public/src/js/controllers/footer.js | 40 - public/src/js/controllers/header.js | 47 - public/src/js/controllers/index.js | 53 - public/src/js/controllers/messages.js | 50 - public/src/js/controllers/scanner.js | 149 - public/src/js/controllers/search.js | 64 - public/src/js/controllers/status.js | 55 - public/src/js/controllers/transactions.js | 213 - public/src/js/directives.js | 91 - public/src/js/filters.js | 15 - public/src/js/init.js | 6 - .../ios-imagefile-megapixel/megapix-image.js | 254 - public/src/js/jsqrcode/alignpat.js | 279 - public/src/js/jsqrcode/bitmat.js | 111 - public/src/js/jsqrcode/bmparser.js | 203 - public/src/js/jsqrcode/datablock.js | 117 - public/src/js/jsqrcode/databr.js | 325 - public/src/js/jsqrcode/datamask.js | 207 - public/src/js/jsqrcode/decoder.js | 95 - public/src/js/jsqrcode/detector.js | 413 - public/src/js/jsqrcode/errorlevel.js | 58 - public/src/js/jsqrcode/findpat.js | 649 - public/src/js/jsqrcode/formatinf.js | 104 - public/src/js/jsqrcode/gf256.js | 117 - public/src/js/jsqrcode/gf256poly.js | 230 - public/src/js/jsqrcode/grid.js | 152 - public/src/js/jsqrcode/qrcode.js | 319 - public/src/js/jsqrcode/rsdecoder.js | 178 - public/src/js/jsqrcode/test.html | 149 - public/src/js/jsqrcode/version.js | 261 - public/src/js/services/address.js | 24 - public/src/js/services/api.js | 9 - public/src/js/services/blocks.js | 31 - public/src/js/services/currency.js | 6 - public/src/js/services/global.js | 12 - public/src/js/services/socket.js | 74 - public/src/js/services/status.js | 17 - public/src/js/services/transactions.js | 39 - public/src/js/translations.js | 7 - public/src/templates/api.js | 9 - public/views/404.html | 6 - public/views/address.html | 80 - public/views/block.html | 128 - public/views/block_list.html | 69 - public/views/dummy-translations.html | 2 - public/views/includes/connection.html | 22 - public/views/includes/currency.html | 18 - public/views/includes/header.html | 48 - public/views/includes/infoStatus.html | 4 - public/views/includes/search.html | 6 - public/views/index.html | 79 - public/views/messages_verify.html | 81 - public/views/redirect.html | 1 - public/views/status.html | 124 - public/views/transaction.html | 98 - public/views/transaction/list.html | 11 - public/views/transaction/tx.html | 211 - public/views/transaction_sendraw.html | 55 - server/insight-ui/Gruntfile.js | 148 - server/insight-ui/README.md | 118 - server/insight-ui/bitcore-node/index.js | 48 - server/insight-ui/bitcore-node/service.js | 91 - server/insight-ui/bower.json | 19 - server/insight-ui/package-lock.json | 1384 - server/insight-ui/package.json | 65 - server/insight-ui/po/de_DE.po | 474 - server/insight-ui/po/es.po | 470 - server/insight-ui/po/ja.po | 617 - server/insight-ui/public/css/main.css | 859 - server/insight-ui/public/css/main.min.css | 5 - .../fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes server/insight-ui/public/img/.gitignore | 0 server/insight-ui/public/img/angularjs.png | Bin 14875 -> 0 bytes server/insight-ui/public/img/icons/copy.png | Bin 148 -> 0 bytes .../insight-ui/public/img/icons/favicon.ico | Bin 1150 -> 0 bytes server/insight-ui/public/img/leveldb.png | Bin 12009 -> 0 bytes server/insight-ui/public/img/loading.gif | Bin 723 -> 0 bytes server/insight-ui/public/img/logo.svg | 29 - server/insight-ui/public/img/nodejs.png | Bin 3253 -> 0 bytes server/insight-ui/public/index-template.html | 74 - server/insight-ui/public/js/angularjs-all.js | 7555 ------ .../insight-ui/public/js/angularjs-all.min.js | 11 - server/insight-ui/public/js/main.js | 1397 - server/insight-ui/public/js/main.min.js | 3 - server/insight-ui/public/js/vendors.js | 5742 ---- server/insight-ui/public/js/vendors.min.js | 5 - .../public/lib/angular-animate/.bower.json | 20 - .../public/lib/angular-animate/LICENSE.md | 21 - .../public/lib/angular-animate/README.md | 68 - .../lib/angular-animate/angular-animate.js | 1704 -- .../angular-animate/angular-animate.min.js | 28 - .../angular-animate.min.js.map | 8 - .../public/lib/angular-animate/bower.json | 10 - .../public/lib/angular-animate/index.js | 2 - .../public/lib/angular-animate/package.json | 33 - .../public/lib/angular-bootstrap/.bower.json | 23 - .../public/lib/angular-bootstrap/bower.json | 11 - .../angular-bootstrap/ui-bootstrap-tpls.js | 3677 --- .../ui-bootstrap-tpls.min.js | 9 - .../lib/angular-bootstrap/ui-bootstrap.js | 3427 --- .../lib/angular-bootstrap/ui-bootstrap.min.js | 9 - .../public/lib/angular-gettext/.bower.json | 31 - .../public/lib/angular-gettext/LICENSE | 19 - .../public/lib/angular-gettext/README.md | 31 - .../public/lib/angular-gettext/bower.json | 21 - .../angular-gettext/dist/angular-gettext.js | 294 - .../dist/angular-gettext.min.js | 1 - .../public/lib/angular-gettext/package.json | 48 - .../public/lib/angular-moment/.bower.json | 31 - .../public/lib/angular-moment/.editorconfig | 24 - .../public/lib/angular-moment/.gitignore | 4 - .../public/lib/angular-moment/.jshintrc | 26 - .../public/lib/angular-moment/.npmignore | 4 - .../public/lib/angular-moment/.travis.yml | 8 - .../public/lib/angular-moment/CHANGELOG.md | 102 - .../public/lib/angular-moment/CONTRIBUTING.md | 72 - .../public/lib/angular-moment/Gruntfile.js | 62 - .../public/lib/angular-moment/README.md | 147 - .../lib/angular-moment/angular-moment.js | 460 - .../lib/angular-moment/angular-moment.min.js | 2 - .../angular-moment/angular-moment.min.js.map | 1 - .../public/lib/angular-moment/bower.json | 23 - .../public/lib/angular-moment/karma.conf.js | 36 - .../public/lib/angular-moment/package.json | 31 - .../public/lib/angular-moment/tests.js | 606 - .../public/lib/angular-qrcode/.bower.json | 24 - .../public/lib/angular-qrcode/README.md | 55 - .../public/lib/angular-qrcode/bower.json | 14 - .../public/lib/angular-qrcode/index.html | 161 - .../public/lib/angular-qrcode/qrcode.js | 143 - .../public/lib/angular-resource/.bower.json | 20 - .../public/lib/angular-resource/LICENSE.md | 21 - .../public/lib/angular-resource/README.md | 68 - .../lib/angular-resource/angular-resource.js | 627 - .../angular-resource/angular-resource.min.js | 13 - .../angular-resource.min.js.map | 8 - .../public/lib/angular-resource/bower.json | 10 - .../public/lib/angular-resource/index.js | 2 - .../public/lib/angular-resource/package.json | 33 - .../public/lib/angular-route/.bower.json | 20 - .../public/lib/angular-route/LICENSE.md | 21 - .../public/lib/angular-route/README.md | 68 - .../public/lib/angular-route/angular-route.js | 921 - .../lib/angular-route/angular-route.min.js | 14 - .../angular-route/angular-route.min.js.map | 8 - .../public/lib/angular-route/bower.json | 10 - .../public/lib/angular-route/index.js | 2 - .../public/lib/angular-route/package.json | 33 - .../public/lib/angular-ui-utils/.bower.json | 18 - .../public/lib/angular-ui-utils/.travis.yml | 5 - .../public/lib/angular-ui-utils/CHANGELOG.md | 31 - .../public/lib/angular-ui-utils/bower.json | 8 - .../lib/angular-ui-utils/ui-utils-ieshiv.js | 68 - .../angular-ui-utils/ui-utils-ieshiv.min.js | 7 - .../public/lib/angular-ui-utils/ui-utils.js | 2055 -- .../lib/angular-ui-utils/ui-utils.min.js | 7 - .../insight-ui/public/lib/angular/.bower.json | 18 - .../insight-ui/public/lib/angular/LICENSE.md | 21 - .../insight-ui/public/lib/angular/README.md | 64 - .../public/lib/angular/angular-csp.css | 24 - .../insight-ui/public/lib/angular/angular.js | 22197 ---------------- .../public/lib/angular/angular.min.js | 218 - .../public/lib/angular/angular.min.js.gzip | Bin 57337 -> 0 bytes .../public/lib/angular/angular.min.js.map | 8 - .../insight-ui/public/lib/angular/bower.json | 9 - server/insight-ui/public/lib/angular/index.js | 2 - .../public/lib/angular/package.json | 25 - .../public/lib/bootstrap/.bower.json | 34 - .../public/lib/bootstrap/Gruntfile.js | 421 - .../insight-ui/public/lib/bootstrap/LICENSE | 21 - .../insight-ui/public/lib/bootstrap/README.md | 173 - .../public/lib/bootstrap/bower.json | 24 - .../bootstrap/dist/css/bootstrap-theme.css | 347 - .../dist/css/bootstrap-theme.css.map | 1 - .../dist/css/bootstrap-theme.min.css | 7 - .../lib/bootstrap/dist/css/bootstrap.css | 5785 ---- .../lib/bootstrap/dist/css/bootstrap.css.map | 1 - .../lib/bootstrap/dist/css/bootstrap.min.css | 7 - .../fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes .../public/lib/bootstrap/dist/js/bootstrap.js | 1951 -- .../lib/bootstrap/dist/js/bootstrap.min.js | 6 - .../fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes .../grunt/bs-glyphicons-data-generator.js | 34 - .../lib/bootstrap/grunt/bs-lessdoc-parser.js | 236 - .../bootstrap/grunt/bs-raw-files-generator.js | 31 - .../public/lib/bootstrap/grunt/shrinkwrap.js | 28 - .../public/lib/bootstrap/js/affix.js | 137 - .../public/lib/bootstrap/js/alert.js | 88 - .../public/lib/bootstrap/js/button.js | 107 - .../public/lib/bootstrap/js/carousel.js | 205 - .../public/lib/bootstrap/js/collapse.js | 170 - .../public/lib/bootstrap/js/dropdown.js | 147 - .../public/lib/bootstrap/js/modal.js | 243 - .../public/lib/bootstrap/js/popover.js | 110 - .../public/lib/bootstrap/js/scrollspy.js | 153 - .../insight-ui/public/lib/bootstrap/js/tab.js | 125 - .../public/lib/bootstrap/js/tooltip.js | 399 - .../public/lib/bootstrap/js/transition.js | 48 - .../public/lib/bootstrap/less/alerts.less | 67 - .../public/lib/bootstrap/less/badges.less | 55 - .../public/lib/bootstrap/less/bootstrap.less | 49 - .../lib/bootstrap/less/breadcrumbs.less | 26 - .../lib/bootstrap/less/button-groups.less | 226 - .../public/lib/bootstrap/less/buttons.less | 159 - .../public/lib/bootstrap/less/carousel.less | 232 - .../public/lib/bootstrap/less/close.less | 33 - .../public/lib/bootstrap/less/code.less | 63 - .../bootstrap/less/component-animations.less | 29 - .../public/lib/bootstrap/less/dropdowns.less | 213 - .../public/lib/bootstrap/less/forms.less | 438 - .../public/lib/bootstrap/less/glyphicons.less | 233 - .../public/lib/bootstrap/less/grid.less | 84 - .../lib/bootstrap/less/input-groups.less | 162 - .../public/lib/bootstrap/less/jumbotron.less | 44 - .../public/lib/bootstrap/less/labels.less | 64 - .../public/lib/bootstrap/less/list-group.less | 110 - .../public/lib/bootstrap/less/media.less | 56 - .../public/lib/bootstrap/less/mixins.less | 929 - .../public/lib/bootstrap/less/modals.less | 139 - .../public/lib/bootstrap/less/navbar.less | 616 - .../public/lib/bootstrap/less/navs.less | 242 - .../public/lib/bootstrap/less/normalize.less | 423 - .../public/lib/bootstrap/less/pager.less | 55 - .../public/lib/bootstrap/less/pagination.less | 88 - .../public/lib/bootstrap/less/panels.less | 241 - .../public/lib/bootstrap/less/popovers.less | 133 - .../public/lib/bootstrap/less/print.less | 101 - .../lib/bootstrap/less/progress-bars.less | 80 - .../bootstrap/less/responsive-utilities.less | 92 - .../lib/bootstrap/less/scaffolding.less | 134 - .../public/lib/bootstrap/less/tables.less | 233 - .../public/lib/bootstrap/less/theme.less | 247 - .../public/lib/bootstrap/less/thumbnails.less | 36 - .../public/lib/bootstrap/less/tooltip.less | 95 - .../public/lib/bootstrap/less/type.less | 293 - .../public/lib/bootstrap/less/utilities.less | 56 - .../public/lib/bootstrap/less/variables.less | 829 - .../public/lib/bootstrap/less/wells.less | 29 - .../public/lib/bootstrap/package.json | 70 - .../public/lib/bootstrap/test-infra/README.md | 100 - .../test-infra/npm-shrinkwrap.canonical.json | 1 - .../lib/bootstrap/test-infra/requirements.txt | 1 - .../lib/bootstrap/test-infra/s3_cache.py | 107 - .../bootstrap/test-infra/sauce_browsers.yml | 83 - .../test-infra/uncached-npm-install.sh | 4 - .../insight-ui/public/lib/jquery/.bower.json | 25 - .../insight-ui/public/lib/jquery/AUTHORS.txt | 301 - .../insight-ui/public/lib/jquery/LICENSE.txt | 36 - server/insight-ui/public/lib/jquery/README.md | 67 - .../insight-ui/public/lib/jquery/bower.json | 14 - .../insight-ui/public/lib/jquery/dist/core.js | 476 - .../public/lib/jquery/dist/jquery.js | 10253 ------- .../public/lib/jquery/dist/jquery.min.js | 4 - .../public/lib/jquery/dist/jquery.min.map | 1 - .../public/lib/jquery/dist/jquery.slim.js | 8160 ------ .../public/lib/jquery/dist/jquery.slim.min.js | 4 - .../lib/jquery/dist/jquery.slim.min.map | 1 - .../lib/jquery/external/sizzle/LICENSE.txt | 36 - .../lib/jquery/external/sizzle/dist/sizzle.js | 2272 -- .../jquery/external/sizzle/dist/sizzle.min.js | 3 - .../external/sizzle/dist/sizzle.min.map | 1 - .../public/lib/jquery/src/.eslintrc.json | 5 - .../insight-ui/public/lib/jquery/src/ajax.js | 855 - .../public/lib/jquery/src/ajax/jsonp.js | 102 - .../public/lib/jquery/src/ajax/load.js | 76 - .../public/lib/jquery/src/ajax/parseXML.js | 30 - .../public/lib/jquery/src/ajax/script.js | 77 - .../lib/jquery/src/ajax/var/location.js | 5 - .../public/lib/jquery/src/ajax/var/nonce.js | 7 - .../public/lib/jquery/src/ajax/var/rquery.js | 5 - .../public/lib/jquery/src/ajax/xhr.js | 169 - .../public/lib/jquery/src/attributes.js | 13 - .../public/lib/jquery/src/attributes/attr.js | 141 - .../lib/jquery/src/attributes/classes.js | 174 - .../public/lib/jquery/src/attributes/prop.js | 143 - .../lib/jquery/src/attributes/support.js | 33 - .../public/lib/jquery/src/attributes/val.js | 190 - .../public/lib/jquery/src/callbacks.js | 234 - .../insight-ui/public/lib/jquery/src/core.js | 476 - .../public/lib/jquery/src/core/DOMEval.js | 16 - .../public/lib/jquery/src/core/access.js | 70 - .../public/lib/jquery/src/core/init.js | 128 - .../public/lib/jquery/src/core/nodeName.js | 13 - .../public/lib/jquery/src/core/parseHTML.js | 65 - .../lib/jquery/src/core/ready-no-deferred.js | 96 - .../public/lib/jquery/src/core/ready.js | 86 - .../lib/jquery/src/core/readyException.js | 13 - .../lib/jquery/src/core/stripAndCollapse.js | 14 - .../public/lib/jquery/src/core/support.js | 20 - .../lib/jquery/src/core/var/rsingleTag.js | 6 - .../insight-ui/public/lib/jquery/src/css.js | 438 - .../public/lib/jquery/src/css/addGetHookIf.js | 26 - .../public/lib/jquery/src/css/adjustCSS.js | 71 - .../public/lib/jquery/src/css/curCSS.js | 65 - .../jquery/src/css/hiddenVisibleSelectors.js | 15 - .../public/lib/jquery/src/css/showHide.js | 105 - .../public/lib/jquery/src/css/support.js | 89 - .../lib/jquery/src/css/var/cssExpand.js | 5 - .../lib/jquery/src/css/var/getStyles.js | 17 - .../jquery/src/css/var/isHiddenWithinTree.js | 34 - .../public/lib/jquery/src/css/var/rmargin.js | 5 - .../lib/jquery/src/css/var/rnumnonpx.js | 7 - .../public/lib/jquery/src/css/var/swap.js | 26 - .../insight-ui/public/lib/jquery/src/data.js | 179 - .../public/lib/jquery/src/data/Data.js | 161 - .../lib/jquery/src/data/var/acceptData.js | 19 - .../lib/jquery/src/data/var/dataPriv.js | 7 - .../lib/jquery/src/data/var/dataUser.js | 7 - .../public/lib/jquery/src/deferred.js | 391 - .../lib/jquery/src/deferred/exceptionHook.js | 21 - .../public/lib/jquery/src/deprecated.js | 40 - .../public/lib/jquery/src/dimensions.js | 56 - .../public/lib/jquery/src/effects.js | 699 - .../public/lib/jquery/src/effects/Tween.js | 123 - .../jquery/src/effects/animatedSelector.js | 15 - .../insight-ui/public/lib/jquery/src/event.js | 746 - .../public/lib/jquery/src/event/ajax.js | 22 - .../public/lib/jquery/src/event/alias.js | 29 - .../public/lib/jquery/src/event/focusin.js | 55 - .../public/lib/jquery/src/event/support.js | 11 - .../public/lib/jquery/src/event/trigger.js | 185 - .../public/lib/jquery/src/exports/amd.js | 26 - .../public/lib/jquery/src/exports/global.js | 34 - .../public/lib/jquery/src/jquery.js | 41 - .../public/lib/jquery/src/manipulation.js | 488 - .../lib/jquery/src/manipulation/_evalUrl.js | 23 - .../jquery/src/manipulation/buildFragment.js | 104 - .../lib/jquery/src/manipulation/getAll.js | 32 - .../jquery/src/manipulation/setGlobalEval.js | 22 - .../lib/jquery/src/manipulation/support.js | 35 - .../src/manipulation/var/rcheckableType.js | 5 - .../src/manipulation/var/rscriptType.js | 5 - .../jquery/src/manipulation/var/rtagName.js | 5 - .../lib/jquery/src/manipulation/wrapMap.js | 29 - .../public/lib/jquery/src/offset.js | 229 - .../insight-ui/public/lib/jquery/src/queue.js | 145 - .../public/lib/jquery/src/queue/delay.js | 24 - .../public/lib/jquery/src/selector-native.js | 237 - .../public/lib/jquery/src/selector-sizzle.js | 19 - .../public/lib/jquery/src/selector.js | 3 - .../public/lib/jquery/src/serialize.js | 130 - .../public/lib/jquery/src/traversing.js | 191 - .../lib/jquery/src/traversing/findFilter.js | 106 - .../lib/jquery/src/traversing/var/dir.js | 22 - .../src/traversing/var/rneedsContext.js | 8 - .../lib/jquery/src/traversing/var/siblings.js | 17 - .../jquery/src/var/ObjectFunctionString.js | 7 - .../public/lib/jquery/src/var/arr.js | 5 - .../public/lib/jquery/src/var/class2type.js | 6 - .../public/lib/jquery/src/var/concat.js | 7 - .../public/lib/jquery/src/var/document.js | 5 - .../lib/jquery/src/var/documentElement.js | 7 - .../public/lib/jquery/src/var/fnToString.js | 7 - .../public/lib/jquery/src/var/getProto.js | 5 - .../public/lib/jquery/src/var/hasOwn.js | 7 - .../public/lib/jquery/src/var/indexOf.js | 7 - .../public/lib/jquery/src/var/pnum.js | 5 - .../public/lib/jquery/src/var/push.js | 7 - .../public/lib/jquery/src/var/rcssNum.js | 9 - .../lib/jquery/src/var/rnothtmlwhite.js | 8 - .../public/lib/jquery/src/var/slice.js | 7 - .../public/lib/jquery/src/var/support.js | 6 - .../public/lib/jquery/src/var/toString.js | 7 - .../insight-ui/public/lib/jquery/src/wrap.js | 77 - .../insight-ui/public/lib/moment/.bower.json | 30 - .../insight-ui/public/lib/moment/CHANGELOG.md | 402 - server/insight-ui/public/lib/moment/LICENSE | 22 - server/insight-ui/public/lib/moment/README.md | 39 - .../public/lib/moment/benchmarks/clone.js | 10 - .../insight-ui/public/lib/moment/bower.json | 20 - .../insight-ui/public/lib/moment/locale/af.js | 67 - .../public/lib/moment/locale/ar-ma.js | 57 - .../public/lib/moment/locale/ar-sa.js | 97 - .../insight-ui/public/lib/moment/locale/ar.js | 130 - .../insight-ui/public/lib/moment/locale/az.js | 103 - .../insight-ui/public/lib/moment/locale/be.js | 152 - .../insight-ui/public/lib/moment/locale/bg.js | 88 - .../insight-ui/public/lib/moment/locale/bn.js | 107 - .../insight-ui/public/lib/moment/locale/bo.js | 104 - .../insight-ui/public/lib/moment/locale/br.js | 109 - .../insight-ui/public/lib/moment/locale/bs.js | 140 - .../insight-ui/public/lib/moment/locale/ca.js | 77 - .../insight-ui/public/lib/moment/locale/cs.js | 157 - .../insight-ui/public/lib/moment/locale/cv.js | 61 - .../insight-ui/public/lib/moment/locale/cy.js | 79 - .../insight-ui/public/lib/moment/locale/da.js | 58 - .../public/lib/moment/locale/de-at.js | 74 - .../insight-ui/public/lib/moment/locale/de.js | 73 - .../insight-ui/public/lib/moment/locale/el.js | 94 - .../public/lib/moment/locale/en-au.js | 64 - .../public/lib/moment/locale/en-ca.js | 61 - .../public/lib/moment/locale/en-gb.js | 65 - .../insight-ui/public/lib/moment/locale/eo.js | 67 - .../insight-ui/public/lib/moment/locale/es.js | 77 - .../insight-ui/public/lib/moment/locale/et.js | 78 - .../insight-ui/public/lib/moment/locale/eu.js | 62 - .../insight-ui/public/lib/moment/locale/fa.js | 99 - .../insight-ui/public/lib/moment/locale/fi.js | 107 - .../insight-ui/public/lib/moment/locale/fo.js | 58 - .../public/lib/moment/locale/fr-ca.js | 56 - .../insight-ui/public/lib/moment/locale/fr.js | 60 - .../insight-ui/public/lib/moment/locale/gl.js | 73 - .../insight-ui/public/lib/moment/locale/he.js | 78 - .../insight-ui/public/lib/moment/locale/hi.js | 106 - .../insight-ui/public/lib/moment/locale/hr.js | 141 - .../insight-ui/public/lib/moment/locale/hu.js | 107 - .../public/lib/moment/locale/hy-am.js | 114 - .../insight-ui/public/lib/moment/locale/id.js | 68 - .../insight-ui/public/lib/moment/locale/is.js | 126 - .../insight-ui/public/lib/moment/locale/it.js | 68 - .../insight-ui/public/lib/moment/locale/ja.js | 59 - .../insight-ui/public/lib/moment/locale/ka.js | 109 - .../insight-ui/public/lib/moment/locale/km.js | 56 - .../insight-ui/public/lib/moment/locale/ko.js | 65 - .../insight-ui/public/lib/moment/locale/lb.js | 139 - .../insight-ui/public/lib/moment/locale/lt.js | 120 - .../insight-ui/public/lib/moment/locale/lv.js | 79 - .../insight-ui/public/lib/moment/locale/mk.js | 88 - .../insight-ui/public/lib/moment/locale/ml.js | 65 - .../insight-ui/public/lib/moment/locale/mr.js | 105 - .../public/lib/moment/locale/ms-my.js | 67 - .../insight-ui/public/lib/moment/locale/my.js | 89 - .../insight-ui/public/lib/moment/locale/nb.js | 59 - .../insight-ui/public/lib/moment/locale/ne.js | 106 - .../insight-ui/public/lib/moment/locale/nl.js | 69 - .../insight-ui/public/lib/moment/locale/nn.js | 58 - .../insight-ui/public/lib/moment/locale/pl.js | 100 - .../public/lib/moment/locale/pt-br.js | 58 - .../insight-ui/public/lib/moment/locale/pt.js | 62 - .../insight-ui/public/lib/moment/locale/ro.js | 73 - .../insight-ui/public/lib/moment/locale/ru.js | 176 - .../insight-ui/public/lib/moment/locale/sk.js | 158 - .../insight-ui/public/lib/moment/locale/sl.js | 146 - .../insight-ui/public/lib/moment/locale/sq.js | 63 - .../public/lib/moment/locale/sr-cyrl.js | 107 - .../insight-ui/public/lib/moment/locale/sr.js | 107 - .../insight-ui/public/lib/moment/locale/sv.js | 65 - .../insight-ui/public/lib/moment/locale/ta.js | 114 - .../insight-ui/public/lib/moment/locale/th.js | 59 - .../public/lib/moment/locale/tl-ph.js | 60 - .../insight-ui/public/lib/moment/locale/tr.js | 94 - .../public/lib/moment/locale/tzm-latn.js | 56 - .../public/lib/moment/locale/tzm.js | 56 - .../insight-ui/public/lib/moment/locale/uk.js | 159 - .../insight-ui/public/lib/moment/locale/uz.js | 56 - .../insight-ui/public/lib/moment/locale/vi.js | 64 - .../public/lib/moment/locale/zh-cn.js | 110 - .../public/lib/moment/locale/zh-tw.js | 86 - .../public/lib/moment/min/locales.js | 7001 ----- .../public/lib/moment/min/locales.min.js | 4 - .../lib/moment/min/moment-with-locales.js | 9394 ------- .../lib/moment/min/moment-with-locales.min.js | 10 - .../public/lib/moment/min/moment.min.js | 7 - server/insight-ui/public/lib/moment/moment.js | 2936 -- .../lib/moment/scripts/npm_prepublish.sh | 43 - .../public/lib/momentjs/.bower.json | 30 - server/insight-ui/public/lib/momentjs/LICENSE | 22 - .../insight-ui/public/lib/momentjs/bower.json | 20 - .../public/lib/momentjs/lang/ar-ma.js | 56 - .../insight-ui/public/lib/momentjs/lang/ar.js | 56 - .../insight-ui/public/lib/momentjs/lang/bg.js | 86 - .../insight-ui/public/lib/momentjs/lang/br.js | 107 - .../insight-ui/public/lib/momentjs/lang/bs.js | 139 - .../insight-ui/public/lib/momentjs/lang/ca.js | 66 - .../insight-ui/public/lib/momentjs/lang/cs.js | 155 - .../insight-ui/public/lib/momentjs/lang/cv.js | 59 - .../insight-ui/public/lib/momentjs/lang/cy.js | 77 - .../insight-ui/public/lib/momentjs/lang/da.js | 56 - .../insight-ui/public/lib/momentjs/lang/de.js | 71 - .../insight-ui/public/lib/momentjs/lang/el.js | 79 - .../public/lib/momentjs/lang/en-au.js | 62 - .../public/lib/momentjs/lang/en-ca.js | 59 - .../public/lib/momentjs/lang/en-gb.js | 63 - .../insight-ui/public/lib/momentjs/lang/eo.js | 65 - .../insight-ui/public/lib/momentjs/lang/es.js | 66 - .../insight-ui/public/lib/momentjs/lang/et.js | 76 - .../insight-ui/public/lib/momentjs/lang/eu.js | 60 - .../insight-ui/public/lib/momentjs/lang/fa.js | 97 - .../insight-ui/public/lib/momentjs/lang/fi.js | 103 - .../insight-ui/public/lib/momentjs/lang/fo.js | 56 - .../public/lib/momentjs/lang/fr-ca.js | 54 - .../insight-ui/public/lib/momentjs/lang/fr.js | 58 - .../insight-ui/public/lib/momentjs/lang/gl.js | 71 - .../insight-ui/public/lib/momentjs/lang/he.js | 77 - .../insight-ui/public/lib/momentjs/lang/hi.js | 105 - .../insight-ui/public/lib/momentjs/lang/hr.js | 140 - .../insight-ui/public/lib/momentjs/lang/hu.js | 98 - .../public/lib/momentjs/lang/hy-am.js | 113 - .../insight-ui/public/lib/momentjs/lang/id.js | 67 - .../insight-ui/public/lib/momentjs/lang/is.js | 124 - .../insight-ui/public/lib/momentjs/lang/it.js | 59 - .../insight-ui/public/lib/momentjs/lang/ja.js | 58 - .../insight-ui/public/lib/momentjs/lang/ka.js | 108 - .../insight-ui/public/lib/momentjs/lang/ko.js | 63 - .../insight-ui/public/lib/momentjs/lang/lb.js | 160 - .../insight-ui/public/lib/momentjs/lang/lt.js | 118 - .../insight-ui/public/lib/momentjs/lang/lv.js | 77 - .../insight-ui/public/lib/momentjs/lang/mk.js | 86 - .../insight-ui/public/lib/momentjs/lang/ml.js | 64 - .../insight-ui/public/lib/momentjs/lang/mr.js | 104 - .../public/lib/momentjs/lang/ms-my.js | 66 - .../insight-ui/public/lib/momentjs/lang/nb.js | 57 - .../insight-ui/public/lib/momentjs/lang/ne.js | 105 - .../insight-ui/public/lib/momentjs/lang/nl.js | 67 - .../insight-ui/public/lib/momentjs/lang/nn.js | 56 - .../insight-ui/public/lib/momentjs/lang/pl.js | 98 - .../public/lib/momentjs/lang/pt-br.js | 56 - .../insight-ui/public/lib/momentjs/lang/pt.js | 60 - .../insight-ui/public/lib/momentjs/lang/ro.js | 72 - .../insight-ui/public/lib/momentjs/lang/rs.js | 139 - .../insight-ui/public/lib/momentjs/lang/ru.js | 163 - .../insight-ui/public/lib/momentjs/lang/sk.js | 156 - .../insight-ui/public/lib/momentjs/lang/sl.js | 144 - .../insight-ui/public/lib/momentjs/lang/sq.js | 57 - .../insight-ui/public/lib/momentjs/lang/sv.js | 63 - .../insight-ui/public/lib/momentjs/lang/ta.js | 112 - .../insight-ui/public/lib/momentjs/lang/th.js | 58 - .../public/lib/momentjs/lang/tl-ph.js | 58 - .../insight-ui/public/lib/momentjs/lang/tr.js | 93 - .../public/lib/momentjs/lang/tzm-la.js | 55 - .../public/lib/momentjs/lang/tzm.js | 55 - .../insight-ui/public/lib/momentjs/lang/uk.js | 157 - .../insight-ui/public/lib/momentjs/lang/uz.js | 55 - .../insight-ui/public/lib/momentjs/lang/vn.js | 62 - .../public/lib/momentjs/lang/zh-cn.js | 108 - .../public/lib/momentjs/lang/zh-tw.js | 84 - .../public/lib/momentjs/min/langs.js | 5841 ---- .../public/lib/momentjs/min/langs.min.js | 3 - .../lib/momentjs/min/moment-with-langs.js | 7768 ------ .../lib/momentjs/min/moment-with-langs.min.js | 9 - .../public/lib/momentjs/min/moment.min.js | 6 - .../insight-ui/public/lib/momentjs/moment.js | 2400 -- .../insight-ui/public/lib/momentjs/readme.md | 349 - .../public/lib/ngprogress/.bower.json | 30 - .../insight-ui/public/lib/ngprogress/LICENSE | 21 - .../public/lib/ngprogress/bower.json | 17 - .../public/lib/ngprogress/build/ngProgress.js | 234 - .../lib/ngprogress/build/ngProgress.min.js | 8 - .../public/lib/ngprogress/ngProgress.css | 28 - .../public/lib/ngprogress/readme.md | 130 - .../public/lib/qrcode-generator/.bower.json | 20 - .../public/lib/qrcode-generator/bower.json | 10 - .../public/lib/qrcode-generator/js/qrcode.js | 1634 -- .../lib/qrcode-generator/js/qrcode_SJIS.js | 28 - .../lib/qrcode-generator/js/sample.html | 20 - .../public/lib/qrcode-generator/js/sample.js | 20 - .../lib/zeroclipboard/ZeroClipboard.swf | Bin 2157 -> 0 bytes server/insight-ui/public/robots.txt | 4 - .../insight-ui/public/sound/transaction.mp3 | Bin 12539 -> 0 bytes server/insight-ui/public/src/css/common.css | 852 - server/insight-ui/public/src/js/app.js | 39 - server/insight-ui/public/src/js/config.js | 77 - .../public/src/js/controllers/address.js | 60 - .../public/src/js/controllers/blocks.js | 100 - .../public/src/js/controllers/connection.js | 53 - .../public/src/js/controllers/currency.js | 64 - .../public/src/js/controllers/footer.js | 40 - .../public/src/js/controllers/header.js | 47 - .../public/src/js/controllers/index.js | 53 - .../public/src/js/controllers/messages.js | 50 - .../public/src/js/controllers/scanner.js | 149 - .../public/src/js/controllers/search.js | 64 - .../public/src/js/controllers/status.js | 55 - .../public/src/js/controllers/transactions.js | 213 - server/insight-ui/public/src/js/directives.js | 91 - server/insight-ui/public/src/js/filters.js | 15 - server/insight-ui/public/src/js/init.js | 6 - .../ios-imagefile-megapixel/megapix-image.js | 254 - .../public/src/js/jsqrcode/alignpat.js | 279 - .../public/src/js/jsqrcode/bitmat.js | 111 - .../public/src/js/jsqrcode/bmparser.js | 203 - .../public/src/js/jsqrcode/datablock.js | 117 - .../public/src/js/jsqrcode/databr.js | 325 - .../public/src/js/jsqrcode/datamask.js | 207 - .../public/src/js/jsqrcode/decoder.js | 95 - .../public/src/js/jsqrcode/detector.js | 413 - .../public/src/js/jsqrcode/errorlevel.js | 58 - .../public/src/js/jsqrcode/findpat.js | 649 - .../public/src/js/jsqrcode/formatinf.js | 104 - .../public/src/js/jsqrcode/gf256.js | 117 - .../public/src/js/jsqrcode/gf256poly.js | 230 - .../insight-ui/public/src/js/jsqrcode/grid.js | 152 - .../public/src/js/jsqrcode/qrcode.js | 319 - .../public/src/js/jsqrcode/rsdecoder.js | 178 - .../public/src/js/jsqrcode/test.html | 149 - .../public/src/js/jsqrcode/version.js | 261 - .../public/src/js/services/address.js | 24 - .../insight-ui/public/src/js/services/api.js | 9 - .../public/src/js/services/blocks.js | 31 - .../public/src/js/services/currency.js | 6 - .../public/src/js/services/global.js | 12 - .../public/src/js/services/socket.js | 75 - .../public/src/js/services/status.js | 17 - .../public/src/js/services/transactions.js | 39 - .../insight-ui/public/src/js/translations.js | 7 - server/insight-ui/public/src/templates/api.js | 9 - server/insight-ui/public/views/404.html | 6 - server/insight-ui/public/views/address.html | 80 - server/insight-ui/public/views/block.html | 128 - .../insight-ui/public/views/block_list.html | 69 - .../public/views/dummy-translations.html | 2 - .../public/views/includes/connection.html | 22 - .../public/views/includes/currency.html | 18 - .../public/views/includes/header.html | 48 - .../public/views/includes/infoStatus.html | 4 - .../public/views/includes/search.html | 6 - server/insight-ui/public/views/index.html | 79 - .../public/views/messages_verify.html | 81 - server/insight-ui/public/views/redirect.html | 1 - server/insight-ui/public/views/status.html | 124 - .../insight-ui/public/views/transaction.html | 98 - .../public/views/transaction/list.html | 11 - .../public/views/transaction/tx.html | 211 - .../public/views/transaction_sendraw.html | 55 - server/package-lock.json | 3146 --- yarn.lock | 362 + 668 files changed, 391 insertions(+), 179625 deletions(-) delete mode 100644 .bowerrc delete mode 100644 .editorconfig delete mode 100644 .jshintrc delete mode 100644 .npmignore delete mode 100644 Gruntfile.js delete mode 100644 bitcore-node/index.js delete mode 100644 bitcore-node/service.js delete mode 100644 bower.json delete mode 100644 po/de_DE.po delete mode 100644 po/es.po delete mode 100644 po/ja.po delete mode 100644 public/css/main.min.css delete mode 100644 public/fonts/glyphicons-halflings-regular.eot delete mode 100644 public/fonts/glyphicons-halflings-regular.svg delete mode 100644 public/fonts/glyphicons-halflings-regular.ttf delete mode 100644 public/fonts/glyphicons-halflings-regular.woff delete mode 100755 public/img/.gitignore delete mode 100644 public/img/angularjs.png delete mode 100644 public/img/icons/copy.png delete mode 100644 public/img/icons/favicon.ico delete mode 100644 public/img/leveldb.png delete mode 100644 public/img/loading.gif delete mode 100644 public/img/logo.svg delete mode 100644 public/img/nodejs.png delete mode 100644 public/index-template.html delete mode 100644 public/js/angularjs-all.min.js delete mode 100644 public/js/main.min.js delete mode 100644 public/js/vendors.min.js delete mode 100644 public/lib/zeroclipboard/ZeroClipboard.swf delete mode 100644 public/robots.txt delete mode 100644 public/sound/transaction.mp3 delete mode 100644 public/src/css/common.css delete mode 100644 public/src/js/app.js delete mode 100644 public/src/js/config.js delete mode 100644 public/src/js/controllers/address.js delete mode 100644 public/src/js/controllers/blocks.js delete mode 100644 public/src/js/controllers/connection.js delete mode 100644 public/src/js/controllers/currency.js delete mode 100644 public/src/js/controllers/footer.js delete mode 100644 public/src/js/controllers/header.js delete mode 100644 public/src/js/controllers/index.js delete mode 100644 public/src/js/controllers/messages.js delete mode 100644 public/src/js/controllers/scanner.js delete mode 100644 public/src/js/controllers/search.js delete mode 100644 public/src/js/controllers/status.js delete mode 100644 public/src/js/controllers/transactions.js delete mode 100644 public/src/js/directives.js delete mode 100644 public/src/js/filters.js delete mode 100644 public/src/js/init.js delete mode 100644 public/src/js/ios-imagefile-megapixel/megapix-image.js delete mode 100644 public/src/js/jsqrcode/alignpat.js delete mode 100644 public/src/js/jsqrcode/bitmat.js delete mode 100644 public/src/js/jsqrcode/bmparser.js delete mode 100644 public/src/js/jsqrcode/datablock.js delete mode 100644 public/src/js/jsqrcode/databr.js delete mode 100644 public/src/js/jsqrcode/datamask.js delete mode 100644 public/src/js/jsqrcode/decoder.js delete mode 100644 public/src/js/jsqrcode/detector.js delete mode 100644 public/src/js/jsqrcode/errorlevel.js delete mode 100644 public/src/js/jsqrcode/findpat.js delete mode 100644 public/src/js/jsqrcode/formatinf.js delete mode 100644 public/src/js/jsqrcode/gf256.js delete mode 100644 public/src/js/jsqrcode/gf256poly.js delete mode 100644 public/src/js/jsqrcode/grid.js delete mode 100644 public/src/js/jsqrcode/qrcode.js delete mode 100644 public/src/js/jsqrcode/rsdecoder.js delete mode 100644 public/src/js/jsqrcode/test.html delete mode 100644 public/src/js/jsqrcode/version.js delete mode 100644 public/src/js/services/address.js delete mode 100644 public/src/js/services/api.js delete mode 100644 public/src/js/services/blocks.js delete mode 100644 public/src/js/services/currency.js delete mode 100644 public/src/js/services/global.js delete mode 100644 public/src/js/services/socket.js delete mode 100644 public/src/js/services/status.js delete mode 100644 public/src/js/services/transactions.js delete mode 100644 public/src/js/translations.js delete mode 100644 public/src/templates/api.js delete mode 100644 public/views/404.html delete mode 100644 public/views/address.html delete mode 100644 public/views/block.html delete mode 100644 public/views/block_list.html delete mode 100644 public/views/dummy-translations.html delete mode 100644 public/views/includes/connection.html delete mode 100644 public/views/includes/currency.html delete mode 100644 public/views/includes/header.html delete mode 100644 public/views/includes/infoStatus.html delete mode 100644 public/views/includes/search.html delete mode 100644 public/views/index.html delete mode 100644 public/views/messages_verify.html delete mode 100644 public/views/redirect.html delete mode 100644 public/views/status.html delete mode 100644 public/views/transaction.html delete mode 100644 public/views/transaction/list.html delete mode 100644 public/views/transaction/tx.html delete mode 100644 public/views/transaction_sendraw.html delete mode 100644 server/insight-ui/Gruntfile.js delete mode 100644 server/insight-ui/README.md delete mode 100644 server/insight-ui/bitcore-node/index.js delete mode 100644 server/insight-ui/bitcore-node/service.js delete mode 100644 server/insight-ui/bower.json delete mode 100644 server/insight-ui/package-lock.json delete mode 100644 server/insight-ui/package.json delete mode 100644 server/insight-ui/po/de_DE.po delete mode 100644 server/insight-ui/po/es.po delete mode 100644 server/insight-ui/po/ja.po delete mode 100644 server/insight-ui/public/css/main.css delete mode 100644 server/insight-ui/public/css/main.min.css delete mode 100644 server/insight-ui/public/fonts/glyphicons-halflings-regular.eot delete mode 100644 server/insight-ui/public/fonts/glyphicons-halflings-regular.svg delete mode 100644 server/insight-ui/public/fonts/glyphicons-halflings-regular.ttf delete mode 100644 server/insight-ui/public/fonts/glyphicons-halflings-regular.woff delete mode 100755 server/insight-ui/public/img/.gitignore delete mode 100644 server/insight-ui/public/img/angularjs.png delete mode 100644 server/insight-ui/public/img/icons/copy.png delete mode 100644 server/insight-ui/public/img/icons/favicon.ico delete mode 100644 server/insight-ui/public/img/leveldb.png delete mode 100644 server/insight-ui/public/img/loading.gif delete mode 100644 server/insight-ui/public/img/logo.svg delete mode 100644 server/insight-ui/public/img/nodejs.png delete mode 100644 server/insight-ui/public/index-template.html delete mode 100644 server/insight-ui/public/js/angularjs-all.js delete mode 100644 server/insight-ui/public/js/angularjs-all.min.js delete mode 100644 server/insight-ui/public/js/main.js delete mode 100644 server/insight-ui/public/js/main.min.js delete mode 100644 server/insight-ui/public/js/vendors.js delete mode 100644 server/insight-ui/public/js/vendors.min.js delete mode 100644 server/insight-ui/public/lib/angular-animate/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-animate/LICENSE.md delete mode 100644 server/insight-ui/public/lib/angular-animate/README.md delete mode 100644 server/insight-ui/public/lib/angular-animate/angular-animate.js delete mode 100644 server/insight-ui/public/lib/angular-animate/angular-animate.min.js delete mode 100644 server/insight-ui/public/lib/angular-animate/angular-animate.min.js.map delete mode 100644 server/insight-ui/public/lib/angular-animate/bower.json delete mode 100644 server/insight-ui/public/lib/angular-animate/index.js delete mode 100644 server/insight-ui/public/lib/angular-animate/package.json delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/bower.json delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.js delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.js delete mode 100644 server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.min.js delete mode 100644 server/insight-ui/public/lib/angular-gettext/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-gettext/LICENSE delete mode 100644 server/insight-ui/public/lib/angular-gettext/README.md delete mode 100644 server/insight-ui/public/lib/angular-gettext/bower.json delete mode 100644 server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.js delete mode 100644 server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.min.js delete mode 100644 server/insight-ui/public/lib/angular-gettext/package.json delete mode 100644 server/insight-ui/public/lib/angular-moment/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-moment/.editorconfig delete mode 100644 server/insight-ui/public/lib/angular-moment/.gitignore delete mode 100644 server/insight-ui/public/lib/angular-moment/.jshintrc delete mode 100644 server/insight-ui/public/lib/angular-moment/.npmignore delete mode 100644 server/insight-ui/public/lib/angular-moment/.travis.yml delete mode 100644 server/insight-ui/public/lib/angular-moment/CHANGELOG.md delete mode 100644 server/insight-ui/public/lib/angular-moment/CONTRIBUTING.md delete mode 100644 server/insight-ui/public/lib/angular-moment/Gruntfile.js delete mode 100644 server/insight-ui/public/lib/angular-moment/README.md delete mode 100644 server/insight-ui/public/lib/angular-moment/angular-moment.js delete mode 100644 server/insight-ui/public/lib/angular-moment/angular-moment.min.js delete mode 100644 server/insight-ui/public/lib/angular-moment/angular-moment.min.js.map delete mode 100644 server/insight-ui/public/lib/angular-moment/bower.json delete mode 100644 server/insight-ui/public/lib/angular-moment/karma.conf.js delete mode 100644 server/insight-ui/public/lib/angular-moment/package.json delete mode 100644 server/insight-ui/public/lib/angular-moment/tests.js delete mode 100644 server/insight-ui/public/lib/angular-qrcode/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-qrcode/README.md delete mode 100644 server/insight-ui/public/lib/angular-qrcode/bower.json delete mode 100644 server/insight-ui/public/lib/angular-qrcode/index.html delete mode 100644 server/insight-ui/public/lib/angular-qrcode/qrcode.js delete mode 100644 server/insight-ui/public/lib/angular-resource/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-resource/LICENSE.md delete mode 100644 server/insight-ui/public/lib/angular-resource/README.md delete mode 100644 server/insight-ui/public/lib/angular-resource/angular-resource.js delete mode 100644 server/insight-ui/public/lib/angular-resource/angular-resource.min.js delete mode 100644 server/insight-ui/public/lib/angular-resource/angular-resource.min.js.map delete mode 100644 server/insight-ui/public/lib/angular-resource/bower.json delete mode 100644 server/insight-ui/public/lib/angular-resource/index.js delete mode 100644 server/insight-ui/public/lib/angular-resource/package.json delete mode 100644 server/insight-ui/public/lib/angular-route/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-route/LICENSE.md delete mode 100644 server/insight-ui/public/lib/angular-route/README.md delete mode 100644 server/insight-ui/public/lib/angular-route/angular-route.js delete mode 100644 server/insight-ui/public/lib/angular-route/angular-route.min.js delete mode 100644 server/insight-ui/public/lib/angular-route/angular-route.min.js.map delete mode 100644 server/insight-ui/public/lib/angular-route/bower.json delete mode 100644 server/insight-ui/public/lib/angular-route/index.js delete mode 100644 server/insight-ui/public/lib/angular-route/package.json delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/.bower.json delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/.travis.yml delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/CHANGELOG.md delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/bower.json delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/ui-utils-ieshiv.js delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/ui-utils-ieshiv.min.js delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/ui-utils.js delete mode 100644 server/insight-ui/public/lib/angular-ui-utils/ui-utils.min.js delete mode 100644 server/insight-ui/public/lib/angular/.bower.json delete mode 100644 server/insight-ui/public/lib/angular/LICENSE.md delete mode 100644 server/insight-ui/public/lib/angular/README.md delete mode 100644 server/insight-ui/public/lib/angular/angular-csp.css delete mode 100644 server/insight-ui/public/lib/angular/angular.js delete mode 100644 server/insight-ui/public/lib/angular/angular.min.js delete mode 100644 server/insight-ui/public/lib/angular/angular.min.js.gzip delete mode 100644 server/insight-ui/public/lib/angular/angular.min.js.map delete mode 100644 server/insight-ui/public/lib/angular/bower.json delete mode 100644 server/insight-ui/public/lib/angular/index.js delete mode 100644 server/insight-ui/public/lib/angular/package.json delete mode 100644 server/insight-ui/public/lib/bootstrap/.bower.json delete mode 100644 server/insight-ui/public/lib/bootstrap/Gruntfile.js delete mode 100644 server/insight-ui/public/lib/bootstrap/LICENSE delete mode 100644 server/insight-ui/public/lib/bootstrap/README.md delete mode 100644 server/insight-ui/public/lib/bootstrap/bower.json delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap-theme.css delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap-theme.css.map delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap-theme.min.css delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap.css delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap.css.map delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/css/bootstrap.min.css delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.eot delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.svg delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/fonts/glyphicons-halflings-regular.woff delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/js/bootstrap.js delete mode 100644 server/insight-ui/public/lib/bootstrap/dist/js/bootstrap.min.js delete mode 100644 server/insight-ui/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot delete mode 100644 server/insight-ui/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg delete mode 100644 server/insight-ui/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf delete mode 100644 server/insight-ui/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff delete mode 100644 server/insight-ui/public/lib/bootstrap/grunt/bs-glyphicons-data-generator.js delete mode 100644 server/insight-ui/public/lib/bootstrap/grunt/bs-lessdoc-parser.js delete mode 100644 server/insight-ui/public/lib/bootstrap/grunt/bs-raw-files-generator.js delete mode 100644 server/insight-ui/public/lib/bootstrap/grunt/shrinkwrap.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/affix.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/alert.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/button.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/carousel.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/collapse.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/dropdown.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/modal.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/popover.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/scrollspy.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/tab.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/tooltip.js delete mode 100644 server/insight-ui/public/lib/bootstrap/js/transition.js delete mode 100644 server/insight-ui/public/lib/bootstrap/less/alerts.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/badges.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/bootstrap.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/breadcrumbs.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/button-groups.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/buttons.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/carousel.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/close.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/code.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/component-animations.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/dropdowns.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/forms.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/glyphicons.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/grid.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/input-groups.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/jumbotron.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/labels.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/list-group.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/media.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/mixins.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/modals.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/navbar.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/navs.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/normalize.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/pager.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/pagination.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/panels.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/popovers.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/print.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/progress-bars.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/responsive-utilities.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/scaffolding.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/tables.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/theme.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/thumbnails.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/tooltip.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/type.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/utilities.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/variables.less delete mode 100644 server/insight-ui/public/lib/bootstrap/less/wells.less delete mode 100644 server/insight-ui/public/lib/bootstrap/package.json delete mode 100644 server/insight-ui/public/lib/bootstrap/test-infra/README.md delete mode 100644 server/insight-ui/public/lib/bootstrap/test-infra/npm-shrinkwrap.canonical.json delete mode 100644 server/insight-ui/public/lib/bootstrap/test-infra/requirements.txt delete mode 100755 server/insight-ui/public/lib/bootstrap/test-infra/s3_cache.py delete mode 100644 server/insight-ui/public/lib/bootstrap/test-infra/sauce_browsers.yml delete mode 100755 server/insight-ui/public/lib/bootstrap/test-infra/uncached-npm-install.sh delete mode 100644 server/insight-ui/public/lib/jquery/.bower.json delete mode 100644 server/insight-ui/public/lib/jquery/AUTHORS.txt delete mode 100644 server/insight-ui/public/lib/jquery/LICENSE.txt delete mode 100644 server/insight-ui/public/lib/jquery/README.md delete mode 100644 server/insight-ui/public/lib/jquery/bower.json delete mode 100644 server/insight-ui/public/lib/jquery/dist/core.js delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.js delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.min.js delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.min.map delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.slim.js delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.slim.min.js delete mode 100644 server/insight-ui/public/lib/jquery/dist/jquery.slim.min.map delete mode 100644 server/insight-ui/public/lib/jquery/external/sizzle/LICENSE.txt delete mode 100644 server/insight-ui/public/lib/jquery/external/sizzle/dist/sizzle.js delete mode 100644 server/insight-ui/public/lib/jquery/external/sizzle/dist/sizzle.min.js delete mode 100644 server/insight-ui/public/lib/jquery/external/sizzle/dist/sizzle.min.map delete mode 100644 server/insight-ui/public/lib/jquery/src/.eslintrc.json delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/jsonp.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/load.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/parseXML.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/script.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/var/location.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/var/nonce.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/var/rquery.js delete mode 100644 server/insight-ui/public/lib/jquery/src/ajax/xhr.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes/attr.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes/classes.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes/prop.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/attributes/val.js delete mode 100644 server/insight-ui/public/lib/jquery/src/callbacks.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/DOMEval.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/access.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/init.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/nodeName.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/parseHTML.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/ready-no-deferred.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/ready.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/readyException.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/stripAndCollapse.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/core/var/rsingleTag.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/addGetHookIf.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/adjustCSS.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/curCSS.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/hiddenVisibleSelectors.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/showHide.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/cssExpand.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/getStyles.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/isHiddenWithinTree.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/rmargin.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/rnumnonpx.js delete mode 100644 server/insight-ui/public/lib/jquery/src/css/var/swap.js delete mode 100644 server/insight-ui/public/lib/jquery/src/data.js delete mode 100644 server/insight-ui/public/lib/jquery/src/data/Data.js delete mode 100644 server/insight-ui/public/lib/jquery/src/data/var/acceptData.js delete mode 100644 server/insight-ui/public/lib/jquery/src/data/var/dataPriv.js delete mode 100644 server/insight-ui/public/lib/jquery/src/data/var/dataUser.js delete mode 100644 server/insight-ui/public/lib/jquery/src/deferred.js delete mode 100644 server/insight-ui/public/lib/jquery/src/deferred/exceptionHook.js delete mode 100644 server/insight-ui/public/lib/jquery/src/deprecated.js delete mode 100644 server/insight-ui/public/lib/jquery/src/dimensions.js delete mode 100644 server/insight-ui/public/lib/jquery/src/effects.js delete mode 100644 server/insight-ui/public/lib/jquery/src/effects/Tween.js delete mode 100644 server/insight-ui/public/lib/jquery/src/effects/animatedSelector.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event/ajax.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event/alias.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event/focusin.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/event/trigger.js delete mode 100644 server/insight-ui/public/lib/jquery/src/exports/amd.js delete mode 100644 server/insight-ui/public/lib/jquery/src/exports/global.js delete mode 100644 server/insight-ui/public/lib/jquery/src/jquery.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/_evalUrl.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/buildFragment.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/getAll.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/setGlobalEval.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/var/rcheckableType.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/var/rscriptType.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/var/rtagName.js delete mode 100644 server/insight-ui/public/lib/jquery/src/manipulation/wrapMap.js delete mode 100644 server/insight-ui/public/lib/jquery/src/offset.js delete mode 100644 server/insight-ui/public/lib/jquery/src/queue.js delete mode 100644 server/insight-ui/public/lib/jquery/src/queue/delay.js delete mode 100644 server/insight-ui/public/lib/jquery/src/selector-native.js delete mode 100644 server/insight-ui/public/lib/jquery/src/selector-sizzle.js delete mode 100644 server/insight-ui/public/lib/jquery/src/selector.js delete mode 100644 server/insight-ui/public/lib/jquery/src/serialize.js delete mode 100644 server/insight-ui/public/lib/jquery/src/traversing.js delete mode 100644 server/insight-ui/public/lib/jquery/src/traversing/findFilter.js delete mode 100644 server/insight-ui/public/lib/jquery/src/traversing/var/dir.js delete mode 100644 server/insight-ui/public/lib/jquery/src/traversing/var/rneedsContext.js delete mode 100644 server/insight-ui/public/lib/jquery/src/traversing/var/siblings.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/ObjectFunctionString.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/arr.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/class2type.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/concat.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/document.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/documentElement.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/fnToString.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/getProto.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/hasOwn.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/indexOf.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/pnum.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/push.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/rcssNum.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/rnothtmlwhite.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/slice.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/support.js delete mode 100644 server/insight-ui/public/lib/jquery/src/var/toString.js delete mode 100644 server/insight-ui/public/lib/jquery/src/wrap.js delete mode 100644 server/insight-ui/public/lib/moment/.bower.json delete mode 100644 server/insight-ui/public/lib/moment/CHANGELOG.md delete mode 100644 server/insight-ui/public/lib/moment/LICENSE delete mode 100644 server/insight-ui/public/lib/moment/README.md delete mode 100644 server/insight-ui/public/lib/moment/benchmarks/clone.js delete mode 100644 server/insight-ui/public/lib/moment/bower.json delete mode 100644 server/insight-ui/public/lib/moment/locale/af.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ar-ma.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ar-sa.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ar.js delete mode 100644 server/insight-ui/public/lib/moment/locale/az.js delete mode 100644 server/insight-ui/public/lib/moment/locale/be.js delete mode 100644 server/insight-ui/public/lib/moment/locale/bg.js delete mode 100644 server/insight-ui/public/lib/moment/locale/bn.js delete mode 100644 server/insight-ui/public/lib/moment/locale/bo.js delete mode 100644 server/insight-ui/public/lib/moment/locale/br.js delete mode 100644 server/insight-ui/public/lib/moment/locale/bs.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ca.js delete mode 100644 server/insight-ui/public/lib/moment/locale/cs.js delete mode 100644 server/insight-ui/public/lib/moment/locale/cv.js delete mode 100644 server/insight-ui/public/lib/moment/locale/cy.js delete mode 100644 server/insight-ui/public/lib/moment/locale/da.js delete mode 100644 server/insight-ui/public/lib/moment/locale/de-at.js delete mode 100644 server/insight-ui/public/lib/moment/locale/de.js delete mode 100644 server/insight-ui/public/lib/moment/locale/el.js delete mode 100644 server/insight-ui/public/lib/moment/locale/en-au.js delete mode 100644 server/insight-ui/public/lib/moment/locale/en-ca.js delete mode 100644 server/insight-ui/public/lib/moment/locale/en-gb.js delete mode 100644 server/insight-ui/public/lib/moment/locale/eo.js delete mode 100644 server/insight-ui/public/lib/moment/locale/es.js delete mode 100644 server/insight-ui/public/lib/moment/locale/et.js delete mode 100644 server/insight-ui/public/lib/moment/locale/eu.js delete mode 100644 server/insight-ui/public/lib/moment/locale/fa.js delete mode 100644 server/insight-ui/public/lib/moment/locale/fi.js delete mode 100644 server/insight-ui/public/lib/moment/locale/fo.js delete mode 100644 server/insight-ui/public/lib/moment/locale/fr-ca.js delete mode 100644 server/insight-ui/public/lib/moment/locale/fr.js delete mode 100644 server/insight-ui/public/lib/moment/locale/gl.js delete mode 100644 server/insight-ui/public/lib/moment/locale/he.js delete mode 100644 server/insight-ui/public/lib/moment/locale/hi.js delete mode 100644 server/insight-ui/public/lib/moment/locale/hr.js delete mode 100644 server/insight-ui/public/lib/moment/locale/hu.js delete mode 100644 server/insight-ui/public/lib/moment/locale/hy-am.js delete mode 100644 server/insight-ui/public/lib/moment/locale/id.js delete mode 100644 server/insight-ui/public/lib/moment/locale/is.js delete mode 100644 server/insight-ui/public/lib/moment/locale/it.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ja.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ka.js delete mode 100644 server/insight-ui/public/lib/moment/locale/km.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ko.js delete mode 100644 server/insight-ui/public/lib/moment/locale/lb.js delete mode 100644 server/insight-ui/public/lib/moment/locale/lt.js delete mode 100644 server/insight-ui/public/lib/moment/locale/lv.js delete mode 100644 server/insight-ui/public/lib/moment/locale/mk.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ml.js delete mode 100644 server/insight-ui/public/lib/moment/locale/mr.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ms-my.js delete mode 100644 server/insight-ui/public/lib/moment/locale/my.js delete mode 100644 server/insight-ui/public/lib/moment/locale/nb.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ne.js delete mode 100644 server/insight-ui/public/lib/moment/locale/nl.js delete mode 100644 server/insight-ui/public/lib/moment/locale/nn.js delete mode 100644 server/insight-ui/public/lib/moment/locale/pl.js delete mode 100644 server/insight-ui/public/lib/moment/locale/pt-br.js delete mode 100644 server/insight-ui/public/lib/moment/locale/pt.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ro.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ru.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sk.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sl.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sq.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sr-cyrl.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sr.js delete mode 100644 server/insight-ui/public/lib/moment/locale/sv.js delete mode 100644 server/insight-ui/public/lib/moment/locale/ta.js delete mode 100644 server/insight-ui/public/lib/moment/locale/th.js delete mode 100644 server/insight-ui/public/lib/moment/locale/tl-ph.js delete mode 100644 server/insight-ui/public/lib/moment/locale/tr.js delete mode 100644 server/insight-ui/public/lib/moment/locale/tzm-latn.js delete mode 100644 server/insight-ui/public/lib/moment/locale/tzm.js delete mode 100644 server/insight-ui/public/lib/moment/locale/uk.js delete mode 100644 server/insight-ui/public/lib/moment/locale/uz.js delete mode 100644 server/insight-ui/public/lib/moment/locale/vi.js delete mode 100644 server/insight-ui/public/lib/moment/locale/zh-cn.js delete mode 100644 server/insight-ui/public/lib/moment/locale/zh-tw.js delete mode 100644 server/insight-ui/public/lib/moment/min/locales.js delete mode 100644 server/insight-ui/public/lib/moment/min/locales.min.js delete mode 100644 server/insight-ui/public/lib/moment/min/moment-with-locales.js delete mode 100644 server/insight-ui/public/lib/moment/min/moment-with-locales.min.js delete mode 100644 server/insight-ui/public/lib/moment/min/moment.min.js delete mode 100644 server/insight-ui/public/lib/moment/moment.js delete mode 100755 server/insight-ui/public/lib/moment/scripts/npm_prepublish.sh delete mode 100644 server/insight-ui/public/lib/momentjs/.bower.json delete mode 100644 server/insight-ui/public/lib/momentjs/LICENSE delete mode 100644 server/insight-ui/public/lib/momentjs/bower.json delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ar-ma.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ar.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/bg.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/br.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/bs.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ca.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/cs.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/cv.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/cy.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/da.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/de.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/el.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/en-au.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/en-ca.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/en-gb.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/eo.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/es.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/et.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/eu.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/fa.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/fi.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/fo.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/fr-ca.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/fr.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/gl.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/he.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/hi.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/hr.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/hu.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/hy-am.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/id.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/is.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/it.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ja.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ka.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ko.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/lb.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/lt.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/lv.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/mk.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ml.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/mr.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ms-my.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/nb.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ne.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/nl.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/nn.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/pl.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/pt-br.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/pt.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ro.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/rs.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ru.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/sk.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/sl.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/sq.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/sv.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/ta.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/th.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/tl-ph.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/tr.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/tzm-la.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/tzm.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/uk.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/uz.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/vn.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/zh-cn.js delete mode 100644 server/insight-ui/public/lib/momentjs/lang/zh-tw.js delete mode 100644 server/insight-ui/public/lib/momentjs/min/langs.js delete mode 100644 server/insight-ui/public/lib/momentjs/min/langs.min.js delete mode 100644 server/insight-ui/public/lib/momentjs/min/moment-with-langs.js delete mode 100644 server/insight-ui/public/lib/momentjs/min/moment-with-langs.min.js delete mode 100644 server/insight-ui/public/lib/momentjs/min/moment.min.js delete mode 100644 server/insight-ui/public/lib/momentjs/moment.js delete mode 100644 server/insight-ui/public/lib/momentjs/readme.md delete mode 100644 server/insight-ui/public/lib/ngprogress/.bower.json delete mode 100644 server/insight-ui/public/lib/ngprogress/LICENSE delete mode 100644 server/insight-ui/public/lib/ngprogress/bower.json delete mode 100644 server/insight-ui/public/lib/ngprogress/build/ngProgress.js delete mode 100644 server/insight-ui/public/lib/ngprogress/build/ngProgress.min.js delete mode 100644 server/insight-ui/public/lib/ngprogress/ngProgress.css delete mode 100644 server/insight-ui/public/lib/ngprogress/readme.md delete mode 100644 server/insight-ui/public/lib/qrcode-generator/.bower.json delete mode 100644 server/insight-ui/public/lib/qrcode-generator/bower.json delete mode 100644 server/insight-ui/public/lib/qrcode-generator/js/qrcode.js delete mode 100644 server/insight-ui/public/lib/qrcode-generator/js/qrcode_SJIS.js delete mode 100644 server/insight-ui/public/lib/qrcode-generator/js/sample.html delete mode 100644 server/insight-ui/public/lib/qrcode-generator/js/sample.js delete mode 100644 server/insight-ui/public/lib/zeroclipboard/ZeroClipboard.swf delete mode 100644 server/insight-ui/public/robots.txt delete mode 100644 server/insight-ui/public/sound/transaction.mp3 delete mode 100644 server/insight-ui/public/src/css/common.css delete mode 100644 server/insight-ui/public/src/js/app.js delete mode 100644 server/insight-ui/public/src/js/config.js delete mode 100644 server/insight-ui/public/src/js/controllers/address.js delete mode 100644 server/insight-ui/public/src/js/controllers/blocks.js delete mode 100644 server/insight-ui/public/src/js/controllers/connection.js delete mode 100644 server/insight-ui/public/src/js/controllers/currency.js delete mode 100644 server/insight-ui/public/src/js/controllers/footer.js delete mode 100644 server/insight-ui/public/src/js/controllers/header.js delete mode 100644 server/insight-ui/public/src/js/controllers/index.js delete mode 100644 server/insight-ui/public/src/js/controllers/messages.js delete mode 100644 server/insight-ui/public/src/js/controllers/scanner.js delete mode 100644 server/insight-ui/public/src/js/controllers/search.js delete mode 100644 server/insight-ui/public/src/js/controllers/status.js delete mode 100644 server/insight-ui/public/src/js/controllers/transactions.js delete mode 100644 server/insight-ui/public/src/js/directives.js delete mode 100644 server/insight-ui/public/src/js/filters.js delete mode 100644 server/insight-ui/public/src/js/init.js delete mode 100644 server/insight-ui/public/src/js/ios-imagefile-megapixel/megapix-image.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/alignpat.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/bitmat.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/bmparser.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/datablock.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/databr.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/datamask.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/decoder.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/detector.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/errorlevel.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/findpat.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/formatinf.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/gf256.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/gf256poly.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/grid.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/qrcode.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/rsdecoder.js delete mode 100644 server/insight-ui/public/src/js/jsqrcode/test.html delete mode 100644 server/insight-ui/public/src/js/jsqrcode/version.js delete mode 100644 server/insight-ui/public/src/js/services/address.js delete mode 100644 server/insight-ui/public/src/js/services/api.js delete mode 100644 server/insight-ui/public/src/js/services/blocks.js delete mode 100644 server/insight-ui/public/src/js/services/currency.js delete mode 100644 server/insight-ui/public/src/js/services/global.js delete mode 100644 server/insight-ui/public/src/js/services/socket.js delete mode 100644 server/insight-ui/public/src/js/services/status.js delete mode 100644 server/insight-ui/public/src/js/services/transactions.js delete mode 100644 server/insight-ui/public/src/js/translations.js delete mode 100644 server/insight-ui/public/src/templates/api.js delete mode 100644 server/insight-ui/public/views/404.html delete mode 100644 server/insight-ui/public/views/address.html delete mode 100644 server/insight-ui/public/views/block.html delete mode 100644 server/insight-ui/public/views/block_list.html delete mode 100644 server/insight-ui/public/views/dummy-translations.html delete mode 100644 server/insight-ui/public/views/includes/connection.html delete mode 100644 server/insight-ui/public/views/includes/currency.html delete mode 100644 server/insight-ui/public/views/includes/header.html delete mode 100644 server/insight-ui/public/views/includes/infoStatus.html delete mode 100644 server/insight-ui/public/views/includes/search.html delete mode 100644 server/insight-ui/public/views/index.html delete mode 100644 server/insight-ui/public/views/messages_verify.html delete mode 100644 server/insight-ui/public/views/redirect.html delete mode 100644 server/insight-ui/public/views/status.html delete mode 100644 server/insight-ui/public/views/transaction.html delete mode 100644 server/insight-ui/public/views/transaction/list.html delete mode 100644 server/insight-ui/public/views/transaction/tx.html delete mode 100644 server/insight-ui/public/views/transaction_sendraw.html delete mode 100644 server/package-lock.json create mode 100644 yarn.lock diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index 47ad667..0000000 --- a/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory": "public/lib" -} diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 51873bc..0000000 --- a/.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 2 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false \ No newline at end of file diff --git a/.gitignore b/.gitignore index f471896..05a92b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,52 +1,3 @@ -# from https://github.com/github/gitignore/blob/master/Node.gitignore -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz -*.swp -tags -pids -logs -results -build - node_modules package-lock.json - -# extras -*.swp -*.swo -*~ -.project -peerdb.json - -npm-debug.log -.nodemonignore - -.DS_Store -public/lib/* -!public/lib/zeroclipboard/ZeroClipboard.swf -db/txs/* -db/txs -db/testnet/txs/* -db/testnet/txs -db/blocks/* -db/blocks -db/testnet/blocks/* -db/testnet/blocks - -public/js/angularjs-all.js -public/js/main.js -public/js/vendors.js - -public/css/main.css - -README.html -po/* -!po/*.po - -mynode/ +*.log \ No newline at end of file diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 48c745a..0000000 --- a/.jshintrc +++ /dev/null @@ -1,43 +0,0 @@ -{ - "node": true, // Enable globals available when code is running inside of the NodeJS runtime environment. - "browser": true, // Standard browser globals e.g. `window`, `document`. - "esnext": true, // Allow ES.next specific features such as `const` and `let`. - "bitwise": false, // Prohibit bitwise operators (&, |, ^, etc.). - "camelcase": false, // Permit only camelcase for `var` and `object indexes`. - "curly": false, // Require {} for every new block or scope. - "eqeqeq": true, // Require triple equals i.e. `===`. - "immed": true, // Require immediate invocations to be wrapped in parens e.g. `( function(){}() );` - "latedef": true, // Prohibit variable use before definition. - "newcap": true, // Require capitalization of all constructor functions e.g. `new F()`. - "noarg": true, // Prohibit use of `arguments.caller` and `arguments.callee`. - "quotmark": "single", // Define quotes to string values. - "regexp": true, // Prohibit `.` and `[^...]` in regular expressions. - "undef": true, // Require all non-global variables be declared before they are used. - "unused": true, // Warn unused variables. - "strict": true, // Require `use strict` pragma in every file. - "trailing": true, // Prohibit trailing whitespaces. - "smarttabs": false, // Suppresses warnings about mixed tabs and spaces - "globals": { // Globals variables. - "angular": true - }, - "predef": [ // Extra globals. - "define", - "require", - "exports", - "module", - "describe", - "before", - "beforeEach", - "after", - "afterEach", - "it", - "inject", - "$", - "io", - "app", - "moment" - ], - "indent": false, // Specify indentation spacing - "devel": true, // Allow development statements e.g. `console.log();`. - "noempty": true // Prohibit use of empty blocks. -} diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 9854e39..0000000 --- a/.npmignore +++ /dev/null @@ -1,39 +0,0 @@ -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz -*.swp -tags -pids -logs -results -build - -node_modules - -# extras -*.swp -*.swo -*~ -.project -peerdb.json - -npm-debug.log -.nodemonignore - -.DS_Store -db/txs/* -db/txs -db/testnet/txs/* -db/testnet/txs -db/blocks/* -db/blocks -db/testnet/blocks/* -db/testnet/blocks - -README.html -k* diff --git a/.travis.yml b/.travis.yml index 00ea0e8..576deec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,24 +1,6 @@ -dist: trusty +sudo: false language: node_js node_js: - - '6' - -env: # a separate build will start for each env - - TEST_DIR=app - -addons: - chrome: stable - -before_install: - - cd $TEST_DIR # switch to the directory we're testing - # npm install happens here - -before_script: - - export DISPLAY=:99.0 - - sh -e /etc/init.d/xvfb start - -script: - - npm run test-ci - + - 8 after_success: - - ./node_modules/.bin/codecov # Send coverage + - yarn send-coverage diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index ad12b37..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,148 +0,0 @@ -'use strict'; - -// var config = require('insight-config.json'); - -module.exports = function(grunt) { - - //Load NPM tasks - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-css'); - grunt.loadNpmTasks('grunt-markdown'); - grunt.loadNpmTasks('grunt-macreload'); - grunt.loadNpmTasks('grunt-angular-gettext'); - grunt.loadNpmTasks('grunt-replace'); - - // Project Configuration - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - replace: { - dist: { - options: { - patterns: [ - { - match: 'INSIGHT_API_PREFIX', - replacement: '<%= pkg.insightConfig.apiPrefix %>' - } - ], - usePrefix: false - }, - files: [ - {src: ['public/src/templates/api.js'], dest: 'public/src/js/services/api.js'} - ] - } - }, - concat: { - options: { - process: function(src, filepath) { - if (filepath.substr(filepath.length - 2) === 'js') { - return '// Source: ' + filepath + '\n' + - src.replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); - } else { - return src; - } - } - }, - vendors: { - src: ['public/src/js/ios-imagefile-megapixel/megapix-image.js', 'public/lib/qrcode-generator/js/qrcode.js', 'public/src/js/jsqrcode/grid.js', 'public/src/js/jsqrcode/version.js', 'public/src/js/jsqrcode/detector.js', 'public/src/js/jsqrcode/formatinf.js', 'public/src/js/jsqrcode/errorlevel.js', 'public/src/js/jsqrcode/bitmat.js', 'public/src/js/jsqrcode/datablock.js', 'public/src/js/jsqrcode/bmparser.js', 'public/src/js/jsqrcode/datamask.js', 'public/src/js/jsqrcode/rsdecoder.js', 'public/src/js/jsqrcode/gf256poly.js', 'public/src/js/jsqrcode/gf256.js', 'public/src/js/jsqrcode/decoder.js', 'public/src/js/jsqrcode/qrcode.js', 'public/src/js/jsqrcode/findpat.js', 'public/src/js/jsqrcode/alignpat.js', 'public/src/js/jsqrcode/databr.js', 'public/lib/momentjs/min/moment.min.js', 'public/lib/moment/lang/es.js', 'public/lib/zeroclipboard/ZeroClipboard.min.js'], - dest: 'public/js/vendors.js' - }, - angular: { - src: ['public/lib/angular/angular.min.js', 'public/lib/angular-resource/angular-resource.min.js', 'public/lib/angular-route/angular-route.min.js', 'public/lib/angular-qrcode/qrcode.js', 'public/lib/angular-animate/angular-animate.min.js', 'public/lib/angular-bootstrap/ui-bootstrap.js', 'public/lib/angular-bootstrap/ui-bootstrap-tpls.js', 'public/lib/angular-ui-utils/ui-utils.min.js', 'public/lib/ngprogress/build/ngProgress.min.js', 'public/lib/angular-gettext/dist/angular-gettext.min.js', 'public/lib/angular-moment/angular-moment.min.js'], - dest: 'public/js/angularjs-all.js' - }, - main: { - src: ['public/src/js/app.js', 'public/src/js/controllers/*.js', 'public/src/js/services/*.js', 'public/src/js/directives.js', 'public/src/js/filters.js', 'public/src/js/config.js', 'public/src/js/init.js', 'public/src/js/translations.js'], - dest: 'public/js/main.js' - }, - css: { - src: ['public/lib/bootstrap/dist/css/bootstrap.min.css', 'public/src/css/**/*.css'], - dest: 'public/css/main.css' - } - }, - uglify: { - options: { - banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n', - mangle: false - }, - vendors: { - src: 'public/js/vendors.js', - dest: 'public/js/vendors.min.js' - }, - angular: { - src: 'public/js/angularjs-all.js', - dest: 'public/js/angularjs-all.min.js' - }, - main: { - src: 'public/js/main.js', - dest: 'public/js/main.min.js' - } - }, - cssmin: { - css: { - src: 'public/css/main.css', - dest: 'public/css/main.min.css' - } - }, - markdown: { - all: { - files: [ - { - expand: true, - src: 'README.md', - dest: '.', - ext: '.html' - } - ] - } - }, - macreload: { - chrome: { - browser: 'chrome', - editor: 'macvim' - } - }, - watch: { - main: { - files: ['public/src/js/**/*.js'], - tasks: ['concat:main', 'uglify:main'], - }, - css: { - files: ['public/src/css/**/*.css'], - tasks: ['concat:css', 'cssmin'], - }, - }, - nggettext_extract: { - pot: { - files: { - 'po/template.pot': ['public/views/*.html', 'public/views/**/*.html'] - } - }, - }, - nggettext_compile: { - all: { - options: { - module: 'insight' - }, - files: { - 'public/src/js/translations.js': ['po/*.po'] - } - }, - } - }); - - //Making grunt default to force in order not to break the project. - grunt.option('force', true); - - //Default task(s). - grunt.registerTask('default', ['replace', 'watch']); - - //Update .pot file - grunt.registerTask('translate', ['nggettext_extract']); - - //Compile task (concat + minify) - grunt.registerTask('compile', ['replace', 'nggettext_compile', 'concat', 'uglify', 'cssmin']); - - -}; diff --git a/README.md b/README.md index e88fe4f..f4feeca 100644 --- a/README.md +++ b/README.md @@ -1,118 +1,17 @@ -# Insight UI +# Insight -A Bitcoin blockchain explorer web application service for [Bitcore Node](https://github.com/bitpay/bitcore-node) using the [Insight API](https://github.com/bitpay/insight-api). +**A bitcoin blockchain explorer and API.** + +## Requirements + +Insight requires [Node.js](https://nodejs.org) and [MongoDB](https://www.mongodb.com/). Consider using [n](https://github.com/tj/n) and [m](https://github.com/aheckmann/m) to install the latest versions. ## Quick Start -Please see the guide at [https://bitcore.io/guides/full-node](https://bitcore.io/guides/full-node) for information about getting a block explorer running. This is only the front-end component of the block explorer, and is packaged together with all of the necessary components in [Bitcore](https://github.com/bitpay/bitcore). - -## Getting Started - -To manually install all of the necessary components, you can run these commands: +To get started, clone this repository, then – with `mongod` running – install and run insight: ```bash -npm install -g bitcore-node -bitcore-node create mynode -cd mynode -bitcore-node install insight-api -bitcore-node install insight-ui -bitcore-node start +git clone -b next https://github.com/bitpay/insight.git && cd insight +npm install +npm start ``` - -Open a web browser to `http://localhost:3001/insight/` - -## Development - -To build Insight UI locally: - -``` -$ npm run build -``` - -A watch task is also available: - -``` -$ npm run watch -``` - -## Changing routePrefix and apiPrefix - -By default, the `insightConfig` in `package.json` is: - -```json - "insightConfig": { - "apiPrefix": "insight-api", - "routePrefix": "insight" - } -``` - -To change these routes, first make your changes to `package.json`, for example: - -```json - "insightConfig": { - "apiPrefix": "api", - "routePrefix": "" - } -``` - -Then rebuild the `insight-ui` service: - -``` -$ npm run build -``` - -## Multilanguage support - -Insight UI uses [angular-gettext](http://angular-gettext.rocketeer.be) for multilanguage support. - -To enable a text to be translated, add the ***translate*** directive to html tags. See more details [here](http://angular-gettext.rocketeer.be/dev-guide/annotate/). Then, run: - -``` -grunt compile -``` - -This action will create a template.pot file in ***po/*** folder. You can open it with some PO editor ([Poedit](http://poedit.net)). Read this [guide](http://angular-gettext.rocketeer.be/dev-guide/translate/) to learn how to edit/update/import PO files from a generated POT file. PO file will be generated inside po/ folder. - -If you make new changes, simply run **grunt compile** again to generate a new .pot template and the angular javascript ***js/translations.js***. Then (if use Poedit), open .po file and choose ***update from POT File*** from **Catalog** menu. - -Finally changes your default language from ***public/src/js/config*** - -``` -gettextCatalog.currentLanguage = 'es'; -``` - -This line will take a look at any *.po files inside ***po/*** folder, e.g. -**po/es.po**, **po/nl.po**. After any change do not forget to run ***grunt -compile***. - - -## Note - -For more details about the [Insight API](https://github.com/bitpay/insight-api) configuration and end-points, go to [Insight API GitHub repository](https://github.com/bitpay/insight-api). - -## Contribute - -Contributions and suggestions are welcomed at the [Insight UI GitHub repository](https://github.com/bitpay/insight-ui). - - -## License -(The MIT License) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app/package.json b/app/package.json index 1701978..5f07727 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,5 @@ { "name": "insight-ui", - "version": "0.5.0", "private": true, "scripts": { "clean": "ionic-app-scripts clean", diff --git a/bitcore-node/index.js b/bitcore-node/index.js deleted file mode 100644 index a013267..0000000 --- a/bitcore-node/index.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -var BaseService = require('./service'); -var inherits = require('util').inherits; -var fs = require('fs'); -var pkg = require('../package'); - -var InsightUI = function(options) { - BaseService.call(this, options); - // we don't use the options object for routePrefix and apiPrefix, since the - // client must be rebuilt with the proper options. A future version of - // Bitcore should allow for a service "build" step to make this better. - this.apiPrefix = pkg.insightConfig.apiPrefix; - this.routePrefix = pkg.insightConfig.routePrefix; -}; - -InsightUI.dependencies = ['insight-api']; - -inherits(InsightUI, BaseService); - -InsightUI.prototype.start = function(callback) { - this.indexFile = this.filterIndexHTML(fs.readFileSync(__dirname + '/../public/index-template.html', {encoding: 'utf8'})); - setImmediate(callback); -}; - -InsightUI.prototype.getRoutePrefix = function() { - return this.routePrefix; -}; - -InsightUI.prototype.setupRoutes = function(app, express) { - var self = this; - app.use(express.static(__dirname + '/../public')); - // if not in found, fall back to indexFile (404 is handled client-side) - app.use(function(req, res, next) { - res.setHeader('Content-Type', 'text/html'); - res.send(self.indexFile); - }); -}; - -InsightUI.prototype.filterIndexHTML = function(data) { - var transformed = data; - if (this.routePrefix !== '') { - transformed = transformed.replace('\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de_DE\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(Eingabe unbestätigt)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 Seite nicht gefunden :(" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen " -"REST und Websocket APIs um eigene Wallets oder Applikationen zu " -"implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain " -"ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der " -"aktuelle Quellcode ist auf Github zu finden." - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insight befindet sich aktuell noch in der Entwicklung. " -"Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren " -"Verbesserung an unseren Github Issue Tracker." - -#: public/views/index.html -msgid "About" -msgstr "Über insight" - -#: public/views/address.html -msgid "Address" -msgstr "Adresse" - -#: public/views/index.html -msgid "Age" -msgstr "Alter" - -#: public/views/status.html -msgid "Application Status" -msgstr "Programmstatus" - -#: public/views/status.html -msgid "Best Block" -msgstr "Bester Block" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Bitcoin-Node Info" - -#: public/views/block.html -msgid "Block" -msgstr "Block" - -#: public/views/block.html -msgid "Block Reward" -msgstr "Belohnung" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "Blöcke" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "Serialisierte Bytes" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom " -"P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:" -"{{port}} ist fehlgeschlagen.)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "" -"Keine Verbindung zum insight-Server möglich. Es wird versucht die " -"Verbindung neu aufzubauen..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen." - -#: public/views/status.html -msgid "Complete" -msgstr "Vollständig" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "Bestätigungen" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "Verbindungen" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "Verbindungen zu Nodes" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "Aktueller Blockchain Tip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "Aktueller Status" - -#: public/views/transaction.html -msgid "Details" -msgstr "Details" - -#: public/views/block.html -msgid "Difficulty" -msgstr "Schwierigkeit" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "Es wurde ein \"double Spend\" Versuch erkannt.Von tx:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "Fehler!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "Gebühr" - -#: public/views/address.html -msgid "Final Balance" -msgstr "Schlussbilanz" - -#: public/views/status.html -msgid "Finish Date" -msgstr "Fertigstellung" - -#: public/views/404.html -msgid "Go to home" -msgstr "Zur Startseite" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "Hash Serialisiert" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "Höhe" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "Eingefügt in Block" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "Fehlerbeschreibung" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "Ursprüngliche Blockchain Höhe" - -#: public/views/transaction.html -msgid "Input" -msgstr "Eingänge" - -#: public/views/status.html -msgid "Last Block" -msgstr "Letzter Block" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "Letzter Hash (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "Letzte Blöcke" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "Letzte Transaktionen" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "Lade Adressinformationen" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "Lade Blockinformation" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "Lade gewähltes Datum..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "Lade Transaktionsdetails" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "Lade Transaktionen..." - -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "Lade..." - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "Block gefunden (Mining)" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "Gefunden von" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "Schwierigkeitgrad" - -#: public/views/block.html -msgid "Next Block" -msgstr "Nächster Block" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "Keine Eingänge (Neu generierte Coins)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "Keine Blöcke bisher." - -#: public/views/includes/header.html public/views/includes/search.html -msgid "No matching records found!" -msgstr "Keine passenden Einträge gefunden!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "Anzahl Transaktionen" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "Anzahl der Transaktionen" - -#: public/views/transaction.html -msgid "Output" -msgstr "Ausgänge" - -#: public/views/index.html -msgid "Powered by" -msgstr "Powered by" - -#: public/views/block.html -msgid "Previous Block" -msgstr "Letzter Block" - -#: public/views/status.html -msgid "Protocol version" -msgstr "Protokollversion" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "Proxyeinstellung" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "Eingangszeitpunkt" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "Umleitung..." - -#: public/views/includes/header.html -msgid "Search for block, transaction or address" -msgstr "Suche Block, Transaktion oder Adresse" - -#: public/views/index.html -msgid "See all blocks" -msgstr "Alle Blöcke anzeigen" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "Zeige Abgänge" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "Zeige Alles" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "Zeige Eingänge" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "Weniger anzeigen" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "Mehr anzeigen" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "Größe" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "Größe (bytes)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "Verworfene Blöcke (bereits syncronisiert)" - -#: public/views/status.html -msgid "Start Date" -msgstr "Startdatum" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "Status" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "Zusammenfassung" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "Zusammenfassung bestätigt" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "Fortschritt" - -#: public/views/status.html -msgid "Sync Status" -msgstr "Syncronisation" - -#: public/views/status.html -msgid "Sync Type" -msgstr "Art der Syncronisation" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "Syncronisierte Blöcke" - -#: public/views/status.html -msgid "Testnet" -msgstr "Testnet aktiv" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "Es gibt keine Transaktionen zu dieser Adressse" - -#: public/views/status.html -msgid "Time Offset" -msgstr "Zeitoffset zu UTC" - -#: public/views/block.html -msgid "Timestamp" -msgstr "Zeitstempel" - -#: public/views/block_list.html -msgid "Today" -msgstr "Heute" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Gesamtsumme" - -#: public/views/address.html -msgid "Total Received" -msgstr "Insgesamt empfangen" - -#: public/views/address.html -msgid "Total Sent" -msgstr "Insgesamt gesendet" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "Transaktion" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "Transaktions Abgänge" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "Abgänge" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "Transaktionen" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "Typ" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "Unbestätigt" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "Unbestätigte Transaktion!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "Unbestätigtes Guthaben" - -#: public/views/index.html -msgid "Value Out" -msgstr "Wert" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "Version" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "Warte auf Blöcke..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "Warte auf Transaktionen..." - -#: public/views/block_list.html -msgid "by date." -msgstr "nach Datum." - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "zuerst gesehen am" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "gefunden" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "vom:" - -msgid "Waiting for blocks" -msgstr "Warte auf Blöcke" diff --git a/po/es.po b/po/es.po deleted file mode 100644 index 90fbca5..0000000 --- a/po/es.po +++ /dev/null @@ -1,470 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Insight\n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.8\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(Entrada sin confirmar)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 Página no encontrada :(" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insight es un explorador de bloques de Bitcoin open-source con un completo " -"conjunto de REST y APIs de websockets que pueden ser usadas para escribir " -"monederos de Bitcoins y otras aplicaciones que requieran consultar un " -"explorador de bloques. Obtén el código en el repositorio abierto de Github." - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insight esta en desarrollo aún, por ello agradecemos que " -"nos reporten errores o sugerencias para mejorar el software. Github issue " -"tracker." - -#: public/views/index.html -msgid "About" -msgstr "Acerca de" - -#: public/views/address.html -msgid "Address" -msgstr "Dirección" - -#: public/views/index.html -msgid "Age" -msgstr "Edad" - -#: public/views/status.html -msgid "Application Status" -msgstr "Estado de la Aplicación" - -#: public/views/status.html -msgid "Best Block" -msgstr "Mejor Bloque" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Información del nodo Bitcoin" - -#: public/views/block.html -msgid "Block" -msgstr "Bloque" - -#: public/views/block.html -msgid "Block Reward" -msgstr "Bloque Recompensa" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "Bloques" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "Bytes Serializados" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la " -"red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "No se pudo conectar al servidor insight. Intentando re-conectar..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "No se pudo conectar a Internet. Por favor, verifique su conexión." - -#: public/views/status.html -msgid "Complete" -msgstr "Completado" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "Confirmaciones" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "Con" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "Conexiones a otros nodos" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "Actual Blockchain Tip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "Actual Estado de Sincronización" - -#: public/views/transaction.html -msgid "Details" -msgstr "Detalles" - -#: public/views/block.html -msgid "Difficulty" -msgstr "Dificultad" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "Intento de doble gasto detectado. De la transacción:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "¡Error!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "Tasa" - -#: public/views/address.html -msgid "Final Balance" -msgstr "Balance Final" - -#: public/views/status.html -msgid "Finish Date" -msgstr "Fecha Final" - -#: public/views/404.html -msgid "Go to home" -msgstr "Volver al Inicio" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "Hash Serializado" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "Altura" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "Incluido en el Bloque" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "Detectada una incoherencia en levelDB:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "Errores de Información" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "Altura de la Cadena en Bloque Inicial" - -#: public/views/transaction.html -msgid "Input" -msgstr "Entrada" - -#: public/views/status.html -msgid "Last Block" -msgstr "Último Bloque" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "Último Bloque Hash (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "Últimos Bloques" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "Últimas Transacciones" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "Cargando Información de la Dirección" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "Cargando Información del Bloque" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "Cargando Fecha Seleccionada..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "Cargando Detalles de la Transacción" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "Cargando Transacciones..." - -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "Cargando..." - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "Hora de Minado" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "Minado por" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "Dificultad de Minado" - -#: public/views/block.html -msgid "Next Block" -msgstr "Próximo Bloque" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "Sin Entradas (Monedas Recién Generadas)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "No hay bloques aún." - -#: public/views/includes/header.html public/views/includes/search.html -msgid "No matching records found!" -msgstr "¡No se encontraron registros coincidentes!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "Nro. de Transacciones" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "Número de Transacciones" - -#: public/views/transaction.html -msgid "Output" -msgstr "Salida" - -#: public/views/index.html -msgid "Powered by" -msgstr "Funciona con" - -#: public/views/block.html -msgid "Previous Block" -msgstr "Bloque Anterior" - -#: public/views/status.html -msgid "Protocol version" -msgstr "Versión del protocolo" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "Opción de proxy" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "Hora de Recibido" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "Redireccionando..." - -#: public/views/includes/header.html -msgid "Search for block, transaction or address" -msgstr "Buscar bloques, transacciones o direcciones" - -#: public/views/index.html -msgid "See all blocks" -msgstr "Ver todos los bloques" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "Mostrar dato de Salida de la Transacción" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "Mostrar todos" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "Mostrar entrada" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "Ver menos" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "Ver más" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "Tamaño" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "Tamaño (bytes)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "Bloques Saltados (previamente sincronizado)" - -#: public/views/status.html -msgid "Start Date" -msgstr "Fecha de Inicio" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "Estado" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "Resumen" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "Resumen confirmados" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "Proceso de Sincronización" - -#: public/views/status.html -msgid "Sync Status" -msgstr "Estado de Sincronización" - -#: public/views/status.html -msgid "Sync Type" -msgstr "Tipo de Sincronización" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "Bloques Sincornizados" - -#: public/views/status.html -msgid "Testnet" -msgstr "Red de prueba" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "No hay transacciones para esta dirección" - -#: public/views/status.html -msgid "Time Offset" -msgstr "Desplazamiento de hora" - -#: public/views/block.html -msgid "Timestamp" -msgstr "Fecha y hora" - -#: public/views/block_list.html -msgid "Today" -msgstr "Hoy" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Cantidad Total" - -#: public/views/address.html -msgid "Total Received" -msgstr "Total Recibido" - -#: public/views/address.html -msgid "Total Sent" -msgstr "Total Enviado" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "Transacción" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "Información del Conjunto de Salida de la Transacción" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "Salidas de la Transacción" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "Transacciones" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "Tipo" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "Sin confirmar" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "¡Transacción sin confirmar!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "Balance sin confirmar" - -#: public/views/index.html -msgid "Value Out" -msgstr "Valor de Salida" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "Versión" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "Esperando bloques..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "Esperando transacciones..." - -#: public/views/block_list.html -msgid "by date." -msgstr "por fecha." - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "Visto a" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "minado" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "minado el:" - -#~ msgid "Waiting for blocks" -#~ msgstr "Esperando bloques" diff --git a/po/ja.po b/po/ja.po deleted file mode 100644 index 53d31ab..0000000 --- a/po/ja.po +++ /dev/null @@ -1,617 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: Vis Virial \n" -"Language-Team: \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.4\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(入力は未検証です)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 ページがみつかりません (´・ω・`)" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insightは、bitcoind RPCの提供するものよりも詳細なブロック" -"チェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに" -"使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソース" -"コードを確認" - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insightは現在開発中です。githubのissueトラッカにてバグの" -"報告や改善案の提案をお願いします。" - -#: public/views/index.html -msgid "About" -msgstr "はじめに" - -#: public/views/address.html public/views/messages_verify.html -msgid "Address" -msgstr "アドレス" - -#: public/views/index.html -msgid "Age" -msgstr "生成後経過時間" - -#: public/views/messages_verify.html -msgid "An error occured in the verification process." -msgstr "検証過程でエラーが発生しました。" - -#: public/views/transaction_sendraw.html -msgid "An error occured:
{{error}}" -msgstr "エラーが発生しました:
{{error}}" - -#: public/views/status.html -msgid "Application Status" -msgstr "アプリケーションの状態" - -#: public/views/status.html -msgid "Best Block" -msgstr "最良ブロック" - -#: public/views/messages_verify.html -msgid "Bitcoin comes with a way of signing arbitrary messages." -msgstr "Bitcoinには任意のメッセージを署名する昨日が備わっています。" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Bitcoinノード情報" - -#: public/views/block.html -msgid "Block" -msgstr "ブロック" - -#: public/views/block.html -msgid "Block Reward" -msgstr "ブロック報酬" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "ブロック" - -#: public/views/transaction_sendraw.html -msgid "Broadcast Raw Transaction" -msgstr "生のトランザクションを配信" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "シリアライズ後の容量 (バイト)" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませ" -"んでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "insight サーバに接続できません。再接続しています..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "インターネットに接続できません。コネクションを確認してください。" - -#: public/views/status.html -msgid "Complete" -msgstr "完了" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "検証数" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "接続数" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "他ノードへの接続" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "現在のブロックチェインのTip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "現在の同期状況" - -#: public/views/transaction.html -msgid "Details" -msgstr "詳細" - -#: public/views/block.html -msgid "Difficulty" -msgstr "難易度" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "二重支払い攻撃をこのトランザクションから検知しました:" - -#: public/views/messages_verify.html -msgid "Error message:" -msgstr "エラーメッセージ:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "エラー!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "手数料" - -#: public/views/address.html -msgid "Final Balance" -msgstr "最終残高" - -#: public/views/status.html -msgid "Finish Date" -msgstr "終了日時" - -#: public/views/404.html -msgid "Go to home" -msgstr "ホームへ" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "シリアライズデータのハッシュ値" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "ブロック高" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "取り込まれたブロック" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "levelDBの破損を検知しました:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "エラー情報" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "起動時のブロック高" - -#: public/views/transaction.html -msgid "Input" -msgstr "入力" - -#: public/views/status.html -msgid "Last Block" -msgstr "直前のブロック" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "直前のブロックのハッシュ値 (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "最新のブロック" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "最新のトランザクション" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "アドレス情報を読み込んでいます" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "ブロック情報を読み込んでいます" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "選択されたデータを読み込んでいます..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "トランザクションの詳細を読み込んでいます" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "トランザクションを読み込んでいます..." - -#: public/views/messages_verify.html public/views/transaction_sendraw.html -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "ロード中..." - -#: public/views/messages_verify.html -msgid "Message" -msgstr "メッセージ" - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "採掘時刻" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "採掘者" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "採掘難易度" - -#: public/views/block.html -msgid "Next Block" -msgstr "次のブロック" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "入力なし (新しく生成されたコイン)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "ブロックはありません。" - -#: public/views/includes/search.html -msgid "No matching records found!" -msgstr "一致するレコードはありません!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "トランザクション数" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "トランザクション数" - -#: public/views/transaction.html -msgid "Output" -msgstr "出力" - -#: public/views/index.html -msgid "Powered by" -msgstr "Powered by" - -#: public/views/block.html -msgid "Previous Block" -msgstr "前のブロック" - -#: public/views/status.html -msgid "Protocol version" -msgstr "プロトコルバージョン" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "プロキシ設定" - -#: public/views/transaction_sendraw.html -msgid "Raw transaction data" -msgstr "トランザクションの生データ" - -#: public/views/transaction_sendraw.html -msgid "Raw transaction data must be a valid hexadecimal string." -msgstr "生のトランザクションデータは有効な16進数でなければいけません。" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "受信時刻" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "リダイレクトしています..." - -#: public/views/includes/search.html -msgid "Search for block, transaction or address" -msgstr "ブロック、トランザクション、アドレスを検索" - -#: public/views/index.html -msgid "See all blocks" -msgstr "すべてのブロックをみる" - -#: public/views/transaction_sendraw.html -msgid "Send transaction" -msgstr "トランザクションを送信" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "トランザクションの出力データをみる" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "すべて表示" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "入力を表示" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "隠す" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "表示する" - -#: public/views/messages_verify.html -msgid "Signature" -msgstr "署名" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "サイズ" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "サイズ (バイト)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "スキップされたブロック (同期済み)" - -#: public/views/status.html -msgid "Start Date" -msgstr "開始日時" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "ステータス" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "概要" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "サマリ 検証済み" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "同期の進捗状況" - -#: public/views/status.html -msgid "Sync Status" -msgstr "同期ステータス" - -#: public/views/status.html -msgid "Sync Type" -msgstr "同期タイプ" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "同期されたブロック数" - -#: public/views/status.html -msgid "Testnet" -msgstr "テストネット" - -#: public/views/messages_verify.html -msgid "The message failed to verify." -msgstr "メッセージの検証に失敗しました。" - -#: public/views/messages_verify.html -msgid "The message is verifiably from {{verification.address}}." -msgstr "メッセージは{{verification.address}}により検証されました。" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "このアドレスに対するトランザクションはありません。" - -#: public/views/transaction_sendraw.html -msgid "" -"This form can be used to broadcast a raw transaction in hex format over\n" -" the Bitcoin network." -msgstr "" -"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワー" -"ク上に配信することができます。" - -#: public/views/messages_verify.html -msgid "" -"This form can be used to verify that a message comes from\n" -" a specific Bitcoin address." -msgstr "" -"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証する" -"ことができます。" - -#: public/views/status.html -msgid "Time Offset" -msgstr "時間オフセット" - -#: public/views/block.html public/views/block_list.html -msgid "Timestamp" -msgstr "タイムスタンプ" - -#: public/views/block_list.html -msgid "Today" -msgstr "今日" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Bitcoin総量" - -#: public/views/address.html -msgid "Total Received" -msgstr "総入金額" - -#: public/views/address.html -msgid "Total Sent" -msgstr "総送金額" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "トランザクション" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "トランザクションの出力セット情報" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "トランザクションの出力" - -#: public/views/transaction_sendraw.html -msgid "Transaction succesfully broadcast.
Transaction id: {{txid}}" -msgstr "トランザクションの配信に成功しました。
トランザクションID: {{txid}}" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "トランザクション" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "タイプ" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "未検証" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "未検証のトランザクションです!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "未検証トランザクションの残高" - -#: public/views/index.html -msgid "Value Out" -msgstr "出力値" - -#: public/views/messages_verify.html -msgid "Verify" -msgstr "検証" - -#: public/views/messages_verify.html -msgid "Verify signed message" -msgstr "署名済みメッセージを検証" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "バージョン" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "ブロックを待っています..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "トランザクションを待っています..." - -#: public/views/block_list.html -msgid "by date." -msgstr "日毎。" - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "最初に発見された日時" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "採掘された" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "採掘日時:" - -#~ msgid "(Mainchain)" -#~ msgstr "(メインチェーン)" - -#~ msgid "(Orphaned)" -#~ msgstr "(孤立したブロック)" - -#~ msgid "Bits" -#~ msgstr "Bits" - -#~ msgid "Block #{{block.height}}" -#~ msgstr "ブロック #{{block.height}}" - -#~ msgid "BlockHash" -#~ msgstr "ブロックのハッシュ値" - -#~ msgid "Blocks
mined on:" -#~ msgstr "ブロック
採掘日" - -#~ msgid "Coinbase" -#~ msgstr "コインベース" - -#~ msgid "Hash" -#~ msgstr "ハッシュ値" - -#~ msgid "LockTime" -#~ msgstr "ロック時間" - -#~ msgid "Merkle Root" -#~ msgstr "Merkleルート" - -#~ msgid "Nonce" -#~ msgstr "Nonce" - -#~ msgid "Ooops!" -#~ msgstr "おぉっと!" - -#~ msgid "Output is spent" -#~ msgstr "出力は使用済みです" - -#~ msgid "Output is unspent" -#~ msgstr "出力は未使用です" - -#~ msgid "Scan" -#~ msgstr "スキャン" - -#~ msgid "Show/Hide items details" -#~ msgstr "アイテムの詳細を表示または隠す" - -#~ msgid "Waiting for blocks" -#~ msgstr "ブロックを待っています" - -#~ msgid "by date. {{detail}} {{before}}" -#~ msgstr "日時順 {{detail}} {{before}}" - -#~ msgid "scriptSig" -#~ msgstr "scriptSig" - -#~ msgid "{{tx.confirmations}} Confirmations" -#~ msgstr "{{tx.confirmations}} 検証" - -#~ msgid " (Orphaned)" -#~ msgstr "" -#~ " (孤立したブロッ" -#~ "ク)" - -#~ msgid "" -#~ " Incoherence in " -#~ "levelDB detected: {{vin.dbError}}" -#~ msgstr "" -#~ " Incoherence in " -#~ "levelDB detected: {{vin.dbError}}" - -#~ msgid "Waiting for blocks " -#~ msgstr "ブロックを待っています " diff --git a/public/css/main.min.css b/public/css/main.min.css deleted file mode 100644 index 86e5a04..0000000 --- a/public/css/main.min.css +++ /dev/null @@ -1,5 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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}}*{-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:62.5%;-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;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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:#999}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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right: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;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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.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.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.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;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,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:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.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]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{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{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}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.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;border-color:#3c763d;background-color:#dff0d8}.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;border-color:#8a6d3b;background-color:#fcf8e3}.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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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>.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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.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{outline:0;background-image:none;-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{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.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:#ebebeb;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:#3276b1;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:#47a447;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:#39b3d7;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:#ed9c28;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:#d2322d;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{color:#428bca;font-weight:400;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:#999;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%;padding-left:0;padding-right:0}.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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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"}.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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right: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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-bottom:0;padding-left: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:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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{text-align:center;margin-bottom:5px}.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-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.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}@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;padding:15px;font-size:18px;line-height:20px;height:50px}.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;margin-right:15px;padding:9px 10px;margin-top:8px;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;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{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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>.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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;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;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom: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-right-radius:0;border-top-left-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-left:15px;margin-right: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{background-color:#e7e7e7;color:#555}@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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{background-color:#080808;color:#fff}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-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;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.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-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-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-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.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;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;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}.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-left:60px;padding-right: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;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right: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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.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: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: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: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: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{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-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{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.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-right-radius:3px;border-top-left-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-right-radius:3px;border-top-left-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}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.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-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-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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.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{bottom:0;right:5px;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:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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{content:" ";display:table}.clearfix: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-left:auto;margin-right: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}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{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 (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: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: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 (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}}@media print{.hidden-print{display:none!important}}html,body{color:#373D42;font-family:Ubuntu,sans-serif;height:100%}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#373D42;font-family:Ubuntu,sans-serif}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none!important}#ngProgress{background-color:#6C9032!important;box-shadow:none!important;color:#373D42!important;height:3px!important;margin:0;opacity:0;padding:0;z-index:99998;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}#ngProgress-container{position:fixed;margin:0;padding:0;top:63px;left:0;right:0;z-index:99999}#qr-canvas{display:none}#qrcode-scanner-video{margin:0 auto 10px;display:block}#file-input-wrapper{padding:0;width:100%}#file-input-wrapper input{opacity:0;padding:5px}#file-input-wrapper span{padding-top:5px;width:100%}#file-input-wrapper i{display:none}#wrap{min-height:100%;height:auto;margin:0 auto -51px;padding:0 0 75px}.m10h{margin:0 10px}.m20h{margin:0 20px}.m5v{margin:5px 0}.m20v{margin:20px 0}.m10v{margin:10px 0}.m50v{margin:50px 0}.m10b{margin-bottom:10px}.m10l{margin-left:10px}.m20t{margin-top:20px}.vm{vertical-align:middle}.pa{position:absolute}.pr{position:relative}.bgwhite{background-color:#fff}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#F0F7E2}.navbar{min-height:64px}.navbar-default .navbar-toggle{border-color:#fff;margin-top:15px}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#373D42}.navbar-default{background-color:#8DC429;margin:0;border:0}.navbar-default .navbar-nav>li>a{color:#F4FBE8;font-family:Ubuntu,sans-serif;padding-left:20px;padding-right:20px}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{background-color:#6C9032;color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>.active>a:hover{background-color:#fff}.navbar-form .form-group{display:block}.navbar-form{margin-top:15px}.nav-tabs.nav-justified>li>a:hover{cursor:pointer}.insight{font-family:Ubuntu,sans-serif;font-size:34px;font-style:italic;font-weight:700;overflow:hidden}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fffffe}.navbar-default .navbar-brand{color:#FFF;padding:20px 15px}.navbar-form .form-control{background-color:#7CAD23;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border:0;-webkit-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);-moz-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10)}.navbar-nav>li>a{padding-top:22px;padding-bottom:22px}#search-form{color:#fff}#search.loading{background-image:url(../img/loading.gif);background-position:5px center;background-repeat:no-repeat;padding-left:25px}.loader-gif{display:inline-block;width:16px;height:11px;background:transparent url(../img/loading.gif) no-repeat;margin-left:5px}#search{color:#fff}#search::-webkit-input-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-style:italic;font-weight:100}#search::-moz-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-weight:100}.status{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#597338;border-radius:3px;margin:15px 0;padding:8px 10px;font-size:12px;color:#eee;text-align:center;margin-right:10px}.status .tooltip{margin:0}.col-gray{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:#F4F4F4;border-radius:5px;padding:14px;border:1px solid #eee}.col-gray-responsive{width:auto}.col-gray-fixed{margin-top:15px;position:fixed;width:250px;border:1px solid #eee;z-index:1}.ellipsis{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.line20{border:1px solid #D4D4D4;margin-bottom:15px}.line10{border:1px solid #EAEAEA;margin:10px 0}.block-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#fff;text-align:center}.block-id span{font-size:40px;margin:30px 0}.block-id h2{color:#FFF;font-weight:700;line-height:30px;font-size:24px;margin-top:0;margin-bottom:10px}.icon-block{color:#FFF;font-size:35px;margin-top:10px}.icon-block h3{color:#fff}.block-tx{-moz-border-radius:2px;-webkit-border-radius:2px;background-color:#F4F4F4;border-radius:2px;margin:20px 0 10px;overflow:hidden;padding:15px;border:1px solid #eee}.btn{border-radius:2px}.btn-primary{background-color:#8DC429;border:2px solid #76AF0F}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary,.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success,.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#fff;border:2px solid #ccc;color:#373D42}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#fff}.btn-default{background-color:#E7E7E7}.btn-success{background-color:#2FA4D7;border:2px solid #237FA7}.btn-danger{background-color:#AC0015;border:2px solid #6C0000}.txvalues{display:inline-block;padding:.7em 2em;font-size:13px;text-transform:uppercase;font-weight:100;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.txvalues-primary{background-color:#8DC429}.txvalues-default{background-color:#EBEBEB;color:#333}.txvalues-success{background-color:#2FA4D7}.txvalues-danger{background-color:#AC0015}.txvalues-normal{background-color:transparent;text-transform:none;color:#333;font-size:14px;font-weight:400}.progress-bar-info{background-color:#8DC429}#footer{background-color:#373D42;color:#fff;height:51px;overflow:hidden}#footer a.insight{font-size:20px;text-decoration:none;color:#fff}#footer a.insight:hover{color:#fffffe}#footer a.insight small{font-size:11px}.line-footer{border-top:2px dashed #ccc}#footer .links{color:#ddd;font-size:10px}#footer .links a{color:#ddd}#footer .links a.selected{color:#eee;font-weight:700}#footer .links a:hover{text-decoration:none;color:#fffffe}.line-bot{border-bottom:2px solid #EAEAEA;padding:0 0 10px}.line-mid{padding:15px}.line-top{border-top:1px solid #EAEAEA;padding:15px 0 0}#wrap>.container{padding:70px 15px 0}#footer>.container{padding:auto 15px}.code{font-size:80%}.address{font-size:11px}.no_matching{-moz-border-radius-bottomleft:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-left-radius:2px;-webkit-border-bottom-right-radius:2px;background-color:#FFF;border-bottom-left-radius:2px;border-bottom-right-radius:2px;border-top:0;border:1px solid #64920F;padding:10px 20px;position:absolute;text-align:center;top:45px;width:300px}.fader.ng-enter{opacity:0;-webkit-transition:opacity 1s;-moz-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s}.fader.ng-enter-active{opacity:1}.tx-bg{background-color:#F4F4F4;left:0;min-height:340px;position:absolute;top:0;width:100%;z-index:-9999}.badge{-moz-border-radius:9px;-webkit-border-radius:9px;background-color:#999;border-radius:9px;color:#fff;font-size:12.025px;font-weight:700;padding:1px 9px 2px;white-space:nowrap}.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-error{background-color:#b94a48}.badge-error:hover{background-color:#953b39}.badge-warning{background-color:#f89406}.badge-warning:hover{background-color:#c67605}.badge-success{background-color:#468847}.badge-success:hover{background-color:#356635}.badge-info{background-color:#3a87ad}.badge-info:hover{background-color:#2d6987}.badge-inverse{background-color:#333}.badge-inverse:hover{background-color:#1a1a1a}.status .t{color:#fff}.status .text-danger{background:red}.status .text-warning{background:#ff0;color:#000}.btn-copy{color:#9b9b9b;display:inline-block;height:16px;width:16px;outline:0;vertical-align:sub}.btn-expand{color:#9b9b9b;vertical-align:middle}.btn-copy:hover,.btn-expand:hover{color:#000;text-decoration:none}.btn-copy{background:transparent url(../img/icons/copy.png) center center no-repeat}.btn-copy .tooltip{display:block;margin-left:20px;margin-top:-2px;opacity:0}.btn-copy.zeroclipboard-is-hover{color:#2a6496}.btn-copy.zeroclipboard-is-active .tooltip{opacity:1}.tx-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#FFF;text-align:center}.tx-id span{font-size:40px;margin:30px 0}.page-header{margin-top:0}.panel{margin-bottom:1em}.panel-body{padding:.7em;word-wrap:break-word}#home .btn-more{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#home .btn-more .btn-default{margin-top:-23px}#powered .powered-text{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#powered .powered-text small{background-color:#f4f4f4;padding:4px;position:relative;top:-12px}#powered a{background-repeat:no-repeat;background-position:center center;display:inline-block;float:left;height:45px}#powered a.bitcore{background-image:url(../img/logo.svg);background-size:80px;width:30%}#powered a.nodejs{background-image:url(../img/nodejs.png);background-size:80px;width:30%}#powered a.angularjs{background-image:url(../img/angularjs.png);background-size:50px;width:20%}#powered a.leveldb{background-image:url(../img/leveldb.png);background-size:50px;width:20%}@keyframes rotateThis{from{transform:scale(1) rotate(0deg)}to{transform:scale(1) rotate(360deg)}}@-webkit-keyframes rotateThis{from{-webkit-transform:scale(1) rotate(0deg)}to{-webkit-transform:scale(1) rotate(360deg)}}.icon-rotate{animation-name:rotateThis;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-name:rotateThis;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.transaction-vin-vout{}.v_highlight{margin-bottom:1em;padding:1em 0;background-color:#e9e9e9;overflow:hidden;color:#333}a.v_highlight_more{background-color:#F0F7E2;color:#333}.secondary_navbar{width:100%;background:#fff;position:fixed;top:64px;left:0;text-align:center;z-index:1000;margin:0 auto;-moz-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);box-shadow:0 1px 4px 0 rgba(0,0,0,.20)}.secondary_navbar .container{margin:0 auto;padding:1.8em 0}.secondary_navbar h3,.secondary_navbar p,.secondary_navbar .lead{margin:0}.secondary_navbar p{line-height:1.9em}.hide_snavbar{border-bottom-right-radius:.3em;border-bottom-left-radius:.3em;position:absolute;right:25px;padding:5px 10px;background:#fff;-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);box-shadow:0 2px 3px 0 rgba(0,0,0,.20)}#search-form-mobile{margin-top:15px}@media (max-width:991px){.status{display:none}.navbar-form{width:auto}.btn-copy{display:none}.col-gray-fixed{position:static;width:100%;margin-top:0;padding:0}.m50v{margin:15px 0}.block-id span{font-size:24px;margin:10px 0}.icon-block{font-size:initial;margin:10px 0}body{font-size:12px}h1{font-size:26px}h2{font-size:22px}h3{font-size:18px}.insight{font-size:30px}.navbar-default .navbar-nav>li>a{padding-left:15px;padding-right:15px}}@media (max-width:767px){.navbar-form{width:auto}.status{display:none}#wrap>.container{padding:50px 15px 0}#ngProgress-container{top:50px}body{font-size:11px}h1{font-size:24px}h2{font-size:20px}.navbar-default .navbar-brand{padding:15px}.insight{font-size:26px}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.container{padding-left:0;padding-right:0}.navbar-default .navbar-toggle{margin-top:7px}.navbar{min-height:50px}#search{color:#000}.txvalues{display:block;margin:5px;padding:.5em 2em;font-size:11px}.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.txvalues{display:inline;margin:0;padding:0;font-weight:700}.txvalues-success{background:0;color:#2FA4D7}.txvalues-primary{background:0;color:#8DC429}.txvalues-default{background:0;color:#A09E9E}.txvalues-danger{background:0;color:#AC0015}.btn-expand{font-size:18px}}@media (min-width:1200px){.col-gray-fixed{width:280px}.navbar-form .form-control{width:350px}} \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.eot b/public/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20335 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

!oRptb@n+ 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 diff --git a/public/fonts/glyphicons-halflings-regular.svg b/public/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc7..0000000 --- a/public/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/fonts/glyphicons-halflings-regular.ttf b/public/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41280 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

PBK;&Wcg|NX{>QR@W3{K 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 diff --git a/public/fonts/glyphicons-halflings-regular.woff b/public/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23320 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 AtN;K2 diff --git a/public/img/icons/copy.png b/public/img/icons/copy.png deleted file mode 100644 index b43ca063492c22a1436ae1d2ce852d638df9e38c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fhQyQAu+S>l}xG*h< za+8=Xc(dWxud1e5($dl|6Bs-MH!>_|JhH3p8(YF>zD;*LiWzq;yi(3+R-bgag-2qe w=Ar3p64y1WW^UqXSe1C>HB(KU`#B$mX;bUjd88Ho0j**1boFyt=akR{0FnYUOaK4? diff --git a/public/img/icons/favicon.ico b/public/img/icons/favicon.ico deleted file mode 100644 index c943f00496582633c1213109ab8fca70c2ac53dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYH+z~Rn+42L`alZh$Oi`Pz( zV}1WYm`r#5hk=38fAYg)uoFVBt|QA2rf27Y^}qW0nJoPvf5X5)g~8JwAHhzrIlqu> eKalHon7)Ay1CTp7j&#$~|CHpxe;DNfi2?vqx@(&N diff --git a/public/img/leveldb.png b/public/img/leveldb.png deleted file mode 100644 index da13a671aaabef5febe267d4d10fa663fbbab21a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12009 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 diff --git a/public/img/loading.gif b/public/img/loading.gif deleted file mode 100644 index 64e5614b46875d4b9905f8f3abf9a4e4207ddbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmZ?wbhEHb6kyY~S+8;RKIf@w#hVu4|_`VKYG`AyI-gVcv>N znf8hM4%|Al^3A2?z0cq5eZ4zEUtZ=E6w0k7GR^Oh05+pcfkrLia1{(;>V0gI zq~dw;l}*3!`O?bg*0Xq*GoNU&OWNT6OSJ#Y#9~Vpsmj&Yx_4>K4N}Brk`W|4u5F5V z<`Ou0hsUL)pitM7TVfws#l4+&n=$QheBcXZ#@-XpPOv7=^ICcJs}xqhnL~_GDU5Ad zu_Z`1Zf!3WHG(|uL?XP7X>>oS;`onEl-K@bNvC+S1X zdIEIMicRlU70IXuZQ*@jy8icenS$xu-@1;>Dr}Yc6{pK!!sZ;gehJn9BH0XUP!a(H E00rLqw*UYD diff --git a/public/img/logo.svg b/public/img/logo.svg deleted file mode 100644 index 856b0a1..0000000 --- a/public/img/logo.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - Group copy + bitcore copy@2x - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/public/img/nodejs.png b/public/img/nodejs.png deleted file mode 100644 index 4cba6f8c6432f5aa83c366fd49d10d9ea84b296a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3253 zcmV;m3`+BfP)u%bCJPqM zqcv+^pr%cm8vXn%BbPCbvH4=S9)Ar{|8Xj1_Eo6vtnHAnF|qud5Q5pp8*78H-^} zU2zH8Xr-^K0+*nTSpu#KT!Omd64Vt}T!Omd64Vt}T!Omdic3&eT!Omdic3&eTnUS} zqN1YSPwMgV%t+x64cY0Zgxbskervn=d`+pgu8tJNC69rzlLnb;M+th{q_I}E|2|_f zV;AFL#-~JTpWkJ)WUOFRHV`oeQm6@KD`TmsxBLdJd7`~c{G5oV0{levp`x!sN zq@BRHjqwYrzeedV!%*EAwm%H9c;8_xU_8n=#k!)(nld_d_ISMG?PYYrwT+SEds$-b zkcrtaQSOWGxAu%DDAe;PH|G^ISETXjJgQ16TO!rGo9xPXC_)jD@+}be&zLaB%^Xn9 z?ePT2>t%wPZ-DE-cz|)MP9Ik?{=xVUJ||Ps8Fw>&$!M+nZ2)5v<2lB!7#}5R3@sSb zF)?LXK`Hbi6ZBqiVisdO#<48jB2v z<4hslI~3}16}>;n=)+jV_?U4QCW^RvSxvAU7JaaZ;~!#dVQgpoMy#+AK_#ww3$D~k z7x)oq@sjvjBhxkSaEZUq1Zf=`$%vsD=__4#hF_`rH9){stysr+5Ulx&)!v z#w=xKj6<<;%m!b=5%9D7)f^v3I6paM@LMy)q`M-l{1ANi0W$GTs5nTe>lp(B zRBmMuW{Eiora6~P);%vWu`-eV$G92Qf_EBX6<1CUWA4n)Jdkjij*Ps+tj4DyST{9j_mZ5Z1X7HP2a}&QnP?UGVy@bT&^S5~UnXc{oDAc-Rkoa~9T7b`DNhQpX z`txHHYAlk1z0_eZLy60B*&$I9t4SygHC9m^n)Hc|LSZW@G3a?u`k1Ibe;qZE-*wTn zl+L7BzV1Ati}h?m#H6-sJqcEE6^xiFG6CZcmKE0xdM06#FIiZjudL8r%M8>x(`=IwC|-1 z;ka`jqf{&_ll3H$w&=_f>)BtSmK=N5ok?gowXl#qk-aZ5*e0A%R+EL^VV9uRMe2W2 za+{!w>EscqJO<3Ir*U-fq|(arquQN2mTS}7byo^}XuhjF5whX2mZSu&XPQ_~4pkFN zZ#_sHm%+tLf3UP1?nK-v`jYZwc-e+DkJPyYO}>P?rB=f_=o^^pMc9(c}CjhFwXBsF$mM|V%M|_s31k$)8uUTw_c>kUar@& zj*+M9VWPx4#~GAjvMe4~nyKd^{E%f9&qurYLd=7kHEP#Wp_H_!_0Ko)?>#6R$r6+I z@m&fK(4C_gZakKZKsb<%?GM_W&5{+$v*u^woKUhx>FYDqBPc=qv3CPhQx(icBPW3@ zw0bK^q}T`xQxUe{ocYq3axHQUgiLdF63HoTZnI5P0p!`W-ChUjPFqQ#=imbkZ#v(D z&x$qLwIUF7@lh=4Mr7X-W6COvLb&n)u$C=goXplW<=OojT$hkj`WJ4ZIFE;o2r5=) z7BaJyCQmLiD<89Ccgz!ta@gJ$zkR`K%1yZVA5-Xwj1zJI%9RPUS5E_jHSwbC8?k+% zgT(w8ajGOy@0r;CT?+L&T#u5G9g*&$@G^@F+_aRKj_ucI_sT%fqeV%oqz_aYLH+=5 zE9=y@qmm)A6c#_0vadB8Q!0eggj>A;-kq)C{vajthEtcZ^UG|Gr`GH30?MsC$d^`lsaY( zl8+LbS@!s7mNX@uZ&Hy)pX`nKZh#WFdC{e;OpqFJLmImdb(7jMRs^WQ^ z(TDLzMvbiUj0a`ps38&ud=N1^oRZdvTf`!cCSCDX*2ibxqz1Fe7@4HZURm9Doyl{C zC)xcJ>fnx=q>1(1{Dhw>N8UL zUCXP51lc*^R%K`zqONiVXZ33 z;89qDBC+Xo48Ghb(yA<#7%*nyybrPIC=nocV;rpzM$Nh>~y2h6Du)v4ZUtVeu04UE}{B+H - - - - - - - - Insight - - - - - - - -

- -
-
- -
-
- - - - - - - diff --git a/public/js/angularjs-all.min.js b/public/js/angularjs-all.min.js deleted file mode 100644 index 58e359f..0000000 --- a/public/js/angularjs-all.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! insight-ui 0.4.0 */ -!function(V,W,v){"use strict";function z(b){return function(){var c,a=arguments[0],a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.32/"+(b?b+"/":"")+a;for(c=1;c0&&a-1 in b}function r(b,a,c){var d;if(b)if(O(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d);else if(M(b)||Ra(b))for(d=0;d=0&&b.splice(c,1),a}function Ia(b,a,c,d){if(Ha(b)||b&&b.$evalAsync&&b.$watch)throw Ua("cpws");if(a){if(b===a)throw Ua("cpi");if(c=c||[],d=d||[],T(b)){var e=Sa(c,b);if(-1!==e)return d[e];c.push(b),d.push(a)}if(M(b))for(var f=a.length=0;fd;d++)if(!Ba(b[d],a[d]))return!1;return!0}}return!1}function Ab(b,a){var c=2").append(b).html();try{return 3===b[0].nodeType?A(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+A(b)})}catch(d){return A(c)}}function ac(b){try{return decodeURIComponent(b)}catch(a){}}function bc(b){var c,d,a={};return r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=ac(c[0]),G(d)&&(b=G(c[1])?ac(c[1]):!0,kb.call(a,d)?M(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))}),a}function Bb(b){var a=[];return r(b,function(b,d){M(b)?r(b,function(b){a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))}):a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))}),a.length?a.join("&"):""}function lb(b){return Ca(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ca(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Xc(b,a){function c(a){a&&d.push(a)}var e,f,d=[b],g=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;r(g,function(a){g[a]=!0,c(W.getElementById(a)),a=a.replace(":","\\:"),b.querySelectorAll&&(r(b.querySelectorAll("."+a),c),r(b.querySelectorAll("."+a+"\\:"),c),r(b.querySelectorAll("["+a+"]"),c))}),r(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):r(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}}),e&&a(e,f?[f]:[])}function cc(b,a){var c=function(){if(b=D(b),b.injector()){var c=b[0]===W?"document":ia(b);throw Ua("btstrpd",c.replace(//,">"))}return a=a||[],a.unshift(["$provide",function(a){a.value("$rootElement",b)}]),a.unshift("ng"),c=dc(a),c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},d=/^NG_DEFER_BOOTSTRAP!/;return V&&!d.test(V.name)?c():(V.name=V.name.replace(d,""),void(Wa.resumeBootstrap=function(b){r(b,function(b){a.push(b)}),c()}))}function mb(b,a){return a=a||"_",b.replace(Yc,function(b,d){return(d?a:"")+b.toLowerCase()})}function Cb(b,a,c){if(!b)throw Ua("areq",a||"?",c||"required");return b}function Xa(b,a,c){return c&&M(b)&&(b=b[b.length-1]),Cb(O(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b)),b}function Da(b,a){if("hasOwnProperty"===b)throw Ua("badname",a)}function ec(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;f>g;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&O(b)?Ab(e,b):b}function Db(b){var a=b[0];if(b=b[b.length-1],a===b)return D(a);var c=[a];do{if(a=a.nextSibling,!a)break;c.push(a)}while(a!==b);return D(c)}function Zc(b){var a=z("$injector"),c=z("ng");return b=b.angular||(b.angular={}),b.$$minErr=b.$$minErr||z,b.module||(b.module=function(){var b={};return function(e,f,g){if("hasOwnProperty"===e)throw c("badname","module");return f&&b.hasOwnProperty(e)&&(b[e]=null),b[e]||(b[e]=function(){function b(a,d,e){return function(){return c[e||"push"]([a,d,arguments]),n}}if(!f)throw a("nomod",e);var c=[],d=[],m=b("$injector","invoke"),n={_invokeQueue:c,_runBlocks:d,requires:f,name:e,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide","constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:m,run:function(a){return d.push(a),this}};return g&&m(g),n}())}}())}function $c(b){F(b,{bootstrap:cc,copy:Ia,extend:F,equals:Ba,element:D,forEach:r,injector:dc,noop:B,bind:Ab,toJson:oa,fromJson:$b,identity:ga,isUndefined:H,isDefined:G,isString:E,isFunction:O,isObject:T,isNumber:ib,isElement:Uc,isArray:M,version:ad,isDate:ua,lowercase:A,uppercase:Ja,callbacks:{counter:0},$$minErr:z,$$csp:Ya}),Za=Zc(V);try{Za("ngLocale")}catch(a){Za("ngLocale",[]).provider("$locale",bd)}Za("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:cd}),a.provider("$compile",fc).directive({a:dd,input:gc,textarea:gc,form:ed,script:fd,select:gd,style:hd,option:id,ngBind:jd,ngBindHtml:kd,ngBindTemplate:ld,ngClass:md,ngClassEven:nd,ngClassOdd:od,ngCloak:pd,ngController:qd,ngForm:rd,ngHide:sd,ngIf:td,ngInclude:ud,ngInit:vd,ngNonBindable:wd,ngPluralize:xd,ngRepeat:yd,ngShow:zd,ngStyle:Ad,ngSwitch:Bd,ngSwitchWhen:Cd,ngSwitchDefault:Dd,ngOptions:Ed,ngTransclude:Fd,ngModel:Gd,ngList:Hd,ngChange:Id,required:hc,ngRequired:hc,ngValue:Jd}).directive({ngInclude:Kd}).directive(Eb).directive(ic),a.provider({$anchorScroll:Ld,$animate:Md,$browser:Nd,$cacheFactory:Od,$controller:Pd,$document:Qd,$exceptionHandler:Rd,$filter:jc,$interpolate:Sd,$interval:Td,$http:Ud,$httpBackend:Vd,$location:Wd,$log:Xd,$parse:Yd,$rootScope:Zd,$q:$d,$sce:ae,$sceDelegate:be,$sniffer:ce,$templateCache:de,$timeout:ee,$window:fe,$$rAF:ge,$$asyncCallback:he})}])}function $a(b){return b.replace(ie,function(a,b,d,e){return e?d.toUpperCase():d}).replace(je,"Moz$1")}function Fb(b,a,c,d){function e(b){var l,m,n,q,p,s,e=c&&b?[this.filter(b)]:[this],k=a;if(!d||null!=b)for(;e.length;)for(l=e.shift(),m=0,n=l.length;n>m;m++)for(q=D(l[m]),k?q.triggerHandler("$destroy"):k=!k,p=0,q=(s=q.children()).length;q>p;p++)e.push(Ea(s[p]));return f.apply(this,arguments)}var f=Ea.fn[b],f=f.$original||f;e.$original=f,Ea.fn[b]=e}function S(b){if(b instanceof S)return b;if(E(b)&&(b=$(b)),!(this instanceof S)){if(E(b)&&"<"!=b.charAt(0))throw Gb("nosel");return new S(b)}if(E(b)){var a=b;b=W;var c;if(c=ke.exec(a))b=[b.createElement(c[1])];else{var e,d=b;if(b=d.createDocumentFragment(),c=[],Hb.test(a)){for(d=b.appendChild(d.createElement("div")),e=(le.exec(a)||["",""])[1].toLowerCase(),e=ca[e]||ca._default,d.innerHTML="
 
"+e[1]+a.replace(me,"<$1>")+e[2],d.removeChild(d.firstChild),a=e[0];a--;)d=d.lastChild;for(a=0,e=d.childNodes.length;e>a;++a)c.push(d.childNodes[a]);d=b.firstChild,d.textContent=""}else c.push(d.createTextNode(a));b.textContent="",b.innerHTML="",b=c}Ib(this,b),D(W.createDocumentFragment()).append(this)}else Ib(this,b)}function Jb(b){return b.cloneNode(!0)}function Ka(b){Kb(b);var a=0;for(b=b.childNodes||[];ad;d++)if((c=D.data(b,a[d]))!==v)return c;b=b.parentNode||11===b.nodeType&&b.host}}function mc(b){for(var a=0,c=b.childNodes;a=u?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};return c.elem=b,c}function La(b,a){var d,c=typeof b;return"function"==c||"object"==c&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():d===v&&(d=b.$$hashKey=(a||hb)()):d=b,c+":"+d}function cb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function pc(b){var a,c;return"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(pe,""),c=c.match(qe),r(c[1].split(re),function(b){b.replace(se,function(b,c,d){a.push(d)})})),b.$inject=a):M(b)?(c=b.length-1,Xa(b[c],"fn"),a=b.slice(0,c)):Xa(b,"fn",!0),a}function dc(b){function a(a){return function(b,c){return T(b)?void r(b,Xb(a)):a(b,c)}}function c(a,b){if(Da(a,"service"),(O(b)||M(b))&&(b=n.instantiate(b)),!b.$get)throw db("pget",a);return m[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var c,d,f,h,b=[];return r(a,function(a){if(!l.get(a)){l.put(a,!0);try{if(E(a))for(c=Za(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,f=0,h=d.length;h>f;f++){var g=d[f],k=n.get(g[0]);k[g[1]].apply(k,g[2])}else O(a)?b.push(n.invoke(a)):M(a)?b.push(n.invoke(a)):Xa(a,"module")}catch(p){throw M(a)&&(a=a[a.length-1]),p.message&&p.stack&&-1==p.stack.indexOf(p.message)&&(p=p.message+"\n"+p.stack),db("modulerr",a,p.stack||p.message||p)}}}),b}function f(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===g)throw db("cdep",d+" <- "+k.join(" <- "));return a[d]}try{return k.unshift(d),a[d]=g,a[d]=b(d)}catch(e){throw a[d]===g&&delete a[d],e}finally{k.shift()}}function d(a,b,e){var g,k,p,f=[],h=pc(a);for(k=0,g=h.length;g>k;k++){if(p=h[k],"string"!=typeof p)throw db("itkn",p);f.push(e&&e.hasOwnProperty(p)?e[p]:c(p))}return M(a)&&(a=a[g]),a.apply(b,f)}return{invoke:d,instantiate:function(a,b){var e,c=function(){};return c.prototype=(M(a)?a[a.length-1]:a).prototype,c=new c,e=d(a,c,b),T(e)||O(e)?e:c},get:c,annotate:pc,has:function(b){return m.hasOwnProperty(b+h)||a.hasOwnProperty(b)}}}var g={},h="Provider",k=[],l=new cb([],!0),m={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,Z(b))}),constant:a(function(a,b){Da(a,"constant"),m[a]=b,q[a]=b}),decorator:function(a,b){var c=n.get(a+h),d=c.$get;c.$get=function(){var a=p.invoke(d,c);return p.invoke(b,null,{$delegate:a})}}}},n=m.$injector=f(m,function(){throw db("unpr",k.join(" <- "))}),q={},p=q.$injector=f(q,function(a){return a=n.get(a+h),p.invoke(a.$get,a)});return r(e(b),function(a){p.invoke(a||B)}),p}function Ld(){var b=!0;this.disableAutoScrolling=function(){b=!1},this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;return r(a,function(a){b||"a"!==A(a.nodeName)||(b=a)}),b}function f(){var d,b=c.hash();b?(d=g.getElementById(b))?d.scrollIntoView():(d=e(g.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var g=a.document;return b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(f)}),f}]}function he(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function te(b,a,c,d){function e(a){try{a.apply(null,va.call(arguments,1))}finally{if(s--,0===s)for(;K.length;)try{K.pop()()}catch(b){c.error(b)}}}function f(a,b){!function da(){r(w,function(a){a()}),t=b(da,a)}()}function g(){x!=h.url()&&(x=h.url(),r(aa,function(a){a(h.url())}))}var h=this,k=a[0],l=b.location,m=b.history,n=b.setTimeout,q=b.clearTimeout,p={};h.isMock=!1;var s=0,K=[];h.$$completeOutstandingRequest=e,h.$$incOutstandingRequestCount=function(){s++},h.notifyWhenNoOutstandingRequests=function(a){r(w,function(a){a()}),0===s?a():K.push(a)};var t,w=[];h.addPollFn=function(a){return H(t)&&f(100,n),w.push(a),a};var x=l.href,L=a.find("base"),y=null;h.url=function(a,c){if(l!==b.location&&(l=b.location),m!==b.history&&(m=b.history),!a)return y||l.href.replace(/%27/g,"'");if(x!=a){var e=x&&Fa(x)===Fa(a);if(x=a,!e&&d.history)c?m.replaceState(null,"",a):(m.pushState(null,"",a),L.attr("href",L.attr("href")));else if(e||(y=a),c)l.replace(a);else if(e){var f,e=l;f=a.indexOf("#"),f=-1===f?"":a.substr(f+1),e.hash=f}else l.href=a;return h}};var aa=[],P=!1;h.onUrlChange=function(a){return P||(d.history&&D(b).on("popstate",g),d.hashchange?D(b).on("hashchange",g):h.addPollFn(g),P=!0),aa.push(a),a},h.$$checkUrlChange=g,h.baseHref=function(){var a=L.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var N={},ba="",Q=h.baseHref();h.cookies=function(a,b){var d,e,f,h;if(!a){if(k.cookie!==ba)for(ba=k.cookie,d=ba.split("; "),N={},f=0;f0&&(a=unescape(e.substring(0,h)),N[a]===v&&(N[a]=unescape(e.substring(h+1))));return N}b===v?k.cookie=escape(a)+"=;path="+Q+";expires=Thu, 01 Jan 1970 00:00:00 GMT":E(b)&&(d=(k.cookie=escape(a)+"="+escape(b)+";path="+Q).length+1,d>4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"))},h.defer=function(a,b){var c;return s++,c=n(function(){delete p[c],e(a)},b||0),p[c]=!0,c},h.defer.cancel=function(a){return p[a]?(delete p[a],q(a),e(B),!0):!1}}function Nd(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new te(b,d,a,c)}]}function Od(){this.$get=function(){function b(b,d){function e(a){a!=n&&(q?q==a&&(q=a.n):q=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw z("$cacheFactory")("iid",b);var g=0,h=F({},d,{id:b}),k={},l=d&&d.capacity||Number.MAX_VALUE,m={},n=null,q=null;return a[b]={put:function(a,b){if(ll&&this.remove(q.key),b)},get:function(a){if(l").parent()[0])});var f=P(a,b,a,c,d,e);return aa(a,"ng-scope"),function(b,c,d,e){Cb(b,"scope");var g=c?Ma.clone.call(a):a;r(d,function(a,b){g.data("$"+b+"Controller",a)}),d=0;for(var k=g.length;k>d;d++){var p=g[d].nodeType;1!==p&&9!==p||g.eq(d).data("$scope",b)}return c&&c(g,b),f&&f(b,g,g,e),g}}function aa(a,b){try{a.addClass(b)}catch(c){}}function P(a,b,c,d,e,f){function g(a,c,d,e){var f,p,m,l,q,n,w;f=c.length;var s=Array(f);for(l=0;f>l;l++)s[l]=c[l];for(n=l=0,q=k.length;q>l;n++)p=s[n],c=k[l++],f=k[l++],c?(c.scope?(m=a.$new(),D.data(p,"$scope",m)):m=a,w=c.transcludeOnThisElement?N(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?N(a,b):null,c(f,m,p,d,w)):f&&f(a,p.childNodes,v,e)}for(var p,m,l,q,k=[],n=0;ns;s++){var K=!1,x=!1;if(l=w[s],!u||u>=8||l.specified){m=l.name,q=$(l.value),l=qa(m),(n=U.test(l))&&(m=mb(l.substr(6),"-"));var y=l.replace(/(Start|End)$/,"");l===y+"Start"&&(K=m,x=m.substr(0,m.length-5)+"end",m=m.substr(0,m.length-6)),l=qa(m.toLowerCase()),k[l]=m,(n||!c.hasOwnProperty(l))&&(c[l]=q,nc(a,l)&&(c[l]=!0)),S(a,b,q,l),da(b,l,"A",d,g,K,x)}}if("input"===p&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off"),a=a.className,E(a)&&""!==a)for(;p=f.exec(a);)l=qa(p[2]),da(b,l,"C",d,g)&&(c[l]=$(p[3])),a=a.substr(p.index+p[0].length);break;case 3:if(11===u)for(;a.parentNode&&a.nextSibling&&3===a.nextSibling.nodeType;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);A(b,a.nodeValue);break;case 8:try{(p=e.exec(a.nodeValue))&&(l=qa(p[1]),da(b,l,"M",d,g)&&(c[l]=$(p[2])))}catch(r){}}return b.sort(H),b}function Q(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ja("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return D(d)}function C(a,b,c){return function(d,e,f,g,k){return e=Q(e[0],b,c),a(d,e,f,g,k)}}function J(a,c,d,e,f,g,k,q,n){function w(a,b,c,d){a&&(c&&(a=C(a,c,d)),a.require=I.require,a.directiveName=z,(L===I||I.$$isolateScope)&&(a=qc(a,{isolateScope:!0})),k.push(a)),b&&(c&&(b=C(b,c,d)),b.require=I.require,b.directiveName=z,(L===I||I.$$isolateScope)&&(b=qc(b,{isolateScope:!0})),q.push(b))}function t(a,b,c,d){var e,f="data",g=!1;if(E(b)){for(;"^"==(e=b.charAt(0))||"?"==e;)b=b.substr(1),"^"==e&&(f="inheritedData"),g=g||"?"==e;if(e=null,d&&"data"===f&&(e=d[b]),e=e||c[f]("$"+b+"Controller"),!e&&!g)throw ja("ctreq",b,a)}else M(b)&&(e=[],r(b,function(b){e.push(t(a,b,c,d))}));return e}function K(a,e,f,g,n){function w(a,b){var c;return 2>arguments.length&&(b=a,a=v),Ga&&(c=ba),n(a,b,c)}var x,R,y,N,C,Q,ra,ba={};if(x=c===f?d:ha(d,new Nb(D(f),d.$attr)),R=x.$$element,L){var ve=/^\s*([@=&])(\??)\s*(\w*)\s*$/;Q=e.$new(!0),!J||J!==L&&J!==L.$$originalDirective?R.data("$isolateScopeNoTemplate",Q):R.data("$isolateScope",Q),aa(R,"ng-isolate-scope"),r(L.scope,function(a,c){var k,m,n,q,d=a.match(ve)||[],f=d[3]||c,g="?"==d[2],d=d[1];switch(Q.$$isolateBindings[c]=d+f,d){case"@":x.$observe(f,function(a){Q[c]=a}),x.$$observers[f].$$scope=e,x[f]&&(Q[c]=b(x[f])(e));break;case"=":if(g&&!x[f])break;m=p(x[f]),q=m.literal?Ba:function(a,b){return a===b||a!==a&&b!==b},n=m.assign||function(){throw k=Q[c]=m(e),ja("nonassign",x[f],L.name)},k=Q[c]=m(e),Q.$watch(function(){var a=m(e);return q(a,Q[c])||(q(a,k)?n(e,a=Q[c]):Q[c]=a),k=a},null,m.literal);break;case"&":m=p(x[f]),Q[c]=function(a){return m(e,a)};break;default:throw ja("iscp",L.name,c,a)}})}for(ra=n&&w,P&&r(P,function(a){var c,b={$scope:a===L||a.$$isolateScope?Q:e,$element:R,$attrs:x,$transclude:ra};C=a.controller,"@"==C&&(C=x[a.name]),c=s(C,b),ba[a.name]=c,Ga||R.data("$"+a.name+"Controller",c),a.controllerAs&&(b.$scope[a.controllerAs]=c)}),g=0,y=k.length;y>g;g++)try{(N=k[g])(N.isolateScope?Q:e,R,x,N.require&&t(N.directiveName,N.require,R,ba),ra)}catch(u){m(u,ia(R))}for(g=e,L&&(L.template||null===L.templateUrl)&&(g=Q),a&&a(g,f.childNodes,v,n),g=q.length-1;g>=0;g--)try{(N=q[g])(N.isolateScope?Q:e,R,x,N.require&&t(N.directiveName,N.require,R,ba),ra)}catch(I){m(I,ia(R))}}n=n||{};for(var N,I,z,u,Oa,x=-Number.MAX_VALUE,P=n.controllerDirectives,L=n.newIsolateScopeDirective,J=n.templateDirective,da=n.nonTlbTranscludeDirective,H=!1,F=!1,Ga=n.hasElementTranscludeDirective,A=d.$$element=D(c),S=e,ka=0,U=a.length;U>ka;ka++){I=a[ka];var X=I.$$start,Y=I.$$end;if(X&&(A=Q(c,X,Y)),u=v,x>I.priority)break;if((u=I.scope)&&(N=N||I,I.templateUrl||(eb("new/isolated scope",L,I,A),T(u)&&(L=I))),z=I.name,!I.templateUrl&&I.controller&&(u=I.controller,P=P||{},eb("'"+z+"' controller",P[z],I,A),P[z]=I),(u=I.transclude)&&(H=!0,I.$$tlb||(eb("transclusion",da,I,A),da=I),"element"==u?(Ga=!0,x=I.priority,u=A,A=d.$$element=D(W.createComment(" "+z+": "+d[z]+" ")),c=A[0],ra(f,va.call(u,0),c),S=y(u,e,x,g&&g.name,{nonTlbTranscludeDirective:da})):(u=D(Jb(c)).contents(),A.empty(),S=y(u,e))),I.template)if(F=!0,eb("template",J,I,A),J=I,u=O(I.template)?I.template(A,d):I.template,u=V(u),I.replace){if(g=I,u=Hb.test(u)?D($(u)):[],c=u[0],1!=u.length||1!==c.nodeType)throw ja("tplrt",z,"");ra(f,A,c),U={$attr:{}},u=ba(c,[],U);var we=a.splice(ka+1,a.length-(ka+1));L&&G(u),a=a.concat(u).concat(we),B(d,U),U=a.length}else A.html(u);if(I.templateUrl)F=!0,eb("template",J,I,A),J=I,I.replace&&(g=I),K=ue(a.splice(ka,a.length-ka),A,d,f,H&&S,k,q,{controllerDirectives:P,newIsolateScopeDirective:L,templateDirective:J,nonTlbTranscludeDirective:da}),U=a.length;else if(I.compile)try{Oa=I.compile(A,d,S),O(Oa)?w(null,Oa,X,Y):Oa&&w(Oa.pre,Oa.post,X,Y)}catch(Z){m(Z,ia(A))}I.terminal&&(K.terminal=!0,x=Math.max(x,I.priority))}return K.scope=N&&!0===N.scope,K.transcludeOnThisElement=H,K.templateOnThisElement=F,K.transclude=S,n.hasElementTranscludeDirective=Ga,K}function G(a){for(var b=0,c=a.length;c>b;b++)a[b]=Zb(a[b],{$$isolateScope:!0})}function da(b,e,f,g,p,l,n){if(e===p)return null;if(p=null,c.hasOwnProperty(e)){var q;e=a.get(e+d);for(var w=0,s=e.length;s>w;w++)try{q=e[w],(g===v||g>q.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Zb(q,{$$start:l,$$end:n})),b.push(q),p=q)}catch(x){m(x)}}return p}function B(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),r(b,function(b,f){"class"==f?(aa(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function ue(a,b,c,d,e,f,g,k){var l,m,p=[],w=b[0],s=a.shift(),x=F({},s,{templateUrl:null,transclude:null,replace:null,$$originalDirective:s}),K=O(s.templateUrl)?s.templateUrl(b,c):s.templateUrl;return b.empty(),n.get(t.getTrustedResourceUrl(K),{cache:q}).success(function(q){var n,t;if(q=V(q),s.replace){if(q=Hb.test(q)?D($(q)):[],n=q[0],1!=q.length||1!==n.nodeType)throw ja("tplrt",s.name,K);q={$attr:{}},ra(d,b,n);var y=ba(n,[],q);T(s.scope)&&G(y),a=y.concat(a),B(c,q)}else n=w,b.html(q);for(a.unshift(x),l=J(a,n,c,e,b,s,f,g,k),r(d,function(a,c){a==n&&(d[c]=b[0])}),m=P(b[0].childNodes,e);p.length;){q=p.shift(),t=p.shift();var L=p.shift(),C=p.shift(),y=b[0];if(t!==w){var Q=t.className;k.hasElementTranscludeDirective&&s.replace||(y=Jb(n)),ra(L,D(t),y),aa(D(y),Q)}t=l.transcludeOnThisElement?N(q,l.transclude,C):C,l(m,q,y,d,t)}p=null}).error(function(a,b,c,d){throw ja("tpload",d.url)}),function(a,b,c,d,e){a=e,p?(p.push(b),p.push(c),p.push(d),p.push(a)):(l.transcludeOnThisElement&&(a=N(b,l.transclude,e)),l(m,b,c,d,a))}}function H(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.nameg;g++)if(a[g]==d){a[g++]=c,k=g+e-1;for(var p=a.length;p>g;g++,k++)p>k?a[g]=a[k]:delete a[g];a.length-=e-1;break}for(f&&f.replaceChild(c,d),a=W.createDocumentFragment(),a.appendChild(d),c[D.expando]=d[D.expando],d=1,e=b.length;e>d;d++)f=b[d],D(f).remove(),a.appendChild(f),delete b[d];b[0]=c,b.length=1}function qc(a,b){return F(function(){return a.apply(null,arguments)},a,b)}var Nb=function(a,b){this.$$element=a,this.$attr=b||{}};Nb.prototype={$normalize:qa,$addClass:function(a){a&&0a.status?d:n.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var d,f,b=e.headers,c=F({},a.headers),b=F({},b.common,b[A(a.method)]);a:for(d in b){a=A(d);for(f in c)if(A(f)===a)continue a;c[d]=b[d]}return function(a){var b;r(a,function(c,d){O(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})}(c),c}(a);F(c,a),c.headers=d,c.method=Ja(c.method);var f=[function(a){d=a.headers;var c=uc(a.data,tc(d),a.transformRequest);return H(c)&&r(d,function(a,b){"content-type"===A(b)&&delete d[b]}),H(a.withCredentials)&&!H(e.withCredentials)&&(a.withCredentials=e.withCredentials),s(a,c,d).then(b,b)},v],g=n.when(c);for(r(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError),(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}return g.success=function(a){return g.then(function(b){a(b.data,b.status,b.headers,c)}),g},g.error=function(a){return g.then(null,function(b){a(b.data,b.status,b.headers,c)}),g},g}function s(c,f,g){function l(a,b,c,e){C&&(a>=200&&300>a?C.put(u,[a,b,sc(c),e]):C.remove(u)),q(b,a,c,e),d.$$phase||d.$apply()}function q(a,b,d,e){b=Math.max(b,0),(b>=200&&300>b?t.resolve:t.reject)({data:a,status:b,headers:tc(d),config:c,statusText:e})}function s(){var a=Sa(p.pendingRequests,c);-1!==a&&p.pendingRequests.splice(a,1)}var C,J,t=n.defer(),r=t.promise,u=K(c.url,c.params);if(p.pendingRequests.push(c),r.then(s,s),!c.cache&&!e.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(C=T(c.cache)?c.cache:T(e.cache)?e.cache:w),C)if(J=C.get(u),G(J)){if(J&&O(J.then))return J.then(s,s),J;M(J)?q(J[1],J[0],ha(J[2]),J[3]):q(J,200,{},"OK")}else C.put(u,r);return H(J)&&((J=Ob(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:v)&&(g[c.xsrfHeaderName||e.xsrfHeaderName]=J),a(c.method,u,f,l,g,c.timeout,c.withCredentials,c.responseType)),r}function K(a,b){if(!b)return a;var c=[];return Tc(b,function(a,b){null===a||H(a)||(M(a)||(a=[a]),r(a,function(a){T(a)&&(a=ua(a)?a.toISOString():oa(a)),c.push(Ca(b)+"="+Ca(a))}))}),0=u&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!V.XMLHttpRequest))return new V.ActiveXObject("Microsoft.XMLHTTP");if(V.XMLHttpRequest)return new V.XMLHttpRequest;throw z("$httpBackend")("noxhr")}function Vd(){this.$get=["$browser","$window","$document",function(b,a,c){return ze(b,ye,b.defer,a.angular.callbacks,c[0])}]}function ze(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),g=null;return f.type="text/javascript",f.src=a,f.async=!0,g=function(a){ab(f,"load",g),ab(f,"error",g),e.body.removeChild(f),f=null;var h=-1,s="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),s=a.type,h="error"===a.type?404:200),c&&c(h,s)},rb(f,"load",g),rb(f,"error",g),8>=u&&(f.onreadystatechange=function(){E(f.readyState)&&/loaded|complete/.test(f.readyState)&&(f.onreadystatechange=null,g({type:"load"}))}),e.body.appendChild(f),g}var g=-1;return function(e,k,l,m,n,q,p,s){function K(){t=g,L&&L(),y&&y.abort()}function w(a,d,e,f,g){P&&c.cancel(P),L=y=null,0===d&&(d=e?200:"file"==wa(k).protocol?404:0),a(1223===d?204:d,e,f,g||""),b.$$completeOutstandingRequest(B)}var t;if(b.$$incOutstandingRequestCount(),k=k||b.url(),"jsonp"==A(e)){var x="_"+(d.counter++).toString(36);d[x]=function(a){d[x].data=a,d[x].called=!0};var L=f(k.replace("JSON_CALLBACK","angular.callbacks."+x),x,function(a,b){w(m,a,d[x].data,"",b),d[x]=B})}else{var y=a(e);if(y.open(e,k,!0),r(n,function(a,b){G(a)&&y.setRequestHeader(b,a)}),y.onreadystatechange=function(){if(y&&4==y.readyState){var a=null,b=null,c="";t!==g&&(a=y.getAllResponseHeaders(),b="response"in y?y.response:y.responseText),t===g&&10>u||(c=y.statusText),w(m,t||y.status,b,a,c)}},p&&(y.withCredentials=!0),s)try{y.responseType=s}catch(aa){if("json"!==s)throw aa}y.send(l||null)}if(q>0)var P=c(K,q);else q&&O(q.then)&&q.then(K)}}function Sd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b},this.endSymbol=function(b){return b?(a=b,this):a},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,l,m){for(var n,q,p=0,s=[],K=f.length,w=!1,t=[];K>p;)-1!=(n=f.indexOf(b,p))&&-1!=(q=f.indexOf(a,n+g))?(p!=n&&s.push(f.substring(p,n)),s.push(p=c(w=f.substring(n+g,q))),p.exp=w,p=q+h,w=!0):(p!=K&&s.push(f.substring(p)),p=K);if((K=s.length)||(s.push(""),K=1),m&&1b;b++){if("function"==typeof(g=s[b]))if(g=g(a),g=m?e.getTrusted(m,g):e.valueOf(g),null==g)g="";else switch(typeof g){case"string":break;case"number":g=""+g;break;default:g=oa(g)}t[b]=g}return t.join("")}catch(h){a=vc("interr",f,h.toString()),d(a)}},p.exp=f,p.parts=s,p):void 0}var g=b.length,h=a.length;return f.startSymbol=function(){return b},f.endSymbol=function(){return a},f}]}function Td(){this.$get=["$rootScope","$window","$q",function(b,a,c){function d(d,g,h,k){var l=a.setInterval,m=a.clearInterval,n=c.defer(),q=n.promise,p=0,s=G(k)&&!k;return h=G(h)?h:0,q.then(null,null,d),q.$$intervalId=l(function(){n.notify(p++),h>0&&p>=h&&(n.resolve(p),m(q.$$intervalId),delete e[q.$$intervalId]),s||b.$apply()},g),e[q.$$intervalId]=n,q}var e={};return d.cancel=function(b){return b&&b.$$intervalId in e?(e[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete e[b.$$intervalId],!0):!1},d}]}function bd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"¤",posSuf:"",negPre:"(¤",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Pb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function wc(b,a,c){b=wa(b,c),a.$$protocol=b.protocol,a.$$host=b.hostname,a.$$port=U(b.port)||Ae[b.protocol]||null}function xc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b),b=wa(b,c),a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname),a.$$search=bc(b.search),a.$$hash=decodeURIComponent(b.hash),a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function sa(b,a){return 0===a.indexOf(b)?a.substr(b.length):void 0}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function yc(b){return b.replace(/(#.+)|#$/,"$1")}function Qb(b){return b.substr(0,Fa(b).lastIndexOf("/")+1)}function zc(b,a){this.$$html5=!0,a=a||"";var c=Qb(b);wc(b,this,b),this.$$parse=function(a){var e=sa(c,a);if(!E(e))throw Rb("ipthprfx",a,c);xc(e,this,b),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Bb(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(a?"?"+a:"")+b,this.$$absUrl=c+this.$$url.substr(1)},this.$$parseLinkUrl=function(d,e){var f,g;return(f=sa(b,d))!==v?(g=f,g=(f=sa(a,f))!==v?c+(sa("/",f)||f):b+g):(f=sa(c,d))!==v?g=c+f:c==d+"/"&&(g=c),g&&this.$$parse(g),!!g}}function Sb(b,a){var c=Qb(b);wc(b,this,b),this.$$parse=function(d){var e=sa(b,d)||sa(c,d),e="#"==e.charAt(0)?sa(a,e):this.$$html5?e:"";if(!E(e))throw Rb("ihshprfx",d,a);xc(e,this,b),d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,"")),f.exec(e)||(d=(e=f.exec(d))?e[1]:d),this.$$path=d,this.$$compose()},this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e,this.$$absUrl=b+(this.$$url?a+this.$$url:"")},this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Ac(b,a){this.$$html5=!0,Sb.apply(this,arguments);var c=Qb(b);this.$$parseLinkUrl=function(d,e){var f,g;return b==Fa(d)?f=d:(g=sa(c,d))?f=b+a+g:c===d+"/"&&(f=c),f&&this.$$parse(f),!!f},this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e,this.$$absUrl=b+a+this.$$url}}function sb(b){return function(){return this[b]}}function Bc(b,a){return function(c){return H(c)?this[b]:(this[b]=a(c),this.$$compose(),this)}}function Wd(){var b="",a=!1;this.hashPrefix=function(a){return G(a)?(b=a,this):b},this.html5Mode=function(b){return G(b)?(a=b,this):a},this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,k=d.baseHref(),l=d.url();a?(k=l.substring(0,l.indexOf("/",l.indexOf("//")+2))+(k||"/"),e=e.history?zc:Ac):(k=Fa(l),e=Sb),h=new e(k,"#"+b),h.$$parseLinkUrl(l,l);var m=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=D(a.target);"a"!==A(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=b.attr("href")||b.attr("xlink:href");T(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=wa(e.animVal).href),m.test(e)||!e||b.attr("target")||a.isDefaultPrevented()||!h.$$parseLinkUrl(e,g)||(a.preventDefault(),h.absUrl()!=d.url()&&(c.$apply(),V.angular["ff-684208-preventDefault"]=!0))}}),h.absUrl()!=l&&d.url(h.absUrl(),!0),d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a),c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var n=0;return c.$watch(function(){var a=yc(d.url()),b=yc(h.absUrl()),e=h.$$replace;return n&&a==b||(n++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),e),g(a))})),h.$$replace=!1,n}),h}]}function Xd(){var b=!0,a=this;this.debugEnabled=function(a){return G(a)?(b=a,this):b},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];return r(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function la(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ea("isecfld",a);return b}function Cc(b,a){if(b+="",!E(b))throw ea("iseccst",a);return b}function ma(b,a){if(b){if(b.constructor===b)throw ea("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ea("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ea("isecdom",a);if(b===Object)throw ea("isecobj",a)}return b}function tb(b,a,c,d,e){ma(b,d),e=e||{},a=a.split(".");for(var f,g=0;1g?Dc(f[0],f[1],f[2],f[3],f[4],c,a):function(b,d){var h,e=0;do h=Dc(f[e++],f[e++],f[e++],f[e++],f[e++],c,a)(b,d),d=v,b=h;while(g>e);return h};else{var k="var p;\n";d&&(k+="s = eso(s, fe);\nl = eso(l, fe);\n");var l=d;r(f,function(b,e){la(b,c);var f=(e?"s":'((l&&l.hasOwnProperty("'+b+'"))?l:s)')+'["'+b+'"]',g=d||Pa(b);g&&(f="eso("+f+", fe)",l=!0),k+="if(s == null) return undefined;\ns="+f+";\n",a.unwrapPromises&&(k+='if (s && s.then) {\n pw("'+c.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v='+(g?"eso(v)":"v")+";});\n}\n s="+(g?"eso(s.$$v)":"s.$$v")+"\n}\n")}),k+="return s;",h=new Function("s","l","pw","eso","fe",k),h.toString=Z(k),(l||a.unwrapPromises)&&(h=Be(h,c))}return"hasOwnProperty"!==b&&(e[b]=h),h}function Yd(){var b={},a={},c={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0,expensiveChecks:!1};this.unwrapPromises=function(a){return G(a)?(c.unwrapPromises=!!a,this):c.unwrapPromises},this.logPromiseWarnings=function(a){return G(a)?(c.logPromiseWarnings=a,this):c.logPromiseWarnings},this.$get=["$filter","$sniffer","$log",function(d,e,f){c.csp=e.csp;var g={csp:c.csp,unwrapPromises:c.unwrapPromises,logPromiseWarnings:c.logPromiseWarnings,expensiveChecks:!0};return xa=function(a){c.logPromiseWarnings&&!Fc.hasOwnProperty(a)&&(Fc[a]=!0,f.warn("[$parse] Promise found in the expression `"+a+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))},function(e,f){var l;switch(typeof e){case"string":var m=f?a:b;if(m.hasOwnProperty(e))return m[e];l=f?g:c;var n=new Tb(l);return l=new fb(n,d,l).parse(e),"hasOwnProperty"!==e&&(m[e]=l),l;case"function":return e;default:return B}}}]}function $d(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return Ee(function(a){b.$evalAsync(a)},a)}]}function Ee(b,a){function c(a){return a}function d(a){return g(a)}var e=function(){var l,m,g=[];return m={resolve:function(a){if(g){var c=g;g=v,l=f(a),c.length&&b(function(){for(var a,b=0,d=c.length;d>b;b++)a=c[b],l.then(a[0],a[1],a[2])})}},reject:function(a){m.resolve(h(a))},notify:function(a){if(g){var c=g;g.length&&b(function(){for(var b,d=0,e=c.length;e>d;d++)b=c[d],b[2](a)})}},promise:{then:function(b,f,h){var m=e(),K=function(d){try{m.resolve((O(b)?b:c)(d))}catch(e){m.reject(e),a(e)}},w=function(b){try{m.resolve((O(f)?f:d)(b))}catch(c){m.reject(c),a(c)}},t=function(b){try{m.notify((O(h)?h:c)(b))}catch(d){a(d)}};return g?g.push([K,w,t]):l.then(K,w,t),m.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();return c?d.resolve(a):d.reject(a),d.promise}function d(e,f){var g=null;try{g=(a||c)()}catch(h){return b(h,!1)}return g&&O(g.then)?g.then(function(){return b(e,f)},function(a){return b(a,!1)}):b(e,f)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},f=function(a){return a&&O(a.then)?a:{then:function(c){var d=e();return b(function(){d.resolve(c(a))}),d.promise}}},g=function(a){var b=e();return b.reject(a),b.promise},h=function(c){return{then:function(f,g){var h=e();return b(function(){try{h.resolve((O(g)?g:d)(c))}catch(b){h.reject(b),a(b)}}),h.promise}}};return{defer:e,reject:g,when:function(h,l,m,n){var p,q=e(),s=function(b){try{return(O(l)?l:c)(b)}catch(d){return a(d),g(d)}},K=function(b){try{return(O(m)?m:d)(b)}catch(c){return a(c),g(c)}},w=function(b){try{return(O(n)?n:c)(b)}catch(d){a(d)}};return b(function(){f(h).then(function(a){p||(p=!0,q.resolve(f(a).then(s,K,w)))},function(a){p||(p=!0,q.resolve(K(a)))},function(a){p||q.notify(w(a))})}),q.promise},all:function(a){var b=e(),c=0,d=M(a)?[]:{};return r(a,function(a,e){c++,f(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}}}function ge(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};return f.supported=e,f}]}function Zd(){var b=10,a=z("$rootScope"),c=null;this.digestTtl=function(a){return arguments.length&&(b=a),b},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,f,g){function h(){this.$id=hb(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this["this"]=this.$root=this,this.$$destroyed=!1,this.$$asyncQueue=[],this.$$postDigestQueue=[],this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings={}}function k(b){if(q.$$phase)throw a("inprog",q.$$phase);q.$$phase=b}function l(a,b){var c=f(a);return Xa(c,b),c}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function n(){}h.prototype={constructor:h,$new:function(a){return a?(a=new h,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(this.$$childScopeClass||(this.$$childScopeClass=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$id=hb(),this.$$childScopeClass=null},this.$$childScopeClass.prototype=this),a=new this.$$childScopeClass),a["this"]=a,a.$parent=this,a.$$prevSibling=this.$$childTail,this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a,a},$watch:function(a,b,d){var e=l(a,"watch"),f=this.$$watchers,g={fn:b,last:n,get:e,exp:a,eq:!!d};if(c=null,!O(b)){var h=l(b||B,"listener");g.fn=function(a,b,c){h(c)}}if("string"==typeof a&&e.constant){var k=g.fn;g.fn=function(a,b,c){k.call(this,a,b,c),Ta(f,g)}}return f||(f=this.$$watchers=[]),f.unshift(g),function(){Ta(f,g),c=null}},$watchCollection:function(a,b){var d,e,g,c=this,h=1b;b++)f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(k++,e[b]=d[b]);else{e!==n&&(e=n={},r=0,k++),a=0;for(b in d)d.hasOwnProperty(b)&&(a++,e.hasOwnProperty(b)?(f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(k++,e[b]=d[b])):(r++,e[b]=d[b],k++));if(r>a)for(b in k++,e)e.hasOwnProperty(b)&&!d.hasOwnProperty(b)&&(r--,delete e[b])}else e!==d&&(e=d,k++);return k},function(){if(q?(q=!1,b(d,d,c)):b(d,g,c),h)if(T(d))if(Ra(d)){g=Array(d.length);for(var a=0;av&&(u=4-v,N[u]||(N[u]=[]),Q=O(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,Q+="; newVal: "+oa(f)+"; oldVal: "+oa(h),N[u].push(Q))}catch(D){q.$$phase=null,e(D)}if(!(l=P.$$childHead||P!==this&&P.$$nextSibling))for(;P!==this&&!(l=P.$$nextSibling);)P=P.$parent}while(P=l);if((y||m.length)&&!v--)throw q.$$phase=null,a("infdig",b,oa(N))}while(y||m.length);for(q.$$phase=null;r.length;)try{r.shift()()}catch(G){e(G)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this!==q&&(r(this.$$listenerCount,Ab(null,m,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=B,this.$on=this.$watch=function(){return B})}},$eval:function(a,b){return f(a)(this,b)},$evalAsync:function(a){q.$$phase||q.$$asyncQueue.length||g.defer(function(){q.$$asyncQueue.length&&q.$digest()}),this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return k("$apply"),this.$eval(a)}catch(b){e(b)}finally{q.$$phase=null;try{q.$digest()}catch(c){throw e(c),c}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=Sa(c,b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var d,l,m,c=[],f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(va.call(arguments,1));do{for(d=f.$$listeners[a]||c,h.currentScope=f,l=0,m=d.length;m>l;l++)if(d[l])try{d[l].apply(null,k)}catch(n){e(n)}else d.splice(l,1),l--,m--;if(g)break;f=f.$parent}while(f);return h},$broadcast:function(a,b){for(var h,k,c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(va.call(arguments,1));c=d;){for(f.currentScope=c,d=c.$$listeners[a]||[],h=0,k=d.length;k>h;h++)if(d[h])try{d[h].apply(null,g)}catch(l){e(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}return f}};var q=new h;return q}]}function cd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return G(a)?(b=a,this):b},this.imgSrcSanitizationWhitelist=function(b){return G(b)?(a=b,this):a},this.$get=function(){return function(c,d){var f,e=d?a:b;return u&&!(u>=8)||(f=wa(c).href,""===f||f.match(e))?c:"unsafe:"+f}}}function Fe(b){if("self"===b)return b;if(E(b)){if(-1m;m++)if("self"===b[m]?Ob(f):b[m].exec(f.href)){q=!0;break}if(q)for(m=0,n=a.length;n>m;m++)if("self"===a[m]?Ob(f):a[m].exec(f.href)){q=!1;break}if(q)return d;throw ya("insecurl",d.toString())}if(c===fa.HTML)return e(d);throw ya("unsafe")},valueOf:function(a){return a instanceof f?a.$$unwrapTrustedValue():a}}}]}function ae(){var b=!0;this.enabled=function(a){return arguments.length&&(b=!!a),b},this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw ya("iequirks");var e=ha(fa);e.isEnabled=function(){return b},e.trustAs=d.trustAs,e.getTrusted=d.getTrusted,e.valueOf=d.valueOf,b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=ga),e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var f=e.parseAs,g=e.getTrusted,h=e.trustAs;return r(fa,function(a,b){var c=A(b);e[$a("parse_as_"+c)]=function(b){return f(a,b)},e[$a("get_trusted_"+c)]=function(b){return g(a,b)},e[$a("trust_as_"+c)]=function(b){return h(a,b)}}),e}]}function ce(){this.$get=["$window","$document",function(b,a){var h,c={},d=U((/android (\d+)/.exec(A((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g=f.documentMode,k=/^(Moz|webkit|O|ms)(?=[A-Z])/,l=f.body&&f.body.style,m=!1,n=!1;if(l){for(var q in l)if(m=k.exec(q)){h=m[0],h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit"),m=!!("transition"in l||h+"Transition"in l),n=!!("animation"in l||h+"Animation"in l),!d||m&&n||(m=E(f.body.style.webkitTransition),n=E(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||g>7),hasEvent:function(a){if("input"==a&&9==u)return!1;if(H(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Ya(),vendorPrefix:h,transitions:m,animations:n,android:d,msie:u,msieDocumentMode:g}}]}function ee(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,h,k){var l=c.defer(),m=l.promise,n=G(k)&&!k;return h=a.defer(function(){try{l.resolve(e())}catch(a){l.reject(a),d(a)}finally{delete f[m.$$timeoutId]}n||b.$apply()},h),m.$$timeoutId=h,f[h]=l,m}var f={};return e.cancel=function(b){return b&&b.$$timeoutId in f?(f[b.$$timeoutId].reject("canceled"),delete f[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1},e}]}function wa(b,a){var c=b;return u&&(X.setAttribute("href",c),c=X.href),X.setAttribute("href",c),{href:X.href,protocol:X.protocol?X.protocol.replace(/:$/,""):"",host:X.host,search:X.search?X.search.replace(/^\?/,""):"",hash:X.hash?X.hash.replace(/^#/,""):"",hostname:X.hostname,port:X.port,pathname:"/"===X.pathname.charAt(0)?X.pathname:"/"+X.pathname}}function Ob(b){return b=E(b)?wa(b):b,b.protocol===Hc.protocol&&b.host===Hc.host}function fe(){this.$get=Z(V)}function jc(b){function a(d,e){if(T(d)){var f={};return r(d,function(b,c){f[c]=a(c,b)}),f}return b.factory(d+c,e)}var c="Filter";this.register=a,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],a("currency",Ic),a("date",Jc),a("filter",Ge),a("json",He),a("limitTo",Ie),a("lowercase",Je),a("number",Kc),a("orderBy",Lc),a("uppercase",Ke)}function Ge(){return function(b,a,c){if(!M(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;bb;b=Math.abs(b);var g=b+"",h="",k=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(h=g,l=!0)}if(l)e>0&&b>-1&&1>b&&(h=b.toFixed(e));else{g=(g.split(Nc)[1]||"").length,H(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac)),b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e),0===b&&(f=!1),b=(""+b).split(Nc),g=b[0],b=b[1]||"";var m=0,n=a.lgSize,q=a.gSize;if(g.length>=n+q)for(m=g.length-n,l=0;m>l;l++)0===(m-l)%q&&0!==l&&(h+=c),h+=g.charAt(l);for(l=m;lb&&(d="-",b=-b),b=""+b;b.length0||e>-c)&&(e+=c),0===e&&-12==c&&(e=12),Ub(e,a,d)}}function ub(b,a){return function(c,d){var e=c["get"+b](),f=Ja(a?"SHORT"+b:b);return d[f][e]}}function Jc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=U(b[9]+b[10]), -g=U(b[9]+b[11])),h.call(a,U(b[1]),U(b[2])-1,U(b[3])),f=U(b[4]||0)-f,g=U(b[5]||0)-g,h=U(b[6]||0),b=Math.round(1e3*parseFloat("0."+(b[7]||0))),k.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var h,k,f="",g=[];if(e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e,E(c)&&(c=Le.test(c)?U(c):a(c)),ib(c)&&(c=new Date(c)),!ua(c))return c;for(;e;)(k=Me.exec(e))?(g=g.concat(va.call(k,1)),e=g.pop()):(g.push(e),e=null);return r(g,function(a){h=Ne[a],f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),f}}function He(){return function(b){return oa(b,!0)}}function Ie(){return function(b,a){return M(b)||E(b)?(a=1/0===Math.abs(Number(a))?Number(a):U(a))?a>0?b.slice(0,a):b.slice(a):E(b)?"":[]:b}}function Lc(b){return function(a,c,d){function e(a,b){return Va(b)?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(ua(a)&&ua(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:b>a?-1:1):d>c?-1:1}return Ra(a)?(c=M(c)?c:[c],0===c.length&&(c=["+"]),c=Vc(c,function(a){var c=!1,d=a||ga;if(E(a)){if(("+"==a.charAt(0)||"-"==a.charAt(0))&&(c="-"==a.charAt(0),a=a.substring(1)),""===a)return e(function(a,b){return f(a,b)},c);if(d=b(a),d.constant){var l=d();return e(function(a,b){return f(a[l],b[l])},c)}}return e(function(a,b){return f(d(a),d(b))},c)}),va.call(a).sort(e(function(a,b){for(var d=0;d15&&19>a||a>=37&&40>=a||p()}),e.hasEvent("paste")&&a.on("paste cut",p)}a.on("change",n),d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var s=c.ngPattern;if(s&&((e=s.match(/^\/(.*)\/([gim]*)$/))?(s=RegExp(e[1],e[2]),e=function(a){return ta(d,"pattern",d.$isEmpty(a)||s.test(a),a)}):e=function(c){var e=b.$eval(s);if(!e||!e.test)throw z("ngPattern")("noregexp",s,e,ia(a));return ta(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e)),c.ngMinlength){var r=U(c.ngMinlength);e=function(a){return ta(d,"minlength",d.$isEmpty(a)||a.length>=r,a)},d.$parsers.push(e),d.$formatters.push(e)}if(c.ngMaxlength){var w=U(c.ngMaxlength);e=function(a){return ta(d,"maxlength",d.$isEmpty(a)||a.length<=w,a)},d.$parsers.push(e),d.$formatters.push(e)}}function Vb(b,a){return b="ngClass"+b,["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d0||c[a])&&(c[a]=(c[a]||0)+b,c[a]===+(b>0)&&d.push(a))}),g.data("$classCounts",c),d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(m){if(!Ba(b,m)){var s=e(m),p=d(l,s),l=d(s,l),l=k(l,-1),p=k(p,1);0===p.length?c.removeClass(g,l):0===l.length?c.addClass(g,p):c.setClass(g,p,l)}}else{var p=k(l,1);h.$addClass(p)}}m=ha(b)}var m;f.$watch(h[b],l,!0),h.$observe("class",function(a){l(f.$eval(h[b]))}),"ngClass"!==b&&f.$watch("$index",function(c,d){var g=1&c;if(g!==(1&d)){var l=e(f.$eval(h[b]));g===a?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}var u,D,Ea,Za,Na,Pe="validity",A=function(b){return E(b)?b.toLowerCase():b},kb=Object.prototype.hasOwnProperty,Ja=function(b){return E(b)?b.toUpperCase():b},va=[].slice,Qe=[].push,Aa=Object.prototype.toString,Ua=z("ng"),Wa=V.angular||(V.angular={}),na=["0","0","0"];u=U((/msie (\d+)/.exec(A(navigator.userAgent))||[])[1]),isNaN(u)&&(u=U((/trident\/.*; rv:(\d+)/.exec(A(navigator.userAgent))||[])[1])),B.$inject=[],ga.$inject=[];var M=function(){return O(Array.isArray)?Array.isArray:function(b){return"[object Array]"===Aa.call(b)}}(),$=function(){return String.prototype.trim?function(b){return E(b)?b.trim():b}:function(b){return E(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Na=9>u?function(b){return b=b.nodeName?b:b[0],b.scopeName&&"HTML"!=b.scopeName?Ja(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Ya=function(){if(G(Ya.isActive_))return Ya.isActive_;var b=!(!W.querySelector("[ng-csp]")&&!W.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Ya.isActive_=b},Yc=/[A-Z]/g,ad={full:"1.2.32",major:1,minor:2,dot:32,codeName:"alternation-intention"};S.expando="ng339";var bb=S.cache={},ne=1,rb=V.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},ab=V.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};S._data=function(b){return this.cache[b[this.expando]]||{}};var ie=/([\:\-\_]+(.))/g,je=/^moz([A-Z])/,Gb=z("jqLite"),ke=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Hb=/<|&#?\w+;/,le=/<([\w:]+)/,me=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ca={option:[1,'"],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ca.optgroup=ca.option,ca.tbody=ca.tfoot=ca.colgroup=ca.caption=ca.thead,ca.th=ca.td;var Ma=S.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===W.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),S(V).on("load",a))},toString:function(){var b=[];return r(this,function(a){b.push(""+a)}),"["+b.join(", ")+"]"},eq:function(b){return D(b>=0?this[b]:this[this.length+b])},length:0,push:Qe,sort:[].sort,splice:[].splice},qb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){qb[A(b)]=b});var oc={};r("input select option textarea button form details".split(" "),function(b){oc[Ja(b)]=!0}),r({data:Lb,removeData:Kb},function(b,a){S[a]=b}),r({data:Lb,inheritedData:pb,scope:function(b){return D.data(b,"$scope")||pb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:lc,injector:function(b){return pb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Mb,css:function(b,a,c){if(a=$a(a),!G(c)){var d;return 8>=u&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto")),d=d||b.style[a],8>=u&&(d=""===d?v:d),d}b.style[a]=c},attr:function(b,a,c){var d=A(a);if(qb[d]){if(!G(c))return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:v;c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d))}else if(G(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?v:b},prop:function(b,a,c){return G(c)?void(b[a]=c):b[a]},text:function(){function b(b,d){var e=a[b.nodeType];return H(d)?e?b[e]:"":void(b[e]=d)}var a=[];return 9>u?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent",b.$dv="",b}(),val:function(b,a){if(H(a)){if("SELECT"===Na(b)&&b.multiple){var c=[];return r(b.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(H(a))return b.innerHTML;for(var c=0,d=b.childNodes;ce;e++)if(b===Lb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}for(e=b.$dv,g=e===v?Math.min(g,1):g,f=0;g>f;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;g>e;e++)b(this[e],a,d);return this}}),r({removeData:Kb,dealoc:Ka,on:function a(c,d,e,f){if(G(f))throw Gb("onargs");var g=pa(c,"events"),h=pa(c,"handle");g||pa(c,"events",g={}),h||pa(c,"handle",h=oe(c,g)),r(d.split(" "),function(d){var f=g[d];if(!f){if("mouseenter"==d||"mouseleave"==d){var m=W.body.contains||W.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!(!e||1!==e.nodeType||!(d.contains?d.contains(e):a.compareDocumentPosition&&16&a.compareDocumentPosition(e)))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[],a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===this||m(this,c))||h(a,d)})}else rb(c,d,h),g[d]=[];f=g[d]}f.push(e)})},off:kc,one:function(a,c,d){a=D(a),a.on(c,function f(){a.off(c,d),a.off(c,f)}),a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;Ka(a),r(new S(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a),d=c})},children:function(a){var c=[];return r(a.childNodes,function(a){1===a.nodeType&&c.push(a)}),c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){r(new S(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;r(new S(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a),c.appendChild(a)},remove:function(a){Ka(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;r(new S(c),function(a){e.insertBefore(a,d.nextSibling),d=a})},addClass:ob,removeClass:nb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=d;H(f)&&(f=!Mb(a,c)),(f?ob:nb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Jb,triggerHandler:function(a,c,d){var e,f;e=c.type||c;var g=(pa(a,"events")||{})[e];g&&(e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopPropagation:B,type:e,target:a},c.type&&(e=F(e,c)),c=ha(g),f=d?[e].concat(d):[e],r(c,function(c){c.apply(a,f)}))}},function(a,c){S.prototype[c]=function(c,e,f){for(var g,h=0;h":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Ve={n:"\n",f:"\f",r:"\r",t:" ",v:" ","'":"'",'"':'"'},Tb=function(a){this.options=a};Tb.prototype={constructor:Tb,lex:function(a){for(this.text=a,this.index=0,this.ch=v,this.lastCh=":",this.tokens=[];this.index="0"&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||" "===a||"\n"===a||" "===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){throw d=d||this.index,c=G(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d,ea("lexerr",a,c,this.text)},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))&&(a=this.binaryFn(a,c.fn,this.relational())),a},additive:function(){for(var c,a=this.multiplicative();c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var c,a=this.unary();c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(fb.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Ec(d,this.options,this.text);return F(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){return(h=a(e,h))||a.assign(e,h={}),tb(h,d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();return this.consume("]"),F(function(e,f){var k,g=a(e,f),h=Cc(d(e,f),c.text);return la(h,c.text),g?((g=ma(g[h],c.text))&&g.then&&c.options.unwrapPromises&&(k=g,"$$v"in g||(k.$$v=v,k.then(function(a){k.$$v=a})),g=g.$$v),g):v},{assign:function(e,f,g){var h=la(Cc(d(e,g),c.text),c.text);return(g=ma(a(e,g),c.text))||a.assign(e,g={}),g[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text)do d.push(this.expression());while(this.expect(","));this.consume(")");var e=this;return function(f,g){for(var h=[],k=c?c(f,g):f,l=0;la.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){return a=-1*a.getTimezoneOffset(),a=(a>=0?"+":"")+(Ub(Math[a>0?"floor":"ceil"](a/60),2)+Ub(Math.abs(a%60),2))}},Me=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Le=/^\-?\d+$/;Jc.$inject=["$locale"];var Je=Z(A),Ke=Z(Ja);Lc.$inject=["$parse"];var dd=Z({restrict:"E",compile:function(a,c){return 8>=u&&(c.href||c.name||c.$set("href",""),a.append(W.createComment("IE fix"))),c.href||c.xlinkHref||c.name?void 0:function(a,c){var f="[object SVGAnimatedString]"===Aa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),Eb={};r(qb,function(a,c){if("multiple"!=a){var d=qa("ng-"+c);Eb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}}),r(["src","srcset","href"],function(a){var c=qa("ng-"+a);Eb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===Aa.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null),f.$observe(c,function(c){c?(f.$set(h,c),u&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var xb={$addControl:B,$removeControl:B,$setValidity:B,$setDirty:B,$setPristine:B};Oc.$inject=["$element","$attrs","$scope","$animate"];var Rc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};rb(e[0],"submit",h),e.on("$destroy",function(){c(function(){ab(e[0],"submit",h)},0,!1)})}var k=e.parent().controller("form"),l=f.name||f.ngForm;l&&tb(a,l,g,l),k&&e.on("$destroy",function(){k.$removeControl(g),l&&tb(a,l,v,l),F(g,xb)})}}}}}]},ed=Rc(),rd=Rc(!0),We=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Xe=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Ye=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Sc={text:zb,number:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),e.$parsers.push(function(a){var c=e.$isEmpty(a);return c||Ye.test(a)?(e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),v)}),Oe(e,"number",Ze,null,e.$$validityState),e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a}),d.min&&(a=function(a){var c=parseFloat(d.min);return ta(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a)),d.max&&(a=function(a){var c=parseFloat(d.max);return ta(e,"max",e.$isEmpty(a)||c>=a,a)},e.$parsers.push(a),e.$formatters.push(a)),e.$formatters.push(function(a){return ta(e,"number",e.$isEmpty(a)||ib(a),a)})},url:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),a=function(a){return ta(e,"url",e.$isEmpty(a)||We.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},email:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),a=function(a){return ta(e,"email",e.$isEmpty(a)||Xe.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},radio:function(a,c,d,e){H(d.name)&&c.attr("name",hb()),c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})}),e.$render=function(){c[0].checked=d.value==e.$viewValue},d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;E(f)||(f=!0),E(g)||(g=!1),c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})}),e.$render=function(){c[0].checked=e.$viewValue},e.$isEmpty=function(a){return a!==f},e.$formatters.push(function(a){return a===f}),e.$parsers.push(function(a){return a?f:g})},hidden:B,button:B,submit:B,reset:B,file:B},Ze=["badInput"],gc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,g){g&&(Sc[A(f.type)]||Sc.text)(d,e,f,g,c,a)}}}],vb="ng-valid",wb="ng-invalid",Qa="ng-pristine",yb="ng-dirty",$e=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,f,g){function h(a,c){c=c?"-"+mb(c,"-"):"",g.removeClass(e,(a?wb:vb)+c),g.addClass(e,(a?vb:wb)+c)}this.$modelValue=this.$viewValue=Number.NaN,this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$name=d.name;var k=f(d.ngModel),l=k.assign;if(!l)throw z("ngModel")("nonassign",d.ngModel,ia(e));this.$render=B,this.$isEmpty=function(a){return H(a)||""===a||null===a||a!==a};var m=e.inheritedData("$formController")||xb,n=0,q=this.$error={};e.addClass(Qa),h(!0),this.$setValidity=function(a,c){q[a]!==!c&&(c?(q[a]&&n--,n||(h(!0),this.$valid=!0,this.$invalid=!1)):(h(!1),this.$invalid=!0,this.$valid=!1,n++),q[a]=!c,h(c,a),m.$setValidity(a,c,this))},this.$setPristine=function(){this.$dirty=!1,this.$pristine=!0,g.removeClass(e,yb),g.addClass(e,Qa)},this.$setViewValue=function(d){this.$viewValue=d,this.$pristine&&(this.$dirty=!0,this.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,yb),m.$setDirty()),r(this.$parsers,function(a){d=a(d)}),this.$modelValue!==d&&(this.$modelValue=d,l(a,d),r(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var p=this;a.$watch(function(){var c=k(a);if(p.$modelValue!==c){var d=p.$formatters,e=d.length;for(p.$modelValue=c;e--;)c=d[e](c);p.$viewValue!==c&&(p.$viewValue=c,p.$render())}return c})}],Gd=function(){return{require:["ngModel","^?form"],controller:$e,link:function(a,c,d,e){var f=e[0],g=e[1]||xb;g.$addControl(f),a.$on("$destroy",function(){g.$removeControl(f)})}}},Id=Z({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),hc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){return d.required&&e.$isEmpty(a)?void e.$setValidity("required",!1):(e.$setValidity("required",!0),a)};e.$formatters.push(f),e.$parsers.unshift(f),d.$observe("required",function(){f(e.$viewValue)})}}}},Hd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!H(a)){var c=[];return a&&r(a.split(f),function(a){a&&c.push($(a))}),c}}),e.$formatters.push(function(a){return M(a)?a.join(", "):v}),e.$isEmpty=function(a){return!a||!a.length}}}},af=/^(true|false|\d+)$/,Jd=function(){return{priority:100,compile:function(a,c){return af.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},jd=za({compile:function(a){return a.addClass("ng-binding"),function(a,d,e){d.data("$binding",e.ngBind),a.$watch(e.ngBind,function(a){d.text(a==v?"":a)})}}}),ld=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate)),d.addClass("ng-binding").data("$binding",c),e.$observe("ngBindTemplate",function(a){d.text(a)})}}],kd=["$sce","$parse",function(a,c){return{compile:function(d){return d.addClass("ng-binding"),function(d,f,g){f.data("$binding",g.ngBindHtml); -var h=c(g.ngBindHtml);d.$watch(function(){return(h(d)||"").toString()},function(c){f.html(a.getTrustedHtml(h(d))||"")})}}}}],md=Vb("",!0),od=Vb("Odd",0),nd=Vb("Even",1),pd=za({compile:function(a,c){c.$set("ngCloak",v),a.removeClass("ng-cloak")}}),qd=[function(){return{scope:!0,controller:"@",priority:500}}],ic={},bf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=qa("ng-"+a);ic[c]=["$parse","$rootScope",function(d,e){return{compile:function(f,g){var h=d(g[c],!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};bf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var td=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,k,l;c.$watch(e.ngIf,function(f){Va(f)?k||(k=c.$new(),g(k,function(c){c[c.length++]=W.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)})):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=Db(h.clone),a.leave(l,function(){l=null}),h=null))})}}}],ud=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Wa.noop,compile:function(g,h){var k=h.ngInclude||h.src,l=h.onload||"",m=h.autoscroll;return function(g,h,p,r,K){var t,x,u,w=0,y=function(){x&&(x.remove(),x=null),t&&(t.$destroy(),t=null),u&&(e.leave(u,function(){x=null}),x=u,u=null)};g.$watch(f.parseAsResourceUrl(k),function(f){var k=function(){!G(m)||m&&!g.$eval(m)||d()},p=++w;f?(a.get(f,{cache:c}).success(function(a){if(p===w){var c=g.$new();r.template=a,a=K(c,function(a){y(),e.enter(a,null,h,k)}),t=c,u=a,t.$emit("$includeContentLoaded"),g.$eval(l)}}).error(function(){p===w&&y()}),g.$emit("$includeContentRequested")):(y(),r.template=null)})}}}}],Kd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){d.html(f.template),a(d.contents())(c)}}}],vd=za({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),wd=za({terminal:!0,priority:1e3}),xd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var h=g.count,k=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(k)||{},n={},q=c.startSymbol(),p=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[A(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))}),r(m,function(a,e){n[e]=c(a.replace(d,q+h+"-"+l+p))}),e.$watch(function(){var c=parseFloat(e.$eval(h));return isNaN(c)?"":(c in m||(c=a.pluralCat(c-l)),n[c](e,f,!0))},function(a){f.text(a)})}}}],yd=["$parse","$animate",function(a,c){var d=z("ngRepeat");return{transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,link:function(e,f,g,h,k){var n,q,p,s,u,v,l=g.ngRepeat,m=l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),t={$id:La};if(!m)throw d("iexp",l);if(g=m[1],h=m[2],(m=m[3])?(n=a(m),q=function(a,c,d){return v&&(t[v]=a),t[u]=c,t.$index=d,n(e,t)}):(p=function(a,c){return La(c)},s=function(a){return a}),m=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/),!m)throw d("iidexp",g);u=m[3]||m[1],v=m[2];var x={};e.$watchCollection(h,function(a){var g,h,n,G,C,J,A,E,B,z,m=f[0],t={},H=[];if(Ra(a))B=a,E=q||p;else{E=q||s,B=[];for(J in a)a.hasOwnProperty(J)&&"$"!=J.charAt(0)&&B.push(J);B.sort()}for(G=B.length,h=H.length=B.length,g=0;h>g;g++)if(J=a===B?g:B[g],A=a[J],n=E(J,A,g),Da(n,"`track by` id"),x.hasOwnProperty(n))z=x[n],delete x[n],t[n]=z,H[g]=z;else{if(t.hasOwnProperty(n))throw r(H,function(a){a&&a.scope&&(x[a.id]=a)}),d("dupes",l,n,oa(A));H[g]={id:n},t[n]=!1}for(J in x)x.hasOwnProperty(J)&&(z=x[J],g=Db(z.clone),c.leave(g),r(g,function(a){a.$$NG_REMOVED=!0}),z.scope.$destroy());for(g=0,h=B.length;h>g;g++){if(J=a===B?g:B[g],A=a[J],z=H[g],H[g-1]&&(m=H[g-1].clone[H[g-1].clone.length-1]),z.scope){C=z.scope,n=m;do n=n.nextSibling;while(n&&n.$$NG_REMOVED);z.clone[0]!=n&&c.move(Db(z.clone),null,D(m)),m=z.clone[z.clone.length-1]}else C=e.$new();C[u]=A,v&&(C[v]=J),C.$index=g,C.$first=0===g,C.$last=g===G-1,C.$middle=!(C.$first||C.$last),C.$odd=!(C.$even=0===(1&g)),z.scope||k(C,function(a){a[a.length++]=W.createComment(" end ngRepeat: "+l+" "),c.enter(a,null,D(m)),m=a,z.scope=C,z.clone=a,t[z.id]=z})}x=t})}}}],zd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Va(c)?"removeClass":"addClass"](d,"ng-hide")})}}],sd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Va(c)?"addClass":"removeClass"](d,"ng-hide")})}}],Ad=za(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")}),a&&c.css(a)},!0)}),Bd=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],h=[],k=[],l=[];c.$watch(e.ngSwitch||e.on,function(d){var n,q;for(n=0,q=k.length;q>n;++n)k[n].remove();for(n=k.length=0,q=l.length;q>n;++n){var p=h[n];l[n].$destroy(),k[n]=p,a.leave(p,function(){k.splice(n,1)})}h.length=0,l.length=0,(g=f.cases["!"+d]||f.cases["?"])&&(c.$eval(e.change),r(g,function(d){var e=c.$new();l.push(e),d.transclude(e,function(c){var e=d.element;h.push(c),a.enter(c,e.parent(),e)})}))})}}}],Cd=za({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[],e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),Dd=za({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[],e.cases["?"].push({transclude:f,element:c})}}),Fd=za({link:function(a,c,d,e,f){if(!f)throw z("ngTransclude")("orphan",ia(c));f(function(a){c.empty(),c.append(a)})}}),fd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],cf=z("ngOptions"),Ed=Z({terminal:!0}),gd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:B};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var n,k=this,l={},m=e;k.databound=d.ngModel,k.init=function(a,c,d){m=a,n=d},k.addOption=function(c){Da(c,'"option value"'),l[c]=!0,m.$viewValue==c&&(a.val(c),n.parent()&&n.remove())},k.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))},k.renderUnknownOption=function(c){c="? "+La(c)+" ?",n.val(c),a.prepend(n),a.val(c),n.prop("selected",!0)},k.hasOption=function(a){return l.hasOwnProperty(a)},c.$on("$destroy",function(){k.renderUnknownOption=B})}],link:function(e,g,h,k){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(B.parent()&&B.remove(),c.val(a),""===a&&A.prop("selected",!0)):H(a)&&A?c.val(""):e.renderUnknownOption(a)},c.on("change",function(){a.$apply(function(){B.parent()&&B.remove(),d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new cb(d.$viewValue);r(c.find("option"),function(c){c.selected=G(a.get(c.value))})},a.$watch(function(){Ba(e,d.$viewValue)||(e=ha(d.$viewValue),d.$render())}),c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)}),d.$setViewValue(a)})})}function n(e,f,g){function h(){var d,k,s,v,w,a={"":[]},c=[""];s=g.$modelValue,v=B(e)||[];var H,R,C,E=n?Wb(v):v;if(R={},C=!1,p)if(k=g.$modelValue,y&&M(k))for(C=new cb([]),d={},w=0;wC;C++){if(k=C,n){if(k=E[C],"$"===k.charAt(0))continue;R[n]=k}R[m]=v[k],d=r(e,R)||"",(k=a[d])||(k=a[d]=[],c.push(d)),p?d=G(w.remove(y?y(e,R):A(e,R))):(y?(d={},d[m]=s,d=y(e,d)===y(e,R)):d=s===A(e,R),w=w||d),F=l(e,R),F=G(F)?F:"",k.push({id:y?y(e,R):n?E[C]:C,label:F,selected:d})}for(p||(z||null===s?a[""].unshift({id:"",label:"",selected:!w}):w||a[""].unshift({id:"?",label:"",selected:!0})),R=0,E=c.length;E>R;R++){for(d=c[R],k=a[d],D.length<=R?(s={element:x.clone().attr("label",d),label:k.label},v=[s],D.push(v),f.append(s.element)):(v=D[R],s=v[0],s.label!=d&&s.element.attr("label",s.label=d)),F=null,C=0,H=k.length;H>C;C++)d=k[C],(w=v[C+1])?(F=w.element,w.label!==d.label&&(F.text(w.label=d.label),F.prop("label",w.label)),w.id!==d.id&&F.val(w.id=d.id),F[0].selected!==d.selected&&(F.prop("selected",w.selected=d.selected),u&&F.prop("selected",w.selected))):(""===d.id&&z?L=z:(L=t.clone()).val(d.id).prop("selected",d.selected).attr("selected",d.selected).prop("label",d.label).text(d.label),v.push({element:L,label:d.label,id:d.id,selected:d.selected}),q.addOption(d.label,L),F?F.after(L):s.element.append(L),F=L);for(C++;v.length>C;)d=v.pop(),q.removeOption(d.label),d.element.remove()}for(;D.length>R;)D.pop()[0].element.remove()}var k;if(!(k=s.match(d)))throw cf("iexp",s,ia(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],r=c(k[3]||""),A=c(k[2]?k[1]:m),B=c(k[7]),y=k[8]?c(k[8]):null,D=[[{element:f,label:""}]];z&&(a(z)(e),z.removeClass("ng-scope"),z.remove()),f.empty(),f.on("change",function(){e.$apply(function(){var a,k,l,q,r,s,t,u,c=B(e)||[],d={};if(p){for(l=[],r=0,t=D.length;t>r;r++)for(a=D[r],q=1,s=a.length;s>q;q++)if((k=a[q].element)[0].selected){if(k=k.val(),n&&(d[n]=k),y)for(u=0;uf;f++)a[m]=c[f],d[f]=l(e,a);return d}},h),p&&e.$watchCollection(function(){return g.$modelValue},h)}if(k[1]){var q=k[0];k=k[1];var A,p=h.multiple,s=h.ngOptions,z=!1,t=D(W.createElement("option")),x=D(W.createElement("optgroup")),B=t.clone();h=0;for(var y=g.children(),E=y.length;E>h;h++)if(""===y[h].value){A=z=y.eq(h);break}q.init(k,z,B),p&&(k.$isEmpty=function(a){return!a||0===a.length}),s?n(e,g,k):p?m(e,g,k):l(e,g,k,q)}}}}],id=["$interpolate",function(a){var c={addOption:B,removeOption:B};return{restrict:"E",priority:100,compile:function(d,e){if(H(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound?d.prop("selected",!1):m=c,f?a.$watch(f,function(a,c){e.$set("value",a),a!==c&&m.removeOption(c),m.addOption(a)}):m.addOption(e.value),d.on("$destroy",function(){m.removeOption(e.value)})}}}}],hd=Z({restrict:"E",terminal:!0});V.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):((Ea=V.jQuery)&&Ea.fn.on?(D=Ea,F(Ea.fn,{scope:Ma.scope,isolateScope:Ma.isolateScope,controller:Ma.controller,injector:Ma.injector,inheritedData:Ma.inheritedData}),Fb("remove",!0,!0,!1),Fb("empty",!1,!1,!1),Fb("html",!1,!1,!0)):D=S,Wa.element=D,$c(Wa),D(W).ready(function(){Xc(W,cc)}))}(window,document),!window.angular.$$csp()&&window.angular.element(document).find("head").prepend(''),function(H,a,A){"use strict";function D(p,g){g=g||{},a.forEach(g,function(a,c){delete g[c]});for(var c in p)!p.hasOwnProperty(c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(g[c]=p[c]);return g}var v=a.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;a.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(p,g){function c(a,c){this.template=a,this.defaults=c||{},this.urlParams={}}function t(n,w,l){function r(h,d){var e={};return d=x({},w,d),s(d,function(b,d){u(b)&&(b=b());var k;if(b&&b.charAt&&"@"==b.charAt(0)){k=h;var a=b.substr(1);if(null==a||""===a||"hasOwnProperty"===a||!C.test("."+a))throw v("badmember",a);for(var a=a.split("."),f=0,c=a.length;c>f&&k!==A;f++){var g=a[f];k=null!==k?k[g]:A}}else k=b;e[d]=k}),e}function e(a){return a.resource}function f(a){D(a||{},this)}var F=new c(n);return l=x({},B,l),s(l,function(h,d){var c=/^(POST|PUT|PATCH)$/i.test(h.method);f[d]=function(b,d,k,w){var n,l,y,q={};switch(arguments.length){case 4:y=w,l=k;case 3:case 2:if(!u(d)){q=b,n=d,l=k;break}if(u(b)){l=b,y=d;break}l=d,y=k;case 1:u(b)?l=b:c?n=b:q=b;break;case 0:break;default:throw v("badargs",arguments.length)}var t=this instanceof f,m=t?n:h.isArray?[]:new f(n),z={},B=h.interceptor&&h.interceptor.response||e,C=h.interceptor&&h.interceptor.responseError||A;return s(h,function(a,b){"params"!=b&&"isArray"!=b&&"interceptor"!=b&&(z[b]=G(a))}),c&&(z.data=n),F.setUrlParams(z,x({},r(n,h.params||{}),q),h.url),q=p(z).then(function(b){var d=b.data,k=m.$promise;if(d){if(a.isArray(d)!==!!h.isArray)throw v("badcfg",h.isArray?"array":"object",a.isArray(d)?"array":"object");h.isArray?(m.length=0,s(d,function(b){"object"==typeof b?m.push(new f(b)):m.push(b)})):(D(d,m),m.$promise=k)}return m.$resolved=!0,b.resource=m,b},function(b){return m.$resolved=!0,(y||E)(b),g.reject(b)}),q=q.then(function(b){var a=B(b);return(l||E)(a,b.headers),a},C),t?q:(m.$promise=q,m.$resolved=!1,m)},f.prototype["$"+d]=function(b,a,k){return u(b)&&(k=a,a=b,b={}),b=f[d].call(this,b,this,a,k),b.$promise||b}}),f.bind=function(a){return t(n,x({},w,a),l)},f}var B={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},E=a.noop,s=a.forEach,x=a.extend,G=a.copy,u=a.isFunction;return c.prototype={setUrlParams:function(c,g,l){var f,p,r=this,e=l||r.template,h=r.urlParams={};s(e.split(/\W/),function(a){if("hasOwnProperty"===a)throw v("badname");!/^\d+$/.test(a)&&a&&RegExp("(^|[^\\\\]):"+a+"(\\W|$)").test(e)&&(h[a]=!0)}),e=e.replace(/\\:/g,":"),g=g||{},s(r.urlParams,function(d,c){f=g.hasOwnProperty(c)?g[c]:r.defaults[c],a.isDefined(f)&&null!==f?(p=encodeURIComponent(f).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),e=e.replace(RegExp(":"+c+"(\\W|$)","g"),function(a,c){return p+c})):e=e.replace(RegExp("(/?):"+c+"(\\W|$)","g"),function(a,c,d){return"/"==d.charAt(0)?d:c+d})}),e=e.replace(/\/+$/,"")||"/",e=e.replace(/\/\.(?=\w+($|\?))/,"."),c.url=e.replace(/\/\\\./,"/."),s(g,function(a,e){r.urlParams[e]||(c.params=c.params||{},c.params[e]=a)})}},t}])}(window,window.angular),function(n,e,A){"use strict";function x(s,g,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,w){function y(){p&&(p.remove(),p=null),k&&(k.$destroy(),k=null),l&&(h.leave(l,function(){p=null}),p=l,l=null)}function v(){var b=s.current&&s.current.locals;if(e.isDefined(b&&b.$template)){var b=a.$new(),d=s.current;l=w(b,function(d){h.enter(d,null,l||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||g()}),y()}),k=d.scope=b,k.$emit("$viewContentLoaded"),k.$eval(u)}else y()}var k,l,p,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",v),v()}}}function z(e,g,h){return{restrict:"ECA",priority:-400,link:function(a,c){var b=h.current,f=b.locals;c.html(f.$template);var w=e(c.contents());b.controller&&(f.$scope=a,f=g(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f)),w(a)}}}n=e.module("ngRoute",["ng"]).provider("$route",function(){function s(a,c){return e.extend(new(e.extend(function(){},{prototype:a})),c)}function g(a,e){var b=e.caseInsensitiveMatch,f={originalPath:a,regexp:a},h=f.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,b,c){return a="?"===c?c:null,c="*"===c?c:null,h.push({name:b,optional:!!a}),e=e||"",""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1"),f.regexp=RegExp("^"+a+"$",b?"i":""),f}var h={};this.when=function(a,c){if(h[a]=e.extend({reloadOnSearch:!0},c,a&&g(a,c)),a){var b="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[b]=e.extend({redirectTo:a},g(b,c))}return this},this.otherwise=function(a){return this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,g,n,v,k){function l(){var d=p(),m=r.current;d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!u?(m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m)):(d||m)&&(u=!1,a.$broadcast("$routeChangeStart",d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?c.path(t(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var c,b,a=e.extend({},d.resolve);return e.forEach(a,function(d,c){a[c]=e.isString(d)?g.get(d):g.invoke(d)}),e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=k.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=b,c=n.get(b,{cache:v}).then(function(a){return a.data}))),e.isDefined(c)&&(a.$template=c),f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)}))}function p(){var a,b;return e.forEach(h,function(f,h){var q;if(q=!b){var g=c.path();q=f.keys;var l={};if(f.regexp)if(g=f.regexp.exec(g)){for(var k=1,p=g.length;p>k;++k){var n=q[k-1],r=g[k];n&&r&&(l[n.name]=r)}q=l}else q=null;else q=null;q=a=q}q&&(b=s(f,{params:e.extend({},c.search(),a),pathParams:a}),b.$$route=f)}),b||h[null]&&s(h[null],{params:{},pathParams:{}})}function t(a,c){var b=[];return e.forEach((a||"").split(":"),function(a,d){if(0===d)b.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];b.push(c[f]),b.push(e[2]||""),delete c[f]}}),b.join("")}var u=!1,r={routes:h,reload:function(){u=!0,a.$evalAsync(l)}};return a.$on("$locationChangeSuccess",l),r}]}),n.provider("$routeParams",function(){this.$get=function(){return{}}}),n.directive("ngView",x),n.directive("ngView",z),x.$inject=["$route","$anchorScroll","$animate"],z.$inject=["$compile","$controller","$route"]}(window,window.angular),angular.module("monospaced.qrcode",[]).directive("qrcode",["$window",function($window){var canvas2D=!!$window.CanvasRenderingContext2D,levels={L:"Low",M:"Medium",Q:"Quartile",H:"High"},draw=function(context,qr,modules,tile){for(var row=0;modules>row;row++)for(var col=0;modules>col;col++){var w=Math.ceil((col+1)*tile)-Math.floor(col*tile),h=Math.ceil((row+1)*tile)-Math.floor(row*tile);context.fillStyle=qr.isDark(row,col)?"#000":"#fff",context.fillRect(Math.round(col*tile),Math.round(row*tile),w,h)}};return{restrict:"E",template:"",link:function(scope,element,attrs){var error,version,errorCorrectionLevel,data,size,modules,tile,qr,domElement=element[0],canvas=element.find("canvas")[0],context=canvas2D?canvas.getContext("2d"):null,trim=/^\s+|\s+$/g,setVersion=function(value){version=Math.max(1,Math.min(parseInt(value,10),10))||4},setErrorCorrectionLevel=function(value){errorCorrectionLevel=value in levels?value:"M"},setData=function(value){if(value){data=value.replace(trim,""),qr=qrcode(version,errorCorrectionLevel),qr.addData(data);try{qr.make()}catch(e){return void(error=e.message)}error=!1,modules=qr.getModuleCount()}},setSize=function(value){size=parseInt(value,10)||2*modules,tile=size/modules,canvas.width=canvas.height=size},render=function(){return qr?error?(canvas2D||(domElement.innerHTML=''),void scope.$emit("qrcode:error",error)):void(canvas2D?draw(context,qr,modules,tile):domElement.innerHTML=qr.createImgTag(tile,0)):void 0};setVersion(attrs.version),setErrorCorrectionLevel(attrs.errorCorrectionLevel),setSize(attrs.size),attrs.$observe("version",function(value){value&&(setVersion(value),setData(data),setSize(size),render())}),attrs.$observe("errorCorrectionLevel",function(value){value&&(setErrorCorrectionLevel(value),setData(data),setSize(size),render())}),attrs.$observe("data",function(value){value&&(setData(value),setSize(size),render())}),attrs.$observe("size",function(value){value&&(setSize(value),render())})}}}]),function(G,d,P){"use strict";d.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(H,k,e){e=e.ngAnimateChildren,d.isString(e)&&0===e.length?k.data("$$ngAnimateChildren",!0):H.$watch(e,function(d){k.data("$$ngAnimateChildren",!!d)})}}).factory("$$animateReflow",["$$rAF","$document",function(d,k){var e=k[0].body;return function(k){return d(function(){k(e.offsetWidth)})}}]).config(["$provide","$animateProvider",function(H,k){function e(d){for(var e=0;e0){if(C=[],m.isClassBased)"setClass"==B.event?(C.push(B),A(c,b)):e[b]&&(w=e[b],w.event==a?f=!0:(C.push(w),A(c,b)));else if("leave"==a&&e["ng-leave"])f=!0;else{for(var w in e)C.push(e[w]),A(c,w);e={},p=0}0=b||(k.cancel(ea),fa=b,ea=k(function(){R(X),X=[]},W,!1))}function R(a){x(a,function(a){(a=a.data(v))&&(a.closeAnimationFn||p)()})}function I(a,b){var c=b?t[b]:null;if(!c){var h,Y,Z,k,e=0,d=0,f=0,l=0;x(a,function(a){if(a.nodeType==aa){a=g.getComputedStyle(a)||{},Z=a[n+Q],e=Math.max(M(Z),e),k=a[n+u],h=a[n+y],d=Math.max(M(h),d),Y=a[r+y],l=Math.max(M(Y),l);var b=M(a[r+Q]);b>0&&(b*=parseInt(a[r+m],10)||1),f=Math.max(b,f)}}),c={total:0,transitionPropertyStyle:k,transitionDurationStyle:Z,transitionDelayStyle:h,transitionDelay:d,transitionDuration:e,animationDelayStyle:Y,animationDelay:l,animationDuration:f},b&&(t[b]=c)}return c}function M(a){var b=0;return a=d.isString(a)?a.split(/\s*,\s*/):[],x(a,function(a){b=Math.max(parseFloat(a)||0,b)}),b}function F(a){var b=a.parent(),c=b.data(z);return c||(b.data(z,++da),c=da),c+"-"+e(a).getAttribute("class")}function U(a,b,c,d){var f=F(b),g=f+" "+c,l=t[g]?++t[g].total:0,h={};if(l>0){var k=c+"-stagger",h=f+" "+k;(f=!t[h])&&b.addClass(k),h=I(b,h),f&&b.removeClass(k)}d=d||function(a){return a()},b.addClass(c);var k=b.data(v)||{},m=d(function(){return I(b,g)});return d=m.transitionDuration,f=m.animationDuration,0===d&&0===f?(b.removeClass(c),!1):(b.data(v,{running:k.running||0,itemIndex:l,stagger:h,timings:m,closeAnimationFn:p}),a=00&&A(b,c,a),f>0&&0=y&&b>=r&&d()}var k=e(b);if(a=b.data(v),-1!=k.getAttribute("class").indexOf(c)&&a){var l="";x(c.split(" "),function(a,b){l+=(b>0?" ":"")+a+"-active"});var m=a.stagger,n=a.timings,p=a.itemIndex,r=Math.max(n.transitionDuration,n.animationDuration),u=Math.max(n.transitionDelay,n.animationDelay),y=u*ba,z=Date.now(),w=E+" "+H,q="",t=[];if(00&&(00?",":"")+(c*b+parseInt(a,10))+"s"}),d}function a(a,b,c,d){return U(a,b,c,d)?function(a){a&&f(b,c)}:void 0}function b(a,b,c,d){return b.data(v)?V(a,b,c,d):(f(b,c),void d())}function c(c,d,e,f){var g=a(c,d,e);if(g){var h=g;return l(d,function(){N(d,e),O(d),h=b(c,d,e,f)}),function(a){(h||p)(a)}}K(),f()}function f(a,b){a.removeClass(b);var c=a.data(v);c&&(c.running&&c.running--,c.running&&0!==c.running||a.removeData(v))}function q(a,b){var c="";return a=d.isArray(a)?a:a.split(/\s+/),x(a,function(a,d){a&&00?" ":"")+a+b)}),c}var n,H,r,E,s="";G.ontransitionend===P&&G.onwebkittransitionend!==P?(s="-webkit-",n="WebkitTransition",H="webkitTransitionEnd transitionend"):(n="transition",H="transitionend"),G.onanimationend===P&&G.onwebkitanimationend!==P?(s="-webkit-",r="WebkitAnimation",E="webkitAnimationEnd animationend"):(r="animation",E="animationend");var L,Q="Duration",u="Property",y="Delay",m="IterationCount",z="$$ngAnimateKey",v="$$ngAnimateCSS3Data",ca="ng-animate-block-transitions",B=3,C=1.5,ba=1e3,t={},da=0,S=[],ea=null,fa=0,X=[];return{enter:function(a,b){return c("enter",a,"ng-enter",b)},leave:function(a,b){return c("leave",a,"ng-leave",b)},move:function(a,b){return c("move",a,"ng-move",b)},beforeSetClass:function(b,c,d,e){var f=q(d,"-remove")+" "+q(c,"-add"),g=a("setClass",b,f,function(a){var e=b.attr("class");return b.removeClass(d),b.addClass(c),a=a(),b.attr("class",e),a});return g?(l(b,function(){N(b,f),O(b),e()}),g):(K(),void e())},beforeAddClass:function(b,c,d){var e=a("addClass",b,q(c,"-add"),function(a){return b.addClass(c),a=a(),b.removeClass(c),a});return e?(l(b,function(){N(b,c),O(b),d()}),e):(K(),void d())},setClass:function(a,c,d,e){return d=q(d,"-remove"),c=q(c,"-add"),b("setClass",a,d+" "+c,e)},addClass:function(a,c,d){return b("addClass",a,q(c,"-add"),d)},beforeRemoveClass:function(b,c,d){var e=a("removeClass",b,q(c,"-remove"),function(a){var d=b.attr("class");return b.removeClass(c),a=a(),b.attr("class",d),a});return e?(l(b,function(){N(b,c),O(b),d()}),e):void d()},removeClass:function(a,c,d){return b("removeClass",a,q(c,"-remove"),d)}}}])}])}(window,window.angular),angular.module("ui.bootstrap",["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]), -angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function($q,$timeout,$rootScope){function findEndEventName(endEventNames){for(var name in endEventNames)if(void 0!==transElement.style[name])return endEventNames[name]}var $transition=function(element,trigger,options){options=options||{};var deferred=$q.defer(),endEventName=$transition[options.animation?"animationEndEventName":"transitionEndEventName"],transitionEndHandler=function(event){$rootScope.$apply(function(){element.unbind(endEventName,transitionEndHandler),deferred.resolve(element)})};return endEventName&&element.bind(endEventName,transitionEndHandler),$timeout(function(){angular.isString(trigger)?element.addClass(trigger):angular.isFunction(trigger)?trigger(element):angular.isObject(trigger)&&element.css(trigger),endEventName||deferred.resolve(element)}),deferred.promise.cancel=function(){endEventName&&element.unbind(endEventName,transitionEndHandler),deferred.reject("Transition cancelled")},deferred.promise},transElement=document.createElement("trans"),transitionEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},animationEndEventNames={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return $transition.transitionEndEventName=findEndEventName(transitionEndEventNames),$transition.animationEndEventName=findEndEventName(animationEndEventNames),$transition}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function($transition,$timeout){return{link:function(scope,element,attrs){function doTransition(change){function newTransitionDone(){currentTransition===newTransition&&(currentTransition=void 0)}var newTransition=$transition(element,change);return currentTransition&¤tTransition.cancel(),currentTransition=newTransition,newTransition.then(newTransitionDone,newTransitionDone),newTransition}function expand(){initialAnimSkip?(initialAnimSkip=!1,expandDone()):(element.removeClass("collapse").addClass("collapsing"),doTransition({height:element[0].scrollHeight+"px"}).then(expandDone))}function expandDone(){element.removeClass("collapsing"),element.addClass("collapse in"),element.css({height:"auto"})}function collapse(){if(initialAnimSkip)initialAnimSkip=!1,collapseDone(),element.css({height:0});else{element.css({height:element[0].scrollHeight+"px"});element[0].offsetWidth;element.removeClass("collapse in").addClass("collapsing"),doTransition({height:0}).then(collapseDone)}}function collapseDone(){element.removeClass("collapsing"),element.addClass("collapse")}var currentTransition,initialAnimSkip=!0;scope.$watch(attrs.collapse,function(shouldCollapse){shouldCollapse?collapse():expand()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function($scope,$attrs,accordionConfig){this.groups=[],this.closeOthers=function(openGroup){var closeOthers=angular.isDefined($attrs.closeOthers)?$scope.$eval($attrs.closeOthers):accordionConfig.closeOthers;closeOthers&&angular.forEach(this.groups,function(group){group!==openGroup&&(group.isOpen=!1)})},this.addGroup=function(groupScope){var that=this;this.groups.push(groupScope),groupScope.$on("$destroy",function(event){that.removeGroup(groupScope)})},this.removeGroup=function(group){var index=this.groups.indexOf(group);-1!==index&&this.groups.splice(this.groups.indexOf(group),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function($parse){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(element){this.heading=element}},link:function(scope,element,attrs,accordionCtrl){var getIsOpen,setIsOpen;accordionCtrl.addGroup(scope),scope.isOpen=!1,attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,scope.$parent.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.$watch("isOpen",function(value){value&&accordionCtrl.closeOthers(scope),setIsOpen&&setIsOpen(scope.$parent,value)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(element,attr,transclude){return function(scope,element,attr,accordionGroupCtrl){accordionGroupCtrl.setHeading(transclude(scope,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(scope,element,attr,controller){scope.$watch(function(){return controller[attr.accordionTransclude]},function(heading){heading&&(element.html(""),element.append(heading))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function($scope,$attrs){$scope.closeable="close"in $attrs}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(scope,element,attr){element.addClass("ng-binding").data("$binding",attr.bindHtmlUnsafe),scope.$watch(attr.bindHtmlUnsafe,function(value){element.html(value||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(buttonConfig){this.activeClass=buttonConfig.activeClass||"active",this.toggleEvent=buttonConfig.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,scope.$eval(attrs.btnRadio)))},element.bind(buttonsCtrl.toggleEvent,function(){element.hasClass(buttonsCtrl.activeClass)||scope.$apply(function(){ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)),ngModelCtrl.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){function getTrueValue(){return getCheckboxValue(attrs.btnCheckboxTrue,!0)}function getFalseValue(){return getCheckboxValue(attrs.btnCheckboxFalse,!1)}function getCheckboxValue(attributeValue,defaultValue){var val=scope.$eval(attributeValue);return angular.isDefined(val)?val:defaultValue}var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,getTrueValue()))},element.bind(buttonsCtrl.toggleEvent,function(){scope.$apply(function(){ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass)?getFalseValue():getTrueValue()),ngModelCtrl.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function($scope,$timeout,$transition,$q){function restartTimer(){resetTimer();var interval=+$scope.interval;!isNaN(interval)&&interval>=0&&(currentTimeout=$timeout(timerFn,interval))}function resetTimer(){currentTimeout&&($timeout.cancel(currentTimeout),currentTimeout=null)}function timerFn(){isPlaying?($scope.next(),restartTimer()):$scope.pause()}var currentTimeout,isPlaying,self=this,slides=self.slides=[],currentIndex=-1;self.currentSlide=null;var destroyed=!1;self.select=function(nextSlide,direction){function goNext(){if(!destroyed){if(self.currentSlide&&angular.isString(direction)&&!$scope.noTransition&&nextSlide.$element){nextSlide.$element.addClass(direction);nextSlide.$element[0].offsetWidth;angular.forEach(slides,function(slide){angular.extend(slide,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(nextSlide,{direction:direction,active:!0,entering:!0}),angular.extend(self.currentSlide||{},{direction:direction,leaving:!0}),$scope.$currentTransition=$transition(nextSlide.$element,{}),function(next,current){$scope.$currentTransition.then(function(){transitionDone(next,current)},function(){transitionDone(next,current)})}(nextSlide,self.currentSlide)}else transitionDone(nextSlide,self.currentSlide);self.currentSlide=nextSlide,currentIndex=nextIndex,restartTimer()}}function transitionDone(next,current){angular.extend(next,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(current||{},{direction:"",active:!1,leaving:!1,entering:!1}),$scope.$currentTransition=null}var nextIndex=slides.indexOf(nextSlide);void 0===direction&&(direction=nextIndex>currentIndex?"next":"prev"),nextSlide&&nextSlide!==self.currentSlide&&($scope.$currentTransition?($scope.$currentTransition.cancel(),$timeout(goNext)):goNext())},$scope.$on("$destroy",function(){destroyed=!0}),self.indexOfSlide=function(slide){return slides.indexOf(slide)},$scope.next=function(){var newIndex=(currentIndex+1)%slides.length;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"next")},$scope.prev=function(){var newIndex=0>currentIndex-1?slides.length-1:currentIndex-1;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"prev")},$scope.select=function(slide){self.select(slide)},$scope.isActive=function(slide){return self.currentSlide===slide},$scope.slides=function(){return slides},$scope.$watch("interval",restartTimer),$scope.$on("$destroy",resetTimer),$scope.play=function(){isPlaying||(isPlaying=!0,restartTimer())},$scope.pause=function(){$scope.noPause||(isPlaying=!1,resetTimer())},self.addSlide=function(slide,element){slide.$element=element,slides.push(slide),1===slides.length||slide.active?(self.select(slides[slides.length-1]),1==slides.length&&$scope.play()):slide.active=!1},self.removeSlide=function(slide){var index=slides.indexOf(slide);slides.splice(index,1),slides.length>0&&slide.active?index>=slides.length?self.select(slides[index-1]):self.select(slides[index]):currentIndex>index&¤tIndex--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function($parse){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(scope,element,attrs,carouselCtrl){if(attrs.active){var getActive=$parse(attrs.active),setActive=getActive.assign,lastValue=scope.active=getActive(scope.$parent);scope.$watch(function(){var parentActive=getActive(scope.$parent);return parentActive!==scope.active&&(parentActive!==lastValue?lastValue=scope.active=parentActive:setActive(scope.$parent,parentActive=lastValue=scope.active)),parentActive})}carouselCtrl.addSlide(scope,element),scope.$on("$destroy",function(){carouselCtrl.removeSlide(scope)}),scope.$watch("active",function(active){active&&carouselCtrl.select(scope)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function($document,$window){function getStyle(el,cssprop){return el.currentStyle?el.currentStyle[cssprop]:$window.getComputedStyle?$window.getComputedStyle(el)[cssprop]:el.style[cssprop]}function isStaticPositioned(element){return"static"===(getStyle(element,"position")||"static")}var parentOffsetEl=function(element){for(var docDomEl=$document[0],offsetParent=element.offsetParent||docDomEl;offsetParent&&offsetParent!==docDomEl&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||docDomEl};return{position:function(element){var elBCR=this.offset(element),offsetParentBCR={top:0,left:0},offsetParentEl=parentOffsetEl(element[0]);offsetParentEl!=$document[0]&&(offsetParentBCR=this.offset(angular.element(offsetParentEl)),offsetParentBCR.top+=offsetParentEl.clientTop-offsetParentEl.scrollTop,offsetParentBCR.left+=offsetParentEl.clientLeft-offsetParentEl.scrollLeft);var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:elBCR.top-offsetParentBCR.top,left:elBCR.left-offsetParentBCR.left}},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].body.scrollTop||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].body.scrollLeft||$document[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function($scope,$attrs,dateFilter,dtConfig){function getValue(value,defaultValue){return angular.isDefined(value)?$scope.$parent.$eval(value):defaultValue}function getDaysInMonth(year,month){return new Date(year,month,0).getDate()}function getDates(startDate,n){for(var dates=new Array(n),current=startDate,i=0;n>i;)dates[i++]=new Date(current),current.setDate(current.getDate()+1);return dates}function makeDate(date,format,isSelected,isSecondary){return{date:date,label:dateFilter(date,format),selected:!!isSelected,secondary:!!isSecondary}}var format={day:getValue($attrs.dayFormat,dtConfig.dayFormat),month:getValue($attrs.monthFormat,dtConfig.monthFormat),year:getValue($attrs.yearFormat,dtConfig.yearFormat),dayHeader:getValue($attrs.dayHeaderFormat,dtConfig.dayHeaderFormat),dayTitle:getValue($attrs.dayTitleFormat,dtConfig.dayTitleFormat),monthTitle:getValue($attrs.monthTitleFormat,dtConfig.monthTitleFormat)},startingDay=getValue($attrs.startingDay,dtConfig.startingDay),yearRange=getValue($attrs.yearRange,dtConfig.yearRange);this.minDate=dtConfig.minDate?new Date(dtConfig.minDate):null,this.maxDate=dtConfig.maxDate?new Date(dtConfig.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(date,selected){var year=date.getFullYear(),month=date.getMonth(),firstDayOfMonth=new Date(year,month,1),difference=startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth),numDates=0;numDisplayedFromPreviousMonth>0&&(firstDate.setDate(-numDisplayedFromPreviousMonth+1),numDates+=numDisplayedFromPreviousMonth),numDates+=getDaysInMonth(year,month+1),numDates+=(7-numDates%7)%7;for(var days=getDates(firstDate,numDates),labels=new Array(7),i=0;numDates>i;i++){var dt=new Date(days[i]);days[i]=makeDate(dt,format.day,selected&&selected.getDate()===dt.getDate()&&selected.getMonth()===dt.getMonth()&&selected.getFullYear()===dt.getFullYear(),dt.getMonth()!==month)}for(var j=0;7>j;j++)labels[j]=dateFilter(days[j].date,format.dayHeader);return{objects:days,title:dateFilter(date,format.dayTitle),labels:labels}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth(),date1.getDate())-new Date(date2.getFullYear(),date2.getMonth(),date2.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(date,selected){for(var months=new Array(12),year=date.getFullYear(),i=0;12>i;i++){var dt=new Date(year,i,1);months[i]=makeDate(dt,format.month,selected&&selected.getMonth()===i&&selected.getFullYear()===year)}return{objects:months,title:dateFilter(date,format.monthTitle)}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth())-new Date(date2.getFullYear(),date2.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(date,selected){for(var years=new Array(yearRange),year=date.getFullYear(),startYear=parseInt((year-1)/yearRange,10)*yearRange+1,i=0;yearRange>i;i++){var dt=new Date(startYear+i,0,1);years[i]=makeDate(dt,format.year,selected&&selected.getFullYear()===dt.getFullYear())}return{objects:years,title:[years[0].label,years[yearRange-1].label].join(" - ")}},compare:function(date1,date2){return date1.getFullYear()-date2.getFullYear()},split:5,step:{years:yearRange}}],this.isDisabled=function(date,mode){var currentMode=this.modes[mode||0];return this.minDate&¤tMode.compare(date,this.minDate)<0||this.maxDate&¤tMode.compare(date,this.maxDate)>0||$scope.dateDisabled&&$scope.dateDisabled({date:date,mode:currentMode.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(dateFilter,$parse,datepickerConfig,$log){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(scope,element,attrs,ctrls){function updateShowWeekNumbers(){scope.showWeekNumbers=0===mode&&showWeeks}function split(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays}function refill(updateSelected){var date=null,valid=!0;ngModel.$modelValue&&(date=new Date(ngModel.$modelValue),isNaN(date)?(valid=!1,$log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):updateSelected&&(selected=date)),ngModel.$setValidity("date",valid);var currentMode=datepickerCtrl.modes[mode],data=currentMode.getVisibleDates(selected,date);angular.forEach(data.objects,function(obj){obj.disabled=datepickerCtrl.isDisabled(obj.date,mode)}),ngModel.$setValidity("date-disabled",!date||!datepickerCtrl.isDisabled(date)),scope.rows=split(data.objects,currentMode.split),scope.labels=data.labels||[],scope.title=data.title}function setMode(value){mode=value,updateShowWeekNumbers(),refill()}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}var datepickerCtrl=ctrls[0],ngModel=ctrls[1];if(ngModel){var mode=0,selected=new Date,showWeeks=datepickerConfig.showWeeks;attrs.showWeeks?scope.$parent.$watch($parse(attrs.showWeeks),function(value){showWeeks=!!value,updateShowWeekNumbers()}):updateShowWeekNumbers(),attrs.min&&scope.$parent.$watch($parse(attrs.min),function(value){datepickerCtrl.minDate=value?new Date(value):null,refill()}),attrs.max&&scope.$parent.$watch($parse(attrs.max),function(value){datepickerCtrl.maxDate=value?new Date(value):null,refill()}),ngModel.$render=function(){refill(!0)},scope.select=function(date){if(0===mode){var dt=ngModel.$modelValue?new Date(ngModel.$modelValue):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),ngModel.$setViewValue(dt),refill(!0)}else selected=date,setMode(mode-1)},scope.move=function(direction){var step=datepickerCtrl.modes[mode].step;selected.setMonth(selected.getMonth()+direction*(step.months||0)),selected.setFullYear(selected.getFullYear()+direction*(step.years||0)),refill()},scope.toggleMode=function(){setMode((mode+1)%datepickerCtrl.modes.length)},scope.getWeekNumber=function(row){return 0===mode&&scope.showWeekNumbers&&7===row.length?getISO8601WeekNumber(row[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function($compile,$parse,$document,$position,dateFilter,datepickerPopupConfig,datepickerConfig){return{restrict:"EA",require:"ngModel",link:function(originalScope,element,attrs,ngModel){function setOpen(value){setIsOpen?setIsOpen(originalScope,!!value):scope.isOpen=!!value}function parseDate(viewValue){if(viewValue){if(angular.isDate(viewValue))return ngModel.$setValidity("date",!0),viewValue;if(angular.isString(viewValue)){var date=new Date(viewValue);return isNaN(date)?void ngModel.$setValidity("date",!1):(ngModel.$setValidity("date",!0),date)}return void ngModel.$setValidity("date",!1)}return ngModel.$setValidity("date",!0),null}function addWatchableAttribute(attribute,scopeProperty,datepickerAttribute){attribute&&(originalScope.$watch($parse(attribute),function(value){scope[scopeProperty]=value}),datepickerEl.attr(datepickerAttribute||scopeProperty,scopeProperty))}function updatePosition(){scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top=scope.position.top+element.prop("offsetHeight")}var dateFormat,scope=originalScope.$new(),closeOnDateSelection=angular.isDefined(attrs.closeOnDateSelection)?originalScope.$eval(attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined(attrs.datepickerAppendToBody)?originalScope.$eval(attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody;attrs.$observe("datepickerPopup",function(value){dateFormat=value||datepickerPopupConfig.dateFormat,ngModel.$render()}),scope.showButtonBar=angular.isDefined(attrs.showButtonBar)?originalScope.$eval(attrs.showButtonBar):datepickerPopupConfig.showButtonBar,originalScope.$on("$destroy",function(){$popup.remove(),scope.$destroy()}),attrs.$observe("currentText",function(text){scope.currentText=angular.isDefined(text)?text:datepickerPopupConfig.currentText}),attrs.$observe("toggleWeeksText",function(text){scope.toggleWeeksText=angular.isDefined(text)?text:datepickerPopupConfig.toggleWeeksText}),attrs.$observe("clearText",function(text){scope.clearText=angular.isDefined(text)?text:datepickerPopupConfig.clearText}),attrs.$observe("closeText",function(text){scope.closeText=angular.isDefined(text)?text:datepickerPopupConfig.closeText});var getIsOpen,setIsOpen;attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,originalScope.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.isOpen=getIsOpen?getIsOpen(originalScope):!1;var documentClickBind=function(event){scope.isOpen&&event.target!==element[0]&&scope.$apply(function(){setOpen(!1)})},elementFocusBind=function(){scope.$apply(function(){setOpen(!0)})},popupEl=angular.element("
");popupEl.attr({"ng-model":"date","ng-change":"dateSelection()"});var datepickerEl=angular.element(popupEl.children()[0]),datepickerOptions={};attrs.datepickerOptions&&(datepickerOptions=originalScope.$eval(attrs.datepickerOptions),datepickerEl.attr(angular.extend({},datepickerOptions))),ngModel.$parsers.unshift(parseDate),scope.dateSelection=function(dt){angular.isDefined(dt)&&(scope.date=dt),ngModel.$setViewValue(scope.date),ngModel.$render(),closeOnDateSelection&&setOpen(!1)},element.bind("input change keyup",function(){scope.$apply(function(){scope.date=ngModel.$modelValue})}),ngModel.$render=function(){var date=ngModel.$viewValue?dateFilter(ngModel.$viewValue,dateFormat):"";element.val(date),scope.date=ngModel.$modelValue},addWatchableAttribute(attrs.min,"min"),addWatchableAttribute(attrs.max,"max"),attrs.showWeeks?addWatchableAttribute(attrs.showWeeks,"showWeeks","show-weeks"):(scope.showWeeks="show-weeks"in datepickerOptions?datepickerOptions["show-weeks"]:datepickerConfig.showWeeks,datepickerEl.attr("show-weeks","showWeeks")),attrs.dateDisabled&&datepickerEl.attr("date-disabled",attrs.dateDisabled);var documentBindingInitialized=!1,elementFocusInitialized=!1;scope.$watch("isOpen",function(value){value?(updatePosition(),$document.bind("click",documentClickBind),elementFocusInitialized&&element.unbind("focus",elementFocusBind),element[0].focus(),documentBindingInitialized=!0):(documentBindingInitialized&&$document.unbind("click",documentClickBind),element.bind("focus",elementFocusBind),elementFocusInitialized=!0),setIsOpen&&setIsOpen(originalScope,value)}),scope.today=function(){scope.dateSelection(new Date)},scope.clear=function(){scope.dateSelection(null)};var $popup=$compile(popupEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(scope,element,attrs){element.bind("click",function(event){event.preventDefault(),event.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function($document,$location){var openElement=null,closeMenu=angular.noop;return{restrict:"CA",link:function(scope,element,attrs){scope.$watch("$location.path",function(){closeMenu()}),element.parent().bind("click",function(){closeMenu()}),element.bind("click",function(event){var elementWasOpen=element===openElement;event.preventDefault(),event.stopPropagation(),openElement&&closeMenu(),elementWasOpen||element.hasClass("disabled")||element.prop("disabled")||(element.parent().addClass("open"),openElement=element,closeMenu=function(event){event&&(event.preventDefault(),event.stopPropagation()),$document.unbind("click",closeMenu),element.parent().removeClass("open"),closeMenu=angular.noop,openElement=null},$document.bind("click",closeMenu))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var stack=[];return{add:function(key,value){stack.push({key:key,value:value})},get:function(key){for(var i=0;i0)}function checkRemoveBackdrop(){if(backdropDomEl&&-1==backdropIndex()){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,150,function(){backdropScopeRef.$destroy(),backdropScopeRef=null}),backdropDomEl=void 0,backdropScope=void 0}}function removeAfterAnimate(domEl,scope,emulateTime,done){function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,domEl.remove(),done&&done())}scope.animate=!1;var transitionEndEventName=$transition.transitionEndEventName;if(transitionEndEventName){var timeout=$timeout(afterAnimating,emulateTime);domEl.bind(transitionEndEventName,function(){$timeout.cancel(timeout),afterAnimating(),scope.$apply()})}else $timeout(afterAnimating,0)}var backdropDomEl,backdropScope,OPENED_MODAL_CLASS="modal-open",openedWindows=$$stackedMap.createNew(),$modalStack={};return $rootScope.$watch(backdropIndex,function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)}),$document.bind("keydown",function(evt){var modal;27===evt.which&&(modal=openedWindows.top(),modal&&modal.value.keyboard&&$rootScope.$apply(function(){$modalStack.dismiss(modal.key)}))}),$modalStack.open=function(modalInstance,modal){openedWindows.add(modalInstance,{deferred:modal.deferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard});var body=$document.find("body").eq(0),currBackdropIndex=backdropIndex();currBackdropIndex>=0&&!backdropDomEl&&(backdropScope=$rootScope.$new(!0),backdropScope.index=currBackdropIndex,backdropDomEl=$compile("
")(backdropScope),body.append(backdropDomEl));var angularDomEl=angular.element("
");angularDomEl.attr("window-class",modal.windowClass),angularDomEl.attr("index",openedWindows.length()-1),angularDomEl.attr("animate","animate"),angularDomEl.html(modal.content);var modalDomEl=$compile(angularDomEl)(modal.scope);openedWindows.top().value.modalDomEl=modalDomEl,body.append(modalDomEl),body.addClass(OPENED_MODAL_CLASS)},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.resolve(result),removeModalWindow(modalInstance))},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.reject(reason),removeModalWindow(modalInstance))},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal;)this.dismiss(topModal.key,reason),topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack}]).provider("$modal",function(){var $modalProvider={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function($injector,$rootScope,$q,$http,$templateCache,$controller,$modalStack){function getTemplatePromise(options){return options.template?$q.when(options.template):$http.get(options.templateUrl,{cache:$templateCache}).then(function(result){return result.data})}function getResolvePromises(resolves){var promisesArr=[];return angular.forEach(resolves,function(value,key){(angular.isFunction(value)||angular.isArray(value))&&promisesArr.push($q.when($injector.invoke(value)))}),promisesArr}var $modal={};return $modal.open=function(modalOptions){var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,close:function(result){$modalStack.close(modalInstance,result)},dismiss:function(reason){$modalStack.dismiss(modalInstance,reason)}};if(modalOptions=angular.extend({},$modalProvider.options,modalOptions),modalOptions.resolve=modalOptions.resolve||{},!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of template or templateUrl options is required.");var templateAndResolvePromise=$q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));return templateAndResolvePromise.then(function(tplAndVars){var modalScope=(modalOptions.scope||$rootScope).$new();modalScope.$close=modalInstance.close, -modalScope.$dismiss=modalInstance.dismiss;var ctrlInstance,ctrlLocals={},resolveIter=1;modalOptions.controller&&(ctrlLocals.$scope=modalScope,ctrlLocals.$modalInstance=modalInstance,angular.forEach(modalOptions.resolve,function(value,key){ctrlLocals[key]=tplAndVars[resolveIter++]}),ctrlInstance=$controller(modalOptions.controller,ctrlLocals)),$modalStack.open(modalInstance,{scope:modalScope,deferred:modalResultDeferred,content:tplAndVars[0],backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,windowClass:modalOptions.windowClass})},function(reason){modalResultDeferred.reject(reason)}),templateAndResolvePromise.then(function(){modalOpenedDeferred.resolve(!0)},function(){modalOpenedDeferred.reject(!1)}),modalInstance},$modal}]};return $modalProvider}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function($scope,$attrs,$parse,$interpolate){var self=this,setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop;this.init=function(defaultItemsPerPage){$attrs.itemsPerPage?$scope.$parent.$watch($parse($attrs.itemsPerPage),function(value){self.itemsPerPage=parseInt(value,10),$scope.totalPages=self.calculateTotalPages()}):this.itemsPerPage=defaultItemsPerPage},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===$scope.totalPages},this.isActive=function(page){return this.page===page},this.calculateTotalPages=function(){var totalPages=this.itemsPerPage<1?1:Math.ceil($scope.totalItems/this.itemsPerPage);return Math.max(totalPages||0,1)},this.getAttributeValue=function(attribute,defaultValue,interpolate){return angular.isDefined(attribute)?interpolate?$interpolate(attribute)($scope.$parent):$scope.$parent.$eval(attribute):defaultValue},this.render=function(){this.page=parseInt($scope.page,10)||1,this.page>0&&this.page<=$scope.totalPages&&($scope.pages=this.getPages(this.page,$scope.totalPages))},$scope.selectPage=function(page){!self.isActive(page)&&page>0&&page<=$scope.totalPages&&($scope.page=page,$scope.onSelectPage({page:page}))},$scope.$watch("page",function(){self.render()}),$scope.$watch("totalItems",function(){$scope.totalPages=self.calculateTotalPages()}),$scope.$watch("totalPages",function(value){setNumPages($scope.$parent,value),self.page>value?$scope.selectPage(value):self.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function($parse,config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isActive,isDisabled){return{number:number,text:text,active:isActive,disabled:isDisabled}}var maxSize,boundaryLinks=paginationCtrl.getAttributeValue(attrs.boundaryLinks,config.boundaryLinks),directionLinks=paginationCtrl.getAttributeValue(attrs.directionLinks,config.directionLinks),firstText=paginationCtrl.getAttributeValue(attrs.firstText,config.firstText,!0),previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),lastText=paginationCtrl.getAttributeValue(attrs.lastText,config.lastText,!0),rotate=paginationCtrl.getAttributeValue(attrs.rotate,config.rotate);paginationCtrl.init(config.itemsPerPage),attrs.maxSize&&scope.$parent.$watch($parse(attrs.maxSize),function(value){maxSize=parseInt(value,10),paginationCtrl.render()}),paginationCtrl.getPages=function(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&totalPages>maxSize;isMaxSized&&(rotate?(startPage=Math.max(currentPage-Math.floor(maxSize/2),1),endPage=startPage+maxSize-1,endPage>totalPages&&(endPage=totalPages,startPage=endPage-maxSize+1)):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;endPage>=number;number++){var page=makePage(number,number,paginationCtrl.isActive(number),!1);pages.push(page)}if(isMaxSized&&!rotate){if(startPage>1){var previousPageSet=makePage(startPage-1,"...",!1,!1);pages.unshift(previousPageSet)}if(totalPages>endPage){var nextPageSet=makePage(endPage+1,"...",!1,!1);pages.push(nextPageSet)}}if(directionLinks){var previousPage=makePage(currentPage-1,previousText,!1,paginationCtrl.noPrevious());pages.unshift(previousPage);var nextPage=makePage(currentPage+1,nextText,!1,paginationCtrl.noNext());pages.push(nextPage)}if(boundaryLinks){var firstPage=makePage(1,firstText,!1,paginationCtrl.noPrevious());pages.unshift(firstPage);var lastPage=makePage(totalPages,lastText,!1,paginationCtrl.noNext());pages.push(lastPage)}return pages}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isDisabled,isPrevious,isNext){return{number:number,text:text,disabled:isDisabled,previous:align&&isPrevious,next:align&&isNext}}var previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),align=paginationCtrl.getAttributeValue(attrs.align,config.align);paginationCtrl.init(config.itemsPerPage),paginationCtrl.getPages=function(currentPage){return[makePage(currentPage-1,previousText,paginationCtrl.noPrevious(),!0,!1),makePage(currentPage+1,nextText,paginationCtrl.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function snake_case(name){var regexp=/[A-Z]/g,separator="-";return name.replace(regexp,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}var defaultOptions={placement:"top",animation:!0,popupDelay:0},triggerMap={mouseenter:"mouseleave",click:"click",focus:"blur"},globalOptions={};this.options=function(value){angular.extend(globalOptions,value)},this.setTriggers=function(triggers){angular.extend(triggerMap,triggers)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function($window,$compile,$timeout,$parse,$document,$position,$interpolate){return function(type,prefix,defaultTriggerShow){function getTriggers(trigger){var show=trigger||options.trigger||defaultTriggerShow,hide=triggerMap[show]||show;return{show:show,hide:hide}}var options=angular.extend({},defaultOptions,globalOptions),directiveName=snake_case(type),startSym=$interpolate.startSymbol(),endSym=$interpolate.endSymbol(),template="
';return{restrict:"EA",scope:!0,compile:function(tElem,tAttrs){var tooltipLinker=$compile(template);return function(scope,element,attrs){function toggleTooltipBind(){scope.tt_isOpen?hideTooltipBind():showTooltipBind()}function showTooltipBind(){(!hasEnableExp||scope.$eval(attrs[prefix+"Enable"]))&&(scope.tt_popupDelay?(popupTimeout=$timeout(show,scope.tt_popupDelay,!1),popupTimeout.then(function(reposition){reposition()})):show()())}function hideTooltipBind(){scope.$apply(function(){hide()})}function show(){return scope.tt_content?(createTooltip(),transitionTimeout&&$timeout.cancel(transitionTimeout),tooltip.css({top:0,left:0,display:"block"}),appendToBody?$document.find("body").append(tooltip):element.after(tooltip),positionTooltip(),scope.tt_isOpen=!0,scope.$digest(),positionTooltip):angular.noop}function hide(){scope.tt_isOpen=!1,$timeout.cancel(popupTimeout),scope.tt_animation?transitionTimeout=$timeout(removeTooltip,500):removeTooltip()}function createTooltip(){tooltip&&removeTooltip(),tooltip=tooltipLinker(scope,function(){}),scope.$digest()}function removeTooltip(){tooltip&&(tooltip.remove(),tooltip=null)}var tooltip,transitionTimeout,popupTimeout,appendToBody=angular.isDefined(options.appendToBody)?options.appendToBody:!1,triggers=getTriggers(void 0),hasRegisteredTriggers=!1,hasEnableExp=angular.isDefined(attrs[prefix+"Enable"]),positionTooltip=function(){var position,ttWidth,ttHeight,ttPosition;switch(position=appendToBody?$position.offset(element):$position.position(element),ttWidth=tooltip.prop("offsetWidth"),ttHeight=tooltip.prop("offsetHeight"),scope.tt_placement){case"right":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left+position.width};break;case"bottom":ttPosition={top:position.top+position.height,left:position.left+position.width/2-ttWidth/2};break;case"left":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left-ttWidth};break;default:ttPosition={top:position.top-ttHeight,left:position.left+position.width/2-ttWidth/2}}ttPosition.top+="px",ttPosition.left+="px",tooltip.css(ttPosition)};scope.tt_isOpen=!1,attrs.$observe(type,function(val){scope.tt_content=val,!val&&scope.tt_isOpen&&hide()}),attrs.$observe(prefix+"Title",function(val){scope.tt_title=val}),attrs.$observe(prefix+"Placement",function(val){scope.tt_placement=angular.isDefined(val)?val:options.placement}),attrs.$observe(prefix+"PopupDelay",function(val){var delay=parseInt(val,10);scope.tt_popupDelay=isNaN(delay)?options.popupDelay:delay});var unregisterTriggers=function(){hasRegisteredTriggers&&(element.unbind(triggers.show,showTooltipBind),element.unbind(triggers.hide,hideTooltipBind))};attrs.$observe(prefix+"Trigger",function(val){unregisterTriggers(),triggers=getTriggers(val),triggers.show===triggers.hide?element.bind(triggers.show,toggleTooltipBind):(element.bind(triggers.show,showTooltipBind),element.bind(triggers.hide,hideTooltipBind)),hasRegisteredTriggers=!0});var animation=scope.$eval(attrs[prefix+"Animation"]);scope.tt_animation=angular.isDefined(animation)?!!animation:options.animation,attrs.$observe(prefix+"AppendToBody",function(val){appendToBody=angular.isDefined(val)?$parse(val)(scope):appendToBody}),appendToBody&&scope.$on("$locationChangeSuccess",function(){scope.tt_isOpen&&hide()}),scope.$on("$destroy",function(){$timeout.cancel(transitionTimeout),$timeout.cancel(popupTimeout),unregisterTriggers(),removeTooltip()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function($tooltip){return $tooltip("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function($tooltip){return $tooltip("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function($tooltip){return $tooltip("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function($scope,$attrs,progressConfig,$transition){var self=this,bars=[],max=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):progressConfig.max,animate=angular.isDefined($attrs.animate)?$scope.$parent.$eval($attrs.animate):progressConfig.animate;this.addBar=function(bar,element){var oldValue=0,index=bar.$parent.$index;angular.isDefined(index)&&bars[index]&&(oldValue=bars[index].value),bars.push(bar),this.update(element,bar.value,oldValue),bar.$watch("value",function(value,oldValue){value!==oldValue&&self.update(element,value,oldValue)}),bar.$on("$destroy",function(){self.removeBar(bar)})},this.update=function(element,newValue,oldValue){var percent=this.getPercentage(newValue);animate?(element.css("width",this.getPercentage(oldValue)+"%"),$transition(element,{width:percent+"%"})):element.css({transition:"none",width:percent+"%"})},this.removeBar=function(bar){bars.splice(bars.indexOf(bar),1)},this.getPercentage=function(value){return Math.round(100*value/max)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
'}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,element)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,angular.element(element.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function($scope,$attrs,$parse,ratingConfig){this.maxRange=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):ratingConfig.max,this.stateOn=angular.isDefined($attrs.stateOn)?$scope.$parent.$eval($attrs.stateOn):ratingConfig.stateOn,this.stateOff=angular.isDefined($attrs.stateOff)?$scope.$parent.$eval($attrs.stateOff):ratingConfig.stateOff,this.createRateObjects=function(states){for(var defaultOptions={stateOn:this.stateOn,stateOff:this.stateOff},i=0,n=states.length;n>i;i++)states[i]=angular.extend({index:i},defaultOptions,states[i]);return states},$scope.range=angular.isDefined($attrs.ratingStates)?this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))):this.createRateObjects(new Array(this.maxRange)),$scope.rate=function(value){$scope.value===value||$scope.readonly||($scope.value=value)},$scope.enter=function(value){$scope.readonly||($scope.val=value),$scope.onHover({value:value})},$scope.reset=function(){$scope.val=angular.copy($scope.value),$scope.onLeave()},$scope.$watch("value",function(value){$scope.val=value}),$scope.readonly=!1,$attrs.readonly&&$scope.$parent.$watch($parse($attrs.readonly),function(value){$scope.readonly=!!value})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function($scope){var ctrl=this,tabs=ctrl.tabs=$scope.tabs=[];ctrl.select=function(tab){angular.forEach(tabs,function(tab){tab.active=!1}),tab.active=!0},ctrl.addTab=function(tab){tabs.push(tab),(1===tabs.length||tab.active)&&ctrl.select(tab)},ctrl.removeTab=function(tab){var index=tabs.indexOf(tab);if(tab.active&&tabs.length>1){var newActiveIndex=index==tabs.length-1?index-1:index+1;ctrl.select(tabs[newActiveIndex])}tabs.splice(index,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(scope,element,attrs){scope.vertical=angular.isDefined(attrs.vertical)?scope.$parent.$eval(attrs.vertical):!1,scope.justified=angular.isDefined(attrs.justified)?scope.$parent.$eval(attrs.justified):!1,scope.type=angular.isDefined(attrs.type)?scope.$parent.$eval(attrs.type):"tabs"}}}).directive("tab",["$parse",function($parse){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(elm,attrs,transclude){return function(scope,elm,attrs,tabsetCtrl){var getActive,setActive;attrs.active?(getActive=$parse(attrs.active),setActive=getActive.assign,scope.$parent.$watch(getActive,function(value,oldVal){value!==oldVal&&(scope.active=!!value)}),scope.active=getActive(scope.$parent)):setActive=getActive=angular.noop,scope.$watch("active",function(active){setActive(scope.$parent,active),active?(tabsetCtrl.select(scope),scope.onSelect()):scope.onDeselect()}),scope.disabled=!1,attrs.disabled&&scope.$parent.$watch($parse(attrs.disabled),function(value){scope.disabled=!!value}),scope.select=function(){scope.disabled||(scope.active=!0)},tabsetCtrl.addTab(scope),scope.$on("$destroy",function(){tabsetCtrl.removeTab(scope)}),scope.$transcludeFn=transclude}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(scope,elm,attrs,tabCtrl){scope.$watch("headingElement",function(heading){heading&&(elm.html(""),elm.append(heading))})}}}]).directive("tabContentTransclude",function(){function isTabHeading(node){return node.tagName&&(node.hasAttribute("tab-heading")||node.hasAttribute("data-tab-heading")||"tab-heading"===node.tagName.toLowerCase()||"data-tab-heading"===node.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(scope,elm,attrs){var tab=scope.$eval(attrs.tabContentTransclude);tab.$transcludeFn(tab.$parent,function(contents){angular.forEach(contents,function(node){isTabHeading(node)?tab.headingElement=node:elm.append(node)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function($parse,$log,timepickerConfig,$locale){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(scope,element,attrs,ngModel){function getHoursFromTemplate(){var hours=parseInt(scope.hours,10),valid=scope.showMeridian?hours>0&&13>hours:hours>=0&&24>hours;return valid?(scope.showMeridian&&(12===hours&&(hours=0),scope.meridian===meridians[1]&&(hours+=12)),hours):void 0}function getMinutesFromTemplate(){var minutes=parseInt(scope.minutes,10);return minutes>=0&&60>minutes?minutes:void 0}function pad(value){return angular.isDefined(value)&&value.toString().length<2?"0"+value:value}function refresh(keyboardChange){makeValid(),ngModel.$setViewValue(new Date(selected)),updateTemplate(keyboardChange)}function makeValid(){ngModel.$setValidity("time",!0),scope.invalidHours=!1,scope.invalidMinutes=!1}function updateTemplate(keyboardChange){var hours=selected.getHours(),minutes=selected.getMinutes();scope.showMeridian&&(hours=0===hours||12===hours?12:hours%12),scope.hours="h"===keyboardChange?hours:pad(hours),scope.minutes="m"===keyboardChange?minutes:pad(minutes),scope.meridian=selected.getHours()<12?meridians[0]:meridians[1]}function addMinutes(minutes){var dt=new Date(selected.getTime()+6e4*minutes);selected.setHours(dt.getHours(),dt.getMinutes()),refresh()}if(ngModel){var selected=new Date,meridians=angular.isDefined(attrs.meridians)?scope.$parent.$eval(attrs.meridians):timepickerConfig.meridians||$locale.DATETIME_FORMATS.AMPMS,hourStep=timepickerConfig.hourStep;attrs.hourStep&&scope.$parent.$watch($parse(attrs.hourStep),function(value){hourStep=parseInt(value,10)});var minuteStep=timepickerConfig.minuteStep;attrs.minuteStep&&scope.$parent.$watch($parse(attrs.minuteStep),function(value){minuteStep=parseInt(value,10)}),scope.showMeridian=timepickerConfig.showMeridian,attrs.showMeridian&&scope.$parent.$watch($parse(attrs.showMeridian),function(value){if(scope.showMeridian=!!value,ngModel.$error.time){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();angular.isDefined(hours)&&angular.isDefined(minutes)&&(selected.setHours(hours),refresh())}else updateTemplate()});var inputs=element.find("input"),hoursInputEl=inputs.eq(0),minutesInputEl=inputs.eq(1),mousewheel=angular.isDefined(attrs.mousewheel)?scope.$eval(attrs.mousewheel):timepickerConfig.mousewheel;if(mousewheel){var isScrollingUp=function(e){e.originalEvent&&(e=e.originalEvent);var delta=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||delta>0};hoursInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementHours():scope.decrementHours()),e.preventDefault()}),minutesInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementMinutes():scope.decrementMinutes()),e.preventDefault()})}if(scope.readonlyInput=angular.isDefined(attrs.readonlyInput)?scope.$eval(attrs.readonlyInput):timepickerConfig.readonlyInput,scope.readonlyInput)scope.updateHours=angular.noop,scope.updateMinutes=angular.noop;else{var invalidate=function(invalidHours,invalidMinutes){ngModel.$setViewValue(null),ngModel.$setValidity("time",!1),angular.isDefined(invalidHours)&&(scope.invalidHours=invalidHours),angular.isDefined(invalidMinutes)&&(scope.invalidMinutes=invalidMinutes)};scope.updateHours=function(){var hours=getHoursFromTemplate();angular.isDefined(hours)?(selected.setHours(hours),refresh("h")):invalidate(!0)},hoursInputEl.bind("blur",function(e){!scope.validHours&&scope.hours<10&&scope.$apply(function(){scope.hours=pad(scope.hours)})}),scope.updateMinutes=function(){var minutes=getMinutesFromTemplate();angular.isDefined(minutes)?(selected.setMinutes(minutes),refresh("m")):invalidate(void 0,!0)},minutesInputEl.bind("blur",function(e){!scope.invalidMinutes&&scope.minutes<10&&scope.$apply(function(){scope.minutes=pad(scope.minutes)})})}ngModel.$render=function(){var date=ngModel.$modelValue?new Date(ngModel.$modelValue):null;isNaN(date)?(ngModel.$setValidity("time",!1),$log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(date&&(selected=date),makeValid(),updateTemplate())},scope.incrementHours=function(){addMinutes(60*hourStep)},scope.decrementHours=function(){addMinutes(60*-hourStep)},scope.incrementMinutes=function(){addMinutes(minuteStep)},scope.decrementMinutes=function(){addMinutes(-minuteStep)},scope.toggleMeridian=function(){addMinutes(720*(selected.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function($parse){var TYPEAHEAD_REGEXP=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(input){var match=input.match(TYPEAHEAD_REGEXP);if(!match)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+input+"'.");return{itemName:match[3],source:$parse(match[4]),viewMapper:$parse(match[2]||match[1]),modelMapper:$parse(match[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function($compile,$parse,$q,$timeout,$document,$position,typeaheadParser){var HOT_KEYS=[9,13,27,38,40];return{require:"ngModel",link:function(originalScope,element,attrs,modelCtrl){var hasFocus,minSearch=originalScope.$eval(attrs.typeaheadMinLength)||1,waitTime=originalScope.$eval(attrs.typeaheadWaitMs)||0,isEditable=originalScope.$eval(attrs.typeaheadEditable)!==!1,isLoadingSetter=$parse(attrs.typeaheadLoading).assign||angular.noop,onSelectCallback=$parse(attrs.typeaheadOnSelect),inputFormatter=attrs.typeaheadInputFormatter?$parse(attrs.typeaheadInputFormatter):void 0,appendToBody=attrs.typeaheadAppendToBody?$parse(attrs.typeaheadAppendToBody):!1,$setModelValue=$parse(attrs.ngModel).assign,parserResult=typeaheadParser.parse(attrs.typeahead),popUpEl=angular.element("
");popUpEl.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(attrs.typeaheadTemplateUrl)&&popUpEl.attr("template-url",attrs.typeaheadTemplateUrl);var scope=originalScope.$new();originalScope.$on("$destroy",function(){scope.$destroy()});var resetMatches=function(){scope.matches=[],scope.activeIdx=-1},getMatchesAsync=function(inputValue){var locals={$viewValue:inputValue};isLoadingSetter(originalScope,!0),$q.when(parserResult.source(originalScope,locals)).then(function(matches){if(inputValue===modelCtrl.$viewValue&&hasFocus){if(matches.length>0){scope.activeIdx=0,scope.matches.length=0;for(var i=0;i=minSearch?waitTime>0?(timeoutPromise&&$timeout.cancel(timeoutPromise),timeoutPromise=$timeout(function(){getMatchesAsync(inputValue)},waitTime)):getMatchesAsync(inputValue):(isLoadingSetter(originalScope,!1),resetMatches()),isEditable?inputValue:inputValue?void modelCtrl.$setValidity("editable",!1):(modelCtrl.$setValidity("editable",!0),inputValue)}),modelCtrl.$formatters.push(function(modelValue){var candidateViewValue,emptyViewValue,locals={};return inputFormatter?(locals.$model=modelValue,inputFormatter(originalScope,locals)):(locals[parserResult.itemName]=modelValue,candidateViewValue=parserResult.viewMapper(originalScope,locals),locals[parserResult.itemName]=void 0,emptyViewValue=parserResult.viewMapper(originalScope,locals),candidateViewValue!==emptyViewValue?candidateViewValue:modelValue)}),scope.select=function(activeIdx){var model,item,locals={};locals[parserResult.itemName]=item=scope.matches[activeIdx].model,model=parserResult.modelMapper(originalScope,locals),$setModelValue(originalScope,model),modelCtrl.$setValidity("editable",!0),onSelectCallback(originalScope,{$item:item,$model:model,$label:parserResult.viewMapper(originalScope,locals)}),resetMatches(),element[0].focus()},element.bind("keydown",function(evt){0!==scope.matches.length&&-1!==HOT_KEYS.indexOf(evt.which)&&(evt.preventDefault(),40===evt.which?(scope.activeIdx=(scope.activeIdx+1)%scope.matches.length,scope.$digest()):38===evt.which?(scope.activeIdx=(scope.activeIdx?scope.activeIdx:scope.matches.length)-1,scope.$digest()):13===evt.which||9===evt.which?scope.$apply(function(){scope.select(scope.activeIdx)}):27===evt.which&&(evt.stopPropagation(),resetMatches(),scope.$digest()))}),element.bind("blur",function(evt){hasFocus=!1});var dismissClickHandler=function(evt){element[0]!==evt.target&&(resetMatches(),scope.$digest())};$document.bind("click",dismissClickHandler),originalScope.$on("$destroy",function(){$document.unbind("click",dismissClickHandler)});var $popup=$compile(popUpEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(scope,element,attrs){scope.templateUrl=attrs.templateUrl,scope.isOpen=function(){return scope.matches.length>0},scope.isActive=function(matchIdx){return scope.active==matchIdx},scope.selectActive=function(matchIdx){scope.active=matchIdx},scope.selectMatch=function(activeIdx){scope.select({activeIdx:activeIdx})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function($http,$templateCache,$compile,$parse){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(scope,element,attrs){var tplUrl=$parse(attrs.templateUrl)(scope.$parent)||"template/typeahead/typeahead-match.html";$http.get(tplUrl,{cache:$templateCache}).success(function(tplContent){element.replaceWith($compile(tplContent.trim())(scope))})}}}]).filter("typeaheadHighlight",function(){function escapeRegexp(queryToEscape){return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(matchItem,query){return query?matchItem.replace(new RegExp(escapeRegexp(query),"gi"),"$&"):matchItem}}),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function($q,$timeout,$rootScope){function findEndEventName(endEventNames){for(var name in endEventNames)if(void 0!==transElement.style[name])return endEventNames[name]}var $transition=function(element,trigger,options){options=options||{};var deferred=$q.defer(),endEventName=$transition[options.animation?"animationEndEventName":"transitionEndEventName"],transitionEndHandler=function(event){$rootScope.$apply(function(){element.unbind(endEventName,transitionEndHandler),deferred.resolve(element)})};return endEventName&&element.bind(endEventName,transitionEndHandler),$timeout(function(){angular.isString(trigger)?element.addClass(trigger):angular.isFunction(trigger)?trigger(element):angular.isObject(trigger)&&element.css(trigger),endEventName||deferred.resolve(element)}),deferred.promise.cancel=function(){endEventName&&element.unbind(endEventName,transitionEndHandler),deferred.reject("Transition cancelled")},deferred.promise},transElement=document.createElement("trans"),transitionEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},animationEndEventNames={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return $transition.transitionEndEventName=findEndEventName(transitionEndEventNames),$transition.animationEndEventName=findEndEventName(animationEndEventNames),$transition}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function($transition,$timeout){return{link:function(scope,element,attrs){function doTransition(change){function newTransitionDone(){currentTransition===newTransition&&(currentTransition=void 0)}var newTransition=$transition(element,change);return currentTransition&¤tTransition.cancel(),currentTransition=newTransition, -newTransition.then(newTransitionDone,newTransitionDone),newTransition}function expand(){initialAnimSkip?(initialAnimSkip=!1,expandDone()):(element.removeClass("collapse").addClass("collapsing"),doTransition({height:element[0].scrollHeight+"px"}).then(expandDone))}function expandDone(){element.removeClass("collapsing"),element.addClass("collapse in"),element.css({height:"auto"})}function collapse(){if(initialAnimSkip)initialAnimSkip=!1,collapseDone(),element.css({height:0});else{element.css({height:element[0].scrollHeight+"px"});element[0].offsetWidth;element.removeClass("collapse in").addClass("collapsing"),doTransition({height:0}).then(collapseDone)}}function collapseDone(){element.removeClass("collapsing"),element.addClass("collapse")}var currentTransition,initialAnimSkip=!0;scope.$watch(attrs.collapse,function(shouldCollapse){shouldCollapse?collapse():expand()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function($scope,$attrs,accordionConfig){this.groups=[],this.closeOthers=function(openGroup){var closeOthers=angular.isDefined($attrs.closeOthers)?$scope.$eval($attrs.closeOthers):accordionConfig.closeOthers;closeOthers&&angular.forEach(this.groups,function(group){group!==openGroup&&(group.isOpen=!1)})},this.addGroup=function(groupScope){var that=this;this.groups.push(groupScope),groupScope.$on("$destroy",function(event){that.removeGroup(groupScope)})},this.removeGroup=function(group){var index=this.groups.indexOf(group);-1!==index&&this.groups.splice(this.groups.indexOf(group),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function($parse){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(element){this.heading=element}},link:function(scope,element,attrs,accordionCtrl){var getIsOpen,setIsOpen;accordionCtrl.addGroup(scope),scope.isOpen=!1,attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,scope.$parent.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.$watch("isOpen",function(value){value&&accordionCtrl.closeOthers(scope),setIsOpen&&setIsOpen(scope.$parent,value)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(element,attr,transclude){return function(scope,element,attr,accordionGroupCtrl){accordionGroupCtrl.setHeading(transclude(scope,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(scope,element,attr,controller){scope.$watch(function(){return controller[attr.accordionTransclude]},function(heading){heading&&(element.html(""),element.append(heading))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function($scope,$attrs){$scope.closeable="close"in $attrs}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(scope,element,attr){element.addClass("ng-binding").data("$binding",attr.bindHtmlUnsafe),scope.$watch(attr.bindHtmlUnsafe,function(value){element.html(value||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(buttonConfig){this.activeClass=buttonConfig.activeClass||"active",this.toggleEvent=buttonConfig.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,scope.$eval(attrs.btnRadio)))},element.bind(buttonsCtrl.toggleEvent,function(){element.hasClass(buttonsCtrl.activeClass)||scope.$apply(function(){ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)),ngModelCtrl.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){function getTrueValue(){return getCheckboxValue(attrs.btnCheckboxTrue,!0)}function getFalseValue(){return getCheckboxValue(attrs.btnCheckboxFalse,!1)}function getCheckboxValue(attributeValue,defaultValue){var val=scope.$eval(attributeValue);return angular.isDefined(val)?val:defaultValue}var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,getTrueValue()))},element.bind(buttonsCtrl.toggleEvent,function(){scope.$apply(function(){ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass)?getFalseValue():getTrueValue()),ngModelCtrl.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function($scope,$timeout,$transition,$q){function restartTimer(){resetTimer();var interval=+$scope.interval;!isNaN(interval)&&interval>=0&&(currentTimeout=$timeout(timerFn,interval))}function resetTimer(){currentTimeout&&($timeout.cancel(currentTimeout),currentTimeout=null)}function timerFn(){isPlaying?($scope.next(),restartTimer()):$scope.pause()}var currentTimeout,isPlaying,self=this,slides=self.slides=[],currentIndex=-1;self.currentSlide=null;var destroyed=!1;self.select=function(nextSlide,direction){function goNext(){if(!destroyed){if(self.currentSlide&&angular.isString(direction)&&!$scope.noTransition&&nextSlide.$element){nextSlide.$element.addClass(direction);nextSlide.$element[0].offsetWidth;angular.forEach(slides,function(slide){angular.extend(slide,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(nextSlide,{direction:direction,active:!0,entering:!0}),angular.extend(self.currentSlide||{},{direction:direction,leaving:!0}),$scope.$currentTransition=$transition(nextSlide.$element,{}),function(next,current){$scope.$currentTransition.then(function(){transitionDone(next,current)},function(){transitionDone(next,current)})}(nextSlide,self.currentSlide)}else transitionDone(nextSlide,self.currentSlide);self.currentSlide=nextSlide,currentIndex=nextIndex,restartTimer()}}function transitionDone(next,current){angular.extend(next,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(current||{},{direction:"",active:!1,leaving:!1,entering:!1}),$scope.$currentTransition=null}var nextIndex=slides.indexOf(nextSlide);void 0===direction&&(direction=nextIndex>currentIndex?"next":"prev"),nextSlide&&nextSlide!==self.currentSlide&&($scope.$currentTransition?($scope.$currentTransition.cancel(),$timeout(goNext)):goNext())},$scope.$on("$destroy",function(){destroyed=!0}),self.indexOfSlide=function(slide){return slides.indexOf(slide)},$scope.next=function(){var newIndex=(currentIndex+1)%slides.length;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"next")},$scope.prev=function(){var newIndex=0>currentIndex-1?slides.length-1:currentIndex-1;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"prev")},$scope.select=function(slide){self.select(slide)},$scope.isActive=function(slide){return self.currentSlide===slide},$scope.slides=function(){return slides},$scope.$watch("interval",restartTimer),$scope.$on("$destroy",resetTimer),$scope.play=function(){isPlaying||(isPlaying=!0,restartTimer())},$scope.pause=function(){$scope.noPause||(isPlaying=!1,resetTimer())},self.addSlide=function(slide,element){slide.$element=element,slides.push(slide),1===slides.length||slide.active?(self.select(slides[slides.length-1]),1==slides.length&&$scope.play()):slide.active=!1},self.removeSlide=function(slide){var index=slides.indexOf(slide);slides.splice(index,1),slides.length>0&&slide.active?index>=slides.length?self.select(slides[index-1]):self.select(slides[index]):currentIndex>index&¤tIndex--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function($parse){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(scope,element,attrs,carouselCtrl){if(attrs.active){var getActive=$parse(attrs.active),setActive=getActive.assign,lastValue=scope.active=getActive(scope.$parent);scope.$watch(function(){var parentActive=getActive(scope.$parent);return parentActive!==scope.active&&(parentActive!==lastValue?lastValue=scope.active=parentActive:setActive(scope.$parent,parentActive=lastValue=scope.active)),parentActive})}carouselCtrl.addSlide(scope,element),scope.$on("$destroy",function(){carouselCtrl.removeSlide(scope)}),scope.$watch("active",function(active){active&&carouselCtrl.select(scope)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function($document,$window){function getStyle(el,cssprop){return el.currentStyle?el.currentStyle[cssprop]:$window.getComputedStyle?$window.getComputedStyle(el)[cssprop]:el.style[cssprop]}function isStaticPositioned(element){return"static"===(getStyle(element,"position")||"static")}var parentOffsetEl=function(element){for(var docDomEl=$document[0],offsetParent=element.offsetParent||docDomEl;offsetParent&&offsetParent!==docDomEl&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||docDomEl};return{position:function(element){var elBCR=this.offset(element),offsetParentBCR={top:0,left:0},offsetParentEl=parentOffsetEl(element[0]);offsetParentEl!=$document[0]&&(offsetParentBCR=this.offset(angular.element(offsetParentEl)),offsetParentBCR.top+=offsetParentEl.clientTop-offsetParentEl.scrollTop,offsetParentBCR.left+=offsetParentEl.clientLeft-offsetParentEl.scrollLeft);var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:elBCR.top-offsetParentBCR.top,left:elBCR.left-offsetParentBCR.left}},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].body.scrollTop||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].body.scrollLeft||$document[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function($scope,$attrs,dateFilter,dtConfig){function getValue(value,defaultValue){return angular.isDefined(value)?$scope.$parent.$eval(value):defaultValue}function getDaysInMonth(year,month){return new Date(year,month,0).getDate()}function getDates(startDate,n){for(var dates=new Array(n),current=startDate,i=0;n>i;)dates[i++]=new Date(current),current.setDate(current.getDate()+1);return dates}function makeDate(date,format,isSelected,isSecondary){return{date:date,label:dateFilter(date,format),selected:!!isSelected,secondary:!!isSecondary}}var format={day:getValue($attrs.dayFormat,dtConfig.dayFormat),month:getValue($attrs.monthFormat,dtConfig.monthFormat),year:getValue($attrs.yearFormat,dtConfig.yearFormat),dayHeader:getValue($attrs.dayHeaderFormat,dtConfig.dayHeaderFormat),dayTitle:getValue($attrs.dayTitleFormat,dtConfig.dayTitleFormat),monthTitle:getValue($attrs.monthTitleFormat,dtConfig.monthTitleFormat)},startingDay=getValue($attrs.startingDay,dtConfig.startingDay),yearRange=getValue($attrs.yearRange,dtConfig.yearRange);this.minDate=dtConfig.minDate?new Date(dtConfig.minDate):null,this.maxDate=dtConfig.maxDate?new Date(dtConfig.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(date,selected){var year=date.getFullYear(),month=date.getMonth(),firstDayOfMonth=new Date(year,month,1),difference=startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth),numDates=0;numDisplayedFromPreviousMonth>0&&(firstDate.setDate(-numDisplayedFromPreviousMonth+1),numDates+=numDisplayedFromPreviousMonth),numDates+=getDaysInMonth(year,month+1),numDates+=(7-numDates%7)%7;for(var days=getDates(firstDate,numDates),labels=new Array(7),i=0;numDates>i;i++){var dt=new Date(days[i]);days[i]=makeDate(dt,format.day,selected&&selected.getDate()===dt.getDate()&&selected.getMonth()===dt.getMonth()&&selected.getFullYear()===dt.getFullYear(),dt.getMonth()!==month)}for(var j=0;7>j;j++)labels[j]=dateFilter(days[j].date,format.dayHeader);return{objects:days,title:dateFilter(date,format.dayTitle),labels:labels}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth(),date1.getDate())-new Date(date2.getFullYear(),date2.getMonth(),date2.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(date,selected){for(var months=new Array(12),year=date.getFullYear(),i=0;12>i;i++){var dt=new Date(year,i,1);months[i]=makeDate(dt,format.month,selected&&selected.getMonth()===i&&selected.getFullYear()===year)}return{objects:months,title:dateFilter(date,format.monthTitle)}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth())-new Date(date2.getFullYear(),date2.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(date,selected){for(var years=new Array(yearRange),year=date.getFullYear(),startYear=parseInt((year-1)/yearRange,10)*yearRange+1,i=0;yearRange>i;i++){var dt=new Date(startYear+i,0,1);years[i]=makeDate(dt,format.year,selected&&selected.getFullYear()===dt.getFullYear())}return{objects:years,title:[years[0].label,years[yearRange-1].label].join(" - ")}},compare:function(date1,date2){return date1.getFullYear()-date2.getFullYear()},split:5,step:{years:yearRange}}],this.isDisabled=function(date,mode){var currentMode=this.modes[mode||0];return this.minDate&¤tMode.compare(date,this.minDate)<0||this.maxDate&¤tMode.compare(date,this.maxDate)>0||$scope.dateDisabled&&$scope.dateDisabled({date:date,mode:currentMode.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(dateFilter,$parse,datepickerConfig,$log){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(scope,element,attrs,ctrls){function updateShowWeekNumbers(){scope.showWeekNumbers=0===mode&&showWeeks}function split(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays}function refill(updateSelected){var date=null,valid=!0;ngModel.$modelValue&&(date=new Date(ngModel.$modelValue),isNaN(date)?(valid=!1,$log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):updateSelected&&(selected=date)),ngModel.$setValidity("date",valid);var currentMode=datepickerCtrl.modes[mode],data=currentMode.getVisibleDates(selected,date);angular.forEach(data.objects,function(obj){obj.disabled=datepickerCtrl.isDisabled(obj.date,mode)}),ngModel.$setValidity("date-disabled",!date||!datepickerCtrl.isDisabled(date)),scope.rows=split(data.objects,currentMode.split),scope.labels=data.labels||[],scope.title=data.title}function setMode(value){mode=value,updateShowWeekNumbers(),refill()}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}var datepickerCtrl=ctrls[0],ngModel=ctrls[1];if(ngModel){var mode=0,selected=new Date,showWeeks=datepickerConfig.showWeeks;attrs.showWeeks?scope.$parent.$watch($parse(attrs.showWeeks),function(value){showWeeks=!!value,updateShowWeekNumbers()}):updateShowWeekNumbers(),attrs.min&&scope.$parent.$watch($parse(attrs.min),function(value){datepickerCtrl.minDate=value?new Date(value):null,refill()}),attrs.max&&scope.$parent.$watch($parse(attrs.max),function(value){datepickerCtrl.maxDate=value?new Date(value):null,refill()}),ngModel.$render=function(){refill(!0)},scope.select=function(date){if(0===mode){var dt=ngModel.$modelValue?new Date(ngModel.$modelValue):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),ngModel.$setViewValue(dt),refill(!0)}else selected=date,setMode(mode-1)},scope.move=function(direction){var step=datepickerCtrl.modes[mode].step;selected.setMonth(selected.getMonth()+direction*(step.months||0)),selected.setFullYear(selected.getFullYear()+direction*(step.years||0)),refill()},scope.toggleMode=function(){setMode((mode+1)%datepickerCtrl.modes.length)},scope.getWeekNumber=function(row){return 0===mode&&scope.showWeekNumbers&&7===row.length?getISO8601WeekNumber(row[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function($compile,$parse,$document,$position,dateFilter,datepickerPopupConfig,datepickerConfig){return{restrict:"EA",require:"ngModel",link:function(originalScope,element,attrs,ngModel){function setOpen(value){setIsOpen?setIsOpen(originalScope,!!value):scope.isOpen=!!value}function parseDate(viewValue){if(viewValue){if(angular.isDate(viewValue))return ngModel.$setValidity("date",!0),viewValue;if(angular.isString(viewValue)){var date=new Date(viewValue);return isNaN(date)?void ngModel.$setValidity("date",!1):(ngModel.$setValidity("date",!0),date)}return void ngModel.$setValidity("date",!1)}return ngModel.$setValidity("date",!0),null}function addWatchableAttribute(attribute,scopeProperty,datepickerAttribute){attribute&&(originalScope.$watch($parse(attribute),function(value){scope[scopeProperty]=value}),datepickerEl.attr(datepickerAttribute||scopeProperty,scopeProperty))}function updatePosition(){scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top=scope.position.top+element.prop("offsetHeight")}var dateFormat,scope=originalScope.$new(),closeOnDateSelection=angular.isDefined(attrs.closeOnDateSelection)?originalScope.$eval(attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined(attrs.datepickerAppendToBody)?originalScope.$eval(attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody;attrs.$observe("datepickerPopup",function(value){dateFormat=value||datepickerPopupConfig.dateFormat,ngModel.$render()}),scope.showButtonBar=angular.isDefined(attrs.showButtonBar)?originalScope.$eval(attrs.showButtonBar):datepickerPopupConfig.showButtonBar,originalScope.$on("$destroy",function(){$popup.remove(),scope.$destroy()}),attrs.$observe("currentText",function(text){scope.currentText=angular.isDefined(text)?text:datepickerPopupConfig.currentText}),attrs.$observe("toggleWeeksText",function(text){scope.toggleWeeksText=angular.isDefined(text)?text:datepickerPopupConfig.toggleWeeksText}),attrs.$observe("clearText",function(text){scope.clearText=angular.isDefined(text)?text:datepickerPopupConfig.clearText}),attrs.$observe("closeText",function(text){scope.closeText=angular.isDefined(text)?text:datepickerPopupConfig.closeText});var getIsOpen,setIsOpen;attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,originalScope.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.isOpen=getIsOpen?getIsOpen(originalScope):!1;var documentClickBind=function(event){scope.isOpen&&event.target!==element[0]&&scope.$apply(function(){setOpen(!1)})},elementFocusBind=function(){scope.$apply(function(){setOpen(!0)})},popupEl=angular.element("
");popupEl.attr({"ng-model":"date","ng-change":"dateSelection()"});var datepickerEl=angular.element(popupEl.children()[0]),datepickerOptions={};attrs.datepickerOptions&&(datepickerOptions=originalScope.$eval(attrs.datepickerOptions),datepickerEl.attr(angular.extend({},datepickerOptions))),ngModel.$parsers.unshift(parseDate),scope.dateSelection=function(dt){angular.isDefined(dt)&&(scope.date=dt),ngModel.$setViewValue(scope.date),ngModel.$render(),closeOnDateSelection&&setOpen(!1)},element.bind("input change keyup",function(){scope.$apply(function(){scope.date=ngModel.$modelValue})}),ngModel.$render=function(){var date=ngModel.$viewValue?dateFilter(ngModel.$viewValue,dateFormat):"";element.val(date),scope.date=ngModel.$modelValue},addWatchableAttribute(attrs.min,"min"),addWatchableAttribute(attrs.max,"max"),attrs.showWeeks?addWatchableAttribute(attrs.showWeeks,"showWeeks","show-weeks"):(scope.showWeeks="show-weeks"in datepickerOptions?datepickerOptions["show-weeks"]:datepickerConfig.showWeeks,datepickerEl.attr("show-weeks","showWeeks")),attrs.dateDisabled&&datepickerEl.attr("date-disabled",attrs.dateDisabled);var documentBindingInitialized=!1,elementFocusInitialized=!1;scope.$watch("isOpen",function(value){value?(updatePosition(),$document.bind("click",documentClickBind),elementFocusInitialized&&element.unbind("focus",elementFocusBind),element[0].focus(),documentBindingInitialized=!0):(documentBindingInitialized&&$document.unbind("click",documentClickBind),element.bind("focus",elementFocusBind),elementFocusInitialized=!0),setIsOpen&&setIsOpen(originalScope,value)}),scope.today=function(){scope.dateSelection(new Date)},scope.clear=function(){scope.dateSelection(null)};var $popup=$compile(popupEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(scope,element,attrs){element.bind("click",function(event){event.preventDefault(),event.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function($document,$location){var openElement=null,closeMenu=angular.noop;return{restrict:"CA",link:function(scope,element,attrs){scope.$watch("$location.path",function(){closeMenu()}),element.parent().bind("click",function(){closeMenu()}),element.bind("click",function(event){var elementWasOpen=element===openElement;event.preventDefault(),event.stopPropagation(),openElement&&closeMenu(),elementWasOpen||element.hasClass("disabled")||element.prop("disabled")||(element.parent().addClass("open"),openElement=element,closeMenu=function(event){event&&(event.preventDefault(),event.stopPropagation()),$document.unbind("click",closeMenu),element.parent().removeClass("open"),closeMenu=angular.noop,openElement=null},$document.bind("click",closeMenu))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var stack=[];return{add:function(key,value){stack.push({key:key,value:value})},get:function(key){for(var i=0;i0)}function checkRemoveBackdrop(){if(backdropDomEl&&-1==backdropIndex()){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,150,function(){backdropScopeRef.$destroy(),backdropScopeRef=null}),backdropDomEl=void 0,backdropScope=void 0}}function removeAfterAnimate(domEl,scope,emulateTime,done){function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,domEl.remove(),done&&done())}scope.animate=!1;var transitionEndEventName=$transition.transitionEndEventName;if(transitionEndEventName){var timeout=$timeout(afterAnimating,emulateTime);domEl.bind(transitionEndEventName,function(){$timeout.cancel(timeout),afterAnimating(),scope.$apply()})}else $timeout(afterAnimating,0)}var backdropDomEl,backdropScope,OPENED_MODAL_CLASS="modal-open",openedWindows=$$stackedMap.createNew(),$modalStack={};return $rootScope.$watch(backdropIndex,function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)}),$document.bind("keydown",function(evt){var modal;27===evt.which&&(modal=openedWindows.top(),modal&&modal.value.keyboard&&$rootScope.$apply(function(){$modalStack.dismiss(modal.key)}))}),$modalStack.open=function(modalInstance,modal){openedWindows.add(modalInstance,{deferred:modal.deferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard});var body=$document.find("body").eq(0),currBackdropIndex=backdropIndex();currBackdropIndex>=0&&!backdropDomEl&&(backdropScope=$rootScope.$new(!0),backdropScope.index=currBackdropIndex,backdropDomEl=$compile("
")(backdropScope),body.append(backdropDomEl));var angularDomEl=angular.element("
");angularDomEl.attr("window-class",modal.windowClass),angularDomEl.attr("index",openedWindows.length()-1),angularDomEl.attr("animate","animate"),angularDomEl.html(modal.content);var modalDomEl=$compile(angularDomEl)(modal.scope);openedWindows.top().value.modalDomEl=modalDomEl,body.append(modalDomEl),body.addClass(OPENED_MODAL_CLASS)},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.resolve(result),removeModalWindow(modalInstance))},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.reject(reason),removeModalWindow(modalInstance))},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal;)this.dismiss(topModal.key,reason),topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack}]).provider("$modal",function(){var $modalProvider={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function($injector,$rootScope,$q,$http,$templateCache,$controller,$modalStack){function getTemplatePromise(options){return options.template?$q.when(options.template):$http.get(options.templateUrl,{cache:$templateCache}).then(function(result){return result.data})}function getResolvePromises(resolves){var promisesArr=[];return angular.forEach(resolves,function(value,key){(angular.isFunction(value)||angular.isArray(value))&&promisesArr.push($q.when($injector.invoke(value)))}),promisesArr}var $modal={};return $modal.open=function(modalOptions){var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,close:function(result){$modalStack.close(modalInstance,result)},dismiss:function(reason){$modalStack.dismiss(modalInstance,reason)}};if(modalOptions=angular.extend({},$modalProvider.options,modalOptions),modalOptions.resolve=modalOptions.resolve||{},!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of template or templateUrl options is required.");var templateAndResolvePromise=$q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));return templateAndResolvePromise.then(function(tplAndVars){var modalScope=(modalOptions.scope||$rootScope).$new();modalScope.$close=modalInstance.close,modalScope.$dismiss=modalInstance.dismiss;var ctrlInstance,ctrlLocals={},resolveIter=1;modalOptions.controller&&(ctrlLocals.$scope=modalScope,ctrlLocals.$modalInstance=modalInstance,angular.forEach(modalOptions.resolve,function(value,key){ctrlLocals[key]=tplAndVars[resolveIter++]}),ctrlInstance=$controller(modalOptions.controller,ctrlLocals)),$modalStack.open(modalInstance,{scope:modalScope,deferred:modalResultDeferred,content:tplAndVars[0],backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,windowClass:modalOptions.windowClass})},function(reason){modalResultDeferred.reject(reason)}),templateAndResolvePromise.then(function(){modalOpenedDeferred.resolve(!0)},function(){modalOpenedDeferred.reject(!1)}),modalInstance},$modal}]};return $modalProvider}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function($scope,$attrs,$parse,$interpolate){var self=this,setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop;this.init=function(defaultItemsPerPage){$attrs.itemsPerPage?$scope.$parent.$watch($parse($attrs.itemsPerPage),function(value){self.itemsPerPage=parseInt(value,10),$scope.totalPages=self.calculateTotalPages()}):this.itemsPerPage=defaultItemsPerPage},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===$scope.totalPages},this.isActive=function(page){return this.page===page},this.calculateTotalPages=function(){var totalPages=this.itemsPerPage<1?1:Math.ceil($scope.totalItems/this.itemsPerPage);return Math.max(totalPages||0,1)},this.getAttributeValue=function(attribute,defaultValue,interpolate){return angular.isDefined(attribute)?interpolate?$interpolate(attribute)($scope.$parent):$scope.$parent.$eval(attribute):defaultValue},this.render=function(){this.page=parseInt($scope.page,10)||1,this.page>0&&this.page<=$scope.totalPages&&($scope.pages=this.getPages(this.page,$scope.totalPages))},$scope.selectPage=function(page){ -!self.isActive(page)&&page>0&&page<=$scope.totalPages&&($scope.page=page,$scope.onSelectPage({page:page}))},$scope.$watch("page",function(){self.render()}),$scope.$watch("totalItems",function(){$scope.totalPages=self.calculateTotalPages()}),$scope.$watch("totalPages",function(value){setNumPages($scope.$parent,value),self.page>value?$scope.selectPage(value):self.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function($parse,config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isActive,isDisabled){return{number:number,text:text,active:isActive,disabled:isDisabled}}var maxSize,boundaryLinks=paginationCtrl.getAttributeValue(attrs.boundaryLinks,config.boundaryLinks),directionLinks=paginationCtrl.getAttributeValue(attrs.directionLinks,config.directionLinks),firstText=paginationCtrl.getAttributeValue(attrs.firstText,config.firstText,!0),previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),lastText=paginationCtrl.getAttributeValue(attrs.lastText,config.lastText,!0),rotate=paginationCtrl.getAttributeValue(attrs.rotate,config.rotate);paginationCtrl.init(config.itemsPerPage),attrs.maxSize&&scope.$parent.$watch($parse(attrs.maxSize),function(value){maxSize=parseInt(value,10),paginationCtrl.render()}),paginationCtrl.getPages=function(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&totalPages>maxSize;isMaxSized&&(rotate?(startPage=Math.max(currentPage-Math.floor(maxSize/2),1),endPage=startPage+maxSize-1,endPage>totalPages&&(endPage=totalPages,startPage=endPage-maxSize+1)):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;endPage>=number;number++){var page=makePage(number,number,paginationCtrl.isActive(number),!1);pages.push(page)}if(isMaxSized&&!rotate){if(startPage>1){var previousPageSet=makePage(startPage-1,"...",!1,!1);pages.unshift(previousPageSet)}if(totalPages>endPage){var nextPageSet=makePage(endPage+1,"...",!1,!1);pages.push(nextPageSet)}}if(directionLinks){var previousPage=makePage(currentPage-1,previousText,!1,paginationCtrl.noPrevious());pages.unshift(previousPage);var nextPage=makePage(currentPage+1,nextText,!1,paginationCtrl.noNext());pages.push(nextPage)}if(boundaryLinks){var firstPage=makePage(1,firstText,!1,paginationCtrl.noPrevious());pages.unshift(firstPage);var lastPage=makePage(totalPages,lastText,!1,paginationCtrl.noNext());pages.push(lastPage)}return pages}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isDisabled,isPrevious,isNext){return{number:number,text:text,disabled:isDisabled,previous:align&&isPrevious,next:align&&isNext}}var previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),align=paginationCtrl.getAttributeValue(attrs.align,config.align);paginationCtrl.init(config.itemsPerPage),paginationCtrl.getPages=function(currentPage){return[makePage(currentPage-1,previousText,paginationCtrl.noPrevious(),!0,!1),makePage(currentPage+1,nextText,paginationCtrl.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function snake_case(name){var regexp=/[A-Z]/g,separator="-";return name.replace(regexp,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}var defaultOptions={placement:"top",animation:!0,popupDelay:0},triggerMap={mouseenter:"mouseleave",click:"click",focus:"blur"},globalOptions={};this.options=function(value){angular.extend(globalOptions,value)},this.setTriggers=function(triggers){angular.extend(triggerMap,triggers)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function($window,$compile,$timeout,$parse,$document,$position,$interpolate){return function(type,prefix,defaultTriggerShow){function getTriggers(trigger){var show=trigger||options.trigger||defaultTriggerShow,hide=triggerMap[show]||show;return{show:show,hide:hide}}var options=angular.extend({},defaultOptions,globalOptions),directiveName=snake_case(type),startSym=$interpolate.startSymbol(),endSym=$interpolate.endSymbol(),template="
';return{restrict:"EA",scope:!0,compile:function(tElem,tAttrs){var tooltipLinker=$compile(template);return function(scope,element,attrs){function toggleTooltipBind(){scope.tt_isOpen?hideTooltipBind():showTooltipBind()}function showTooltipBind(){(!hasEnableExp||scope.$eval(attrs[prefix+"Enable"]))&&(scope.tt_popupDelay?(popupTimeout=$timeout(show,scope.tt_popupDelay,!1),popupTimeout.then(function(reposition){reposition()})):show()())}function hideTooltipBind(){scope.$apply(function(){hide()})}function show(){return scope.tt_content?(createTooltip(),transitionTimeout&&$timeout.cancel(transitionTimeout),tooltip.css({top:0,left:0,display:"block"}),appendToBody?$document.find("body").append(tooltip):element.after(tooltip),positionTooltip(),scope.tt_isOpen=!0,scope.$digest(),positionTooltip):angular.noop}function hide(){scope.tt_isOpen=!1,$timeout.cancel(popupTimeout),scope.tt_animation?transitionTimeout=$timeout(removeTooltip,500):removeTooltip()}function createTooltip(){tooltip&&removeTooltip(),tooltip=tooltipLinker(scope,function(){}),scope.$digest()}function removeTooltip(){tooltip&&(tooltip.remove(),tooltip=null)}var tooltip,transitionTimeout,popupTimeout,appendToBody=angular.isDefined(options.appendToBody)?options.appendToBody:!1,triggers=getTriggers(void 0),hasRegisteredTriggers=!1,hasEnableExp=angular.isDefined(attrs[prefix+"Enable"]),positionTooltip=function(){var position,ttWidth,ttHeight,ttPosition;switch(position=appendToBody?$position.offset(element):$position.position(element),ttWidth=tooltip.prop("offsetWidth"),ttHeight=tooltip.prop("offsetHeight"),scope.tt_placement){case"right":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left+position.width};break;case"bottom":ttPosition={top:position.top+position.height,left:position.left+position.width/2-ttWidth/2};break;case"left":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left-ttWidth};break;default:ttPosition={top:position.top-ttHeight,left:position.left+position.width/2-ttWidth/2}}ttPosition.top+="px",ttPosition.left+="px",tooltip.css(ttPosition)};scope.tt_isOpen=!1,attrs.$observe(type,function(val){scope.tt_content=val,!val&&scope.tt_isOpen&&hide()}),attrs.$observe(prefix+"Title",function(val){scope.tt_title=val}),attrs.$observe(prefix+"Placement",function(val){scope.tt_placement=angular.isDefined(val)?val:options.placement}),attrs.$observe(prefix+"PopupDelay",function(val){var delay=parseInt(val,10);scope.tt_popupDelay=isNaN(delay)?options.popupDelay:delay});var unregisterTriggers=function(){hasRegisteredTriggers&&(element.unbind(triggers.show,showTooltipBind),element.unbind(triggers.hide,hideTooltipBind))};attrs.$observe(prefix+"Trigger",function(val){unregisterTriggers(),triggers=getTriggers(val),triggers.show===triggers.hide?element.bind(triggers.show,toggleTooltipBind):(element.bind(triggers.show,showTooltipBind),element.bind(triggers.hide,hideTooltipBind)),hasRegisteredTriggers=!0});var animation=scope.$eval(attrs[prefix+"Animation"]);scope.tt_animation=angular.isDefined(animation)?!!animation:options.animation,attrs.$observe(prefix+"AppendToBody",function(val){appendToBody=angular.isDefined(val)?$parse(val)(scope):appendToBody}),appendToBody&&scope.$on("$locationChangeSuccess",function(){scope.tt_isOpen&&hide()}),scope.$on("$destroy",function(){$timeout.cancel(transitionTimeout),$timeout.cancel(popupTimeout),unregisterTriggers(),removeTooltip()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function($tooltip){return $tooltip("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function($tooltip){return $tooltip("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function($tooltip){return $tooltip("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function($scope,$attrs,progressConfig,$transition){var self=this,bars=[],max=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):progressConfig.max,animate=angular.isDefined($attrs.animate)?$scope.$parent.$eval($attrs.animate):progressConfig.animate;this.addBar=function(bar,element){var oldValue=0,index=bar.$parent.$index;angular.isDefined(index)&&bars[index]&&(oldValue=bars[index].value),bars.push(bar),this.update(element,bar.value,oldValue),bar.$watch("value",function(value,oldValue){value!==oldValue&&self.update(element,value,oldValue)}),bar.$on("$destroy",function(){self.removeBar(bar)})},this.update=function(element,newValue,oldValue){var percent=this.getPercentage(newValue);animate?(element.css("width",this.getPercentage(oldValue)+"%"),$transition(element,{width:percent+"%"})):element.css({transition:"none",width:percent+"%"})},this.removeBar=function(bar){bars.splice(bars.indexOf(bar),1)},this.getPercentage=function(value){return Math.round(100*value/max)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
'}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,element)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,angular.element(element.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function($scope,$attrs,$parse,ratingConfig){this.maxRange=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):ratingConfig.max,this.stateOn=angular.isDefined($attrs.stateOn)?$scope.$parent.$eval($attrs.stateOn):ratingConfig.stateOn,this.stateOff=angular.isDefined($attrs.stateOff)?$scope.$parent.$eval($attrs.stateOff):ratingConfig.stateOff,this.createRateObjects=function(states){for(var defaultOptions={stateOn:this.stateOn,stateOff:this.stateOff},i=0,n=states.length;n>i;i++)states[i]=angular.extend({index:i},defaultOptions,states[i]);return states},$scope.range=angular.isDefined($attrs.ratingStates)?this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))):this.createRateObjects(new Array(this.maxRange)),$scope.rate=function(value){$scope.value===value||$scope.readonly||($scope.value=value)},$scope.enter=function(value){$scope.readonly||($scope.val=value),$scope.onHover({value:value})},$scope.reset=function(){$scope.val=angular.copy($scope.value),$scope.onLeave()},$scope.$watch("value",function(value){$scope.val=value}),$scope.readonly=!1,$attrs.readonly&&$scope.$parent.$watch($parse($attrs.readonly),function(value){$scope.readonly=!!value})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function($scope){var ctrl=this,tabs=ctrl.tabs=$scope.tabs=[];ctrl.select=function(tab){angular.forEach(tabs,function(tab){tab.active=!1}),tab.active=!0},ctrl.addTab=function(tab){tabs.push(tab),(1===tabs.length||tab.active)&&ctrl.select(tab)},ctrl.removeTab=function(tab){var index=tabs.indexOf(tab);if(tab.active&&tabs.length>1){var newActiveIndex=index==tabs.length-1?index-1:index+1;ctrl.select(tabs[newActiveIndex])}tabs.splice(index,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(scope,element,attrs){scope.vertical=angular.isDefined(attrs.vertical)?scope.$parent.$eval(attrs.vertical):!1,scope.justified=angular.isDefined(attrs.justified)?scope.$parent.$eval(attrs.justified):!1,scope.type=angular.isDefined(attrs.type)?scope.$parent.$eval(attrs.type):"tabs"}}}).directive("tab",["$parse",function($parse){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(elm,attrs,transclude){return function(scope,elm,attrs,tabsetCtrl){var getActive,setActive;attrs.active?(getActive=$parse(attrs.active),setActive=getActive.assign,scope.$parent.$watch(getActive,function(value,oldVal){value!==oldVal&&(scope.active=!!value)}),scope.active=getActive(scope.$parent)):setActive=getActive=angular.noop,scope.$watch("active",function(active){setActive(scope.$parent,active),active?(tabsetCtrl.select(scope),scope.onSelect()):scope.onDeselect()}),scope.disabled=!1,attrs.disabled&&scope.$parent.$watch($parse(attrs.disabled),function(value){scope.disabled=!!value}),scope.select=function(){scope.disabled||(scope.active=!0)},tabsetCtrl.addTab(scope),scope.$on("$destroy",function(){tabsetCtrl.removeTab(scope)}),scope.$transcludeFn=transclude}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(scope,elm,attrs,tabCtrl){scope.$watch("headingElement",function(heading){heading&&(elm.html(""),elm.append(heading))})}}}]).directive("tabContentTransclude",function(){function isTabHeading(node){return node.tagName&&(node.hasAttribute("tab-heading")||node.hasAttribute("data-tab-heading")||"tab-heading"===node.tagName.toLowerCase()||"data-tab-heading"===node.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(scope,elm,attrs){var tab=scope.$eval(attrs.tabContentTransclude);tab.$transcludeFn(tab.$parent,function(contents){angular.forEach(contents,function(node){isTabHeading(node)?tab.headingElement=node:elm.append(node)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function($parse,$log,timepickerConfig,$locale){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(scope,element,attrs,ngModel){function getHoursFromTemplate(){var hours=parseInt(scope.hours,10),valid=scope.showMeridian?hours>0&&13>hours:hours>=0&&24>hours;return valid?(scope.showMeridian&&(12===hours&&(hours=0),scope.meridian===meridians[1]&&(hours+=12)),hours):void 0}function getMinutesFromTemplate(){var minutes=parseInt(scope.minutes,10);return minutes>=0&&60>minutes?minutes:void 0}function pad(value){return angular.isDefined(value)&&value.toString().length<2?"0"+value:value}function refresh(keyboardChange){makeValid(),ngModel.$setViewValue(new Date(selected)),updateTemplate(keyboardChange)}function makeValid(){ngModel.$setValidity("time",!0),scope.invalidHours=!1,scope.invalidMinutes=!1}function updateTemplate(keyboardChange){var hours=selected.getHours(),minutes=selected.getMinutes();scope.showMeridian&&(hours=0===hours||12===hours?12:hours%12),scope.hours="h"===keyboardChange?hours:pad(hours),scope.minutes="m"===keyboardChange?minutes:pad(minutes),scope.meridian=selected.getHours()<12?meridians[0]:meridians[1]}function addMinutes(minutes){var dt=new Date(selected.getTime()+6e4*minutes);selected.setHours(dt.getHours(),dt.getMinutes()),refresh()}if(ngModel){var selected=new Date,meridians=angular.isDefined(attrs.meridians)?scope.$parent.$eval(attrs.meridians):timepickerConfig.meridians||$locale.DATETIME_FORMATS.AMPMS,hourStep=timepickerConfig.hourStep;attrs.hourStep&&scope.$parent.$watch($parse(attrs.hourStep),function(value){hourStep=parseInt(value,10)});var minuteStep=timepickerConfig.minuteStep;attrs.minuteStep&&scope.$parent.$watch($parse(attrs.minuteStep),function(value){minuteStep=parseInt(value,10)}),scope.showMeridian=timepickerConfig.showMeridian,attrs.showMeridian&&scope.$parent.$watch($parse(attrs.showMeridian),function(value){if(scope.showMeridian=!!value,ngModel.$error.time){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();angular.isDefined(hours)&&angular.isDefined(minutes)&&(selected.setHours(hours),refresh())}else updateTemplate()});var inputs=element.find("input"),hoursInputEl=inputs.eq(0),minutesInputEl=inputs.eq(1),mousewheel=angular.isDefined(attrs.mousewheel)?scope.$eval(attrs.mousewheel):timepickerConfig.mousewheel;if(mousewheel){var isScrollingUp=function(e){e.originalEvent&&(e=e.originalEvent);var delta=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||delta>0};hoursInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementHours():scope.decrementHours()),e.preventDefault()}),minutesInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementMinutes():scope.decrementMinutes()),e.preventDefault()})}if(scope.readonlyInput=angular.isDefined(attrs.readonlyInput)?scope.$eval(attrs.readonlyInput):timepickerConfig.readonlyInput,scope.readonlyInput)scope.updateHours=angular.noop,scope.updateMinutes=angular.noop;else{var invalidate=function(invalidHours,invalidMinutes){ngModel.$setViewValue(null),ngModel.$setValidity("time",!1),angular.isDefined(invalidHours)&&(scope.invalidHours=invalidHours),angular.isDefined(invalidMinutes)&&(scope.invalidMinutes=invalidMinutes)};scope.updateHours=function(){var hours=getHoursFromTemplate();angular.isDefined(hours)?(selected.setHours(hours),refresh("h")):invalidate(!0)},hoursInputEl.bind("blur",function(e){!scope.validHours&&scope.hours<10&&scope.$apply(function(){scope.hours=pad(scope.hours)})}),scope.updateMinutes=function(){var minutes=getMinutesFromTemplate();angular.isDefined(minutes)?(selected.setMinutes(minutes),refresh("m")):invalidate(void 0,!0)},minutesInputEl.bind("blur",function(e){!scope.invalidMinutes&&scope.minutes<10&&scope.$apply(function(){scope.minutes=pad(scope.minutes)})})}ngModel.$render=function(){var date=ngModel.$modelValue?new Date(ngModel.$modelValue):null;isNaN(date)?(ngModel.$setValidity("time",!1),$log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(date&&(selected=date),makeValid(),updateTemplate())},scope.incrementHours=function(){addMinutes(60*hourStep)},scope.decrementHours=function(){addMinutes(60*-hourStep)},scope.incrementMinutes=function(){addMinutes(minuteStep)},scope.decrementMinutes=function(){addMinutes(-minuteStep)},scope.toggleMeridian=function(){addMinutes(720*(selected.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function($parse){var TYPEAHEAD_REGEXP=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(input){var match=input.match(TYPEAHEAD_REGEXP);if(!match)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+input+"'.");return{itemName:match[3],source:$parse(match[4]),viewMapper:$parse(match[2]||match[1]),modelMapper:$parse(match[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function($compile,$parse,$q,$timeout,$document,$position,typeaheadParser){var HOT_KEYS=[9,13,27,38,40];return{require:"ngModel",link:function(originalScope,element,attrs,modelCtrl){var hasFocus,minSearch=originalScope.$eval(attrs.typeaheadMinLength)||1,waitTime=originalScope.$eval(attrs.typeaheadWaitMs)||0,isEditable=originalScope.$eval(attrs.typeaheadEditable)!==!1,isLoadingSetter=$parse(attrs.typeaheadLoading).assign||angular.noop,onSelectCallback=$parse(attrs.typeaheadOnSelect),inputFormatter=attrs.typeaheadInputFormatter?$parse(attrs.typeaheadInputFormatter):void 0,appendToBody=attrs.typeaheadAppendToBody?$parse(attrs.typeaheadAppendToBody):!1,$setModelValue=$parse(attrs.ngModel).assign,parserResult=typeaheadParser.parse(attrs.typeahead),popUpEl=angular.element("
");popUpEl.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(attrs.typeaheadTemplateUrl)&&popUpEl.attr("template-url",attrs.typeaheadTemplateUrl);var scope=originalScope.$new();originalScope.$on("$destroy",function(){scope.$destroy()});var resetMatches=function(){scope.matches=[],scope.activeIdx=-1},getMatchesAsync=function(inputValue){var locals={$viewValue:inputValue};isLoadingSetter(originalScope,!0),$q.when(parserResult.source(originalScope,locals)).then(function(matches){if(inputValue===modelCtrl.$viewValue&&hasFocus){if(matches.length>0){scope.activeIdx=0,scope.matches.length=0;for(var i=0;i=minSearch?waitTime>0?(timeoutPromise&&$timeout.cancel(timeoutPromise),timeoutPromise=$timeout(function(){getMatchesAsync(inputValue)},waitTime)):getMatchesAsync(inputValue):(isLoadingSetter(originalScope,!1),resetMatches()),isEditable?inputValue:inputValue?void modelCtrl.$setValidity("editable",!1):(modelCtrl.$setValidity("editable",!0),inputValue)}),modelCtrl.$formatters.push(function(modelValue){var candidateViewValue,emptyViewValue,locals={};return inputFormatter?(locals.$model=modelValue,inputFormatter(originalScope,locals)):(locals[parserResult.itemName]=modelValue,candidateViewValue=parserResult.viewMapper(originalScope,locals),locals[parserResult.itemName]=void 0,emptyViewValue=parserResult.viewMapper(originalScope,locals),candidateViewValue!==emptyViewValue?candidateViewValue:modelValue)}),scope.select=function(activeIdx){var model,item,locals={};locals[parserResult.itemName]=item=scope.matches[activeIdx].model,model=parserResult.modelMapper(originalScope,locals),$setModelValue(originalScope,model),modelCtrl.$setValidity("editable",!0),onSelectCallback(originalScope,{$item:item,$model:model,$label:parserResult.viewMapper(originalScope,locals)}),resetMatches(),element[0].focus()},element.bind("keydown",function(evt){0!==scope.matches.length&&-1!==HOT_KEYS.indexOf(evt.which)&&(evt.preventDefault(),40===evt.which?(scope.activeIdx=(scope.activeIdx+1)%scope.matches.length,scope.$digest()):38===evt.which?(scope.activeIdx=(scope.activeIdx?scope.activeIdx:scope.matches.length)-1,scope.$digest()):13===evt.which||9===evt.which?scope.$apply(function(){scope.select(scope.activeIdx)}):27===evt.which&&(evt.stopPropagation(),resetMatches(),scope.$digest()))}),element.bind("blur",function(evt){hasFocus=!1});var dismissClickHandler=function(evt){element[0]!==evt.target&&(resetMatches(),scope.$digest())};$document.bind("click",dismissClickHandler),originalScope.$on("$destroy",function(){$document.unbind("click",dismissClickHandler)});var $popup=$compile(popUpEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(scope,element,attrs){scope.templateUrl=attrs.templateUrl,scope.isOpen=function(){return scope.matches.length>0},scope.isActive=function(matchIdx){return scope.active==matchIdx},scope.selectActive=function(matchIdx){scope.active=matchIdx},scope.selectMatch=function(activeIdx){scope.select({activeIdx:activeIdx})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function($http,$templateCache,$compile,$parse){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(scope,element,attrs){var tplUrl=$parse(attrs.templateUrl)(scope.$parent)||"template/typeahead/typeahead-match.html";$http.get(tplUrl,{cache:$templateCache}).success(function(tplContent){element.replaceWith($compile(tplContent.trim())(scope))})}}}]).filter("typeaheadHighlight",function(){function escapeRegexp(queryToEscape){return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(matchItem,query){return query?matchItem.replace(new RegExp(escapeRegexp(query),"gi"),"$&"):matchItem}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/accordion/accordion-group.html",'
\n
\n

\n {{heading}}\n

\n
\n
\n
\n
\n
')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/accordion/accordion.html",'
')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/alert/alert.html","
\n \n
\n
\n")}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/carousel/slide.html","
\n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/datepicker/datepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
#{{label}}
{{ getWeekNumber(row) }}\n \n
\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/datepicker/popup.html","
    \n
  • \n"+'
  • \n \n \n \n \n \n \n
  • \n
\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/modal/backdrop.html",'')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function($templateCache){ -$templateCache.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html",'
\n
\n
\n
\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-popup.html",'
\n
\n
\n
\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover.html",'
\n
\n\n
\n

\n
\n
\n
\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/bar.html",'
')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progress.html",'
')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progressbar.html",'
')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/rating/rating.html",'\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tab.html",'
  • \n {{heading}}\n
  • \n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset-titles.html","
      \n
    \n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset.html",'\n
    \n \n
    \n
    \n
    \n
    \n
    \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
     
    \n \n :\n \n
     
    \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-popup.html","
      \n"+'
    • \n
      \n
    • \n
    ')}]),angular.module("ui.alias",[]).config(["$compileProvider","uiAliasConfig",function(a,b){b=b||{},angular.forEach(b,function(b,c){angular.isString(b)&&(b={replace:!0,template:b}),a.directive(c,function(){return b})})}]),angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join(''+b+""):a.replace(new RegExp(b,"gi"),'$&')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("
    ").html(a).find(p):angular.element("
    ").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(!a)return 0;if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(!a)return 0;if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return a?void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element(''),c.wrap('').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){e.$setViewValue(d.uiReset?a.$eval(d.uiReset):b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){i(c,a.path().indexOf(b)>-1)})()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))})()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scroll.jqlite",["ui.scroll"]).service("jqLiteExtras",["$log","$window",function(a,b){return{registerFor:function(a){var c,d,e,f,g,h,i;return d=angular.element.prototype.css,a.prototype.css=function(a,b){var c,e;return e=this,c=e[0],c&&3!==c.nodeType&&8!==c.nodeType&&c.style?d.call(e,a,b):void 0},h=function(a){return a&&a.document&&a.location&&a.alert&&a.setInterval},i=function(a,b,c){var d,e,f,g,i;return d=a[0],i={top:["scrollTop","pageYOffset","scrollLeft"],left:["scrollLeft","pageXOffset","scrollTop"]}[b],e=i[0],g=i[1],f=i[2],h(d)?angular.isDefined(c)?d.scrollTo(a[f].call(a),c):g in d?d[g]:d.document.documentElement[e]:angular.isDefined(c)?d[e]=c:d[e]},b.getComputedStyle?(f=function(a){return b.getComputedStyle(a,null)},c=function(a,b){return parseFloat(b)}):(f=function(a){return a.currentStyle},c=function(a,b){var c,d,e,f,g,h,i;return c=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,f=new RegExp("^("+c+")(?!px)[a-z%]+$","i"),f.test(b)?(i=a.style,d=i.left,g=a.runtimeStyle,h=g&&g.left,g&&(g.left=i.left),i.left=b,e=i.pixelLeft,i.left=d,h&&(g.left=h),e):parseFloat(b)}),e=function(a,b){var d,e,g,i,j,k,l,m,n,o,p,q,r;return h(a)?(d=document.documentElement[{height:"clientHeight",width:"clientWidth"}[b]],{base:d,padding:0,border:0,margin:0}):(r={width:[a.offsetWidth,"Left","Right"],height:[a.offsetHeight,"Top","Bottom"]}[b],d=r[0],l=r[1],m=r[2],k=f(a),p=c(a,k["padding"+l])||0,q=c(a,k["padding"+m])||0,e=c(a,k["border"+l+"Width"])||0,g=c(a,k["border"+m+"Width"])||0,i=k["margin"+l],j=k["margin"+m],n=c(a,i)||0,o=c(a,j)||0,{base:d,padding:p+q,border:e+g,margin:n+o})},g=function(a,b,c){var d,g,h;return g=e(a,b),g.base>0?{base:g.base-g.padding-g.border,outer:g.base,outerfull:g.base+g.margin}[c]:(d=f(a),h=d[b],(0>h||null===h)&&(h=a.style[b]||0),h=parseFloat(h)||0,{base:h-g.padding-g.border,outer:h,outerfull:h+g.padding+g.border+g.margin}[c])},angular.forEach({before:function(a){var b,c,d,e,f,g,h;if(f=this,c=f[0],e=f.parent(),b=e.contents(),b[0]===c)return e.prepend(a);for(d=g=1,h=b.length-1;h>=1?h>=g:g>=h;d=h>=1?++g:--g)if(b[d]===c)return void angular.element(b[d-1]).after(a);throw new Error("invalid DOM structure "+c.outerHTML)},height:function(a){var b;return b=this,angular.isDefined(a)?(angular.isNumber(a)&&(a+="px"),d.call(b,"height",a)):g(this[0],"height","base")},outerHeight:function(a){return g(this[0],"height",a?"outerfull":"outer")},offset:function(a){var b,c,d,e,f,g;return f=this,arguments.length?void 0===a?f:a:(b={top:0,left:0},e=f[0],(c=e&&e.ownerDocument)?(d=c.documentElement,e.getBoundingClientRect&&(b=e.getBoundingClientRect()),g=c.defaultView||c.parentWindow,{top:b.top+(g.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(g.pageXOffset||d.scrollLeft)-(d.clientLeft||0)}):void 0)},scrollTop:function(a){return i(this,"top",a)},scrollLeft:function(a){return i(this,"left",a)}},function(b,c){return a.prototype[c]?void 0:a.prototype[c]=b})}}}]).run(["$log","$window","jqLiteExtras",function(a,b,c){return b.jQuery?void 0:c.registerFor(angular.element)}]),angular.module("ui.scroll",[]).directive("ngScrollViewport",["$log",function(){return{controller:["$scope","$element",function(a,b){return b}]}}]).directive("ngScroll",["$log","$injector","$rootScope","$timeout",function(a,b,c,d){return{require:["?^ngScrollViewport"],transclude:"element",priority:1e3,terminal:!0,compile:function(e,f,g){return function(f,h,i,j){var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;if(H=i.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/),!H)throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "'+i.ngScroll+'"');if(F=H[1],v=H[2],D=function(a){return angular.isObject(a)&&a.get&&angular.isFunction(a.get)},u=f[v],!D(u)&&(u=b.get(v),!D(u)))throw new Error(v+" is not a valid datasource");return r=Math.max(3,+i.bufferSize||10),q=function(){return T.height()*Math.max(.1,+i.padding||.1)},O=function(a){return a[0].scrollHeight||a[0].document.documentElement.scrollHeight},k=null,g(R=f.$new(),function(a){var b,c,d,f,g,h;if(f=a[0].localName,"dl"===f)throw new Error("ng-scroll directive does not support <"+a[0].localName+"> as a repeating tag: "+a[0].outerHTML);return"li"!==f&&"tr"!==f&&(f="div"),h=j[0]||angular.element(window),h.css({"overflow-y":"auto",display:"block"}),d=function(a){var b,c,d;switch(a){case"tr":return d=angular.element("
    "),b=d.find("div"),c=d.find("tr"),c.paddingHeight=function(){return b.height.apply(b,arguments)},c;default:return c=angular.element("<"+a+">"),c.paddingHeight=c.height,c}},c=function(a,b,c){return b[{top:"before",bottom:"after"}[c]](a),{paddingHeight:function(){return a.paddingHeight.apply(a,arguments)},insert:function(b){return a[{top:"after",bottom:"before"}[c]](b)}}},g=c(d(f),e,"top"),b=c(d(f),e,"bottom"),R.$destroy(),k={viewport:h,topPadding:g.paddingHeight,bottomPadding:b.paddingHeight,append:b.insert,prepend:g.insert,bottomDataPos:function(){return O(h)-b.paddingHeight()},topDataPos:function(){return g.paddingHeight()}}}),T=k.viewport,B=1,I=1,p=[],J=[],x=!1,n=!1,G=u.loading||function(){},E=!1,L=function(a,b){var c,d;for(c=d=a;b>=a?b>d:d>b;c=b>=a?++d:--d)p[c].scope.$destroy(),p[c].element.remove();return p.splice(a,b-a)},K=function(){return B=1,I=1,L(0,p.length),k.topPadding(0),k.bottomPadding(0),J=[],x=!1,n=!1,l(!1)},o=function(){return T.scrollTop()+T.height()},S=function(){return T.scrollTop()},P=function(){return!x&&k.bottomDataPos()=g?0>=f:f>=0)&&(d=p[c].element.outerHeight(!0),k.bottomDataPos()-b-d>o()+q());c=0>=g?++f:--f)b+=d,e++,x=!1;return e>0?(k.bottomPadding(k.bottomPadding()+b),L(p.length-e,p.length),I-=e,a.log("clipped off bottom "+e+" bottom padding "+k.bottomPadding())):void 0},Q=function(){return!n&&k.topDataPos()>S()-q()},t=function(){var b,c,d,e,f,g;for(e=0,d=0,f=0,g=p.length;g>f&&(b=p[f],c=b.element.outerHeight(!0),k.topDataPos()+e+c0?(k.topPadding(k.topPadding()+e),L(0,d),B+=d,a.log("clipped off top "+d+" top padding "+k.topPadding())):void 0},w=function(a,b){return E||(E=!0,G(!0)),1===J.push(a)?z(b):void 0},C=function(a,b){var c,d,e;return c=f.$new(),c[F]=b,d=a>B,c.$index=a,d&&c.$index--,e={scope:c},g(c,function(b){return e.element=b,d?a===I?(k.append(b),p.push(e)):(p[a-B].element.after(b),p.splice(a-B+1,0,e)):(k.prepend(b),p.unshift(e))}),{appended:d,wrapper:e}},m=function(a,b){var c;return a?k.bottomPadding(Math.max(0,k.bottomPadding()-b.element.outerHeight(!0))):(c=k.topPadding()-b.element.outerHeight(!0),c>=0?k.topPadding(c):T.scrollTop(T.scrollTop()+b.element.outerHeight(!0)))},l=function(b,c,e){var f;return f=function(){return a.log("top {actual="+k.topDataPos()+" visible from="+S()+" bottom {visible through="+o()+" actual="+k.bottomDataPos()+"}"),P()?w(!0,b):Q()&&w(!1,b),e?e():void 0},c?d(function(){var a,b,d;for(b=0,d=c.length;d>b;b++)a=c[b],m(a.appended,a.wrapper);return f()}):f()},A=function(a,b){return l(a,b,function(){return J.shift(),0===J.length?(E=!1,G(!1)):z(a)})},z=function(b){var c;return c=J[0],c?p.length&&!P()?A(b):u.get(I,r,function(c){var d,e,f,g;if(e=[],0===c.length)x=!0,k.bottomPadding(0),a.log("appended: requested "+r+" records starting from "+I+" recieved: eof");else{for(t(),f=0,g=c.length;g>f;f++)d=c[f],e.push(C(++I,d));a.log("appended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)}):p.length&&!Q()?A(b):u.get(B-r,r,function(c){var d,e,f,g;if(e=[],0===c.length)n=!0,k.topPadding(0),a.log("prepended: requested "+r+" records starting from "+(B-r)+" recieved: bof");else{for(s(),d=f=g=c.length-1;0>=g?0>=f:f>=0;d=0>=g?++f:--f)e.unshift(C(--B,c[d]));a.log("prepended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)})},M=function(){return c.$$phase||E?void 0:(l(!1),f.$apply())},T.bind("resize",M),N=function(){return c.$$phase||E?void 0:(l(!0),f.$apply())},T.bind("scroll",N),f.$watch(u.revision,function(){return K()}),y=u.scope?u.scope.$new():f.$new(),f.$on("$destroy",function(){return y.$destroy(),T.unbind("resize",M),T.unbind("scroll",N)}),y.$on("update.items",function(a,b,c){var d,e,f,g,h;if(angular.isFunction(b))for(e=function(a){return b(a.scope)},f=0,g=p.length;g>f;f++)d=p[f],e(d);else 0<=(h=b-B-1)&&hh;h++)d=p[h],e.unshift(d);for(g=function(a){return b(a.scope)?(L(e.length-1-c,e.length-c),I--):void 0},c=i=0,m=e.length;m>i;c=++i)f=e[c],g(f)}else 0<=(o=b-B-1)&&oj;c=++j)d=p[c],d.scope.$index=B+c;return l(!1)}),y.$on("insert.item",function(a,b,c){var d,e,f,g,h,i,j,k,m,n,o,q;if(e=[],angular.isFunction(b)){for(f=[],i=0,m=p.length;m>i;i++)c=p[i],f.unshift(c);for(h=function(a){var f,g,h,i,j;if(g=b(a.scope)){if(C=function(a,b){return C(a,b),I++},angular.isArray(g)){for(j=[],f=h=0,i=g.length;i>h;f=++h)c=g[f],j.push(e.push(C(d+f,c)));return j}return e.push(C(d,g))}},d=j=0,n=f.length;n>j;d=++j)g=f[d],h(g)}else 0<=(q=b-B-1)&&qk;d=++k)c=p[d],c.scope.$index=B+d;return l(!1,e)})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b")(i);j.appendChild(k[0]),i.count=f,void 0!==g&&k.eq(0).children().css("height",g),void 0!==h&&(k.eq(0).children().css("background-color",h),k.eq(0).children().css("color",h));var l,m=0;return{start:function(){this.show();var a=this;clearInterval(m),m=setInterval(function(){if(isNaN(f))clearInterval(m),f=0,a.hide();else{var b=100-f;f+=.15*Math.pow(1-Math.sqrt(b),2),a.updateCount(f)}},200)},updateCount:function(a){i.count=a,i.$$phase||i.$apply()},height:function(a){return void 0!==a&&(g=a,i.height=g,i.$$phase||i.$apply()),g},color:function(a){return void 0!==a&&(h=a,i.color=h,i.$$phase||i.$apply()),h},hide:function(){k.children().css("opacity","0");var a=this;a.animate(function(){k.children().css("width","0%"),a.animate(function(){a.show()},500)},500)},show:function(){var a=this;a.animate(function(){k.children().css("opacity","1")},100)},animate:function(a,b){l&&e.cancel(l),l=e(a,b)},status:function(){return f},stop:function(){clearInterval(m)},set:function(a){return this.show(),this.updateCount(a),f=a,clearInterval(m),f},css:function(a){return k.children().css(a)},reset:function(){return clearInterval(m),f=0,this.updateCount(f),0},complete:function(){f=100,this.updateCount(f);var a=this;return clearInterval(m),e(function(){a.hide(),e(function(){f=0,a.updateCount(f)},500)},1e3),f},setParent:function(a){if(null===a||void 0===a)throw new Error("Provide a valid parent of type HTMLElement");null!==j&&void 0!==j&&j.removeChild(k[0]),j=a,j.appendChild(k[0])},getDomElement:function(){return k}}}],this.setColor=function(a){return void 0!==a&&(this.color=a),this.color},this.setHeight=function(a){return void 0!==a&&(this.height=a),this.height}}),angular.module("ngProgress.directive",[]).directive("ngProgress",["$window","$rootScope",function(a,b){var c={replace:!0,restrict:"E",link:function(a,c){b.$watch("count",function(b){(void 0!==b||null!==b)&&(a.counter=b,c.eq(0).children().css("width",b+"%"))}),b.$watch("color",function(b){(void 0!==b||null!==b)&&(a.color=b,c.eq(0).children().css("background-color",b),c.eq(0).children().css("color",b))}),b.$watch("height",function(b){(void 0!==b||null!==b)&&(a.height=b, -c.eq(0).children().css("height",b))})},template:'
    '};return c}]),angular.module("ngProgress",["ngProgress.directive","ngProgress.provider"]),angular.module("gettext",[]),angular.module("gettext").constant("gettext",function(a){return a}),angular.module("gettext").factory("gettextCatalog",["gettextPlurals","$http","$cacheFactory","$interpolate","$rootScope",function(a,b,c,d,e){function f(){e.$broadcast("gettextLanguageChanged")}var g,h=function(a){return g.debug&&g.currentLanguage!==g.baseLanguage?g.debugPrefix+a:a},i=function(a){return g.showTranslatedMarkers?g.translatedMarkerPrefix+a+g.translatedMarkerSuffix:a};return g={debug:!1,debugPrefix:"[MISSING]: ",showTranslatedMarkers:!1,translatedMarkerPrefix:"[",translatedMarkerSuffix:"]",strings:{},baseLanguage:"en",currentLanguage:"en",cache:c("strings"),setCurrentLanguage:function(a){this.currentLanguage=a,f()},setStrings:function(a,b){this.strings[a]||(this.strings[a]={});for(var c in b){var d=b[c];this.strings[a][c]="string"==typeof d?[d]:d}f()},getStringForm:function(a,b){var c=this.strings[this.currentLanguage]||{},d=c[a]||[];return d[b]},getString:function(a,b){return a=this.getStringForm(a,0)||h(a),a=b?d(a)(b):a,i(a)},getPlural:function(b,c,e,f){var g=a(this.currentLanguage,b);return c=this.getStringForm(c,g)||h(1===b?c:e),c=f?d(c)(f):c,i(c)},loadRemote:function(a){return b({method:"GET",url:a,cache:g.cache}).success(function(a){for(var b in a)g.setStrings(b,a[b])})}}}]),angular.module("gettext").directive("translate",["gettextCatalog","$parse","$animate","$compile",function(a,b,c,d){function e(a,b,c){if(!a)throw new Error("You should add a "+b+" attribute whenever you add a "+c+" attribute.")}var f=function(){return String.prototype.trim?function(a){return"string"==typeof a?a.trim():a}:function(a){return"string"==typeof a?a.replace(/^\s*/,"").replace(/\s*$/,""):a}}();return{restrict:"A",terminal:!0,compile:function(g,h){e(!h.translatePlural||h.translateN,"translate-n","translate-plural"),e(!h.translateN||h.translatePlural,"translate-plural","translate-n");var i=f(g.html()),j=h.translatePlural;return{post:function(e,f,g){function h(){var b;j?(e=l||(l=e.$new()),e.$count=k(e),b=a.getPlural(e.$count,i,j)):b=a.getString(i);var g=angular.element(""+b+"");d(g.contents())(e);var h=f.contents(),m=g.contents();c.enter(m,f),c.leave(h)}var k=b(g.translateN),l=null;g.translateN&&e.$watch(g.translateN,h),e.$on("gettextLanguageChanged",h),h()}}}}}]),angular.module("gettext").filter("translate",["gettextCatalog",function(a){function b(b){return a.getString(b)}return b.$stateful=!0,b}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return b%10!=1||b%100==11?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||b%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return b%10==1&&b%100!=11?0:0!=b?1:2;case"lt":return b%10==1&&b%100!=11?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return b%10==1&&b%100!=11?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return b%100==1?1:b%100==2?2:b%100==3||b%100==4?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}),!function(){"use strict";function a(a,b){return a.module("angularMoment",[]).constant("angularMomentConfig",{preprocess:null,timezone:"",format:null}).constant("moment",b).constant("amTimeAgoConfig",{withoutSuffix:!1,serverTime:null,titleFormat:null}).directive("amTimeAgo",["$window","moment","amMoment","amTimeAgoConfig","angularMomentConfig",function(b,c,d,e,f){return function(g,h,i){function j(){var a;if(e.serverTime){var b=(new Date).getTime(),d=b-u+e.serverTime;a=c(d)}else a=c();return a}function k(){q&&(b.clearTimeout(q),q=null)}function l(a){if(h.text(a.from(j(),s)),t&&!h.attr("title")&&h.attr("title",a.local().format(t)),!x){var c=Math.abs(j().diff(a,"minute")),d=3600;1>c?d=1:60>c?d=30:180>c&&(d=300),q=b.setTimeout(function(){l(a)},1e3*d)}}function m(a){y&&h.attr("datetime",a)}function n(){if(k(),o){var a=d.preprocessDate(o,v,r);l(a),m(a.toISOString())}}var o,p,q=null,r=f.format,s=e.withoutSuffix,t=e.titleFormat,u=(new Date).getTime(),v=f.preprocess,w=i.amTimeAgo.replace(/^::/,""),x=0===i.amTimeAgo.indexOf("::"),y="TIME"===h[0].nodeName.toUpperCase();p=g.$watch(w,function(a){return"undefined"==typeof a||null===a||""===a?(k(),void(o&&(h.text(""),m(""),o=null))):(o=a,n(),void(void 0!==a&&x&&p()))}),a.isDefined(i.amWithoutSuffix)&&g.$watch(i.amWithoutSuffix,function(a){"boolean"==typeof a?(s=a,n()):s=e.withoutSuffix}),i.$observe("amFormat",function(a){"undefined"!=typeof a&&(r=a,n())}),i.$observe("amPreprocess",function(a){v=a,n()}),g.$on("$destroy",function(){k()}),g.$on("amMoment:localeChanged",function(){n()})}}]).service("amMoment",["moment","$rootScope","$log","angularMomentConfig",function(b,c,d,e){var f=this;this.preprocessors={utc:b.utc,unix:b.unix},this.changeLocale=function(d){var e=(b.locale||b.lang)(d);return a.isDefined(d)&&(c.$broadcast("amMoment:localeChanged"),c.$broadcast("amMoment:languageChange")),e},this.changeLanguage=function(a){return d.warn("angular-moment: Usage of amMoment.changeLanguage() is deprecated. Please use changeLocale()"),f.changeLocale(a)},this.preprocessDate=function(c,f,g){return a.isUndefined(f)&&(f=e.preprocess),this.preprocessors[f]?this.preprocessors[f](c,g):(f&&d.warn("angular-moment: Ignoring unsupported value for preprocess: "+f),!isNaN(parseFloat(c))&&isFinite(c)?b(parseInt(c,10)):b(c,g))},this.applyTimezone=function(a){var b=e.timezone;return a&&b&&(a.tz?a=a.tz(b):d.warn("angular-moment: timezone specified but moment.tz() is undefined. Did you forget to include moment-timezone.js?")),a}}]).filter("amCalendar",["moment","amMoment",function(a,b){return function(c,d){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var e=a(c);return e.isValid()?b.applyTimezone(e).calendar():""}}]).filter("amDateFormat",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,e);var f=a(c);return f.isValid()?b.applyTimezone(f).format(d):""}}]).filter("amDurationFormat",["moment",function(a){return function(b,c,d){return"undefined"==typeof b||null===b?"":a.duration(b,c).humanize(d)}}]).filter("amTimeAgo",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var f=a(c);return f.isValid()?b.applyTimezone(f).fromNow(e):""}}])}"function"==typeof define&&define.amd?define("angular-moment",["angular","moment"],a):"undefined"!=typeof module&&module&&module.exports?a(angular,require("moment")):a(angular,window.moment)}(); \ No newline at end of file diff --git a/public/js/main.min.js b/public/js/main.min.js deleted file mode 100644 index 0283215..0000000 --- a/public/js/main.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! insight-ui 0.4.0 */ -var defaultLanguage=localStorage.getItem("insight-language")||"en",defaultCurrency=localStorage.getItem("insight-currency")||"BTC";angular.module("insight",["ngAnimate","ngResource","ngRoute","ngProgress","ui.bootstrap","ui.route","monospaced.qrcode","gettext","angularMoment","insight.system","insight.socket","insight.api","insight.blocks","insight.transactions","insight.address","insight.search","insight.status","insight.connection","insight.currency","insight.messages"]),angular.module("insight.system",[]),angular.module("insight.socket",[]),angular.module("insight.api",[]),angular.module("insight.blocks",[]),angular.module("insight.transactions",[]),angular.module("insight.address",[]),angular.module("insight.search",[]),angular.module("insight.status",[]),angular.module("insight.connection",[]),angular.module("insight.currency",[]),angular.module("insight.messages",[]),angular.module("insight.address").controller("AddressController",function($scope,$rootScope,$routeParams,$location,Global,Address,getSocket){$scope.global=Global;var socket=getSocket($scope),addrStr=$routeParams.addrStr,_startSocket=function(){socket.on("bitcoind/addresstxid",function(data){if(data.address===addrStr){$rootScope.$broadcast("tx",data.txid);var base=document.querySelector("base"),beep=new Audio(base.href+"/sound/transaction.mp3");beep.play()}}),socket.emit("subscribe","bitcoind/addresstxid",[addrStr])},_stopSocket=function(){socket.emit("unsubscribe","bitcoind/addresstxid",[addrStr])};socket.on("connect",function(){_startSocket()}),$scope.$on("$destroy",function(){_stopSocket()}),$scope.params=$routeParams,$scope.findOne=function(){$rootScope.currentAddr=$routeParams.addrStr,_startSocket(),Address.get({addrStr:$routeParams.addrStr},function(address){$rootScope.titleDetail=address.addrStr.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.address=address},function(e){400===e.status?$rootScope.flashMessage="Invalid Address: "+$routeParams.addrStr:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Address Not Found",$location.path("/")})}}),angular.module("insight.blocks").controller("BlocksController",function($scope,$rootScope,$routeParams,$location,Global,Block,Blocks,BlockByHeight){$scope.global=Global,$scope.loading=!1,$routeParams.blockHeight&&BlockByHeight.get({blockHeight:$routeParams.blockHeight},function(hash){$location.path("/block/"+hash.blockHash)},function(){$rootScope.flashMessage="Bad Request",$location.path("/")});var _formatTimestamp=function(date){var yyyy=date.getUTCFullYear().toString(),mm=(date.getUTCMonth()+1).toString(),dd=date.getUTCDate().toString();return yyyy+"-"+(mm[1]?mm:"0"+mm[0])+"-"+(dd[1]?dd:"0"+dd[0])};$scope.$watch("dt",function(newValue,oldValue){newValue!==oldValue&&$location.path("/blocks-date/"+_formatTimestamp(newValue))}),$scope.openCalendar=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.opened=!0},$scope.humanSince=function(time){var m=moment.unix(time).startOf("day"),b=moment().startOf("day");return m.max().from(b)},$scope.list=function(){if($scope.loading=!0,$routeParams.blockDate&&($scope.detail="On "+$routeParams.blockDate),$routeParams.startTimestamp){var d=new Date(1e3*$routeParams.startTimestamp),m=d.getMinutes();10>m&&(m="0"+m),$scope.before=" before "+d.getHours()+":"+m}$rootScope.titleDetail=$scope.detail,Blocks.get({blockDate:$routeParams.blockDate,startTimestamp:$routeParams.startTimestamp},function(res){$scope.loading=!1,$scope.blocks=res.blocks,$scope.pagination=res.pagination})},$scope.findOne=function(){$scope.loading=!0,Block.get({blockHash:$routeParams.blockHash},function(block){$rootScope.titleDetail=block.height,$rootScope.flashMessage=null,$scope.loading=!1,$scope.block=block},function(e){400===e.status?$rootScope.flashMessage="Invalid Transaction ID: "+$routeParams.txId:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Block Not Found",$location.path("/")})},$scope.params=$routeParams}),angular.module("insight.connection").controller("ConnectionController",function($scope,$window,Status,getSocket,PeerSync){$scope.apiOnline=!0,$scope.serverOnline=!0,$scope.clienteOnline=!0;var socket=getSocket($scope);socket.on("connect",function(){$scope.serverOnline=!0,socket.on("disconnect",function(){$scope.serverOnline=!1})}),$scope.getConnStatus=function(){PeerSync.get({},function(peer){$scope.apiOnline=peer.connected,$scope.host=peer.host,$scope.port=peer.port},function(){$scope.apiOnline=!1})},socket.emit("subscribe","sync"),socket.on("status",function(sync){$scope.sync=sync,$scope.apiOnline="aborted"!==sync.status&&"error"!==sync.status}),$window.addEventListener("offline",function(){$scope.$apply(function(){$scope.clienteOnline=!1})},!0),$window.addEventListener("online",function(){$scope.$apply(function(){$scope.clienteOnline=!0})},!0)}),angular.module("insight.currency").controller("CurrencyController",function($scope,$rootScope,Currency){$rootScope.currency.symbol=defaultCurrency;var _roundFloat=function(x,n){return parseInt(n,10)&&parseFloat(x)||(n=0),Math.round(x*Math.pow(10,n))/Math.pow(10,n)};$rootScope.currency.getConvertion=function(value){if(value=1*value,!isNaN(value)&&"undefined"!=typeof value&&null!==value){if(0===value)return"0 "+this.symbol;var response;return"USD"===this.symbol?response=_roundFloat(value*this.factor,2):"mBTC"===this.symbol?(this.factor=1e3,response=_roundFloat(value*this.factor,5)):"bits"===this.symbol?(this.factor=1e6,response=_roundFloat(value*this.factor,2)):(this.factor=1,response=value),1e-7>response&&(response=response.toFixed(8)),response+" "+this.symbol}return"value error"},$scope.setCurrency=function(currency){$rootScope.currency.symbol=currency,localStorage.setItem("insight-currency",currency),"USD"===currency?Currency.get({},function(res){$rootScope.currency.factor=$rootScope.currency.bitstamp=res.data.bitstamp}):"mBTC"===currency?$rootScope.currency.factor=1e3:"bits"===currency?$rootScope.currency.factor=1e6:$rootScope.currency.factor=1},Currency.get({},function(res){$rootScope.currency.factor=$rootScope.currency.bitstamp=res.data.bitstamp})}),angular.module("insight.system").controller("FooterController",function($scope,$route,$templateCache,gettextCatalog,amMoment,Version){$scope.defaultLanguage=defaultLanguage;var _getVersion=function(){Version.get({},function(res){$scope.version=res.version})};$scope.version=_getVersion(),$scope.availableLanguages=[{name:"Deutsch",isoCode:"de_DE"},{name:"English",isoCode:"en"},{name:"Spanish",isoCode:"es"},{name:"Japanese",isoCode:"ja"}],$scope.setLanguage=function(isoCode){gettextCatalog.currentLanguage=$scope.defaultLanguage=defaultLanguage=isoCode,amMoment.changeLocale(isoCode),localStorage.setItem("insight-language",isoCode);var currentPageTemplate=$route.current.templateUrl;$templateCache.remove(currentPageTemplate),$route.reload()}}),angular.module("insight.system").controller("HeaderController",function($scope,$rootScope,$modal,getSocket,Global,Block){$scope.global=Global,$rootScope.currency={factor:1,bitstamp:0,symbol:"BTC"},$scope.menu=[{title:"Blocks",link:"blocks"},{title:"Status",link:"status"}],$scope.openScannerModal=function(){$modal.open({templateUrl:"scannerModal.html",controller:"ScannerController"})};var _getBlock=function(hash){Block.get({blockHash:hash},function(res){$scope.totalBlocks=res.height})},socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe","inv"),socket.on("block",function(block){var blockHash=block.toString();_getBlock(blockHash)})}),$rootScope.isCollapsed=!0});var TRANSACTION_DISPLAYED=10,BLOCKS_DISPLAYED=5;angular.module("insight.system").controller("IndexController",function($scope,Global,getSocket,Blocks){$scope.global=Global;var _getBlocks=function(){Blocks.get({limit:BLOCKS_DISPLAYED},function(res){$scope.blocks=res.blocks,$scope.blocksLength=res.length})},socket=getSocket($scope),_startSocket=function(){socket.emit("subscribe","inv"),socket.on("tx",function(tx){$scope.txs.unshift(tx),parseInt($scope.txs.length,10)>=parseInt(TRANSACTION_DISPLAYED,10)&&($scope.txs=$scope.txs.splice(0,TRANSACTION_DISPLAYED))}),socket.on("block",function(){_getBlocks()})};socket.on("connect",function(){_startSocket()}),$scope.humanSince=function(time){var m=moment.unix(time);return m.max().fromNow()},$scope.index=function(){_getBlocks(),_startSocket()},$scope.txs=[],$scope.blocks=[]}),angular.module("insight.messages").controller("VerifyMessageController",function($scope,$http,Api){$scope.message={address:"",signature:"",message:""},$scope.verification={status:"unverified",result:null,error:null,address:""},$scope.verifiable=function(){return $scope.message.address&&$scope.message.signature&&$scope.message.message},$scope.verify=function(){$scope.verification.status="loading",$scope.verification.address=$scope.message.address,$http.post(Api.apiPrefix+"/messages/verify",$scope.message).success(function(data,status,headers,config){return"boolean"!=typeof data.result?($scope.verification.status="error",void($scope.verification.error=null)):($scope.verification.status="verified",void($scope.verification.result=data.result))}).error(function(data,status,headers,config){$scope.verification.status="error",$scope.verification.error=data})};var unverify=function(){$scope.verification.status="unverified"};$scope.$watch("message.address",unverify),$scope.$watch("message.signature",unverify),$scope.$watch("message.message",unverify)}),angular.module("insight.system").controller("ScannerController",function($scope,$rootScope,$modalInstance,Global){$scope.global=Global;var isMobile={Android:function(){return navigator.userAgent.match(/Android/i)},BlackBerry:function(){return navigator.userAgent.match(/BlackBerry/i)},iOS:function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},Opera:function(){return navigator.userAgent.match(/Opera Mini/i)},Windows:function(){return navigator.userAgent.match(/IEMobile/i)},any:function(){return isMobile.Android()||isMobile.BlackBerry()||isMobile.iOS()||isMobile.Opera()||isMobile.Windows()}};navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia,window.URL=window.URL||window.webkitURL||window.mozURL||window.msURL,$scope.isMobile=isMobile.any(),$scope.scannerLoading=!1;var cameraInput,video,canvas,$video,context,localMediaStream,$searchInput=angular.element(document.getElementById("search")),_scan=function(evt){if($scope.isMobile){$scope.scannerLoading=!0;var files=evt.target.files;if(1===files.length&&0===files[0].type.indexOf("image/")){var file=files[0],reader=new FileReader;reader.onload=function(theFile){return function(e){var mpImg=new MegaPixImage(file);mpImg.render(canvas,{maxWidth:200,maxHeight:200,orientation:6}),setTimeout(function(){qrcode.width=canvas.width,qrcode.height=canvas.height,qrcode.imagedata=context.getImageData(0,0,qrcode.width,qrcode.height);try{qrcode.decode()}catch(e){alert(e)}},1500)}}(file),reader.readAsDataURL(file)}}else{if(localMediaStream){context.drawImage(video,0,0,300,225);try{qrcode.decode()}catch(e){}}setTimeout(_scan,500)}},_successCallback=function(stream){video.src=window.URL&&window.URL.createObjectURL(stream)||stream,localMediaStream=stream,video.play(),setTimeout(_scan,1e3)},_scanStop=function(){$scope.scannerLoading=!1,$modalInstance.close(),$scope.isMobile||(localMediaStream.stop&&localMediaStream.stop(),localMediaStream=null,video.src="")},_videoError=function(err){console.log("Video Error: "+JSON.stringify(err)),_scanStop()};qrcode.callback=function(data){_scanStop();var str=0===data.indexOf("bitcoin:")?data.substring(8):data;console.log("QR code detected: "+str),$searchInput.val(str).triggerHandler("change").triggerHandler("submit")},$scope.cancel=function(){_scanStop()},$modalInstance.opened.then(function(){$rootScope.isCollapsed=!0,setTimeout(function(){canvas=document.getElementById("qr-canvas"),context=canvas.getContext("2d"),$scope.isMobile?(cameraInput=document.getElementById("qrcode-camera"),cameraInput.addEventListener("change",_scan,!1)):(video=document.getElementById("qrcode-scanner-video"),$video=angular.element(video),canvas.width=300,canvas.height=225,context.clearRect(0,0,300,225),navigator.getUserMedia({video:!0},_successCallback,_videoError))},500)})}),angular.module("insight.search").controller("SearchController",function($scope,$routeParams,$location,$timeout,Global,Block,Transaction,Address,BlockByHeight){$scope.global=Global,$scope.loading=!1;var _badQuery=function(){$scope.badQuery=!0,$timeout(function(){$scope.badQuery=!1},2e3)},_resetSearch=function(){$scope.q="",$scope.loading=!1};$scope.search=function(){var q=$scope.q;$scope.badQuery=!1,$scope.loading=!0,Block.get({blockHash:q},function(){_resetSearch(),$location.path("block/"+q)},function(){Transaction.get({txId:q},function(){_resetSearch(),$location.path("tx/"+q)},function(){Address.get({addrStr:q},function(){_resetSearch(),$location.path("address/"+q)},function(){isFinite(q)?BlockByHeight.get({blockHeight:q},function(hash){_resetSearch(),$location.path("/block/"+hash.blockHash)},function(){$scope.loading=!1,_badQuery()}):($scope.loading=!1,_badQuery())})})})}}),angular.module("insight.status").controller("StatusController",function($scope,$routeParams,$location,Global,Status,Sync,getSocket){$scope.global=Global,$scope.getStatus=function(q){Status.get({q:"get"+q},function(d){$scope.loaded=1,angular.extend($scope,d)},function(e){$scope.error="API ERROR: "+e.data})},$scope.humanSince=function(time){var m=moment.unix(time/1e3);return m.max().fromNow()};var _onSyncUpdate=function(sync){$scope.sync=sync},_startSocket=function(){socket.emit("subscribe","sync"),socket.on("status",function(sync){_onSyncUpdate(sync)})},socket=getSocket($scope);socket.on("connect",function(){_startSocket()}),$scope.getSync=function(){_startSocket(),Sync.get({},function(sync){_onSyncUpdate(sync)},function(e){var err="Could not get sync information"+e.toString();$scope.sync={error:err}})}}),angular.module("insight.transactions").controller("transactionsController",function($scope,$rootScope,$routeParams,$location,Global,Transaction,TransactionsByBlock,TransactionsByAddress){$scope.global=Global,$scope.loading=!1,$scope.loadedBy=null;var pageNum=0,pagesTotal=1,COIN=1e8,_aggregateItems=function(items){if(!items)return[];for(var l=items.length,ret=[],tmp={},u=0,i=0;l>i;i++){var notAddr=!1;if(items[i].scriptSig&&!items[i].addr&&(items[i].addr="Unparsed address ["+u++ +"]",items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&!items[i].scriptPubKey.addresses&&(items[i].scriptPubKey.addresses=["Unparsed address ["+u++ +"]"],items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&items[i].scriptPubKey.addresses.length>1)items[i].addr=items[i].scriptPubKey.addresses.join(","),ret.push(items[i]);else{var addr=items[i].addr||items[i].scriptPubKey&&items[i].scriptPubKey.addresses[0];tmp[addr]||(tmp[addr]={},tmp[addr].valueSat=0,tmp[addr].count=0,tmp[addr].addr=addr,tmp[addr].items=[]),tmp[addr].isSpent=items[i].spentTxId,tmp[addr].doubleSpentTxID=tmp[addr].doubleSpentTxID||items[i].doubleSpentTxID,tmp[addr].doubleSpentIndex=tmp[addr].doubleSpentIndex||items[i].doubleSpentIndex,tmp[addr].dbError=tmp[addr].dbError||items[i].dbError,tmp[addr].valueSat+=Math.round(items[i].value*COIN),tmp[addr].items.push(items[i]),tmp[addr].notAddr=notAddr,items[i].unconfirmedInput&&(tmp[addr].unconfirmedInput=!0),tmp[addr].count++}}return angular.forEach(tmp,function(v){v.value=v.value||parseInt(v.valueSat)/COIN,ret.push(v)}),ret},_processTX=function(tx){tx.vinSimple=_aggregateItems(tx.vin),tx.voutSimple=_aggregateItems(tx.vout)},_paginate=function(data){$scope.loading=!1,pagesTotal=data.pagesTotal,pageNum+=1,data.txs.forEach(function(tx){_processTX(tx),$scope.txs.push(tx)})},_byBlock=function(){TransactionsByBlock.get({block:$routeParams.blockHash,pageNum:pageNum},function(data){_paginate(data)})},_byAddress=function(){TransactionsByAddress.get({address:$routeParams.addrStr,pageNum:pageNum},function(data){_paginate(data)})},_findTx=function(txid){Transaction.get({txId:txid},function(tx){$rootScope.titleDetail=tx.txid.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.tx=tx,_processTX(tx),$scope.txs.unshift(tx)},function(e){400===e.status?$rootScope.flashMessage="Invalid Transaction ID: "+$routeParams.txId:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Transaction Not Found",$location.path("/")})};$scope.findThis=function(){_findTx($routeParams.txId)},$scope.load=function(from){$scope.loadedBy=from,$scope.loadMore()},$scope.loadMore=function(){pagesTotal>pageNum&&!$scope.loading&&($scope.loading=!0,"address"===$scope.loadedBy?_byAddress():_byBlock())},(">"==$routeParams.v_type||"<"==$routeParams.v_type)&&($scope.from_vin="<"==$routeParams.v_type?!0:!1,$scope.from_vout=">"==$routeParams.v_type?!0:!1,$scope.v_index=parseInt($routeParams.v_index),$scope.itemsExpanded=!0),$scope.txs=[],$scope.$on("tx",function(event,txid){_findTx(txid)})}),angular.module("insight.transactions").controller("SendRawTransactionController",function($scope,$http,Api){$scope.transaction="",$scope.status="ready",$scope.txid="",$scope.error=null,$scope.formValid=function(){return!!$scope.transaction},$scope.send=function(){var postData={rawtx:$scope.transaction};$scope.status="loading",$http.post(Api.apiPrefix+"/tx/send",postData).success(function(data,status,headers,config){return"string"!=typeof data.txid?($scope.status="error",void($scope.error="The transaction was sent but no transaction id was got back")):($scope.status="sent",void($scope.txid=data.txid))}).error(function(data,status,headers,config){$scope.status="error",data?$scope.error=data:$scope.error="No error message given (connection error?)"})}}),angular.module("insight.address").factory("Address",function($resource,Api){return $resource(Api.apiPrefix+"/addr/:addrStr/?noTxList=1",{addrStr:"@addStr"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}),angular.module("insight.api").factory("Api",function(){return{apiPrefix:"/insight-api"}}),angular.module("insight.blocks").factory("Block",function($resource,Api){return $resource(Api.apiPrefix+"/block/:blockHash",{blockHash:"@blockHash"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}).factory("Blocks",function($resource,Api){return $resource(Api.apiPrefix+"/blocks")}).factory("BlockByHeight",function($resource,Api){return $resource(Api.apiPrefix+"/block-index/:blockHeight")}),angular.module("insight.currency").factory("Currency",function($resource,Api){return $resource(Api.apiPrefix+"/currency")}),angular.module("insight.system").factory("Global",[function(){}]).factory("Version",function($resource,Api){return $resource(Api.apiPrefix+"/version")});var ScopedSocket=function(socket,$rootScope){this.socket=socket,this.$rootScope=$rootScope,this.listeners=[]};ScopedSocket.prototype.removeAllListeners=function(opts){opts||(opts={});for(var i=0;i=200?scope.secondaryNavbar=!0:scope.secondaryNavbar=!1,scope.$apply()})}}).directive("whenScrolled",function($window){return{restric:"A",link:function(scope,elm,attr){var pageHeight,clientHeight,scrollPos;$window=angular.element($window);var handler=function(){pageHeight=window.document.documentElement.scrollHeight,clientHeight=window.document.documentElement.clientHeight,scrollPos=window.pageYOffset,pageHeight-(scrollPos+clientHeight)===0&&scope.$apply(attr.whenScrolled)};$window.on("scroll",handler),scope.$on("$destroy",function(){return $window.off("scroll",handler)})}}}).directive("clipCopy",function(){return ZeroClipboard.config({moviePath:"/lib/zeroclipboard/ZeroClipboard.swf",trustedDomains:["*"],allowScriptAccess:"always",forceHandCursor:!0}),{restric:"A",scope:{clipCopy:"=clipCopy"},template:'
    Copied!
    ',link:function(scope,elm){var clip=new ZeroClipboard(elm);clip.on("load",function(client){var onMousedown=function(client){client.setText(scope.clipCopy)};client.on("mousedown",onMousedown),scope.$on("$destroy",function(){client.off("mousedown",onMousedown)})}),clip.on("noFlash wrongflash",function(){return elm.remove()})}}}).directive("focus",function($timeout){return{scope:{trigger:"@focus"},link:function(scope,element){scope.$watch("trigger",function(value){"true"===value&&$timeout(function(){element[0].focus()})})}}}),angular.module("insight").filter("startFrom",function(){return function(input,start){return start=+start,input.slice(start)}}).filter("split",function(){return function(input,delimiter){var delimiter=delimiter||",";return input.split(delimiter)}}),angular.module("insight").config(function($routeProvider){$routeProvider.when("/block/:blockHash",{templateUrl:"views/block.html",title:"Bitcoin Block "}).when("/block-index/:blockHeight",{controller:"BlocksController",templateUrl:"views/redirect.html"}).when("/tx/send",{templateUrl:"views/transaction_sendraw.html",title:"Broadcast Raw Transaction"}).when("/tx/:txId/:v_type?/:v_index?",{templateUrl:"views/transaction.html",title:"Bitcoin Transaction "}).when("/",{templateUrl:"views/index.html",title:"Home"}).when("/blocks",{templateUrl:"views/block_list.html",title:"Bitcoin Blocks solved Today"}).when("/blocks-date/:blockDate/:startTimestamp?",{templateUrl:"views/block_list.html",title:"Bitcoin Blocks solved "}).when("/address/:addrStr",{templateUrl:"views/address.html",title:"Bitcoin Address "}).when("/status",{templateUrl:"views/status.html",title:"Status"}).when("/messages/verify",{templateUrl:"views/messages_verify.html",title:"Verify Message"}).otherwise({templateUrl:"views/404.html",title:"Error"})}),angular.module("insight").config(function($locationProvider){$locationProvider.html5Mode(!0),$locationProvider.hashPrefix("!")}).run(function($rootScope,$route,$location,$routeParams,$anchorScroll,ngProgress,gettextCatalog,amMoment){gettextCatalog.currentLanguage=defaultLanguage,amMoment.changeLocale(defaultLanguage),$rootScope.$on("$routeChangeStart",function(){ngProgress.start()}),$rootScope.$on("$routeChangeSuccess",function(){ngProgress.complete(),$rootScope.titleDetail="",$rootScope.title=$route.current.title,$rootScope.isCollapsed=!0,$rootScope.currentAddr=null,$location.hash($routeParams.scrollTo),$anchorScroll()})}),angular.element(document).ready(function(){}),angular.module("insight").run(["gettextCatalog",function(gettextCatalog){gettextCatalog.setStrings("de_DE",{"(Input unconfirmed)":"(Eingabe unbestätigt)","404 Page not found :(":"404 Seite nicht gefunden :(",'insight is an
    open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen REST und Websocket APIs um eigene Wallets oder Applikationen zu implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der aktuelle Quellcode ist auf Github zu finden.','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insight befindet sich aktuell noch in der Entwicklung. Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren Verbesserung an unseren Github Issue Tracker.',About:"Über insight",Address:"Adresse",Age:"Alter","Application Status":"Programmstatus","Best Block":"Bester Block","Bitcoin node information":"Bitcoin-Node Info",Block:"Block","Block Reward":"Belohnung",Blocks:"Blöcke","Bytes Serialized":"Serialisierte Bytes","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:{{port}} ist fehlgeschlagen.)","Can't connect to insight server. Attempting to reconnect...":"Keine Verbindung zum insight-Server möglich. Es wird versucht die Verbindung neu aufzubauen...","Can't connect to internet. Please, check your connection.":"Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen.",Complete:"Vollständig",Confirmations:"Bestätigungen",Conn:"Verbindungen","Connections to other nodes":"Verbindungen zu Nodes","Current Blockchain Tip (insight)":"Aktueller Blockchain Tip (insight)","Current Sync Status":"Aktueller Status",Details:"Details",Difficulty:"Schwierigkeit","Double spent attempt detected. From tx:":'Es wurde ein "double Spend" Versuch erkannt.Von tx:',"Error!":"Fehler!",Fee:"Gebühr","Final Balance":"Schlussbilanz","Finish Date":"Fertigstellung","Go to home":"Zur Startseite","Hash Serialized":"Hash Serialisiert",Height:"Höhe","Included in Block":"Eingefügt in Block","Incoherence in levelDB detected:":"Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:","Info Errors":"Fehlerbeschreibung","Initial Block Chain Height":"Ursprüngliche Blockchain Höhe",Input:"Eingänge","Last Block":"Letzter Block","Last Block Hash (Bitcoind)":"Letzter Hash (Bitcoind)","Latest Blocks":"Letzte Blöcke","Latest Transactions":"Letzte Transaktionen","Loading Address Information":"Lade Adressinformationen","Loading Block Information":"Lade Blockinformation","Loading Selected Date...":"Lade gewähltes Datum...","Loading Transaction Details":"Lade Transaktionsdetails","Loading Transactions...":"Lade Transaktionen...","Loading...":"Lade...","Mined Time":"Block gefunden (Mining)","Mined by":"Gefunden von","Mining Difficulty":"Schwierigkeitgrad","Next Block":"Nächster Block","No Inputs (Newly Generated Coins)":"Keine Eingänge (Neu generierte Coins)","No blocks yet.":"Keine Blöcke bisher.","No matching records found!":"Keine passenden Einträge gefunden!","No. Transactions":"Anzahl Transaktionen","Number Of Transactions":"Anzahl der Transaktionen",Output:"Ausgänge","Powered by":"Powered by","Previous Block":"Letzter Block","Protocol version":"Protokollversion","Proxy setting":"Proxyeinstellung","Received Time":"Eingangszeitpunkt","Redirecting...":"Umleitung...","Search for block, transaction or address":"Suche Block, Transaktion oder Adresse","See all blocks":"Alle Blöcke anzeigen","Show Transaction Output data":"Zeige Abgänge","Show all":"Zeige Alles","Show input":"Zeige Eingänge","Show less":"Weniger anzeigen","Show more":"Mehr anzeigen",Size:"Größe","Size (bytes)":"Größe (bytes)","Skipped Blocks (previously synced)":"Verworfene Blöcke (bereits syncronisiert)","Start Date":"Startdatum",Status:"Status",Summary:"Zusammenfassung","Summary confirmed":"Zusammenfassung bestätigt","Sync Progress":"Fortschritt","Sync Status":"Syncronisation","Sync Type":"Art der Syncronisation","Synced Blocks":"Syncronisierte Blöcke",Testnet:"Testnet aktiv","There are no transactions involving this address.":"Es gibt keine Transaktionen zu dieser Adressse","Time Offset":"Zeitoffset zu UTC",Timestamp:"Zeitstempel",Today:"Heute","Total Amount":"Gesamtsumme","Total Received":"Insgesamt empfangen","Total Sent":"Insgesamt gesendet",Transaction:"Transaktion","Transaction Output Set Information":"Transaktions Abgänge","Transaction Outputs":"Abgänge",Transactions:"Transaktionen",Type:"Typ",Unconfirmed:"Unbestätigt","Unconfirmed Transaction!":"Unbestätigte Transaktion!","Unconfirmed Txs Balance":"Unbestätigtes Guthaben","Value Out":"Wert",Version:"Version","Waiting for blocks...":"Warte auf Blöcke...","Waiting for transactions...":"Warte auf Transaktionen...","by date.":"nach Datum.","first seen at":"zuerst gesehen am",mined:"gefunden","mined on:":"vom:","Waiting for blocks":"Warte auf Blöcke"}),gettextCatalog.setStrings("es",{"(Input unconfirmed)":"(Entrada sin confirmar)","404 Page not found :(":"404 Página no encontrada :(",'insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insight es un explorador de bloques de Bitcoin open-source con un completo conjunto de REST y APIs de websockets que pueden ser usadas para escribir monederos de Bitcoins y otras aplicaciones que requieran consultar un explorador de bloques. Obtén el código en el repositorio abierto de Github.','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insight esta en desarrollo aún, por ello agradecemos que nos reporten errores o sugerencias para mejorar el software. Github issue tracker.', -About:"Acerca de",Address:"Dirección",Age:"Edad","Application Status":"Estado de la Aplicación","Best Block":"Mejor Bloque","Bitcoin node information":"Información del nodo Bitcoin",Block:"Bloque","Block Reward":"Bloque Recompensa",Blocks:"Bloques","Bytes Serialized":"Bytes Serializados","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)","Can't connect to insight server. Attempting to reconnect...":"No se pudo conectar al servidor insight. Intentando re-conectar...","Can't connect to internet. Please, check your connection.":"No se pudo conectar a Internet. Por favor, verifique su conexión.",Complete:"Completado",Confirmations:"Confirmaciones",Conn:"Con","Connections to other nodes":"Conexiones a otros nodos","Current Blockchain Tip (insight)":"Actual Blockchain Tip (insight)","Current Sync Status":"Actual Estado de Sincronización",Details:"Detalles",Difficulty:"Dificultad","Double spent attempt detected. From tx:":"Intento de doble gasto detectado. De la transacción:","Error!":"¡Error!",Fee:"Tasa","Final Balance":"Balance Final","Finish Date":"Fecha Final","Go to home":"Volver al Inicio","Hash Serialized":"Hash Serializado",Height:"Altura","Included in Block":"Incluido en el Bloque","Incoherence in levelDB detected:":"Detectada una incoherencia en levelDB:","Info Errors":"Errores de Información","Initial Block Chain Height":"Altura de la Cadena en Bloque Inicial",Input:"Entrada","Last Block":"Último Bloque","Last Block Hash (Bitcoind)":"Último Bloque Hash (Bitcoind)","Latest Blocks":"Últimos Bloques","Latest Transactions":"Últimas Transacciones","Loading Address Information":"Cargando Información de la Dirección","Loading Block Information":"Cargando Información del Bloque","Loading Selected Date...":"Cargando Fecha Seleccionada...","Loading Transaction Details":"Cargando Detalles de la Transacción","Loading Transactions...":"Cargando Transacciones...","Loading...":"Cargando...","Mined Time":"Hora de Minado","Mined by":"Minado por","Mining Difficulty":"Dificultad de Minado","Next Block":"Próximo Bloque","No Inputs (Newly Generated Coins)":"Sin Entradas (Monedas Recién Generadas)","No blocks yet.":"No hay bloques aún.","No matching records found!":"¡No se encontraron registros coincidentes!","No. Transactions":"Nro. de Transacciones","Number Of Transactions":"Número de Transacciones",Output:"Salida","Powered by":"Funciona con","Previous Block":"Bloque Anterior","Protocol version":"Versión del protocolo","Proxy setting":"Opción de proxy","Received Time":"Hora de Recibido","Redirecting...":"Redireccionando...","Search for block, transaction or address":"Buscar bloques, transacciones o direcciones","See all blocks":"Ver todos los bloques","Show Transaction Output data":"Mostrar dato de Salida de la Transacción","Show all":"Mostrar todos","Show input":"Mostrar entrada","Show less":"Ver menos","Show more":"Ver más",Size:"Tamaño","Size (bytes)":"Tamaño (bytes)","Skipped Blocks (previously synced)":"Bloques Saltados (previamente sincronizado)","Start Date":"Fecha de Inicio",Status:"Estado",Summary:"Resumen","Summary confirmed":"Resumen confirmados","Sync Progress":"Proceso de Sincronización","Sync Status":"Estado de Sincronización","Sync Type":"Tipo de Sincronización","Synced Blocks":"Bloques Sincornizados",Testnet:"Red de prueba","There are no transactions involving this address.":"No hay transacciones para esta dirección","Time Offset":"Desplazamiento de hora",Timestamp:"Fecha y hora",Today:"Hoy","Total Amount":"Cantidad Total","Total Received":"Total Recibido","Total Sent":"Total Enviado",Transaction:"Transacción","Transaction Output Set Information":"Información del Conjunto de Salida de la Transacción","Transaction Outputs":"Salidas de la Transacción",Transactions:"Transacciones",Type:"Tipo",Unconfirmed:"Sin confirmar","Unconfirmed Transaction!":"¡Transacción sin confirmar!","Unconfirmed Txs Balance":"Balance sin confirmar","Value Out":"Valor de Salida",Version:"Versión","Waiting for blocks...":"Esperando bloques...","Waiting for transactions...":"Esperando transacciones...","by date.":"por fecha.","first seen at":"Visto a",mined:"minado","mined on:":"minado el:","Waiting for blocks":"Esperando bloques"}),gettextCatalog.setStrings("ja",{"(Input unconfirmed)":"(入力は未検証です)","404 Page not found :(":"404 ページがみつかりません (´・ω・`)",'insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insightは、bitcoind RPCの提供するものよりも詳細なブロックチェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソースコードを確認','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insightは現在開発中です。githubのissueトラッカにてバグの報告や改善案の提案をお願いします。',About:"はじめに",Address:"アドレス",Age:"生成後経過時間","An error occured in the verification process.":"検証過程でエラーが発生しました。","An error occured:
    {{error}}":"エラーが発生しました:
    {{error}}","Application Status":"アプリケーションの状態","Best Block":"最良ブロック","Bitcoin comes with a way of signing arbitrary messages.":"Bitcoinには任意のメッセージを署名する昨日が備わっています。","Bitcoin node information":"Bitcoinノード情報",Block:"ブロック","Block Reward":"ブロック報酬",Blocks:"ブロック","Broadcast Raw Transaction":"生のトランザクションを配信","Bytes Serialized":"シリアライズ後の容量 (バイト)","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませんでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)","Can't connect to insight server. Attempting to reconnect...":"insight サーバに接続できません。再接続しています...","Can't connect to internet. Please, check your connection.":"インターネットに接続できません。コネクションを確認してください。",Complete:"完了",Confirmations:"検証数",Conn:"接続数","Connections to other nodes":"他ノードへの接続","Current Blockchain Tip (insight)":"現在のブロックチェインのTip (insight)","Current Sync Status":"現在の同期状況",Details:"詳細",Difficulty:"難易度","Double spent attempt detected. From tx:":"二重支払い攻撃をこのトランザクションから検知しました:","Error message:":"エラーメッセージ:","Error!":"エラー!",Fee:"手数料","Final Balance":"最終残高","Finish Date":"終了日時","Go to home":"ホームへ","Hash Serialized":"シリアライズデータのハッシュ値",Height:"ブロック高","Included in Block":"取り込まれたブロック","Incoherence in levelDB detected:":"levelDBの破損を検知しました:","Info Errors":"エラー情報","Initial Block Chain Height":"起動時のブロック高",Input:"入力","Last Block":"直前のブロック","Last Block Hash (Bitcoind)":"直前のブロックのハッシュ値 (Bitcoind)","Latest Blocks":"最新のブロック","Latest Transactions":"最新のトランザクション","Loading Address Information":"アドレス情報を読み込んでいます","Loading Block Information":"ブロック情報を読み込んでいます","Loading Selected Date...":"選択されたデータを読み込んでいます...","Loading Transaction Details":"トランザクションの詳細を読み込んでいます","Loading Transactions...":"トランザクションを読み込んでいます...","Loading...":"ロード中...",Message:"メッセージ","Mined Time":"採掘時刻","Mined by":"採掘者","Mining Difficulty":"採掘難易度","Next Block":"次のブロック","No Inputs (Newly Generated Coins)":"入力なし (新しく生成されたコイン)","No blocks yet.":"ブロックはありません。","No matching records found!":"一致するレコードはありません!","No. Transactions":"トランザクション数","Number Of Transactions":"トランザクション数",Output:"出力","Powered by":"Powered by","Previous Block":"前のブロック","Protocol version":"プロトコルバージョン","Proxy setting":"プロキシ設定","Raw transaction data":"トランザクションの生データ","Raw transaction data must be a valid hexadecimal string.":"生のトランザクションデータは有効な16進数でなければいけません。","Received Time":"受信時刻","Redirecting...":"リダイレクトしています...","Search for block, transaction or address":"ブロック、トランザクション、アドレスを検索","See all blocks":"すべてのブロックをみる","Send transaction":"トランザクションを送信","Show Transaction Output data":"トランザクションの出力データをみる","Show all":"すべて表示","Show input":"入力を表示","Show less":"隠す","Show more":"表示する",Signature:"署名",Size:"サイズ","Size (bytes)":"サイズ (バイト)","Skipped Blocks (previously synced)":"スキップされたブロック (同期済み)","Start Date":"開始日時",Status:"ステータス",Summary:"概要","Summary confirmed":"サマリ 検証済み","Sync Progress":"同期の進捗状況","Sync Status":"同期ステータス","Sync Type":"同期タイプ","Synced Blocks":"同期されたブロック数",Testnet:"テストネット","The message failed to verify.":"メッセージの検証に失敗しました。","The message is verifiably from {{verification.address}}.":"メッセージは{{verification.address}}により検証されました。","There are no transactions involving this address.":"このアドレスに対するトランザクションはありません。","This form can be used to broadcast a raw transaction in hex format over\n the Bitcoin network.":"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワーク上に配信することができます。","This form can be used to verify that a message comes from\n a specific Bitcoin address.":"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証することができます。","Time Offset":"時間オフセット",Timestamp:"タイムスタンプ",Today:"今日","Total Amount":"Bitcoin総量","Total Received":"総入金額","Total Sent":"総送金額",Transaction:"トランザクション","Transaction Output Set Information":"トランザクションの出力セット情報","Transaction Outputs":"トランザクションの出力","Transaction succesfully broadcast.
    Transaction id: {{txid}}":"トランザクションの配信に成功しました。
    トランザクションID: {{txid}}",Transactions:"トランザクション",Type:"タイプ",Unconfirmed:"未検証","Unconfirmed Transaction!":"未検証のトランザクションです!","Unconfirmed Txs Balance":"未検証トランザクションの残高","Value Out":"出力値",Verify:"検証","Verify signed message":"署名済みメッセージを検証",Version:"バージョン","Waiting for blocks...":"ブロックを待っています...","Waiting for transactions...":"トランザクションを待っています...","by date.":"日毎。","first seen at":"最初に発見された日時",mined:"採掘された","mined on:":"採掘日時:","(Mainchain)":"(メインチェーン)","(Orphaned)":"(孤立したブロック)",Bits:"Bits","Block #{{block.height}}":"ブロック #{{block.height}}",BlockHash:"ブロックのハッシュ値","Blocks
    mined on:":"ブロック
    採掘日",Coinbase:"コインベース",Hash:"ハッシュ値",LockTime:"ロック時間","Merkle Root":"Merkleルート",Nonce:"Nonce","Ooops!":"おぉっと!","Output is spent":"出力は使用済みです","Output is unspent":"出力は未使用です",Scan:"スキャン","Show/Hide items details":"アイテムの詳細を表示または隠す","Waiting for blocks":"ブロックを待っています","by date. {{detail}} {{before}}":"日時順 {{detail}} {{before}}",scriptSig:"scriptSig","{{tx.confirmations}} Confirmations":"{{tx.confirmations}} 検証",' (Orphaned)':' (孤立したブロック)',' Incoherence in levelDB detected: {{vin.dbError}}':' Incoherence in levelDB detected: {{vin.dbError}}','Waiting for blocks ':'ブロックを待っています '})}]); \ No newline at end of file diff --git a/public/js/vendors.min.js b/public/js/vendors.min.js deleted file mode 100644 index e9d6fb7..0000000 --- a/public/js/vendors.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! insight-ui 0.4.0 */ -function ECB(count,dataCodewords){this.count=count,this.dataCodewords=dataCodewords,this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("DataCodewords",function(){return this.dataCodewords})}function ECBlocks(ecCodewordsPerBlock,ecBlocks1,ecBlocks2){this.ecCodewordsPerBlock=ecCodewordsPerBlock,ecBlocks2?this.ecBlocks=new Array(ecBlocks1,ecBlocks2):this.ecBlocks=new Array(ecBlocks1),this.__defineGetter__("ECCodewordsPerBlock",function(){return this.ecCodewordsPerBlock}),this.__defineGetter__("TotalECCodewords",function(){return this.ecCodewordsPerBlock*this.NumBlocks}),this.__defineGetter__("NumBlocks",function(){for(var total=0,i=0;ix;x++)for(var i=this.alignmentPatternCenters[x]-2,y=0;max>y;y++)0==x&&(0==y||y==max-1)||x==max-1&&0==y||bitMatrix.setRegion(this.alignmentPatternCenters[y]-2,i,5,5);return bitMatrix.setRegion(6,9,1,dimension-17),bitMatrix.setRegion(9,6,dimension-17,1),this.versionNumber>6&&(bitMatrix.setRegion(dimension-11,0,3,6),bitMatrix.setRegion(0,dimension-11,6,3)),bitMatrix},this.getECBlocksForLevel=function(ecLevel){return this.ecBlocks[ecLevel.ordinal()]}}function buildVersions(){return new Array(new Version(1,new Array,new ECBlocks(7,new ECB(1,19)),new ECBlocks(10,new ECB(1,16)),new ECBlocks(13,new ECB(1,13)),new ECBlocks(17,new ECB(1,9))),new Version(2,new Array(6,18),new ECBlocks(10,new ECB(1,34)),new ECBlocks(16,new ECB(1,28)),new ECBlocks(22,new ECB(1,22)),new ECBlocks(28,new ECB(1,16))),new Version(3,new Array(6,22),new ECBlocks(15,new ECB(1,55)),new ECBlocks(26,new ECB(1,44)),new ECBlocks(18,new ECB(2,17)),new ECBlocks(22,new ECB(2,13))),new Version(4,new Array(6,26),new ECBlocks(20,new ECB(1,80)),new ECBlocks(18,new ECB(2,32)),new ECBlocks(26,new ECB(2,24)),new ECBlocks(16,new ECB(4,9))),new Version(5,new Array(6,30),new ECBlocks(26,new ECB(1,108)),new ECBlocks(24,new ECB(2,43)),new ECBlocks(18,new ECB(2,15),new ECB(2,16)),new ECBlocks(22,new ECB(2,11),new ECB(2,12))),new Version(6,new Array(6,34),new ECBlocks(18,new ECB(2,68)),new ECBlocks(16,new ECB(4,27)),new ECBlocks(24,new ECB(4,19)),new ECBlocks(28,new ECB(4,15))),new Version(7,new Array(6,22,38),new ECBlocks(20,new ECB(2,78)),new ECBlocks(18,new ECB(4,31)),new ECBlocks(18,new ECB(2,14),new ECB(4,15)),new ECBlocks(26,new ECB(4,13),new ECB(1,14))),new Version(8,new Array(6,24,42),new ECBlocks(24,new ECB(2,97)),new ECBlocks(22,new ECB(2,38),new ECB(2,39)),new ECBlocks(22,new ECB(4,18),new ECB(2,19)),new ECBlocks(26,new ECB(4,14),new ECB(2,15))),new Version(9,new Array(6,26,46),new ECBlocks(30,new ECB(2,116)),new ECBlocks(22,new ECB(3,36),new ECB(2,37)),new ECBlocks(20,new ECB(4,16),new ECB(4,17)),new ECBlocks(24,new ECB(4,12),new ECB(4,13))),new Version(10,new Array(6,28,50),new ECBlocks(18,new ECB(2,68),new ECB(2,69)),new ECBlocks(26,new ECB(4,43),new ECB(1,44)),new ECBlocks(24,new ECB(6,19),new ECB(2,20)),new ECBlocks(28,new ECB(6,15),new ECB(2,16))),new Version(11,new Array(6,30,54),new ECBlocks(20,new ECB(4,81)),new ECBlocks(30,new ECB(1,50),new ECB(4,51)),new ECBlocks(28,new ECB(4,22),new ECB(4,23)),new ECBlocks(24,new ECB(3,12),new ECB(8,13))),new Version(12,new Array(6,32,58),new ECBlocks(24,new ECB(2,92),new ECB(2,93)),new ECBlocks(22,new ECB(6,36),new ECB(2,37)),new ECBlocks(26,new ECB(4,20),new ECB(6,21)),new ECBlocks(28,new ECB(7,14),new ECB(4,15))),new Version(13,new Array(6,34,62),new ECBlocks(26,new ECB(4,107)),new ECBlocks(22,new ECB(8,37),new ECB(1,38)),new ECBlocks(24,new ECB(8,20),new ECB(4,21)),new ECBlocks(22,new ECB(12,11),new ECB(4,12))),new Version(14,new Array(6,26,46,66),new ECBlocks(30,new ECB(3,115),new ECB(1,116)),new ECBlocks(24,new ECB(4,40),new ECB(5,41)),new ECBlocks(20,new ECB(11,16),new ECB(5,17)),new ECBlocks(24,new ECB(11,12),new ECB(5,13))),new Version(15,new Array(6,26,48,70),new ECBlocks(22,new ECB(5,87),new ECB(1,88)),new ECBlocks(24,new ECB(5,41),new ECB(5,42)),new ECBlocks(30,new ECB(5,24),new ECB(7,25)),new ECBlocks(24,new ECB(11,12),new ECB(7,13))),new Version(16,new Array(6,26,50,74),new ECBlocks(24,new ECB(5,98),new ECB(1,99)),new ECBlocks(28,new ECB(7,45),new ECB(3,46)),new ECBlocks(24,new ECB(15,19),new ECB(2,20)),new ECBlocks(30,new ECB(3,15),new ECB(13,16))),new Version(17,new Array(6,30,54,78),new ECBlocks(28,new ECB(1,107),new ECB(5,108)),new ECBlocks(28,new ECB(10,46),new ECB(1,47)),new ECBlocks(28,new ECB(1,22),new ECB(15,23)),new ECBlocks(28,new ECB(2,14),new ECB(17,15))),new Version(18,new Array(6,30,56,82),new ECBlocks(30,new ECB(5,120),new ECB(1,121)),new ECBlocks(26,new ECB(9,43),new ECB(4,44)),new ECBlocks(28,new ECB(17,22),new ECB(1,23)),new ECBlocks(28,new ECB(2,14),new ECB(19,15))),new Version(19,new Array(6,30,58,86),new ECBlocks(28,new ECB(3,113),new ECB(4,114)),new ECBlocks(26,new ECB(3,44),new ECB(11,45)),new ECBlocks(26,new ECB(17,21),new ECB(4,22)),new ECBlocks(26,new ECB(9,13),new ECB(16,14))),new Version(20,new Array(6,34,62,90),new ECBlocks(28,new ECB(3,107),new ECB(5,108)),new ECBlocks(26,new ECB(3,41),new ECB(13,42)),new ECBlocks(30,new ECB(15,24),new ECB(5,25)),new ECBlocks(28,new ECB(15,15),new ECB(10,16))),new Version(21,new Array(6,28,50,72,94),new ECBlocks(28,new ECB(4,116),new ECB(4,117)),new ECBlocks(26,new ECB(17,42)),new ECBlocks(28,new ECB(17,22),new ECB(6,23)),new ECBlocks(30,new ECB(19,16),new ECB(6,17))),new Version(22,new Array(6,26,50,74,98),new ECBlocks(28,new ECB(2,111),new ECB(7,112)),new ECBlocks(28,new ECB(17,46)),new ECBlocks(30,new ECB(7,24),new ECB(16,25)),new ECBlocks(24,new ECB(34,13))),new Version(23,new Array(6,30,54,74,102),new ECBlocks(30,new ECB(4,121),new ECB(5,122)),new ECBlocks(28,new ECB(4,47),new ECB(14,48)),new ECBlocks(30,new ECB(11,24),new ECB(14,25)),new ECBlocks(30,new ECB(16,15),new ECB(14,16))),new Version(24,new Array(6,28,54,80,106),new ECBlocks(30,new ECB(6,117),new ECB(4,118)),new ECBlocks(28,new ECB(6,45),new ECB(14,46)),new ECBlocks(30,new ECB(11,24),new ECB(16,25)),new ECBlocks(30,new ECB(30,16),new ECB(2,17))),new Version(25,new Array(6,32,58,84,110),new ECBlocks(26,new ECB(8,106),new ECB(4,107)),new ECBlocks(28,new ECB(8,47),new ECB(13,48)),new ECBlocks(30,new ECB(7,24),new ECB(22,25)),new ECBlocks(30,new ECB(22,15),new ECB(13,16))),new Version(26,new Array(6,30,58,86,114),new ECBlocks(28,new ECB(10,114),new ECB(2,115)),new ECBlocks(28,new ECB(19,46),new ECB(4,47)),new ECBlocks(28,new ECB(28,22),new ECB(6,23)),new ECBlocks(30,new ECB(33,16),new ECB(4,17))),new Version(27,new Array(6,34,62,90,118),new ECBlocks(30,new ECB(8,122),new ECB(4,123)),new ECBlocks(28,new ECB(22,45),new ECB(3,46)),new ECBlocks(30,new ECB(8,23),new ECB(26,24)),new ECBlocks(30,new ECB(12,15),new ECB(28,16))),new Version(28,new Array(6,26,50,74,98,122),new ECBlocks(30,new ECB(3,117),new ECB(10,118)),new ECBlocks(28,new ECB(3,45),new ECB(23,46)),new ECBlocks(30,new ECB(4,24),new ECB(31,25)),new ECBlocks(30,new ECB(11,15),new ECB(31,16))),new Version(29,new Array(6,30,54,78,102,126),new ECBlocks(30,new ECB(7,116),new ECB(7,117)),new ECBlocks(28,new ECB(21,45),new ECB(7,46)),new ECBlocks(30,new ECB(1,23),new ECB(37,24)),new ECBlocks(30,new ECB(19,15),new ECB(26,16))),new Version(30,new Array(6,26,52,78,104,130),new ECBlocks(30,new ECB(5,115),new ECB(10,116)),new ECBlocks(28,new ECB(19,47),new ECB(10,48)),new ECBlocks(30,new ECB(15,24),new ECB(25,25)),new ECBlocks(30,new ECB(23,15),new ECB(25,16))),new Version(31,new Array(6,30,56,82,108,134),new ECBlocks(30,new ECB(13,115),new ECB(3,116)),new ECBlocks(28,new ECB(2,46),new ECB(29,47)),new ECBlocks(30,new ECB(42,24),new ECB(1,25)),new ECBlocks(30,new ECB(23,15),new ECB(28,16))),new Version(32,new Array(6,34,60,86,112,138),new ECBlocks(30,new ECB(17,115)),new ECBlocks(28,new ECB(10,46),new ECB(23,47)),new ECBlocks(30,new ECB(10,24),new ECB(35,25)),new ECBlocks(30,new ECB(19,15),new ECB(35,16))),new Version(33,new Array(6,30,58,86,114,142),new ECBlocks(30,new ECB(17,115),new ECB(1,116)),new ECBlocks(28,new ECB(14,46),new ECB(21,47)),new ECBlocks(30,new ECB(29,24),new ECB(19,25)),new ECBlocks(30,new ECB(11,15),new ECB(46,16))),new Version(34,new Array(6,34,62,90,118,146),new ECBlocks(30,new ECB(13,115),new ECB(6,116)),new ECBlocks(28,new ECB(14,46),new ECB(23,47)),new ECBlocks(30,new ECB(44,24),new ECB(7,25)),new ECBlocks(30,new ECB(59,16),new ECB(1,17))),new Version(35,new Array(6,30,54,78,102,126,150),new ECBlocks(30,new ECB(12,121),new ECB(7,122)),new ECBlocks(28,new ECB(12,47),new ECB(26,48)),new ECBlocks(30,new ECB(39,24),new ECB(14,25)),new ECBlocks(30,new ECB(22,15),new ECB(41,16))),new Version(36,new Array(6,24,50,76,102,128,154),new ECBlocks(30,new ECB(6,121),new ECB(14,122)),new ECBlocks(28,new ECB(6,47),new ECB(34,48)),new ECBlocks(30,new ECB(46,24),new ECB(10,25)),new ECBlocks(30,new ECB(2,15),new ECB(64,16))),new Version(37,new Array(6,28,54,80,106,132,158),new ECBlocks(30,new ECB(17,122),new ECB(4,123)),new ECBlocks(28,new ECB(29,46),new ECB(14,47)),new ECBlocks(30,new ECB(49,24),new ECB(10,25)),new ECBlocks(30,new ECB(24,15),new ECB(46,16))),new Version(38,new Array(6,32,58,84,110,136,162),new ECBlocks(30,new ECB(4,122),new ECB(18,123)),new ECBlocks(28,new ECB(13,46),new ECB(32,47)),new ECBlocks(30,new ECB(48,24),new ECB(14,25)),new ECBlocks(30,new ECB(42,15),new ECB(32,16))),new Version(39,new Array(6,26,54,82,110,138,166),new ECBlocks(30,new ECB(20,117),new ECB(4,118)),new ECBlocks(28,new ECB(40,47),new ECB(7,48)),new ECBlocks(30,new ECB(43,24),new ECB(22,25)),new ECBlocks(30,new ECB(10,15),new ECB(67,16))),new Version(40,new Array(6,30,58,86,114,142,170),new ECBlocks(30,new ECB(19,118),new ECB(6,119)),new ECBlocks(28,new ECB(18,47),new ECB(31,48)),new ECBlocks(30,new ECB(34,24),new ECB(34,25)),new ECBlocks(30,new ECB(20,15),new ECB(61,16))))}function PerspectiveTransform(a11,a21,a31,a12,a22,a32,a13,a23,a33){this.a11=a11,this.a12=a12,this.a13=a13,this.a21=a21,this.a22=a22,this.a23=a23,this.a31=a31,this.a32=a32,this.a33=a33,this.transformPoints1=function(points){for(var max=points.length,a11=this.a11,a12=this.a12,a13=this.a13,a21=this.a21,a22=this.a22,a23=this.a23,a31=this.a31,a32=this.a32,a33=this.a33,i=0;max>i;i+=2){var x=points[i],y=points[i+1],denominator=a13*x+a23*y+a33;points[i]=(a11*x+a21*y+a31)/denominator,points[i+1]=(a12*x+a22*y+a32)/denominator}},this.transformPoints2=function(xValues,yValues){for(var n=xValues.length,i=0;n>i;i++){var x=xValues[i],y=yValues[i],denominator=this.a13*x+this.a23*y+this.a33;xValues[i]=(this.a11*x+this.a21*y+this.a31)/denominator,yValues[i]=(this.a12*x+this.a22*y+this.a32)/denominator}},this.buildAdjoint=function(){return new PerspectiveTransform(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)},this.times=function(other){return new PerspectiveTransform(this.a11*other.a11+this.a21*other.a12+this.a31*other.a13,this.a11*other.a21+this.a21*other.a22+this.a31*other.a23,this.a11*other.a31+this.a21*other.a32+this.a31*other.a33,this.a12*other.a11+this.a22*other.a12+this.a32*other.a13,this.a12*other.a21+this.a22*other.a22+this.a32*other.a23,this.a12*other.a31+this.a22*other.a32+this.a32*other.a33,this.a13*other.a11+this.a23*other.a12+this.a33*other.a13,this.a13*other.a21+this.a23*other.a22+this.a33*other.a23,this.a13*other.a31+this.a23*other.a32+this.a33*other.a33)}}function DetectorResult(bits,points){this.bits=bits,this.points=points}function Detector(image){this.image=image,this.resultPointCallback=null,this.sizeOfBlackWhiteBlackRun=function(fromX,fromY,toX,toY){var steep=Math.abs(toY-fromY)>Math.abs(toX-fromX);if(steep){var temp=fromX;fromX=fromY,fromY=temp,temp=toX,toX=toY,toY=temp}for(var dx=Math.abs(toX-fromX),dy=Math.abs(toY-fromY),error=-dx>>1,ystep=toY>fromY?1:-1,xstep=toX>fromX?1:-1,state=0,x=fromX,y=fromY;x!=toX;x+=xstep){var realX=steep?y:x,realY=steep?x:y;if(1==state?this.image[realX+realY*qrcode.width]&&state++:this.image[realX+realY*qrcode.width]||state++,3==state){var diffX=x-fromX,diffY=y-fromY;return Math.sqrt(diffX*diffX+diffY*diffY)}if(error+=dy,error>0){if(y==toY)break;y+=ystep,error-=dx}}var diffX2=toX-fromX,diffY2=toY-fromY;return Math.sqrt(diffX2*diffX2+diffY2*diffY2)},this.sizeOfBlackWhiteBlackRunBothWays=function(fromX,fromY,toX,toY){var result=this.sizeOfBlackWhiteBlackRun(fromX,fromY,toX,toY),scale=1,otherToX=fromX-(toX-fromX);0>otherToX?(scale=fromX/(fromX-otherToX),otherToX=0):otherToX>=qrcode.width&&(scale=(qrcode.width-1-fromX)/(otherToX-fromX),otherToX=qrcode.width-1);var otherToY=Math.floor(fromY-(toY-fromY)*scale);return scale=1,0>otherToY?(scale=fromY/(fromY-otherToY),otherToY=0):otherToY>=qrcode.height&&(scale=(qrcode.height-1-fromY)/(otherToY-fromY),otherToY=qrcode.height-1),otherToX=Math.floor(fromX+(otherToX-fromX)*scale),result+=this.sizeOfBlackWhiteBlackRun(fromX,fromY,otherToX,otherToY),result-1},this.calculateModuleSizeOneWay=function(pattern,otherPattern){var moduleSizeEst1=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(pattern.X),Math.floor(pattern.Y),Math.floor(otherPattern.X),Math.floor(otherPattern.Y)),moduleSizeEst2=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(otherPattern.X),Math.floor(otherPattern.Y),Math.floor(pattern.X),Math.floor(pattern.Y));return isNaN(moduleSizeEst1)?moduleSizeEst2/7:isNaN(moduleSizeEst2)?moduleSizeEst1/7:(moduleSizeEst1+moduleSizeEst2)/14},this.calculateModuleSize=function(topLeft,topRight,bottomLeft){return(this.calculateModuleSizeOneWay(topLeft,topRight)+this.calculateModuleSizeOneWay(topLeft,bottomLeft))/2},this.distance=function(pattern1,pattern2){return xDiff=pattern1.X-pattern2.X,yDiff=pattern1.Y-pattern2.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)},this.computeDimension=function(topLeft,topRight,bottomLeft,moduleSize){var tltrCentersDimension=Math.round(this.distance(topLeft,topRight)/moduleSize),tlblCentersDimension=Math.round(this.distance(topLeft,bottomLeft)/moduleSize),dimension=(tltrCentersDimension+tlblCentersDimension>>1)+7;switch(3&dimension){case 0:dimension++;break;case 2:dimension--;break;case 3:throw"Error"}return dimension},this.findAlignmentInRegion=function(overallEstModuleSize,estAlignmentX,estAlignmentY,allowanceFactor){var allowance=Math.floor(allowanceFactor*overallEstModuleSize),alignmentAreaLeftX=Math.max(0,estAlignmentX-allowance),alignmentAreaRightX=Math.min(qrcode.width-1,estAlignmentX+allowance);if(3*overallEstModuleSize>alignmentAreaRightX-alignmentAreaLeftX)throw"Error";var alignmentAreaTopY=Math.max(0,estAlignmentY-allowance),alignmentAreaBottomY=Math.min(qrcode.height-1,estAlignmentY+allowance),alignmentFinder=new AlignmentPatternFinder(this.image,alignmentAreaLeftX,alignmentAreaTopY,alignmentAreaRightX-alignmentAreaLeftX,alignmentAreaBottomY-alignmentAreaTopY,overallEstModuleSize,this.resultPointCallback);return alignmentFinder.find()},this.createTransform=function(topLeft,topRight,bottomLeft,alignmentPattern,dimension){var bottomRightX,bottomRightY,sourceBottomRightX,sourceBottomRightY,dimMinusThree=dimension-3.5;null!=alignmentPattern?(bottomRightX=alignmentPattern.X,bottomRightY=alignmentPattern.Y,sourceBottomRightX=sourceBottomRightY=dimMinusThree-3):(bottomRightX=topRight.X-topLeft.X+bottomLeft.X,bottomRightY=topRight.Y-topLeft.Y+bottomLeft.Y,sourceBottomRightX=sourceBottomRightY=dimMinusThree);var transform=PerspectiveTransform.quadrilateralToQuadrilateral(3.5,3.5,dimMinusThree,3.5,sourceBottomRightX,sourceBottomRightY,3.5,dimMinusThree,topLeft.X,topLeft.Y,topRight.X,topRight.Y,bottomRightX,bottomRightY,bottomLeft.X,bottomLeft.Y);return transform},this.sampleGrid=function(image,transform,dimension){var sampler=GridSampler;return sampler.sampleGrid3(image,dimension,transform)},this.processFinderPatternInfo=function(info){var topLeft=info.TopLeft,topRight=info.TopRight,bottomLeft=info.BottomLeft,moduleSize=this.calculateModuleSize(topLeft,topRight,bottomLeft);if(1>moduleSize)throw"Error";var dimension=this.computeDimension(topLeft,topRight,bottomLeft,moduleSize),provisionalVersion=Version.getProvisionalVersionForDimension(dimension),modulesBetweenFPCenters=provisionalVersion.DimensionForVersion-7,alignmentPattern=null;if(provisionalVersion.AlignmentPatternCenters.length>0)for(var bottomRightX=topRight.X-topLeft.X+bottomLeft.X,bottomRightY=topRight.Y-topLeft.Y+bottomLeft.Y,correctionToTopLeft=1-3/modulesBetweenFPCenters,estAlignmentX=Math.floor(topLeft.X+correctionToTopLeft*(bottomRightX-topLeft.X)),estAlignmentY=Math.floor(topLeft.Y+correctionToTopLeft*(bottomRightY-topLeft.Y)),i=4;16>=i;i<<=1){alignmentPattern=this.findAlignmentInRegion(moduleSize,estAlignmentX,estAlignmentY,i);break}var points,transform=this.createTransform(topLeft,topRight,bottomLeft,alignmentPattern,dimension),bits=this.sampleGrid(this.image,transform,dimension);return points=null==alignmentPattern?new Array(bottomLeft,topLeft,topRight):new Array(bottomLeft,topLeft,topRight,alignmentPattern),new DetectorResult(bits,points)},this.detect=function(){var info=(new FinderPatternFinder).findFinderPattern(this.image);return this.processFinderPatternInfo(info)}}function FormatInformation(formatInfo){this.errorCorrectionLevel=ErrorCorrectionLevel.forBits(formatInfo>>3&3),this.dataMask=7&formatInfo,this.__defineGetter__("ErrorCorrectionLevel",function(){return this.errorCorrectionLevel}),this.__defineGetter__("DataMask",function(){return this.dataMask}),this.GetHashCode=function(){return this.errorCorrectionLevel.ordinal()<<3|dataMask},this.Equals=function(o){var other=o;return this.errorCorrectionLevel==other.errorCorrectionLevel&&this.dataMask==other.dataMask}}function ErrorCorrectionLevel(ordinal,bits,name){this.ordinal_Renamed_Field=ordinal,this.bits=bits,this.name=name,this.__defineGetter__("Bits",function(){return this.bits}),this.__defineGetter__("Name",function(){return this.name}),this.ordinal=function(){return this.ordinal_Renamed_Field}}function BitMatrix(width,height){if(height||(height=width),1>width||1>height)throw"Both dimensions must be greater than 0";this.width=width,this.height=height;var rowSize=width>>5;0!=(31&width)&&rowSize++,this.rowSize=rowSize,this.bits=new Array(rowSize*height);for(var i=0;i>5);return 0!=(1&URShift(this.bits[offset],31&x))},this.set_Renamed=function(x,y){var offset=y*this.rowSize+(x>>5);this.bits[offset]|=1<<(31&x)},this.flip=function(x,y){var offset=y*this.rowSize+(x>>5);this.bits[offset]^=1<<(31&x)},this.clear=function(){for(var max=this.bits.length,i=0;max>i;i++)this.bits[i]=0},this.setRegion=function(left,top,width,height){if(0>top||0>left)throw"Left and top must be nonnegative";if(1>height||1>width)throw"Height and width must be at least 1";var right=left+width,bottom=top+height;if(bottom>this.height||right>this.width)throw"The region must fit inside the matrix";for(var y=top;bottom>y;y++)for(var offset=y*this.rowSize,x=left;right>x;x++)this.bits[offset+(x>>5)]|=1<<(31&x)}}function DataBlock(numDataCodewords,codewords){this.numDataCodewords=numDataCodewords,this.codewords=codewords,this.__defineGetter__("NumDataCodewords",function(){return this.numDataCodewords}),this.__defineGetter__("Codewords",function(){return this.codewords})}function BitMatrixParser(bitMatrix){var dimension=bitMatrix.Dimension;if(21>dimension||1!=(3&dimension))throw"Error BitMatrixParser";this.bitMatrix=bitMatrix,this.parsedVersion=null,this.parsedFormatInfo=null,this.copyBit=function(i,j,versionBits){return this.bitMatrix.get_Renamed(i,j)?versionBits<<1|1:versionBits<<1},this.readFormatInformation=function(){if(null!=this.parsedFormatInfo)return this.parsedFormatInfo;for(var formatInfoBits=0,i=0;6>i;i++)formatInfoBits=this.copyBit(i,8,formatInfoBits);formatInfoBits=this.copyBit(7,8,formatInfoBits),formatInfoBits=this.copyBit(8,8,formatInfoBits),formatInfoBits=this.copyBit(8,7,formatInfoBits);for(var j=5;j>=0;j--)formatInfoBits=this.copyBit(8,j,formatInfoBits);if(this.parsedFormatInfo=FormatInformation.decodeFormatInformation(formatInfoBits),null!=this.parsedFormatInfo)return this.parsedFormatInfo;var dimension=this.bitMatrix.Dimension;formatInfoBits=0;for(var iMin=dimension-8,i=dimension-1;i>=iMin;i--)formatInfoBits=this.copyBit(i,8,formatInfoBits);for(var j=dimension-7;dimension>j;j++)formatInfoBits=this.copyBit(8,j,formatInfoBits);if(this.parsedFormatInfo=FormatInformation.decodeFormatInformation(formatInfoBits),null!=this.parsedFormatInfo)return this.parsedFormatInfo;throw"Error readFormatInformation"},this.readVersion=function(){if(null!=this.parsedVersion)return this.parsedVersion;var dimension=this.bitMatrix.Dimension,provisionalVersion=dimension-17>>2;if(6>=provisionalVersion)return Version.getVersionForNumber(provisionalVersion);for(var versionBits=0,ijMin=dimension-11,j=5;j>=0;j--)for(var i=dimension-9;i>=ijMin;i--)versionBits=this.copyBit(i,j,versionBits);if(this.parsedVersion=Version.decodeVersionInformation(versionBits),null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==dimension)return this.parsedVersion;versionBits=0;for(var i=5;i>=0;i--)for(var j=dimension-9;j>=ijMin;j--)versionBits=this.copyBit(i,j,versionBits);if(this.parsedVersion=Version.decodeVersionInformation(versionBits),null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==dimension)return this.parsedVersion;throw"Error readVersion"},this.readCodewords=function(){var formatInfo=this.readFormatInformation(),version=this.readVersion(),dataMask=DataMask.forReference(formatInfo.DataMask),dimension=this.bitMatrix.Dimension;dataMask.unmaskBitMatrix(this.bitMatrix,dimension);for(var functionPattern=version.buildFunctionPattern(),readingUp=!0,result=new Array(version.TotalCodewords),resultOffset=0,currentByte=0,bitsRead=0,j=dimension-1;j>0;j-=2){6==j&&j--;for(var count=0;dimension>count;count++)for(var i=readingUp?dimension-1-count:count,col=0;2>col;col++)functionPattern.get_Renamed(j-col,i)||(bitsRead++,currentByte<<=1,this.bitMatrix.get_Renamed(j-col,i)&&(currentByte|=1),8==bitsRead&&(result[resultOffset++]=currentByte,bitsRead=0,currentByte=0));readingUp^=!0}if(resultOffset!=version.TotalCodewords)throw"Error readCodewords";return result}}function DataMask000(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(i+j&1)}}function DataMask001(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(1&i)}}function DataMask010(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return j%3==0}}function DataMask011(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return(i+j)%3==0}}function DataMask100(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(URShift(i,1)+j/3&1)}}function DataMask101(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){var temp=i*j;return(1&temp)+temp%3==0}}function DataMask110(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){var temp=i*j;return 0==((1&temp)+temp%3&1)}}function DataMask111(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==((i+j&1)+i*j%3&1)}}function ReedSolomonDecoder(field){this.field=field,this.decode=function(received,twoS){for(var poly=new GF256Poly(this.field,received),syndromeCoefficients=new Array(twoS),i=0;ii;i++){var eval=poly.evaluateAt(this.field.exp(dataMatrix?i+1:i));syndromeCoefficients[syndromeCoefficients.length-1-i]=eval,0!=eval&&(noError=!1)}if(!noError)for(var syndrome=new GF256Poly(this.field,syndromeCoefficients),sigmaOmega=this.runEuclideanAlgorithm(this.field.buildMonomial(twoS,1),syndrome,twoS),sigma=sigmaOmega[0],omega=sigmaOmega[1],errorLocations=this.findErrorLocations(sigma),errorMagnitudes=this.findErrorMagnitudes(omega,errorLocations,dataMatrix),i=0;iposition)throw"ReedSolomonException Bad error location";received[position]=GF256.addOrSubtract(received[position],errorMagnitudes[i])}},this.runEuclideanAlgorithm=function(a,b,R){if(a.Degree=Math.floor(R/2);){var rLastLast=rLast,sLastLast=sLast,tLastLast=tLast;if(rLast=r,sLast=s,tLast=t,rLast.Zero)throw"r_{i-1} was zero";r=rLastLast;for(var q=this.field.Zero,denominatorLeadingTerm=rLast.getCoefficient(rLast.Degree),dltInverse=this.field.inverse(denominatorLeadingTerm);r.Degree>=rLast.Degree&&!r.Zero;){var degreeDiff=r.Degree-rLast.Degree,scale=this.field.multiply(r.getCoefficient(r.Degree),dltInverse);q=q.addOrSubtract(this.field.buildMonomial(degreeDiff,scale)),r=r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff,scale))}s=q.multiply1(sLast).addOrSubtract(sLastLast),t=q.multiply1(tLast).addOrSubtract(tLastLast)}var sigmaTildeAtZero=t.getCoefficient(0);if(0==sigmaTildeAtZero)throw"ReedSolomonException sigmaTilde(0) was zero";var inverse=this.field.inverse(sigmaTildeAtZero),sigma=t.multiply2(inverse),omega=r.multiply2(inverse);return new Array(sigma,omega)},this.findErrorLocations=function(errorLocator){var numErrors=errorLocator.Degree;if(1==numErrors)return new Array(errorLocator.getCoefficient(1));for(var result=new Array(numErrors),e=0,i=1;256>i&&numErrors>e;i++)0==errorLocator.evaluateAt(i)&&(result[e]=this.field.inverse(i),e++);if(e!=numErrors)throw"Error locator degree does not match number of roots";return result},this.findErrorMagnitudes=function(errorEvaluator,errorLocations,dataMatrix){for(var s=errorLocations.length,result=new Array(s),i=0;s>i;i++){for(var xiInverse=this.field.inverse(errorLocations[i]),denominator=1,j=0;s>j;j++)i!=j&&(denominator=this.field.multiply(denominator,GF256.addOrSubtract(1,this.field.multiply(errorLocations[j],xiInverse))));result[i]=this.field.multiply(errorEvaluator.evaluateAt(xiInverse),this.field.inverse(denominator)),dataMatrix&&(result[i]=this.field.multiply(result[i],xiInverse))}return result}}function GF256Poly(field,coefficients){if(null==coefficients||0==coefficients.length)throw"System.ArgumentException";this.field=field;var coefficientsLength=coefficients.length;if(coefficientsLength>1&&0==coefficients[0]){for(var firstNonZero=1;coefficientsLength>firstNonZero&&0==coefficients[firstNonZero];)firstNonZero++;if(firstNonZero==coefficientsLength)this.coefficients=field.Zero.coefficients;else{this.coefficients=new Array(coefficientsLength-firstNonZero);for(var i=0;ii;i++)result=GF256.addOrSubtract(result,this.coefficients[i]);return result}for(var result2=this.coefficients[0],i=1;size>i;i++)result2=GF256.addOrSubtract(this.field.multiply(a,result2),this.coefficients[i]);return result2},this.addOrSubtract=function(other){if(this.field!=other.field)throw"GF256Polys do not have same GF256 field";if(this.Zero)return other;if(other.Zero)return this;var smallerCoefficients=this.coefficients,largerCoefficients=other.coefficients;if(smallerCoefficients.length>largerCoefficients.length){var temp=smallerCoefficients;smallerCoefficients=largerCoefficients,largerCoefficients=temp}for(var sumDiff=new Array(largerCoefficients.length),lengthDiff=largerCoefficients.length-smallerCoefficients.length,ci=0;lengthDiff>ci;ci++)sumDiff[ci]=largerCoefficients[ci];for(var i=lengthDiff;ii;i++)for(var aCoeff=aCoefficients[i],j=0;bLength>j;j++)product[i+j]=GF256.addOrSubtract(product[i+j],this.field.multiply(aCoeff,bCoefficients[j]));return new GF256Poly(this.field,product)},this.multiply2=function(scalar){if(0==scalar)return this.field.Zero;if(1==scalar)return this;for(var size=this.coefficients.length,product=new Array(size),i=0;size>i;i++)product[i]=this.field.multiply(this.coefficients[i],scalar);return new GF256Poly(this.field,product)},this.multiplyByMonomial=function(degree,coefficient){if(0>degree)throw"System.ArgumentException";if(0==coefficient)return this.field.Zero;for(var size=this.coefficients.length,product=new Array(size+degree),i=0;ii;i++)product[i]=this.field.multiply(this.coefficients[i],coefficient);return new GF256Poly(this.field,product)},this.divide=function(other){if(this.field!=other.field)throw"GF256Polys do not have same GF256 field";if(other.Zero)throw"Divide by 0";for(var quotient=this.field.Zero,remainder=this,denominatorLeadingTerm=other.getCoefficient(other.Degree),inverseDenominatorLeadingTerm=this.field.inverse(denominatorLeadingTerm);remainder.Degree>=other.Degree&&!remainder.Zero;){ -var degreeDifference=remainder.Degree-other.Degree,scale=this.field.multiply(remainder.getCoefficient(remainder.Degree),inverseDenominatorLeadingTerm),term=other.multiplyByMonomial(degreeDifference,scale),iterationQuotient=this.field.buildMonomial(degreeDifference,scale);quotient=quotient.addOrSubtract(iterationQuotient),remainder=remainder.addOrSubtract(term)}return new Array(quotient,remainder)}}function GF256(primitive){this.expTable=new Array(256),this.logTable=new Array(256);for(var x=1,i=0;256>i;i++)this.expTable[i]=x,x<<=1,x>=256&&(x^=primitive);for(var i=0;255>i;i++)this.logTable[this.expTable[i]]=i;var at0=new Array(1);at0[0]=0,this.zero=new GF256Poly(this,new Array(at0));var at1=new Array(1);at1[0]=1,this.one=new GF256Poly(this,new Array(at1)),this.__defineGetter__("Zero",function(){return this.zero}),this.__defineGetter__("One",function(){return this.one}),this.buildMonomial=function(degree,coefficient){if(0>degree)throw"System.ArgumentException";if(0==coefficient)return zero;for(var coefficients=new Array(degree+1),i=0;i=0?number>>bits:(number>>bits)+(2<<~bits)}function FinderPattern(posX,posY,estimatedModuleSize){this.x=posX,this.y=posY,this.count=1,this.estimatedModuleSize=estimatedModuleSize,this.__defineGetter__("EstimatedModuleSize",function(){return this.estimatedModuleSize}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return this.x}),this.__defineGetter__("Y",function(){return this.y}),this.incrementCount=function(){this.count++},this.aboutEquals=function(moduleSize,i,j){if(Math.abs(i-this.y)<=moduleSize&&Math.abs(j-this.x)<=moduleSize){var moduleSizeDiff=Math.abs(moduleSize-this.estimatedModuleSize);return 1>=moduleSizeDiff||moduleSizeDiff/this.estimatedModuleSize<=1}return!1}}function FinderPatternInfo(patternCenters){this.bottomLeft=patternCenters[0],this.topLeft=patternCenters[1],this.topRight=patternCenters[2],this.__defineGetter__("BottomLeft",function(){return this.bottomLeft}),this.__defineGetter__("TopLeft",function(){return this.topLeft}),this.__defineGetter__("TopRight",function(){return this.topRight})}function FinderPatternFinder(){this.image=null,this.possibleCenters=[],this.hasSkipped=!1,this.crossCheckStateCount=new Array(0,0,0,0,0),this.resultPointCallback=null,this.__defineGetter__("CrossCheckStateCount",function(){return this.crossCheckStateCount[0]=0,this.crossCheckStateCount[1]=0,this.crossCheckStateCount[2]=0,this.crossCheckStateCount[3]=0,this.crossCheckStateCount[4]=0,this.crossCheckStateCount}),this.foundPatternCross=function(stateCount){for(var totalModuleSize=0,i=0;5>i;i++){var count=stateCount[i];if(0==count)return!1;totalModuleSize+=count}if(7>totalModuleSize)return!1;var moduleSize=Math.floor((totalModuleSize<=0&&image[centerJ+i*qrcode.width];)stateCount[2]++,i--;if(0>i)return NaN;for(;i>=0&&!image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i--;if(0>i||stateCount[1]>maxCount)return NaN;for(;i>=0&&image[centerJ+i*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,i--;if(stateCount[0]>maxCount)return NaN;for(i=startI+1;maxI>i&&image[centerJ+i*qrcode.width];)stateCount[2]++,i++;if(i==maxI)return NaN;for(;maxI>i&&!image[centerJ+i*qrcode.width]&&stateCount[3]=maxCount)return NaN;for(;maxI>i&&image[centerJ+i*qrcode.width]&&stateCount[4]=maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=2*originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,i):NaN},this.crossCheckHorizontal=function(startJ,centerI,maxCount,originalStateCountTotal){for(var image=this.image,maxJ=qrcode.width,stateCount=this.CrossCheckStateCount,j=startJ;j>=0&&image[j+centerI*qrcode.width];)stateCount[2]++,j--;if(0>j)return NaN;for(;j>=0&&!image[j+centerI*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,j--;if(0>j||stateCount[1]>maxCount)return NaN;for(;j>=0&&image[j+centerI*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,j--;if(stateCount[0]>maxCount)return NaN;for(j=startJ+1;maxJ>j&&image[j+centerI*qrcode.width];)stateCount[2]++,j++;if(j==maxJ)return NaN;for(;maxJ>j&&!image[j+centerI*qrcode.width]&&stateCount[3]=maxCount)return NaN;for(;maxJ>j&&image[j+centerI*qrcode.width]&&stateCount[4]=maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,j):NaN},this.handlePossibleCenter=function(stateCount,i,j){var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4],centerJ=this.centerFromEnd(stateCount,j),centerI=this.crossCheckVertical(i,Math.floor(centerJ),stateCount[2],stateCountTotal);if(!isNaN(centerI)&&(centerJ=this.crossCheckHorizontal(Math.floor(centerJ),Math.floor(centerI),stateCount[2],stateCountTotal),!isNaN(centerJ))){for(var estimatedModuleSize=stateCountTotal/7,found=!1,max=this.possibleCenters.length,index=0;max>index;index++){var center=this.possibleCenters[index];if(center.aboutEquals(estimatedModuleSize,centerI,centerJ)){center.incrementCount(),found=!0;break}}if(!found){var point=new FinderPattern(centerJ,centerI,estimatedModuleSize);this.possibleCenters.push(point),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(point)}return!0}return!1},this.selectBestPatterns=function(){var startSize=this.possibleCenters.length;if(3>startSize)throw"Couldn't find enough finder patterns";if(startSize>3){for(var totalModuleSize=0,square=0,i=0;startSize>i;i++){var centerValue=this.possibleCenters[i].EstimatedModuleSize;totalModuleSize+=centerValue,square+=centerValue*centerValue}var average=totalModuleSize/startSize;this.possibleCenters.sort(function(center1,center2){var dA=Math.abs(center2.EstimatedModuleSize-average),dB=Math.abs(center1.EstimatedModuleSize-average);return dB>dA?-1:dA==dB?0:1});for(var stdDev=Math.sqrt(square/startSize-average*average),limit=Math.max(.2*average,stdDev),i=0;i3;i++){var pattern=this.possibleCenters[i];Math.abs(pattern.EstimatedModuleSize-average)>limit&&(this.possibleCenters.remove(i),i--)}}return this.possibleCenters.length>3&&this.possibleCenters.sort(function(a,b){return a.count>b.count?-1:a.count=max)return 0;for(var firstConfirmedCenter=null,i=0;max>i;i++){var center=this.possibleCenters[i];if(center.Count>=CENTER_QUORUM){if(null!=firstConfirmedCenter)return this.hasSkipped=!0,Math.floor((Math.abs(firstConfirmedCenter.X-center.X)-Math.abs(firstConfirmedCenter.Y-center.Y))/2);firstConfirmedCenter=center}}return 0},this.haveMultiplyConfirmedCenters=function(){for(var confirmedCount=0,totalModuleSize=0,max=this.possibleCenters.length,i=0;max>i;i++){var pattern=this.possibleCenters[i];pattern.Count>=CENTER_QUORUM&&(confirmedCount++,totalModuleSize+=pattern.EstimatedModuleSize)}if(3>confirmedCount)return!1;for(var average=totalModuleSize/max,totalDeviation=0,i=0;max>i;i++)pattern=this.possibleCenters[i],totalDeviation+=Math.abs(pattern.EstimatedModuleSize-average);return.05*totalModuleSize>=totalDeviation},this.findFinderPattern=function(image){var tryHarder=!1;this.image=image;var maxI=qrcode.height,maxJ=qrcode.width,iSkip=Math.floor(3*maxI/(4*MAX_MODULES));(MIN_SKIP>iSkip||tryHarder)&&(iSkip=MIN_SKIP);for(var done=!1,stateCount=new Array(5),i=iSkip-1;maxI>i&&!done;i+=iSkip){stateCount[0]=0,stateCount[1]=0,stateCount[2]=0,stateCount[3]=0,stateCount[4]=0;for(var currentState=0,j=0;maxJ>j;j++)if(image[j+i*qrcode.width])1==(1¤tState)&¤tState++,stateCount[currentState]++;else if(0==(1¤tState))if(4==currentState)if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,j);if(confirmed)if(iSkip=2,this.hasSkipped)done=this.haveMultiplyConfirmedCenters();else{var rowSkip=this.findRowSkip();rowSkip>stateCount[2]&&(i+=rowSkip-stateCount[2]-iSkip,j=maxJ-1)}else{do j++;while(maxJ>j&&!image[j+i*qrcode.width]);j--}currentState=0,stateCount[0]=0,stateCount[1]=0,stateCount[2]=0,stateCount[3]=0,stateCount[4]=0}else stateCount[0]=stateCount[2],stateCount[1]=stateCount[3],stateCount[2]=stateCount[4],stateCount[3]=1,stateCount[4]=0,currentState=3;else stateCount[++currentState]++;else stateCount[currentState]++;if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,maxJ);confirmed&&(iSkip=stateCount[0],this.hasSkipped&&(done=haveMultiplyConfirmedCenters()))}}var patternInfo=this.selectBestPatterns();return qrcode.orderBestPatterns(patternInfo),new FinderPatternInfo(patternInfo)}}function AlignmentPattern(posX,posY,estimatedModuleSize){this.x=posX,this.y=posY,this.count=1,this.estimatedModuleSize=estimatedModuleSize,this.__defineGetter__("EstimatedModuleSize",function(){return this.estimatedModuleSize}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return Math.floor(this.x)}),this.__defineGetter__("Y",function(){return Math.floor(this.y)}),this.incrementCount=function(){this.count++},this.aboutEquals=function(moduleSize,i,j){if(Math.abs(i-this.y)<=moduleSize&&Math.abs(j-this.x)<=moduleSize){var moduleSizeDiff=Math.abs(moduleSize-this.estimatedModuleSize);return 1>=moduleSizeDiff||moduleSizeDiff/this.estimatedModuleSize<=1}return!1}}function AlignmentPatternFinder(image,startX,startY,width,height,moduleSize,resultPointCallback){this.image=image,this.possibleCenters=new Array,this.startX=startX,this.startY=startY,this.width=width,this.height=height,this.moduleSize=moduleSize,this.crossCheckStateCount=new Array(0,0,0),this.resultPointCallback=resultPointCallback,this.centerFromEnd=function(stateCount,end){return end-stateCount[2]-stateCount[1]/2},this.foundPatternCross=function(stateCount){for(var moduleSize=this.moduleSize,maxVariance=moduleSize/2,i=0;3>i;i++)if(Math.abs(moduleSize-stateCount[i])>=maxVariance)return!1;return!0},this.crossCheckVertical=function(startI,centerJ,maxCount,originalStateCountTotal){var image=this.image,maxI=qrcode.height,stateCount=this.crossCheckStateCount;stateCount[0]=0,stateCount[1]=0,stateCount[2]=0;for(var i=startI;i>=0&&image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i--;if(0>i||stateCount[1]>maxCount)return NaN;for(;i>=0&&!image[centerJ+i*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,i--;if(stateCount[0]>maxCount)return NaN;for(i=startI+1;maxI>i&&image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i++;if(i==maxI||stateCount[1]>maxCount)return NaN;for(;maxI>i&&!image[centerJ+i*qrcode.width]&&stateCount[2]<=maxCount;)stateCount[2]++,i++;if(stateCount[2]>maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=2*originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,i):NaN},this.handlePossibleCenter=function(stateCount,i,j){var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2],centerJ=this.centerFromEnd(stateCount,j),centerI=this.crossCheckVertical(i,Math.floor(centerJ),2*stateCount[1],stateCountTotal);if(!isNaN(centerI)){for(var estimatedModuleSize=(stateCount[0]+stateCount[1]+stateCount[2])/3,max=this.possibleCenters.length,index=0;max>index;index++){var center=this.possibleCenters[index];if(center.aboutEquals(estimatedModuleSize,centerI,centerJ))return new AlignmentPattern(centerJ,centerI,estimatedModuleSize)}var point=new AlignmentPattern(centerJ,centerI,estimatedModuleSize);this.possibleCenters.push(point),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(point)}return null},this.find=function(){for(var startX=this.startX,height=this.height,maxJ=startX+width,middleI=startY+(height>>1),stateCount=new Array(0,0,0),iGen=0;height>iGen;iGen++){var i=middleI+(0==(1&iGen)?iGen+1>>1:-(iGen+1>>1));stateCount[0]=0,stateCount[1]=0,stateCount[2]=0;for(var j=startX;maxJ>j&&!image[j+qrcode.width*i];)j++;for(var currentState=0;maxJ>j;){if(image[j+i*qrcode.width])if(1==currentState)stateCount[currentState]++;else if(2==currentState){if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,j);if(null!=confirmed)return confirmed}stateCount[0]=stateCount[2],stateCount[1]=1,stateCount[2]=0,currentState=1}else stateCount[++currentState]++;else 1==currentState&¤tState++,stateCount[currentState]++;j++}if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,maxJ);if(null!=confirmed)return confirmed}}if(0!=this.possibleCenters.length)return this.possibleCenters[0];throw"Couldn't find enough alignment patterns"}}function QRCodeDataBlockReader(blocks,version,numErrorCorrectionCode){this.blockPointer=0,this.bitPointer=7,this.dataLength=0,this.blocks=blocks,this.numErrorCorrectionCode=numErrorCorrectionCode,9>=version?this.dataLengthMode=0:version>=10&&26>=version?this.dataLengthMode=1:version>=27&&40>=version&&(this.dataLengthMode=2),this.getNextBits=function(numBits){var bits=0;if(numBitsi;i++)mask+=1<>this.bitPointer-numBits+1,this.bitPointer-=numBits,bits}if(numBits>8-(numBits-(this.bitPointer+1)),this.bitPointer=this.bitPointer-numBits%8,this.bitPointer<0&&(this.bitPointer=8+this.bitPointer),bits}if(numBits>8-(numBits-(this.bitPointer+1+8));return bits=bitsFirstBlock+bitsSecondBlock+bitsThirdBlock,this.bitPointer=this.bitPointer-(numBits-8)%8,this.bitPointer<0&&(this.bitPointer=8+this.bitPointer),bits}return 0},this.NextMode=function(){return this.blockPointer>this.blocks.length-this.numErrorCorrectionCode-2?0:this.getNextBits(4)},this.getDataLength=function(modeIndicator){for(var index=0;;){if(modeIndicator>>index==1)break;index++}return this.getNextBits(qrcode.sizeOfDataLengthInfo[this.dataLengthMode][index])},this.getRomanAndFigureString=function(dataLength){var length=dataLength,intData=0,strData="",tableRomanAndFigure=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do if(length>1){intData=this.getNextBits(11);var firstLetter=Math.floor(intData/45),secondLetter=intData%45;strData+=tableRomanAndFigure[firstLetter],strData+=tableRomanAndFigure[secondLetter],length-=2}else 1==length&&(intData=this.getNextBits(6),strData+=tableRomanAndFigure[intData],length-=1);while(length>0);return strData},this.getFigureString=function(dataLength){var length=dataLength,intData=0,strData="";do length>=3?(intData=this.getNextBits(10),100>intData&&(strData+="0"),10>intData&&(strData+="0"),length-=3):2==length?(intData=this.getNextBits(7),10>intData&&(strData+="0"),length-=2):1==length&&(intData=this.getNextBits(4),length-=1),strData+=intData;while(length>0);return strData},this.get8bitByteArray=function(dataLength){var length=dataLength,intData=0,output=new Array;do intData=this.getNextBits(8),output.push(intData),length--;while(length>0);return output},this.getKanjiString=function(dataLength){var length=dataLength,intData=0,unicodeString="";do{intData=getNextBits(13);var lowerByte=intData%192,higherByte=intData/192,tempWord=(higherByte<<8)+lowerByte,shiftjisWord=0;shiftjisWord=40956>=tempWord+33088?tempWord+33088:tempWord+49472,unicodeString+=String.fromCharCode(shiftjisWord),length--}while(length>0);return unicodeString},this.__defineGetter__("DataByte",function(){for(var output=new Array,MODE_NUMBER=1,MODE_ROMAN_AND_NUMBER=2,MODE_8BIT_BYTE=4,MODE_KANJI=8;;){var mode=this.NextMode();if(0==mode){if(output.length>0)break;throw"Empty data block"}if(mode!=MODE_NUMBER&&mode!=MODE_ROMAN_AND_NUMBER&&mode!=MODE_8BIT_BYTE&&mode!=MODE_KANJI)throw"Invalid mode: "+mode+" in (block:"+this.blockPointer+" bit:"+this.bitPointer+")";if(dataLength=this.getDataLength(mode),dataLength<1)throw"Invalid data length: "+dataLength;switch(mode){case MODE_NUMBER:for(var temp_str=this.getFigureString(dataLength),ta=new Array(temp_str.length),j=0;j1048576){var canvas=document.createElement("canvas");canvas.width=canvas.height=1;var ctx=canvas.getContext("2d");return ctx.drawImage(img,-iw+1,0),0===ctx.getImageData(0,0,1,1).data[3]}return!1}function detectVerticalSquash(img,iw,ih){var canvas=document.createElement("canvas");canvas.width=1,canvas.height=ih;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);for(var data=ctx.getImageData(0,0,1,ih).data,sy=0,ey=ih,py=ih;py>sy;){var alpha=data[4*(py-1)+3];0===alpha?ey=py:sy=py,py=ey+sy>>1}var ratio=py/ih;return 0===ratio?1:ratio}function renderImageToDataURL(img,options,doSquash){var canvas=document.createElement("canvas");return renderImageToCanvas(img,canvas,options,doSquash),canvas.toDataURL("image/jpeg",options.quality||.8)}function renderImageToCanvas(img,canvas,options,doSquash){var iw=img.naturalWidth,ih=img.naturalHeight,width=options.width,height=options.height,ctx=canvas.getContext("2d");ctx.save(),transformCoordinate(canvas,width,height,options.orientation);var subsampled=detectSubsampling(img);subsampled&&(iw/=2,ih/=2);var d=1024,tmpCanvas=document.createElement("canvas");tmpCanvas.width=tmpCanvas.height=d;for(var tmpCtx=tmpCanvas.getContext("2d"),vertSquashRatio=doSquash?detectVerticalSquash(img,iw,ih):1,dw=Math.ceil(d*width/iw),dh=Math.ceil(d*height/ih/vertSquashRatio),sy=0,dy=0;ih>sy;){for(var sx=0,dx=0;iw>sx;)tmpCtx.clearRect(0,0,d,d),tmpCtx.drawImage(img,-sx,-sy),ctx.drawImage(tmpCanvas,0,0,d,d,dx,dy,dw,dh),sx+=d,dx+=dw;sy+=d,dy+=dh}ctx.restore(),tmpCanvas=tmpCtx=null}function transformCoordinate(canvas,width,height,orientation){switch(orientation){case 5:case 6:case 7:case 8:canvas.width=height,canvas.height=width;break;default:canvas.width=width,canvas.height=height}var ctx=canvas.getContext("2d");switch(orientation){case 2:ctx.translate(width,0),ctx.scale(-1,1);break;case 3:ctx.translate(width,height),ctx.rotate(Math.PI);break;case 4:ctx.translate(0,height),ctx.scale(1,-1);break;case 5:ctx.rotate(.5*Math.PI),ctx.scale(1,-1);break;case 6:ctx.rotate(.5*Math.PI),ctx.translate(0,-height);break;case 7:ctx.rotate(.5*Math.PI),ctx.translate(width,-height),ctx.scale(-1,1);break;case 8:ctx.rotate(-.5*Math.PI),ctx.translate(-width,0)}}function MegaPixImage(srcImage){if(window.Blob&&srcImage instanceof Blob){var img=new Image,URL=window.URL&&window.URL.createObjectURL?window.URL:window.webkitURL&&window.webkitURL.createObjectURL?window.webkitURL:null;if(!URL)throw Error("No createObjectURL function found to create blob url");img.src=URL.createObjectURL(srcImage),this.blob=srcImage,srcImage=img}if(!srcImage.naturalWidth&&!srcImage.naturalHeight){var _this=this;srcImage.onload=function(){var listeners=_this.imageLoadListeners;if(listeners){_this.imageLoadListeners=null;for(var i=0,len=listeners.length;len>i;i++)listeners[i]()}},this.imageLoadListeners=[]}this.srcImage=srcImage}MegaPixImage.prototype.render=function(target,options){if(this.imageLoadListeners){var _this=this;return void this.imageLoadListeners.push(function(){_this.render(target,options)})}options=options||{};var imgWidth=this.srcImage.naturalWidth,imgHeight=this.srcImage.naturalHeight,width=options.width,height=options.height,maxWidth=options.maxWidth,maxHeight=options.maxHeight,doSquash=!this.blob||"image/jpeg"===this.blob.type;width&&!height?height=imgHeight*width/imgWidth<<0:height&&!width?width=imgWidth*height/imgHeight<<0:(width=imgWidth,height=imgHeight),maxWidth&&width>maxWidth&&(width=maxWidth,height=imgHeight*width/imgWidth<<0),maxHeight&&height>maxHeight&&(height=maxHeight,width=imgWidth*height/imgHeight<<0);var opt={width:width,height:height};for(var k in options)opt[k]=options[k];var tagName=target.tagName.toLowerCase();"img"===tagName?target.src=renderImageToDataURL(this.srcImage,opt,doSquash):"canvas"===tagName&&renderImageToCanvas(this.srcImage,target,opt,doSquash),"function"==typeof this.onrender&&this.onrender(target)},"function"==typeof define&&define.amd?define([],function(){return MegaPixImage}):this.MegaPixImage=MegaPixImage}();var qrcode=function(){function qrPolynomial(num,shift){if("undefined"==typeof num.length)throw new Error(num.length+"/"+shift);var _num=function(){for(var offset=0;offsetrow;row+=1){modules[row]=new Array(moduleCount);for(var col=0;moduleCount>col;col+=1)modules[row][col]=null}return modules}(_moduleCount),setupPositionProbePattern(0,0),setupPositionProbePattern(_moduleCount-7,0),setupPositionProbePattern(0,_moduleCount-7),setupPositionAdjustPattern(),setupTimingPattern(),setupTypeInfo(test,maskPattern),_typeNumber>=7&&setupTypeNumber(test),null==_dataCache&&(_dataCache=createData(_typeNumber,_errorCorrectLevel,_dataList)),mapData(_dataCache,maskPattern)},setupPositionProbePattern=function(row,col){for(var r=-1;7>=r;r+=1)if(!(-1>=row+r||row+r>=_moduleCount))for(var c=-1;7>=c;c+=1)-1>=col+c||col+c>=_moduleCount||(r>=0&&6>=r&&(0==c||6==c)||c>=0&&6>=c&&(0==r||6==r)||r>=2&&4>=r&&c>=2&&4>=c?_modules[row+r][col+c]=!0:_modules[row+r][col+c]=!1)},getBestMaskPattern=function(){for(var minLostPoint=0,pattern=0,i=0;8>i;i+=1){makeImpl(!0,i);var lostPoint=QRUtil.getLostPoint(_this);(0==i||minLostPoint>lostPoint)&&(minLostPoint=lostPoint,pattern=i)}return pattern},setupTimingPattern=function(){for(var r=8;_moduleCount-8>r;r+=1)null==_modules[r][6]&&(_modules[r][6]=r%2==0);for(var c=8;_moduleCount-8>c;c+=1)null==_modules[6][c]&&(_modules[6][c]=c%2==0)},setupPositionAdjustPattern=function(){for(var pos=QRUtil.getPatternPosition(_typeNumber),i=0;i=r;r+=1)for(var c=-2;2>=c;c+=1)-2==r||2==r||-2==c||2==c||0==r&&0==c?_modules[row+r][col+c]=!0:_modules[row+r][col+c]=!1}},setupTypeNumber=function(test){for(var bits=QRUtil.getBCHTypeNumber(_typeNumber),i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[Math.floor(i/3)][i%3+_moduleCount-8-3]=mod}for(var i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[i%3+_moduleCount-8-3][Math.floor(i/3)]=mod}},setupTypeInfo=function(test,maskPattern){for(var data=_errorCorrectLevel<<3|maskPattern,bits=QRUtil.getBCHTypeInfo(data),i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);6>i?_modules[i][8]=mod:8>i?_modules[i+1][8]=mod:_modules[_moduleCount-15+i][8]=mod}for(var i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);8>i?_modules[8][_moduleCount-i-1]=mod:9>i?_modules[8][15-i-1+1]=mod:_modules[8][15-i-1]=mod}_modules[_moduleCount-8][8]=!test},mapData=function(data,maskPattern){for(var inc=-1,row=_moduleCount-1,bitIndex=7,byteIndex=0,maskFunc=QRUtil.getMaskFunction(maskPattern),col=_moduleCount-1;col>0;col-=2)for(6==col&&(col-=1);;){for(var c=0;2>c;c+=1)if(null==_modules[row][col-c]){var dark=!1;byteIndex>>bitIndex&1));var mask=maskFunc(row,col-c);mask&&(dark=!dark),_modules[row][col-c]=dark,bitIndex-=1,-1==bitIndex&&(byteIndex+=1,bitIndex=7)}if(row+=inc,0>row||row>=_moduleCount){row-=inc,inc=-inc;break}}},createBytes=function(buffer,rsBlocks){for(var offset=0,maxDcCount=0,maxEcCount=0,dcdata=new Array(rsBlocks.length),ecdata=new Array(rsBlocks.length),r=0;r=0?modPoly.getAt(modIndex):0}}for(var totalCodeCount=0,i=0;ii;i+=1)for(var r=0;ri;i+=1)for(var r=0;r8*totalDataCount)throw new Error("code length overflow. ("+buffer.getLengthInBits()+">"+8*totalDataCount+")");for(buffer.getLengthInBits()+4<=8*totalDataCount&&buffer.put(0,4);buffer.getLengthInBits()%8!=0;)buffer.putBit(!1);for(;;){if(buffer.getLengthInBits()>=8*totalDataCount)break;if(buffer.put(PAD0,8),buffer.getLengthInBits()>=8*totalDataCount)break;buffer.put(PAD1,8)}return createBytes(buffer,rsBlocks)};return _this.addData=function(data){var newData=qr8BitByte(data);_dataList.push(newData),_dataCache=null},_this.isDark=function(row,col){if(0>row||row>=_moduleCount||0>col||col>=_moduleCount)throw new Error(row+","+col);return _modules[row][col]},_this.getModuleCount=function(){return _moduleCount},_this.make=function(){makeImpl(!1,getBestMaskPattern())},_this.createTableTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var qrHtml="";qrHtml+='";for(var c=0;c<_this.getModuleCount();c+=1)qrHtml+='"}return qrHtml+="",qrHtml+="
    ';qrHtml+="
    "},_this.createImgTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var size=_this.getModuleCount()*cellSize+2*margin,min=margin,max=size-margin;return createImgTag(size,size,function(x,y){if(x>=min&&max>x&&y>=min&&max>y){var c=Math.floor((x-min)/cellSize),r=Math.floor((y-min)/cellSize);return _this.isDark(r,c)?0:1}return 1})},_this};qrcode.stringToBytes=function(s){for(var bytes=new Array,i=0;ic)bytes.push(c);else{var b=unicodeMap[s.charAt(i)];"number"==typeof b?(255&b)==b?bytes.push(b):(bytes.push(b>>>8),bytes.push(255&b)):bytes.push(unknownChar)}}return bytes}};var QRMode={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},QRErrorCorrectLevel={L:1,M:0,Q:3,H:2},QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},QRUtil=function(){var PATTERN_POSITION_TABLE=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15=1335,G18=7973,G15_MASK=21522,_this={},getBCHDigit=function(data){ -for(var digit=0;0!=data;)digit+=1,data>>>=1;return digit};return _this.getBCHTypeInfo=function(data){for(var d=data<<10;getBCHDigit(d)-getBCHDigit(G15)>=0;)d^=G15<=0;)d^=G18<i;i+=1)a=a.multiply(qrPolynomial([1,QRMath.gexp(i)],0));return a},_this.getLengthInBits=function(mode,type){if(type>=1&&10>type)switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode)}else if(27>type)switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode)}else{if(!(41>type))throw new Error("type:"+type);switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode)}}},_this.getLostPoint=function(qrcode){for(var moduleCount=qrcode.getModuleCount(),lostPoint=0,row=0;moduleCount>row;row+=1)for(var col=0;moduleCount>col;col+=1){for(var sameCount=0,dark=qrcode.isDark(row,col),r=-1;1>=r;r+=1)if(!(0>row+r||row+r>=moduleCount))for(var c=-1;1>=c;c+=1)0>col+c||col+c>=moduleCount||(0!=r||0!=c)&&dark==qrcode.isDark(row+r,col+c)&&(sameCount+=1);sameCount>5&&(lostPoint+=3+sameCount-5)}for(var row=0;moduleCount-1>row;row+=1)for(var col=0;moduleCount-1>col;col+=1){var count=0;qrcode.isDark(row,col)&&(count+=1),qrcode.isDark(row+1,col)&&(count+=1),qrcode.isDark(row,col+1)&&(count+=1),qrcode.isDark(row+1,col+1)&&(count+=1),(0==count||4==count)&&(lostPoint+=3)}for(var row=0;moduleCount>row;row+=1)for(var col=0;moduleCount-6>col;col+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row,col+1)&&qrcode.isDark(row,col+2)&&qrcode.isDark(row,col+3)&&qrcode.isDark(row,col+4)&&!qrcode.isDark(row,col+5)&&qrcode.isDark(row,col+6)&&(lostPoint+=40);for(var col=0;moduleCount>col;col+=1)for(var row=0;moduleCount-6>row;row+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row+1,col)&&qrcode.isDark(row+2,col)&&qrcode.isDark(row+3,col)&&qrcode.isDark(row+4,col)&&!qrcode.isDark(row+5,col)&&qrcode.isDark(row+6,col)&&(lostPoint+=40);for(var darkCount=0,col=0;moduleCount>col;col+=1)for(var row=0;moduleCount>row;row+=1)qrcode.isDark(row,col)&&(darkCount+=1);var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;return lostPoint+=10*ratio},_this}(),QRMath=function(){for(var EXP_TABLE=new Array(256),LOG_TABLE=new Array(256),i=0;8>i;i+=1)EXP_TABLE[i]=1<i;i+=1)EXP_TABLE[i]=EXP_TABLE[i-4]^EXP_TABLE[i-5]^EXP_TABLE[i-6]^EXP_TABLE[i-8];for(var i=0;255>i;i+=1)LOG_TABLE[EXP_TABLE[i]]=i;var _this={};return _this.glog=function(n){if(1>n)throw new Error("glog("+n+")");return LOG_TABLE[n]},_this.gexp=function(n){for(;0>n;)n+=255;for(;n>=256;)n-=255;return EXP_TABLE[n]},_this}(),QRRSBlock=function(){var RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16]],qrRSBlock=function(totalCount,dataCount){var _this={};return _this.totalCount=totalCount,_this.dataCount=dataCount,_this},_this={},getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return RS_BLOCK_TABLE[4*(typeNumber-1)+0];case QRErrorCorrectLevel.M:return RS_BLOCK_TABLE[4*(typeNumber-1)+1];case QRErrorCorrectLevel.Q:return RS_BLOCK_TABLE[4*(typeNumber-1)+2];case QRErrorCorrectLevel.H:return RS_BLOCK_TABLE[4*(typeNumber-1)+3];default:return void 0}};return _this.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=getRsBlockTable(typeNumber,errorCorrectLevel);if("undefined"==typeof rsBlock)throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);for(var length=rsBlock.length/3,list=new Array,i=0;length>i;i+=1)for(var count=rsBlock[3*i+0],totalCount=rsBlock[3*i+1],dataCount=rsBlock[3*i+2],j=0;count>j;j+=1)list.push(qrRSBlock(totalCount,dataCount));return list},_this}(),qrBitBuffer=function(){var _buffer=new Array,_length=0,_this={};return _this.getBuffer=function(){return _buffer},_this.getAt=function(index){var bufIndex=Math.floor(index/8);return 1==(_buffer[bufIndex]>>>7-index%8&1)},_this.put=function(num,length){for(var i=0;length>i;i+=1)_this.putBit(1==(num>>>length-i-1&1))},_this.getLengthInBits=function(){return _length},_this.putBit=function(bit){var bufIndex=Math.floor(_length/8);_buffer.length<=bufIndex&&_buffer.push(0),bit&&(_buffer[bufIndex]|=128>>>_length%8),_length+=1},_this},qr8BitByte=function(data){var _mode=QRMode.MODE_8BIT_BYTE,_bytes=qrcode.stringToBytes(data),_this={};return _this.getMode=function(){return _mode},_this.getLength=function(buffer){return _bytes.length},_this.write=function(buffer){for(var i=0;i<_bytes.length;i+=1)buffer.put(_bytes[i],8)},_this},byteArrayOutputStream=function(){var _bytes=new Array,_this={};return _this.writeByte=function(b){_bytes.push(255&b)},_this.writeShort=function(i){_this.writeByte(i),_this.writeByte(i>>>8)},_this.writeBytes=function(b,off,len){off=off||0,len=len||b.length;for(var i=0;len>i;i+=1)_this.writeByte(b[i+off])},_this.writeString=function(s){for(var i=0;i0&&(s+=","),s+=_bytes[i];return s+="]"},_this},base64EncodeOutputStream=function(){var _buffer=0,_buflen=0,_length=0,_base64="",_this={},writeEncoded=function(b){_base64+=String.fromCharCode(encode(63&b))},encode=function(n){if(0>n);else{if(26>n)return 65+n;if(52>n)return 97+(n-26);if(62>n)return 48+(n-52);if(62==n)return 43;if(63==n)return 47}throw new Error("n:"+n)};return _this.writeByte=function(n){for(_buffer=_buffer<<8|255&n,_buflen+=8,_length+=1;_buflen>=6;)writeEncoded(_buffer>>>_buflen-6),_buflen-=6},_this.flush=function(){if(_buflen>0&&(writeEncoded(_buffer<<6-_buflen),_buffer=0,_buflen=0),_length%3!=0)for(var padlen=3-_length%3,i=0;padlen>i;i+=1)_base64+="="},_this.toString=function(){return _base64},_this},base64DecodeInputStream=function(str){var _str=str,_pos=0,_buffer=0,_buflen=0,_this={};_this.read=function(){for(;8>_buflen;){if(_pos>=_str.length){if(0==_buflen)return-1;throw new Error("unexpected end of file./"+_buflen)}var c=_str.charAt(_pos);if(_pos+=1,"="==c)return _buflen=0,-1;c.match(/^\s$/)||(_buffer=_buffer<<6|decode(c.charCodeAt(0)),_buflen+=6)}var n=_buffer>>>_buflen-8&255;return _buflen-=8,n};var decode=function(c){if(c>=65&&90>=c)return c-65;if(c>=97&&122>=c)return c-97+26;if(c>=48&&57>=c)return c-48+52;if(43==c)return 62;if(47==c)return 63;throw new Error("c:"+c)};return _this},gifImage=function(width,height){var _width=width,_height=height,_data=new Array(width*height),_this={};_this.setPixel=function(x,y,pixel){_data[y*_width+x]=pixel},_this.write=function(out){out.writeString("GIF87a"),out.writeShort(_width),out.writeShort(_height),out.writeByte(128),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(255),out.writeByte(255),out.writeByte(255),out.writeString(","),out.writeShort(0),out.writeShort(0),out.writeShort(_width),out.writeShort(_height),out.writeByte(0);var lzwMinCodeSize=2,raster=getLZWRaster(lzwMinCodeSize);out.writeByte(lzwMinCodeSize);for(var offset=0;raster.length-offset>255;)out.writeByte(255),out.writeBytes(raster,offset,255),offset+=255;out.writeByte(raster.length-offset),out.writeBytes(raster,offset,raster.length-offset),out.writeByte(0),out.writeString(";")};var bitOutputStream=function(out){var _out=out,_bitLength=0,_bitBuffer=0,_this={};return _this.write=function(data,length){if(data>>>length!=0)throw new Error("length over");for(;_bitLength+length>=8;)_out.writeByte(255&(data<<_bitLength|_bitBuffer)),length-=8-_bitLength,data>>>=8-_bitLength,_bitBuffer=0,_bitLength=0;_bitBuffer=data<<_bitLength|_bitBuffer,_bitLength+=length},_this.flush=function(){_bitLength>0&&_out.writeByte(_bitBuffer)},_this},getLZWRaster=function(lzwMinCodeSize){for(var clearCode=1<i;i+=1)table.add(String.fromCharCode(i));table.add(String.fromCharCode(clearCode)),table.add(String.fromCharCode(endCode));var byteOut=byteArrayOutputStream(),bitOut=bitOutputStream(byteOut);bitOut.write(clearCode,bitLength);var dataIndex=0,s=String.fromCharCode(_data[dataIndex]);for(dataIndex+=1;dataIndex<_data.length;){var c=String.fromCharCode(_data[dataIndex]);dataIndex+=1,table.contains(s+c)?s+=c:(bitOut.write(table.indexOf(s),bitLength),table.size()<4095&&(table.size()==1<y;y+=1)for(var x=0;width>x;x+=1)gif.setPixel(x,y,getPixel(x,y));var b=byteArrayOutputStream();gif.write(b);for(var base64=base64EncodeOutputStream(),bytes=b.toByteArray(),i=0;ix||x>width||-1>y||y>height)throw"Error.checkAndNudgePoints ";nudged=!1,-1==x?(points[offset]=0,nudged=!0):x==width&&(points[offset]=width-1,nudged=!0),-1==y?(points[offset+1]=0,nudged=!0):y==height&&(points[offset+1]=height-1,nudged=!0)}nudged=!0;for(var offset=points.length-2;offset>=0&&nudged;offset-=2){var x=Math.floor(points[offset]),y=Math.floor(points[offset+1]);if(-1>x||x>width||-1>y||y>height)throw"Error.checkAndNudgePoints ";nudged=!1,-1==x?(points[offset]=0,nudged=!0):x==width&&(points[offset]=width-1,nudged=!0),-1==y?(points[offset+1]=0,nudged=!0):y==height&&(points[offset+1]=height-1,nudged=!0)}},GridSampler.sampleGrid3=function(image,dimension,transform){for(var bits=new BitMatrix(dimension),points=new Array(dimension<<1),y=0;dimension>y;y++){for(var max=points.length,iValue=y+.5,x=0;max>x;x+=2)points[x]=(x>>1)+.5,points[x+1]=iValue;transform.transformPoints1(points),GridSampler.checkAndNudgePoints(image,points);try{for(var x=0;max>x;x+=2){var xpoint=4*Math.floor(points[x])+Math.floor(points[x+1])*qrcode.width*4,bit=image[Math.floor(points[x])+qrcode.width*Math.floor(points[x+1])];qrcode.imagedata.data[xpoint]=bit?255:0,qrcode.imagedata.data[xpoint+1]=bit?255:0,qrcode.imagedata.data[xpoint+2]=0,qrcode.imagedata.data[xpoint+3]=255,bit&&bits.set_Renamed(x>>1,y)}}catch(aioobe){throw"Error.checkAndNudgePoints"}}return bits},GridSampler.sampleGridx=function(image,dimension,p1ToX,p1ToY,p2ToX,p2ToY,p3ToX,p3ToY,p4ToX,p4ToY,p1FromX,p1FromY,p2FromX,p2FromY,p3FromX,p3FromY,p4FromX,p4FromY){var transform=PerspectiveTransform.quadrilateralToQuadrilateral(p1ToX,p1ToY,p2ToX,p2ToY,p3ToX,p3ToY,p4ToX,p4ToY,p1FromX,p1FromY,p2FromX,p2FromY,p3FromX,p3FromY,p4FromX,p4FromY);return GridSampler.sampleGrid3(image,dimension,transform)},Version.VERSION_DECODE_INFO=new Array(31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017),Version.VERSIONS=buildVersions(),Version.getVersionForNumber=function(versionNumber){if(1>versionNumber||versionNumber>40)throw"ArgumentException";return Version.VERSIONS[versionNumber-1]},Version.getProvisionalVersionForDimension=function(dimension){if(dimension%4!=1)throw"Error getProvisionalVersionForDimension";try{return Version.getVersionForNumber(dimension-17>>2)}catch(iae){throw"Error getVersionForNumber"}},Version.decodeVersionInformation=function(versionBits){for(var bestDifference=4294967295,bestVersion=0,i=0;ibitsDifference&&(bestVersion=i+7,bestDifference=bitsDifference)}return 3>=bestDifference?this.getVersionForNumber(bestVersion):null},PerspectiveTransform.quadrilateralToQuadrilateral=function(x0,y0,x1,y1,x2,y2,x3,y3,x0p,y0p,x1p,y1p,x2p,y2p,x3p,y3p){var qToS=this.quadrilateralToSquare(x0,y0,x1,y1,x2,y2,x3,y3),sToQ=this.squareToQuadrilateral(x0p,y0p,x1p,y1p,x2p,y2p,x3p,y3p);return sToQ.times(qToS)},PerspectiveTransform.squareToQuadrilateral=function(x0,y0,x1,y1,x2,y2,x3,y3){return dy2=y3-y2,dy3=y0-y1+y2-y3,0==dy2&&0==dy3?new PerspectiveTransform(x1-x0,x2-x1,x0,y1-y0,y2-y1,y0,0,0,1):(dx1=x1-x2,dx2=x3-x2,dx3=x0-x1+x2-x3,dy1=y1-y2,denominator=dx1*dy2-dx2*dy1,a13=(dx3*dy2-dx2*dy3)/denominator,a23=(dx1*dy3-dx3*dy1)/denominator,new PerspectiveTransform(x1-x0+a13*x1,x3-x0+a23*x3,x0,y1-y0+a13*y1,y3-y0+a23*y3,y0,a13,a23,1))},PerspectiveTransform.quadrilateralToSquare=function(x0,y0,x1,y1,x2,y2,x3,y3){return this.squareToQuadrilateral(x0,y0,x1,y1,x2,y2,x3,y3).buildAdjoint()};var FORMAT_INFO_MASK_QR=21522,FORMAT_INFO_DECODE_LOOKUP=new Array(new Array(21522,0),new Array(20773,1),new Array(24188,2),new Array(23371,3),new Array(17913,4),new Array(16590,5),new Array(20375,6),new Array(19104,7),new Array(30660,8),new Array(29427,9),new Array(32170,10),new Array(30877,11),new Array(26159,12),new Array(25368,13),new Array(27713,14),new Array(26998,15),new Array(5769,16),new Array(5054,17),new Array(7399,18),new Array(6608,19),new Array(1890,20),new Array(597,21),new Array(3340,22),new Array(2107,23),new Array(13663,24),new Array(12392,25),new Array(16177,26),new Array(14854,27),new Array(9396,28),new Array(8579,29),new Array(11994,30),new Array(11245,31)),BITS_SET_IN_HALF_BYTE=new Array(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);FormatInformation.numBitsDiffering=function(a,b){return a^=b,BITS_SET_IN_HALF_BYTE[15&a]+BITS_SET_IN_HALF_BYTE[15&URShift(a,4)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,8)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,12)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,16)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,20)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,24)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,28)]},FormatInformation.decodeFormatInformation=function(maskedFormatInfo){var formatInfo=FormatInformation.doDecodeFormatInformation(maskedFormatInfo);return null!=formatInfo?formatInfo:FormatInformation.doDecodeFormatInformation(maskedFormatInfo^FORMAT_INFO_MASK_QR)},FormatInformation.doDecodeFormatInformation=function(maskedFormatInfo){for(var bestDifference=4294967295,bestFormatInfo=0,i=0;ibitsDifference&&(bestFormatInfo=decodeInfo[1],bestDifference=bitsDifference)}return 3>=bestDifference?new FormatInformation(bestFormatInfo):null},ErrorCorrectionLevel.forBits=function(bits){if(0>bits||bits>=FOR_BITS.length)throw"ArgumentException";return FOR_BITS[bits]};var L=new ErrorCorrectionLevel(0,1,"L"),M=new ErrorCorrectionLevel(1,0,"M"),Q=new ErrorCorrectionLevel(2,3,"Q"),H=new ErrorCorrectionLevel(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);DataBlock.getDataBlocks=function(rawCodewords,version,ecLevel){if(rawCodewords.length!=version.TotalCodewords)throw"ArgumentException";for(var ecBlocks=version.getECBlocksForLevel(ecLevel),totalBlocks=0,ecBlockArray=ecBlocks.getECBlocks(),i=0;i=0;){var numCodewords=result[longerBlocksStartAt].codewords.length;if(numCodewords==shorterBlocksTotalCodewords)break;longerBlocksStartAt--}longerBlocksStartAt++;for(var shorterBlocksNumDataCodewords=shorterBlocksTotalCodewords-ecBlocks.ECCodewordsPerBlock,rawCodewordsOffset=0,i=0;shorterBlocksNumDataCodewords>i;i++)for(var j=0;numResultBlocks>j;j++)result[j].codewords[i]=rawCodewords[rawCodewordsOffset++];for(var j=longerBlocksStartAt;numResultBlocks>j;j++)result[j].codewords[shorterBlocksNumDataCodewords]=rawCodewords[rawCodewordsOffset++];for(var max=result[0].codewords.length,i=shorterBlocksNumDataCodewords;max>i;i++)for(var j=0;numResultBlocks>j;j++){var iOffset=longerBlocksStartAt>j?i:i+1;result[j].codewords[iOffset]=rawCodewords[rawCodewordsOffset++]}return result},DataMask={},DataMask.forReference=function(reference){if(0>reference||reference>7)throw"System.ArgumentException";return DataMask.DATA_MASKS[reference]},DataMask.DATA_MASKS=new Array(new DataMask000,new DataMask001,new DataMask010,new DataMask011,new DataMask100,new DataMask101,new DataMask110,new DataMask111),GF256.QR_CODE_FIELD=new GF256(285),GF256.DATA_MATRIX_FIELD=new GF256(301),GF256.addOrSubtract=function(a,b){return a^b},Decoder={},Decoder.rsDecoder=new ReedSolomonDecoder(GF256.QR_CODE_FIELD),Decoder.correctErrors=function(codewordBytes,numDataCodewords){for(var numCodewords=codewordBytes.length,codewordsInts=new Array(numCodewords),i=0;numCodewords>i;i++)codewordsInts[i]=255&codewordBytes[i];var numECCodewords=codewordBytes.length-numDataCodewords;try{Decoder.rsDecoder.decode(codewordsInts,numECCodewords)}catch(rse){throw rse}for(var i=0;numDataCodewords>i;i++)codewordBytes[i]=codewordsInts[i]},Decoder.decode=function(bits){for(var parser=new BitMatrixParser(bits),version=parser.readVersion(),ecLevel=parser.readFormatInformation().ErrorCorrectionLevel,codewords=parser.readCodewords(),dataBlocks=DataBlock.getDataBlocks(codewords,version,ecLevel),totalBytes=0,i=0;ii;i++)resultBytes[resultOffset++]=codewordBytes[i]}var reader=new QRCodeDataBlockReader(resultBytes,version.VersionNumber,ecLevel.Bits);return reader},qrcode=window.qrcode||{},qrcode.imagedata=null,qrcode.width=0,qrcode.height=0,qrcode.qrCodeSymbol=null,qrcode.debug=!1,qrcode.maxImgSize=1048576,qrcode.sizeOfDataLengthInfo=[[10,9,8,8],[12,11,16,10],[14,13,16,12]],qrcode.callback=null,qrcode.decode=function(src){if(0==arguments.length){var canvas_qr=document.getElementById("qr-canvas"),context=canvas_qr.getContext("2d");return qrcode.width=canvas_qr.width,qrcode.height=canvas_qr.height,qrcode.imagedata=context.getImageData(0,0,qrcode.width,qrcode.height),qrcode.result=qrcode.process(context),null!=qrcode.callback&&qrcode.callback(qrcode.result),qrcode.result}var image=new Image;image.onload=function(){var canvas_qr=document.createElement("canvas"),context=canvas_qr.getContext("2d"),nheight=image.height,nwidth=image.width;if(image.width*image.height>qrcode.maxImgSize){var ir=image.width/image.height;nheight=Math.sqrt(qrcode.maxImgSize/ir),nwidth=ir*nheight}canvas_qr.width=nwidth,canvas_qr.height=nheight,context.drawImage(image,0,0,canvas_qr.width,canvas_qr.height),qrcode.width=canvas_qr.width,qrcode.height=canvas_qr.height;try{qrcode.imagedata=context.getImageData(0,0,canvas_qr.width,canvas_qr.height)}catch(e){return qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!",void(null!=qrcode.callback&&qrcode.callback(qrcode.result))}try{qrcode.result=qrcode.process(context)}catch(e){console.log(e),qrcode.result="error decoding QR Code"}null!=qrcode.callback&&qrcode.callback(qrcode.result)},image.src=src},qrcode.isUrl=function(s){var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return regexp.test(s)},qrcode.decode_url=function(s){var escaped="";try{escaped=escape(s)}catch(e){console.log(e),escaped=s}var ret="";try{ret=decodeURIComponent(escaped)}catch(e){console.log(e),ret=escaped}return ret},qrcode.decode_utf8=function(s){return qrcode.isUrl(s)?qrcode.decode_url(s):s},qrcode.process=function(ctx){var start=(new Date).getTime(),image=qrcode.grayScaleToBitmap(qrcode.grayscale());if(qrcode.debug){for(var y=0;y=gray?!0:!1}return ret},qrcode.getMiddleBrightnessPerArea=function(image){for(var numSqrtArea=4,areaWidth=Math.floor(qrcode.width/numSqrtArea),areaHeight=Math.floor(qrcode.height/numSqrtArea),minmax=new Array(numSqrtArea),i=0;numSqrtArea>i;i++){minmax[i]=new Array(numSqrtArea);for(var i2=0;numSqrtArea>i2;i2++)minmax[i][i2]=new Array(0,0)}for(var ay=0;numSqrtArea>ay;ay++)for(var ax=0;numSqrtArea>ax;ax++){minmax[ax][ay][0]=255;for(var dy=0;areaHeight>dy;dy++)for(var dx=0;areaWidth>dx;dx++){var target=image[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width];targetminmax[ax][ay][1]&&(minmax[ax][ay][1]=target)}}for(var middle=new Array(numSqrtArea),i3=0;numSqrtArea>i3;i3++)middle[i3]=new Array(numSqrtArea);for(var ay=0;numSqrtArea>ay;ay++)for(var ax=0;numSqrtArea>ax;ax++)middle[ax][ay]=Math.floor((minmax[ax][ay][0]+minmax[ax][ay][1])/2);return middle},qrcode.grayScaleToBitmap=function(grayScale){for(var middle=qrcode.getMiddleBrightnessPerArea(grayScale),sqrtNumArea=middle.length,areaWidth=Math.floor(qrcode.width/sqrtNumArea),areaHeight=Math.floor(qrcode.height/sqrtNumArea),bitmap=new Array(qrcode.height*qrcode.width),ay=0;sqrtNumArea>ay;ay++)for(var ax=0;sqrtNumArea>ax;ax++)for(var dy=0;areaHeight>dy;dy++)for(var dx=0;areaWidth>dx;dx++)bitmap[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width]=grayScale[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width]from?this.length+from:from,this.push.apply(this,rest)};var MIN_SKIP=3,MAX_MODULES=57,INTEGER_MATH_SHIFT=8,CENTER_QUORUM=2;qrcode.orderBestPatterns=function(patterns){function distance(pattern1,pattern2){return xDiff=pattern1.X-pattern2.X,yDiff=pattern1.Y-pattern2.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)}function crossProductZ(pointA,pointB,pointC){var bX=pointB.x,bY=pointB.y;return(pointC.x-bX)*(pointA.y-bY)-(pointC.y-bY)*(pointA.x-bX)}var pointA,pointB,pointC,zeroOneDistance=distance(patterns[0],patterns[1]),oneTwoDistance=distance(patterns[1],patterns[2]),zeroTwoDistance=distance(patterns[0],patterns[2]);if(oneTwoDistance>=zeroOneDistance&&oneTwoDistance>=zeroTwoDistance?(pointB=patterns[0],pointA=patterns[1],pointC=patterns[2]):zeroTwoDistance>=oneTwoDistance&&zeroTwoDistance>=zeroOneDistance?(pointB=patterns[1],pointA=patterns[0],pointC=patterns[2]):(pointB=patterns[2],pointA=patterns[0],pointC=patterns[1]),crossProductZ(pointA,pointB,pointC)<0){var temp=pointA;pointA=pointC,pointC=temp}patterns[0]=pointA,patterns[1]=pointB,patterns[2]=pointC},function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){return function(c){return k(a.call(this,c),b)}}function d(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function e(){}function f(a){w(a),h(this,a)}function g(a){var b=q(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function h(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function i(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&qb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function j(a){return 0>a?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3); -break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&ju(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(NaN));for(f=0;fg)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(NaN);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 00:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;eb7yHzM=4t7n;odxOMNW=4* zv)Sza{{F=N^n~ryvy(G3Guhl!c4}%IG{)US%cBS5mV0evK6FrEuI3m`&#{_lP_CUOI)A228dy(g_HMT6 z*tM1hIqBdkG(Kw*xM;Sjrr|c2GvBh_SoVG=#3>r+Xbz*E-L3Hv3!a!p)0c zKSSZQ_^&_wGY=F0tMZIFcHT6aRhv3B^ymIRDG0#>q&sw%O`-&vK-}AZ|4~F7I=)OK zmOaO?>SC$-nrU7%oWum%3&y9c+bx$Z1w6lJ8#S_M+a{xyxY63JGAGs*F4nQE8E(_0 zhhn+u7#B$F-dREgL^)QV^GVS|hnp+FD;&dsSE|Z!T=-mzTEEU1?5yRJ^!a zezjgI?5r)ldb+i+xw%w0V-t6&Wq9DX(;R7+d9*-1sx+zNvd1mv97gNRD+VP$0qDj} zy=7_PDY+T;PR&rK?y8y7dPg(AP;O;1d(_EvC6u|BaoEpVhQn^2QNF8;WHLXV_}KuU z$Nh3t++y{mgC_U~%CmYI={@VNXY~@r)XW_Ut%pscRn2@IAHVi$;7vC4a*6;)uHjVMGZNri~ z4lL$Hced7Gdz1YVAD&uKw-YbD318|JP)5WFc5mCo@A;>6$(oUXl8cWAR=Xs%pk;H+qvrV?iQ)Tnulo{(K;M!n%l zHHYqRLEE5!W`jz!R?9aGvnJ%%R`QP$Ach@WGaxk>jIv(ZDKEV$Jz3h4kJ+8=W3W(q zx*>Jgoz3|16b_&~i<-%$V4(rtuM1qQ{RC~h*O%cnT<$@D?veXhRXw!ri@m_GW z;Z;bt;4rYDPr`msi`WRu;Gy4U?+=C@>)MOte{E6v$Cs}!jnjNu8I%Pi-AIoL=p0Uu z56MFlL)oF+(B#lmdM5pxiwjtkWKQ9GqOo{yVw+%&;0WOaf<=M}!4knTiS!U5N`x2@ z;zZ~rLV^fMBBY4WM{qyE0|cjuaE=IrL>MB%1tMG|!X+YHCiof=M+g}s_!hyctYU(v z+_wE(<|~a?Z&ohpmv``6?)!Esh0y!9euZX$UZtM^y+((JktQ5{ zsfmd`gygDN6)uC>`zn7_<@M|I`jjXn|Nh~FBuc`2@EzeIk~|K+-*VrzQyGNX>ZipU zco-K)FmN~VSKqc%(32OV?bT6;`rQ#2@ex^)e~rV81h~Z=1o_lVd{jISI%682(h!0~ zNc&4oN~{HmNL2!f2<@s+9K)#@gg_kx{dxuerg#p6lPVuR+Z#*4j7Q;d0O;4@VO9Jl zNubuMP!*v9i6nmy6-W{ZDi8!-R=(zf5^jC(ub_&m&eL(A59q{;tgq+v$zm42&3+pM z)Ti3|ba99a3ej&vC<#IV_gi)On^ZqSz^W_7PcgWv+|fVFyf1yu9qBVCiZh`iY>p3n zqsMZ`xlQi^5aS}U(t8Z7 z13jV}0LKM@M+3Mg1)E=40jGMpeFSo;#3!O3p@H^MsT2W&UJhgFnxA8+!sRNPxys{Q jWh+-H=PDBXeSt28SA&3RsxNr4bpJQ|0FeIxQ+=8*M*tao diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 5acf836..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,4 +0,0 @@ -User-agent: * -Disallow: /address -Disallow: /api -Disallow: /transaction diff --git a/public/sound/transaction.mp3 b/public/sound/transaction.mp3 deleted file mode 100644 index 57081caeea0cdb50eb594ca79c943be36faa4652..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12539 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:hover>td, .table-hover>tbody>tr:hover>th { - background-color: #F0F7E2; -} -.navbar { min-height: 64px; } -.navbar-default .navbar-toggle { - border-color: #fff; - margin-top: 15px; -} - -.navbar-default .navbar-toggle .icon-bar { background-color: #fff; } -.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {background-color: #373D42;} - -.navbar-default { - background-color: #8DC429; - margin: 0; - border: 0; -} - -.navbar-default .navbar-nav>li>a { - color: #F4FBE8; - font-family: 'Ubuntu', sans-serif; - padding-left: 20px; - padding-right: 20px; -} - -.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus { - background-color: #6C9032; - color: #fff; -} - -.navbar-default .navbar-nav>li>a:hover, .navbar-default .navbar-nav>.active>a:hover { - background-color: #fff; -} - -.navbar-form .form-group { - display: block; -} - -.navbar-form { - margin-top: 15px; -} - -.nav-tabs.nav-justified>li>a:hover { - cursor: pointer; -} - -.insight { - font-family: 'Ubuntu', sans-serif; - font-size: 34px; - font-style: italic; - font-weight: 700; - overflow: hidden; -} - -.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #fffffe; -} - -.navbar-default .navbar-brand { - color: #FFFFFF; - padding: 20px 15px; -} - -.navbar-form .form-control { - background-color: #7CAD23; - border-radius: 3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border: 0; - -webkit-box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); - -moz-box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); - box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); -} - -.navbar-nav>li>a { - padding-top: 22px; - padding-bottom: 22px; -} - -#search-form { color: #fff; } - -#search.loading { - background-image: url('../img/loading.gif'); - background-position: 5px center; - background-repeat: no-repeat; - padding-left: 25px; -} - -.loader-gif { - display: inline-block; - width: 16px; - height: 11px; - background: transparent url(../img/loading.gif) no-repeat; - margin-left: 5px; -} - -#search { color: #fff; } - -#search::-webkit-input-placeholder { - color: #BCDF7E; - font-family: 'Ubuntu', sans-serif; - font-style: italic; - font-weight: 100; -} - -#search::-moz-placeholder { - color: #BCDF7E; - font-family: 'Ubuntu', sans-serif; - font-weight: 100; -} - -.status { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - background-color: #597338; - border-radius: 3px; - margin: 15px 0; - padding: 8px 10px; - font-size: 12px; - color: #eee; - text-align: center; - margin-right: 10px; -} - -.status .tooltip { - margin: 0; -} - -.col-gray { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - background-color: #F4F4F4; - border-radius: 5px; - padding: 14px; - border: 1px solid #eee; -} - -.col-gray-responsive { - width: auto; -} - -.col-gray-fixed { - margin-top: 15px; - position: fixed; - width: 250px; - border: 1px solid #eee; - z-index: 1; -} - -.ellipsis { - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.line20 { - border: 1px solid #D4D4D4; - margin-bottom: 15px; -} - -.line10 { - border: 1px solid #EAEAEA; - margin: 10px 0; -} - -.block-id { - background-color: #373D42; - border: 3px solid #FFFFFF; - margin: 0 auto; - width: 165px; - color: #fff; - text-align: center; -} - -.block-id span { - font-size: 40px; - margin: 30px 0; -} - -.block-id h2 { - color: #FFFFFF; - font-weight: bold; - line-height: 30px; - font-size: 24px; - margin-top: 0; - margin-bottom: 10px; -} - -.icon-block { - color: #FFFFFF; - font-size: 35px; - margin-top: 10px; -} - -.icon-block h3 { - color: #fff; -} - -.block-tx { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - background-color: #F4F4F4; - border-radius: 2px; - margin: 20px 0 10px; - overflow: hidden; - padding: 15px; - border: 1px solid #eee; -} - -.btn { - border-radius: 2px; -} -.btn-primary { - background-color: #8DC429; - border: 2px solid #76AF0F; -} - -.btn-primary:hover, .btn-primary:focus, .btn-primary:active, -.btn-primary.active, .open .dropdown-toggle.btn-primary, -.btn-success:hover, .btn-success:focus, .btn-success:active, -.btn-success.active, .open .dropdown-toggle.btn-success, -.btn-danger:hover, .btn-danger:focus, .btn-danger:active, -.btn-danger.active, .open .dropdown-toggle.btn-danger { - background-color: #fff; - border: 2px solid #ccc; - color: #373D42; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { - background-color: #fff; -} - -.btn-default { - background-color: #E7E7E7; -} - -.btn-success { - background-color: #2FA4D7; - border: 2px solid #237FA7; -} - -.btn-danger { - background-color: #AC0015; - border: 2px solid #6C0000; -} - -.txvalues { - display: inline-block; - padding: .7em 2em; - font-size: 13px; - text-transform: uppercase; - font-weight:100; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.txvalues-primary { - background-color: #8DC429; -} - -.txvalues-default { - background-color: #EBEBEB; - color: #333; -} - -.txvalues-success { - background-color: #2FA4D7; -} - -.txvalues-danger { - background-color: #AC0015; -} - -.txvalues-normal { - background-color: transparent; - text-transform: none; - color: #333; - font-size: 14px; - font-weight: normal; -} -.progress-bar-info { background-color: #8DC429; } - -/* Set the fixed height of the footer here */ -#footer { - background-color: #373D42; - color: #fff; - height: 51px; - overflow: hidden; -} - -#footer a.insight { - font-size: 20px; - text-decoration: none; - color: #fff; -} - -#footer a.insight:hover { - color: #fffffe; -} - -#footer a.insight small { font-size: 11px; } -.line-footer { border-top: 2px dashed #ccc; } - -#footer .links { - color: #ddd; - font-size: 10px; -} - -#footer .links a { - color: #ddd; -} - -#footer .links a.selected { - color: #eee; - font-weight: bold; -} - -#footer .links a:hover { - text-decoration: none; - color: #fffffe; -} - -.line-bot { - border-bottom: 2px solid #EAEAEA; - padding: 0 0 10px 0; -} -.line-mid { padding: 15px;} -.line-top { - border-top: 1px solid #EAEAEA; - padding: 15px 0 0 0; -} - -/* Custom page CSS --------------------------------------------------- */ -/* Not required for template or sticky footer method. */ - -#wrap > .container { padding: 70px 15px 0; } - -#footer > .container { padding: auto 15px; } - -.code { font-size: 80%; } - -.address { font-size: 11px; } - -.no_matching { - -moz-border-radius-bottomleft: 2px; - -moz-border-radius-bottomright: 2px; - -webkit-border-bottom-left-radius: 2px; - -webkit-border-bottom-right-radius: 2px; - background-color: #FFFFFF; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - border-top: none; - border: 1px solid #64920F; - padding: 10px 20px; - position: absolute; - text-align: center; - top: 45px; - width: 300px; -} - -/*Animations*/ -.fader.ng-enter { - opacity: 0; - -webkit-transition: opacity 1s; - -moz-transition: opacity 1s; - -o-transition: opacity 1s; - transition: opacity 1s; -} - -.fader.ng-enter-active { opacity: 1; } - -.tx-bg { - background-color: #F4F4F4; - left: 0; - min-height: 340px; - position: absolute; - top: 0; - width: 100%; - z-index: -9999; -} - -.badge { - -moz-border-radius: 9px; - -webkit-border-radius: 9px; - background-color: #999999; - border-radius: 9px; - color: #ffffff; - font-size: 12.025px; - font-weight: bold; - padding: 1px 9px 2px; - white-space: nowrap; -} - -.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.badge-error { background-color: #b94a48; } -.badge-error:hover { background-color: #953b39; } -.badge-warning { background-color: #f89406; } -.badge-warning:hover { background-color: #c67605; } -.badge-success { background-color: #468847; } -.badge-success:hover { background-color: #356635; } -.badge-info { background-color: #3a87ad; } -.badge-info:hover { background-color: #2d6987; } -.badge-inverse { background-color: #333333; } -.badge-inverse:hover { background-color: #1a1a1a; } - -.status .t { - color: white; -} - -.status .text-danger { background: red; } - -.status .text-warning { - background: yellow; - color: black; -} - -.btn-copy { - color: #9b9b9b; - display: inline-block; - height: 16px; - width: 16px; - outline: none; - vertical-align: sub; -} - -.btn-expand { - color: #9b9b9b; - vertical-align: middle; -} - -.btn-copy:hover, .btn-expand:hover { - color: #000; - text-decoration: none; -} - -.btn-copy { - background: transparent url('../img/icons/copy.png') center center no-repeat; -} - -.btn-copy .tooltip { - display: block; - margin-left: 20px; - margin-top: -2px; - opacity: 0; -} -.btn-copy.zeroclipboard-is-hover { color: #2a6496; } -.btn-copy.zeroclipboard-is-active .tooltip { opacity: 1; } - -.tx-id { - background-color: #373D42; - border: 3px solid #FFFFFF; - margin: 0 auto; - width: 165px; - color: #FFFFFF; - text-align: center; -} - -.tx-id span { - font-size: 40px; - margin: 30px 0; -} - -.page-header { margin-top: 0; } - -.panel { margin-bottom: 1em;} -.panel-body { - padding: 0.7em; - word-wrap: break-word; -} - -/* Index */ -#home .btn-more { - border-top: 1px solid #ddd; - margin: 30px auto 0; - text-align: center; - width: 90%; -} -#home .btn-more .btn-default { - margin-top: -23px; -} - -#powered .powered-text { - border-top: 1px solid #ddd; - margin: 30px auto 0; - text-align: center; - width: 90%; -} -#powered .powered-text small { - background-color: #f4f4f4; - padding: 4px; - position: relative; - top: -12px; -} - -#powered a { - background-repeat: no-repeat; - background-position: center center; - display: inline-block; - float: left; - height: 45px; -} -#powered a.bitcore { - background-image: url('../img/logo.svg'); - background-size: 80px; - width: 30%; -} -#powered a.nodejs { - background-image: url('../img/nodejs.png'); - background-size: 80px; - width: 30%; -} -#powered a.angularjs { - background-image: url('../img/angularjs.png'); - background-size: 50px; - width: 20%; -} -#powered a.leveldb { - background-image: url('../img/leveldb.png'); - background-size: 50px; - width: 20%; -} - -@keyframes rotateThis { - from { transform: scale( 1 ) rotate( 0deg ); } - to { transform: scale( 1 ) rotate( 360deg ); } -} - -@-webkit-keyframes rotateThis { - from { -webkit-transform: scale( 1 ) rotate( 0deg ); } - to { -webkit-transform: scale( 1 ) rotate( 360deg ); } -} - -.icon-rotate { - animation-name: rotateThis; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - -webkit-animation-name: rotateThis; - -webkit-animation-duration: 2s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; -} - -.transaction-vin-vout { -} - -.v_highlight { - margin-bottom: 1em; - padding: 1em 0; - background-color: #e9e9e9; - overflow: hidden; - color: #333; -} - -a.v_highlight_more { - background-color: #F0F7E2; - color: #333; -} - -.secondary_navbar { - width: 100%; - background: #fff; - position: fixed; - top: 64px; - left: 0; - text-align: center; - z-index: 1000; - margin: 0 auto; - -moz-box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); - -webkit-box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); - box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); -} - -.secondary_navbar .container { - margin: 0 auto; - padding: 1.8em 0; -} - -.secondary_navbar h3, .secondary_navbar p, .secondary_navbar .lead { - margin: 0; -} - -.secondary_navbar p { - line-height: 1.9em; -} - -.hide_snavbar { - border-bottom-right-radius: 0.3em; - border-bottom-left-radius: 0.3em; - position: absolute; - right: 25px; - padding: 5px 10px; - background: #fff; - -moz-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); - -webkit-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); - box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); -} - -#search-form-mobile { - margin-top: 15px; -} - -@media (max-width: 991px) { - .status { - display: none; - } - .navbar-form { - width: auto; - } - .btn-copy { - display: none; - } - .col-gray-fixed { - position:static; - width: 100%; - margin-top: 0; - padding: 0; - } - .m50v { - margin: 15px 0; - } - .block-id span { - font-size: 24px; - margin: 10px 0; - } - .icon-block { - font-size: initial; - margin: 10px 0; - } - body { - font-size: 12px; - } - h1 { - font-size: 26px; - } - h2 { - font-size: 22px; - } - h3 { - font-size: 18px; - } - .insight { - font-size: 30px; - } - .navbar-default .navbar-nav>li>a { - padding-left: 15px; - padding-right: 15px; - } -} - -@media (max-width: 767px) { - .navbar-form { - width: auto; - } - .status { - display: none; - } - #wrap>.container { - padding: 50px 15px 0; - } - #ngProgress-container { - top: 50px; - } - body { - font-size: 11px; - } - h1 { - font-size: 24px; - } - h2 { - font-size: 20px; - } - .navbar-default .navbar-brand { - padding: 15px; - } - .insight { - font-size: 26px; - } - .navbar-nav>li>a { - padding-top: 15px; - padding-bottom: 15px; - } - .container { - padding-left: 0; - padding-right: 0; - } - .navbar-default .navbar-toggle { - margin-top: 7px; - } - .navbar { - min-height: 50px; - } - #search { color: #000; } - .txvalues { - display: block; - margin: 5px; - padding: 0.5em 2em; - font-size: 11px; - } - .navbar-default .navbar-nav .open .dropdown-menu>li>a { - color: #fff; - } - .txvalues { - display: inline; - margin: 0; - padding: 0; - font-weight: bold; - } - .txvalues-success { - background: none; - color: #2FA4D7; - } - .txvalues-primary { - background: none; - color: #8DC429; - } - .txvalues-default { - background: none; - color: #A09E9E; - } - .txvalues-danger { - background: none; - color: #AC0015; - } - .btn-expand { - font-size: 18px; - } -} - -@media (min-width: 1200px) { - .col-gray-fixed { - width: 280px; - } - .navbar-form .form-control { - width: 350px; - } -} - diff --git a/public/src/js/app.js b/public/src/js/app.js deleted file mode 100644 index d7318b1..0000000 --- a/public/src/js/app.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -var defaultLanguage = localStorage.getItem('insight-language') || 'en'; -var defaultCurrency = localStorage.getItem('insight-currency') || 'BTC'; - -angular.module('insight',[ - 'ngAnimate', - 'ngResource', - 'ngRoute', - 'ngProgress', - 'ui.bootstrap', - 'ui.route', - 'monospaced.qrcode', - 'gettext', - 'angularMoment', - 'insight.system', - 'insight.socket', - 'insight.api', - 'insight.blocks', - 'insight.transactions', - 'insight.address', - 'insight.search', - 'insight.status', - 'insight.connection', - 'insight.currency', - 'insight.messages' -]); - -angular.module('insight.system', []); -angular.module('insight.socket', []); -angular.module('insight.api', []); -angular.module('insight.blocks', []); -angular.module('insight.transactions', []); -angular.module('insight.address', []); -angular.module('insight.search', []); -angular.module('insight.status', []); -angular.module('insight.connection', []); -angular.module('insight.currency', []); -angular.module('insight.messages', []); diff --git a/public/src/js/config.js b/public/src/js/config.js deleted file mode 100644 index bb1801d..0000000 --- a/public/src/js/config.js +++ /dev/null @@ -1,77 +0,0 @@ -'use strict'; - -//Setting up route -angular.module('insight').config(function($routeProvider) { - $routeProvider. - when('/block/:blockHash', { - templateUrl: 'views/block.html', - title: 'Bitcoin Block ' - }). - when('/block-index/:blockHeight', { - controller: 'BlocksController', - templateUrl: 'views/redirect.html' - }). - when('/tx/send', { - templateUrl: 'views/transaction_sendraw.html', - title: 'Broadcast Raw Transaction' - }). - when('/tx/:txId/:v_type?/:v_index?', { - templateUrl: 'views/transaction.html', - title: 'Bitcoin Transaction ' - }). - when('/', { - templateUrl: 'views/index.html', - title: 'Home' - }). - when('/blocks', { - templateUrl: 'views/block_list.html', - title: 'Bitcoin Blocks solved Today' - }). - when('/blocks-date/:blockDate/:startTimestamp?', { - templateUrl: 'views/block_list.html', - title: 'Bitcoin Blocks solved ' - }). - when('/address/:addrStr', { - templateUrl: 'views/address.html', - title: 'Bitcoin Address ' - }). - when('/status', { - templateUrl: 'views/status.html', - title: 'Status' - }). - when('/messages/verify', { - templateUrl: 'views/messages_verify.html', - title: 'Verify Message' - }) - .otherwise({ - templateUrl: 'views/404.html', - title: 'Error' - }); -}); - -//Setting HTML5 Location Mode -angular.module('insight') - .config(function($locationProvider) { - $locationProvider.html5Mode(true); - $locationProvider.hashPrefix('!'); - }) - .run(function($rootScope, $route, $location, $routeParams, $anchorScroll, ngProgress, gettextCatalog, amMoment) { - gettextCatalog.currentLanguage = defaultLanguage; - amMoment.changeLocale(defaultLanguage); - $rootScope.$on('$routeChangeStart', function() { - ngProgress.start(); - }); - - $rootScope.$on('$routeChangeSuccess', function() { - ngProgress.complete(); - - //Change page title, based on Route information - $rootScope.titleDetail = ''; - $rootScope.title = $route.current.title; - $rootScope.isCollapsed = true; - $rootScope.currentAddr = null; - - $location.hash($routeParams.scrollTo); - $anchorScroll(); - }); - }); diff --git a/public/src/js/controllers/address.js b/public/src/js/controllers/address.js deleted file mode 100644 index 4524d34..0000000 --- a/public/src/js/controllers/address.js +++ /dev/null @@ -1,60 +0,0 @@ -'use strict'; - -angular.module('insight.address').controller('AddressController', - function($scope, $rootScope, $routeParams, $location, Global, Address, getSocket) { - $scope.global = Global; - - var socket = getSocket($scope); - var addrStr = $routeParams.addrStr; - - var _startSocket = function() { - socket.on('bitcoind/addresstxid', function(data) { - if (data.address === addrStr) { - $rootScope.$broadcast('tx', data.txid); - var base = document.querySelector('base'); - var beep = new Audio(base.href + '/sound/transaction.mp3'); - beep.play(); - } - }); - socket.emit('subscribe', 'bitcoind/addresstxid', [addrStr]); - }; - - var _stopSocket = function () { - socket.emit('unsubscribe', 'bitcoind/addresstxid', [addrStr]); - }; - - socket.on('connect', function() { - _startSocket(); - }); - - $scope.$on('$destroy', function(){ - _stopSocket(); - }); - - $scope.params = $routeParams; - - $scope.findOne = function() { - $rootScope.currentAddr = $routeParams.addrStr; - _startSocket(); - - Address.get({ - addrStr: $routeParams.addrStr - }, - function(address) { - $rootScope.titleDetail = address.addrStr.substring(0, 7) + '...'; - $rootScope.flashMessage = null; - $scope.address = address; - }, - function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Address: ' + $routeParams.addrStr; - } else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } else { - $rootScope.flashMessage = 'Address Not Found'; - } - $location.path('/'); - }); - }; - - }); diff --git a/public/src/js/controllers/blocks.js b/public/src/js/controllers/blocks.js deleted file mode 100644 index 4660672..0000000 --- a/public/src/js/controllers/blocks.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict'; - -angular.module('insight.blocks').controller('BlocksController', - function($scope, $rootScope, $routeParams, $location, Global, Block, Blocks, BlockByHeight) { - $scope.global = Global; - $scope.loading = false; - - if ($routeParams.blockHeight) { - BlockByHeight.get({ - blockHeight: $routeParams.blockHeight - }, function(hash) { - $location.path('/block/' + hash.blockHash); - }, function() { - $rootScope.flashMessage = 'Bad Request'; - $location.path('/'); - }); - } - - //Datepicker - var _formatTimestamp = function (date) { - var yyyy = date.getUTCFullYear().toString(); - var mm = (date.getUTCMonth() + 1).toString(); // getMonth() is zero-based - var dd = date.getUTCDate().toString(); - - return yyyy + '-' + (mm[1] ? mm : '0' + mm[0]) + '-' + (dd[1] ? dd : '0' + dd[0]); //padding - }; - - $scope.$watch('dt', function(newValue, oldValue) { - if (newValue !== oldValue) { - $location.path('/blocks-date/' + _formatTimestamp(newValue)); - } - }); - - $scope.openCalendar = function($event) { - $event.preventDefault(); - $event.stopPropagation(); - - $scope.opened = true; - }; - - $scope.humanSince = function(time) { - var m = moment.unix(time).startOf('day'); - var b = moment().startOf('day'); - return m.max().from(b); - }; - - - $scope.list = function() { - $scope.loading = true; - - if ($routeParams.blockDate) { - $scope.detail = 'On ' + $routeParams.blockDate; - } - - if ($routeParams.startTimestamp) { - var d=new Date($routeParams.startTimestamp*1000); - var m=d.getMinutes(); - if (m<10) m = '0' + m; - $scope.before = ' before ' + d.getHours() + ':' + m; - } - - $rootScope.titleDetail = $scope.detail; - - Blocks.get({ - blockDate: $routeParams.blockDate, - startTimestamp: $routeParams.startTimestamp - }, function(res) { - $scope.loading = false; - $scope.blocks = res.blocks; - $scope.pagination = res.pagination; - }); - }; - - $scope.findOne = function() { - $scope.loading = true; - - Block.get({ - blockHash: $routeParams.blockHash - }, function(block) { - $rootScope.titleDetail = block.height; - $rootScope.flashMessage = null; - $scope.loading = false; - $scope.block = block; - }, function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Transaction ID: ' + $routeParams.txId; - } - else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } - else { - $rootScope.flashMessage = 'Block Not Found'; - } - $location.path('/'); - }); - }; - - $scope.params = $routeParams; - -}); diff --git a/public/src/js/controllers/connection.js b/public/src/js/controllers/connection.js deleted file mode 100644 index 119c1b4..0000000 --- a/public/src/js/controllers/connection.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -angular.module('insight.connection').controller('ConnectionController', - function($scope, $window, Status, getSocket, PeerSync) { - - // Set initial values - $scope.apiOnline = true; - $scope.serverOnline = true; - $scope.clienteOnline = true; - - var socket = getSocket($scope); - - // Check for the node server connection - socket.on('connect', function() { - $scope.serverOnline = true; - socket.on('disconnect', function() { - $scope.serverOnline = false; - }); - }); - - // Check for the api connection - $scope.getConnStatus = function() { - PeerSync.get({}, - function(peer) { - $scope.apiOnline = peer.connected; - $scope.host = peer.host; - $scope.port = peer.port; - }, - function() { - $scope.apiOnline = false; - }); - }; - - socket.emit('subscribe', 'sync'); - socket.on('status', function(sync) { - $scope.sync = sync; - $scope.apiOnline = (sync.status !== 'aborted' && sync.status !== 'error'); - }); - - // Check for the client conneciton - $window.addEventListener('offline', function() { - $scope.$apply(function() { - $scope.clienteOnline = false; - }); - }, true); - - $window.addEventListener('online', function() { - $scope.$apply(function() { - $scope.clienteOnline = true; - }); - }, true); - - }); diff --git a/public/src/js/controllers/currency.js b/public/src/js/controllers/currency.js deleted file mode 100644 index 2ccbfe4..0000000 --- a/public/src/js/controllers/currency.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - -angular.module('insight.currency').controller('CurrencyController', - function($scope, $rootScope, Currency) { - $rootScope.currency.symbol = defaultCurrency; - - var _roundFloat = function(x, n) { - if(!parseInt(n, 10) || !parseFloat(x)) n = 0; - - return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); - }; - - $rootScope.currency.getConvertion = function(value) { - value = value * 1; // Convert to number - - if (!isNaN(value) && typeof value !== 'undefined' && value !== null) { - if (value === 0.00000000) return '0 ' + this.symbol; // fix value to show - - var response; - - if (this.symbol === 'USD') { - response = _roundFloat((value * this.factor), 2); - } else if (this.symbol === 'mBTC') { - this.factor = 1000; - response = _roundFloat((value * this.factor), 5); - } else if (this.symbol === 'bits') { - this.factor = 1000000; - response = _roundFloat((value * this.factor), 2); - } else { // assumes symbol is BTC - this.factor = 1; - response = _roundFloat((value * this.factor), 8); - } - // prevent sci notation - if (response < 1e-7) response=response.toFixed(8); - - return response + ' ' + this.symbol; - } - - return 'value error'; - }; - - $scope.setCurrency = function(currency) { - $rootScope.currency.symbol = currency; - localStorage.setItem('insight-currency', currency); - - if (currency === 'USD') { - Currency.get({}, function(res) { - $rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp; - }); - } else if (currency === 'mBTC') { - $rootScope.currency.factor = 1000; - } else if (currency === 'bits') { - $rootScope.currency.factor = 1000000; - } else { - $rootScope.currency.factor = 1; - } - }; - - // Get initial value - Currency.get({}, function(res) { - $rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp; - }); - - }); diff --git a/public/src/js/controllers/footer.js b/public/src/js/controllers/footer.js deleted file mode 100644 index 359242f..0000000 --- a/public/src/js/controllers/footer.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -angular.module('insight.system').controller('FooterController', - function($scope, $route, $templateCache, gettextCatalog, amMoment, Version) { - - $scope.defaultLanguage = defaultLanguage; - - var _getVersion = function() { - Version.get({}, - function(res) { - $scope.version = res.version; - }); - }; - - $scope.version = _getVersion(); - - $scope.availableLanguages = [{ - name: 'Deutsch', - isoCode: 'de_DE', - }, { - name: 'English', - isoCode: 'en', - }, { - name: 'Spanish', - isoCode: 'es', - }, { - name: 'Japanese', - isoCode: 'ja', - }]; - - $scope.setLanguage = function(isoCode) { - gettextCatalog.currentLanguage = $scope.defaultLanguage = defaultLanguage = isoCode; - amMoment.changeLocale(isoCode); - localStorage.setItem('insight-language', isoCode); - var currentPageTemplate = $route.current.templateUrl; - $templateCache.remove(currentPageTemplate); - $route.reload(); - }; - - }); diff --git a/public/src/js/controllers/header.js b/public/src/js/controllers/header.js deleted file mode 100644 index 1436034..0000000 --- a/public/src/js/controllers/header.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -angular.module('insight.system').controller('HeaderController', - function($scope, $rootScope, $modal, getSocket, Global, Block) { - $scope.global = Global; - - $rootScope.currency = { - factor: 1, - bitstamp: 0, - symbol: 'BTC' - }; - - $scope.menu = [{ - 'title': 'Blocks', - 'link': 'blocks' - }, { - 'title': 'Status', - 'link': 'status' - }]; - - $scope.openScannerModal = function() { - var modalInstance = $modal.open({ - templateUrl: 'scannerModal.html', - controller: 'ScannerController' - }); - }; - - var _getBlock = function(hash) { - Block.get({ - blockHash: hash - }, function(res) { - $scope.totalBlocks = res.height; - }); - }; - - var socket = getSocket($scope); - socket.on('connect', function() { - socket.emit('subscribe', 'inv'); - - socket.on('block', function(block) { - var blockHash = block.toString(); - _getBlock(blockHash); - }); - }); - - $rootScope.isCollapsed = true; - }); diff --git a/public/src/js/controllers/index.js b/public/src/js/controllers/index.js deleted file mode 100644 index 3434748..0000000 --- a/public/src/js/controllers/index.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -var TRANSACTION_DISPLAYED = 10; -var BLOCKS_DISPLAYED = 5; - -angular.module('insight.system').controller('IndexController', - function($scope, Global, getSocket, Blocks) { - $scope.global = Global; - - var _getBlocks = function() { - Blocks.get({ - limit: BLOCKS_DISPLAYED - }, function(res) { - $scope.blocks = res.blocks; - $scope.blocksLength = res.length; - }); - }; - - var socket = getSocket($scope); - - var _startSocket = function() { - socket.emit('subscribe', 'inv'); - socket.on('tx', function(tx) { - $scope.txs.unshift(tx); - if (parseInt($scope.txs.length, 10) >= parseInt(TRANSACTION_DISPLAYED, 10)) { - $scope.txs = $scope.txs.splice(0, TRANSACTION_DISPLAYED); - } - }); - - socket.on('block', function() { - _getBlocks(); - }); - }; - - socket.on('connect', function() { - _startSocket(); - }); - - - - $scope.humanSince = function(time) { - var m = moment.unix(time); - return m.max().fromNow(); - }; - - $scope.index = function() { - _getBlocks(); - _startSocket(); - }; - - $scope.txs = []; - $scope.blocks = []; - }); diff --git a/public/src/js/controllers/messages.js b/public/src/js/controllers/messages.js deleted file mode 100644 index 3c75193..0000000 --- a/public/src/js/controllers/messages.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -angular.module('insight.messages').controller('VerifyMessageController', - function($scope, $http, Api) { - $scope.message = { - address: '', - signature: '', - message: '' - }; - $scope.verification = { - status: 'unverified', // ready|loading|verified|error - result: null, - error: null, - address: '' - }; - - $scope.verifiable = function() { - return ($scope.message.address - && $scope.message.signature - && $scope.message.message); - }; - $scope.verify = function() { - $scope.verification.status = 'loading'; - $scope.verification.address = $scope.message.address; - $http.post(Api.apiPrefix + '/messages/verify', $scope.message) - .success(function(data, status, headers, config) { - if(typeof(data.result) != 'boolean') { - // API returned 200 but result was not true or false - $scope.verification.status = 'error'; - $scope.verification.error = null; - return; - } - - $scope.verification.status = 'verified'; - $scope.verification.result = data.result; - }) - .error(function(data, status, headers, config) { - $scope.verification.status = 'error'; - $scope.verification.error = data; - }); - }; - - // Hide the verify status message on form change - var unverify = function() { - $scope.verification.status = 'unverified'; - }; - $scope.$watch('message.address', unverify); - $scope.$watch('message.signature', unverify); - $scope.$watch('message.message', unverify); -}); diff --git a/public/src/js/controllers/scanner.js b/public/src/js/controllers/scanner.js deleted file mode 100644 index 6164fb9..0000000 --- a/public/src/js/controllers/scanner.js +++ /dev/null @@ -1,149 +0,0 @@ -'use strict'; - -angular.module('insight.system').controller('ScannerController', - function($scope, $rootScope, $modalInstance, Global) { - $scope.global = Global; - - // Detect mobile devices - var isMobile = { - Android: function() { - return navigator.userAgent.match(/Android/i); - }, - BlackBerry: function() { - return navigator.userAgent.match(/BlackBerry/i); - }, - iOS: function() { - return navigator.userAgent.match(/iPhone|iPad|iPod/i); - }, - Opera: function() { - return navigator.userAgent.match(/Opera Mini/i); - }, - Windows: function() { - return navigator.userAgent.match(/IEMobile/i); - }, - any: function() { - return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows()); - } - }; - - navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; - window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL; - - $scope.isMobile = isMobile.any(); - $scope.scannerLoading = false; - - var $searchInput = angular.element(document.getElementById('search')), - cameraInput, - video, - canvas, - $video, - context, - localMediaStream; - - var _scan = function(evt) { - if ($scope.isMobile) { - $scope.scannerLoading = true; - var files = evt.target.files; - - if (files.length === 1 && files[0].type.indexOf('image/') === 0) { - var file = files[0]; - - var reader = new FileReader(); - reader.onload = (function(theFile) { - return function(e) { - var mpImg = new MegaPixImage(file); - mpImg.render(canvas, { maxWidth: 200, maxHeight: 200, orientation: 6 }); - - setTimeout(function() { - qrcode.width = canvas.width; - qrcode.height = canvas.height; - qrcode.imagedata = context.getImageData(0, 0, qrcode.width, qrcode.height); - - try { - //alert(JSON.stringify(qrcode.process(context))); - qrcode.decode(); - } catch (e) { - alert(e); - } - }, 1500); - }; - })(file); - - // Read in the file as a data URL - reader.readAsDataURL(file); - } - } else { - if (localMediaStream) { - context.drawImage(video, 0, 0, 300, 225); - - try { - qrcode.decode(); - } catch(e) { - //qrcodeError(e); - } - } - - setTimeout(_scan, 500); - } - }; - - var _successCallback = function(stream) { - video.src = (window.URL && window.URL.createObjectURL(stream)) || stream; - localMediaStream = stream; - video.play(); - setTimeout(_scan, 1000); - }; - - var _scanStop = function() { - $scope.scannerLoading = false; - $modalInstance.close(); - if (!$scope.isMobile) { - if (localMediaStream.stop) localMediaStream.stop(); - localMediaStream = null; - video.src = ''; - } - }; - - var _videoError = function(err) { - console.log('Video Error: ' + JSON.stringify(err)); - _scanStop(); - }; - - qrcode.callback = function(data) { - _scanStop(); - - var str = (data.indexOf('bitcoin:') === 0) ? data.substring(8) : data; - console.log('QR code detected: ' + str); - $searchInput - .val(str) - .triggerHandler('change') - .triggerHandler('submit'); - }; - - $scope.cancel = function() { - _scanStop(); - }; - - $modalInstance.opened.then(function() { - $rootScope.isCollapsed = true; - - // Start the scanner - setTimeout(function() { - canvas = document.getElementById('qr-canvas'); - context = canvas.getContext('2d'); - - if ($scope.isMobile) { - cameraInput = document.getElementById('qrcode-camera'); - cameraInput.addEventListener('change', _scan, false); - } else { - video = document.getElementById('qrcode-scanner-video'); - $video = angular.element(video); - canvas.width = 300; - canvas.height = 225; - context.clearRect(0, 0, 300, 225); - - navigator.getUserMedia({video: true}, _successCallback, _videoError); - } - }, 500); - }); -}); diff --git a/public/src/js/controllers/search.js b/public/src/js/controllers/search.js deleted file mode 100644 index 7cb723c..0000000 --- a/public/src/js/controllers/search.js +++ /dev/null @@ -1,64 +0,0 @@ -'use strict'; - -angular.module('insight.search').controller('SearchController', - function($scope, $routeParams, $location, $timeout, Global, Block, Transaction, Address, BlockByHeight) { - $scope.global = Global; - $scope.loading = false; - - var _badQuery = function() { - $scope.badQuery = true; - - $timeout(function() { - $scope.badQuery = false; - }, 2000); - }; - - var _resetSearch = function() { - $scope.q = ''; - $scope.loading = false; - }; - - $scope.search = function() { - var q = $scope.q; - $scope.badQuery = false; - $scope.loading = true; - - Block.get({ - blockHash: q - }, function() { - _resetSearch(); - $location.path('block/' + q); - }, function() { //block not found, search on TX - Transaction.get({ - txId: q - }, function() { - _resetSearch(); - $location.path('tx/' + q); - }, function() { //tx not found, search on Address - Address.get({ - addrStr: q - }, function() { - _resetSearch(); - $location.path('address/' + q); - }, function() { // block by height not found - if (isFinite(q)) { // ensure that q is a finite number. A logical height value. - BlockByHeight.get({ - blockHeight: q - }, function(hash) { - _resetSearch(); - $location.path('/block/' + hash.blockHash); - }, function() { //not found, fail :( - $scope.loading = false; - _badQuery(); - }); - } - else { - $scope.loading = false; - _badQuery(); - } - }); - }); - }); - }; - -}); diff --git a/public/src/js/controllers/status.js b/public/src/js/controllers/status.js deleted file mode 100644 index 617b806..0000000 --- a/public/src/js/controllers/status.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -angular.module('insight.status').controller('StatusController', - function($scope, $routeParams, $location, Global, Status, Sync, getSocket) { - $scope.global = Global; - - $scope.getStatus = function(q) { - Status.get({ - q: 'get' + q - }, - function(d) { - $scope.loaded = 1; - angular.extend($scope, d); - }, - function(e) { - $scope.error = 'API ERROR: ' + e.data; - }); - }; - - $scope.humanSince = function(time) { - var m = moment.unix(time / 1000); - return m.max().fromNow(); - }; - - var _onSyncUpdate = function(sync) { - $scope.sync = sync; - }; - - var _startSocket = function () { - socket.emit('subscribe', 'sync'); - socket.on('status', function(sync) { - _onSyncUpdate(sync); - }); - }; - - var socket = getSocket($scope); - socket.on('connect', function() { - _startSocket(); - }); - - - $scope.getSync = function() { - _startSocket(); - Sync.get({}, - function(sync) { - _onSyncUpdate(sync); - }, - function(e) { - var err = 'Could not get sync information' + e.toString(); - $scope.sync = { - error: err - }; - }); - }; - }); diff --git a/public/src/js/controllers/transactions.js b/public/src/js/controllers/transactions.js deleted file mode 100644 index 0e02ec1..0000000 --- a/public/src/js/controllers/transactions.js +++ /dev/null @@ -1,213 +0,0 @@ -'use strict'; - -angular.module('insight.transactions').controller('transactionsController', -function($scope, $rootScope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress) { - $scope.global = Global; - $scope.loading = false; - $scope.loadedBy = null; - - var pageNum = 0; - var pagesTotal = 1; - var COIN = 100000000; - - var _aggregateItems = function(items) { - if (!items) return []; - - var l = items.length; - - var ret = []; - var tmp = {}; - var u = 0; - - for(var i=0; i < l; i++) { - - var notAddr = false; - // non standard input - if (items[i].scriptSig && !items[i].addr) { - items[i].addr = 'Unparsed address [' + u++ + ']'; - items[i].notAddr = true; - notAddr = true; - } - - // non standard output - if (items[i].scriptPubKey && !items[i].scriptPubKey.addresses) { - items[i].scriptPubKey.addresses = ['Unparsed address [' + u++ + ']']; - items[i].notAddr = true; - notAddr = true; - } - - // multiple addr at output - if (items[i].scriptPubKey && items[i].scriptPubKey.addresses.length > 1) { - items[i].addr = items[i].scriptPubKey.addresses.join(','); - ret.push(items[i]); - continue; - } - - var addr = items[i].addr || (items[i].scriptPubKey && items[i].scriptPubKey.addresses[0]); - - if (!tmp[addr]) { - tmp[addr] = {}; - tmp[addr].valueSat = 0; - tmp[addr].count = 0; - tmp[addr].addr = addr; - tmp[addr].items = []; - } - tmp[addr].isSpent = items[i].spentTxId; - - tmp[addr].doubleSpentTxID = tmp[addr].doubleSpentTxID || items[i].doubleSpentTxID; - tmp[addr].doubleSpentIndex = tmp[addr].doubleSpentIndex || items[i].doubleSpentIndex; - tmp[addr].dbError = tmp[addr].dbError || items[i].dbError; - tmp[addr].valueSat += Math.round(items[i].value * COIN); - tmp[addr].items.push(items[i]); - tmp[addr].notAddr = notAddr; - - if (items[i].unconfirmedInput) - tmp[addr].unconfirmedInput = true; - - tmp[addr].count++; - } - - angular.forEach(tmp, function(v) { - v.value = v.value || parseInt(v.valueSat) / COIN; - ret.push(v); - }); - return ret; - }; - - var _processTX = function(tx) { - tx.vinSimple = _aggregateItems(tx.vin); - tx.voutSimple = _aggregateItems(tx.vout); - }; - - var _paginate = function(data) { - $scope.loading = false; - - pagesTotal = data.pagesTotal; - pageNum += 1; - - data.txs.forEach(function(tx) { - _processTX(tx); - $scope.txs.push(tx); - }); - }; - - var _byBlock = function() { - TransactionsByBlock.get({ - block: $routeParams.blockHash, - pageNum: pageNum - }, function(data) { - _paginate(data); - }); - }; - - var _byAddress = function () { - TransactionsByAddress.get({ - address: $routeParams.addrStr, - pageNum: pageNum - }, function(data) { - _paginate(data); - }); - }; - - var _findTx = function(txid) { - Transaction.get({ - txId: txid - }, function(tx) { - $rootScope.titleDetail = tx.txid.substring(0,7) + '...'; - $rootScope.flashMessage = null; - $scope.tx = tx; - _processTX(tx); - $scope.txs.unshift(tx); - }, function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Transaction ID: ' + $routeParams.txId; - } - else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } - else { - $rootScope.flashMessage = 'Transaction Not Found'; - } - - $location.path('/'); - }); - }; - - $scope.findThis = function() { - _findTx($routeParams.txId); - }; - - //Initial load - $scope.load = function(from) { - $scope.loadedBy = from; - $scope.loadMore(); - }; - - //Load more transactions for pagination - $scope.loadMore = function() { - if (pageNum < pagesTotal && !$scope.loading) { - $scope.loading = true; - - if ($scope.loadedBy === 'address') { - _byAddress(); - } - else { - _byBlock(); - } - } - }; - - // Highlighted txout - if ($routeParams.v_type == '>' || $routeParams.v_type == '<') { - $scope.from_vin = $routeParams.v_type == '<' ? true : false; - $scope.from_vout = $routeParams.v_type == '>' ? true : false; - $scope.v_index = parseInt($routeParams.v_index); - $scope.itemsExpanded = true; - } - - //Init without txs - $scope.txs = []; - - $scope.$on('tx', function(event, txid) { - _findTx(txid); - }); - -}); - -angular.module('insight.transactions').controller('SendRawTransactionController', - function($scope, $http, Api) { - $scope.transaction = ''; - $scope.status = 'ready'; // ready|loading|sent|error - $scope.txid = ''; - $scope.error = null; - - $scope.formValid = function() { - return !!$scope.transaction; - }; - $scope.send = function() { - var postData = { - rawtx: $scope.transaction - }; - $scope.status = 'loading'; - $http.post(Api.apiPrefix + '/tx/send', postData) - .success(function(data, status, headers, config) { - if(typeof(data.txid) != 'string') { - // API returned 200 but the format is not known - $scope.status = 'error'; - $scope.error = 'The transaction was sent but no transaction id was got back'; - return; - } - - $scope.status = 'sent'; - $scope.txid = data.txid; - }) - .error(function(data, status, headers, config) { - $scope.status = 'error'; - if(data) { - $scope.error = data; - } else { - $scope.error = "No error message given (connection error?)" - } - }); - }; -}); diff --git a/public/src/js/directives.js b/public/src/js/directives.js deleted file mode 100644 index 4426c42..0000000 --- a/public/src/js/directives.js +++ /dev/null @@ -1,91 +0,0 @@ -'use strict'; - -var ZeroClipboard = window.ZeroClipboard; - -angular.module('insight') - .directive('scroll', function ($window) { - return function(scope, element, attrs) { - angular.element($window).bind('scroll', function() { - if (this.pageYOffset >= 200) { - scope.secondaryNavbar = true; - } else { - scope.secondaryNavbar = false; - } - scope.$apply(); - }); - }; - }) - .directive('whenScrolled', function($window) { - return { - restric: 'A', - link: function(scope, elm, attr) { - var pageHeight, clientHeight, scrollPos; - $window = angular.element($window); - - var handler = function() { - pageHeight = window.document.documentElement.scrollHeight; - clientHeight = window.document.documentElement.clientHeight; - scrollPos = window.pageYOffset; - - if (pageHeight - (scrollPos + clientHeight) === 0) { - scope.$apply(attr.whenScrolled); - } - }; - - $window.on('scroll', handler); - - scope.$on('$destroy', function() { - return $window.off('scroll', handler); - }); - } - }; - }) - .directive('clipCopy', function() { - ZeroClipboard.config({ - moviePath: '/lib/zeroclipboard/ZeroClipboard.swf', - trustedDomains: ['*'], - allowScriptAccess: 'always', - forceHandCursor: true - }); - - return { - restric: 'A', - scope: { clipCopy: '=clipCopy' }, - template: '
    Copied!
    ', - link: function(scope, elm) { - var clip = new ZeroClipboard(elm); - - clip.on('load', function(client) { - var onMousedown = function(client) { - client.setText(scope.clipCopy); - }; - - client.on('mousedown', onMousedown); - - scope.$on('$destroy', function() { - client.off('mousedown', onMousedown); - }); - }); - - clip.on('noFlash wrongflash', function() { - return elm.remove(); - }); - } - }; - }) - .directive('focus', function ($timeout) { - return { - scope: { - trigger: '@focus' - }, - link: function (scope, element) { - scope.$watch('trigger', function (value) { - if (value === "true") { - $timeout(function () { - element[0].focus(); - }); - } - }); - } - }; - }); diff --git a/public/src/js/filters.js b/public/src/js/filters.js deleted file mode 100644 index 223d049..0000000 --- a/public/src/js/filters.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -angular.module('insight') - .filter('startFrom', function() { - return function(input, start) { - start = +start; //parse to int - return input.slice(start); - } - }) - .filter('split', function() { - return function(input, delimiter) { - var delimiter = delimiter || ','; - return input.split(delimiter); - } - }); diff --git a/public/src/js/init.js b/public/src/js/init.js deleted file mode 100644 index 53aa43f..0000000 --- a/public/src/js/init.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -angular.element(document).ready(function() { - // Init the app - // angular.bootstrap(document, ['insight']); -}); diff --git a/public/src/js/ios-imagefile-megapixel/megapix-image.js b/public/src/js/ios-imagefile-megapixel/megapix-image.js deleted file mode 100644 index ad7b278..0000000 --- a/public/src/js/ios-imagefile-megapixel/megapix-image.js +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Mega pixel image rendering library for iOS6 Safari - * - * Fixes iOS6 Safari's image file rendering issue for large size image (over mega-pixel), - * which causes unexpected subsampling when drawing it in canvas. - * By using this library, you can safely render the image with proper stretching. - * - * Copyright (c) 2012 Shinichi Tomita - * Released under the MIT license - */ -(function() { - - /** - * Detect subsampling in loaded image. - * In iOS, larger images than 2M pixels may be subsampled in rendering. - */ - function detectSubsampling(img) { - var iw = img.naturalWidth, ih = img.naturalHeight; - if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, -iw + 1, 0); - // subsampled image becomes half smaller in rendering size. - // check alpha channel value to confirm image is covering edge pixel or not. - // if alpha value is 0 image is not covering, hence subsampled. - return ctx.getImageData(0, 0, 1, 1).data[3] === 0; - } else { - return false; - } - } - - /** - * Detecting vertical squash in loaded image. - * Fixes a bug which squash image vertically while drawing into canvas for some images. - */ - function detectVerticalSquash(img, iw, ih) { - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = ih; - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, 0, 0); - var data = ctx.getImageData(0, 0, 1, ih).data; - // search image edge pixel position in case it is squashed vertically. - var sy = 0; - var ey = ih; - var py = ih; - while (py > sy) { - var alpha = data[(py - 1) * 4 + 3]; - if (alpha === 0) { - ey = py; - } else { - sy = py; - } - py = (ey + sy) >> 1; - } - var ratio = (py / ih); - return (ratio===0)?1:ratio; - } - - /** - * Rendering image element (with resizing) and get its data URL - */ - function renderImageToDataURL(img, options, doSquash) { - var canvas = document.createElement('canvas'); - renderImageToCanvas(img, canvas, options, doSquash); - return canvas.toDataURL("image/jpeg", options.quality || 0.8); - } - - /** - * Rendering image element (with resizing) into the canvas element - */ - function renderImageToCanvas(img, canvas, options, doSquash) { - var iw = img.naturalWidth, ih = img.naturalHeight; - var width = options.width, height = options.height; - var ctx = canvas.getContext('2d'); - ctx.save(); - transformCoordinate(canvas, width, height, options.orientation); - var subsampled = detectSubsampling(img); - if (subsampled) { - iw /= 2; - ih /= 2; - } - var d = 1024; // size of tiling canvas - var tmpCanvas = document.createElement('canvas'); - tmpCanvas.width = tmpCanvas.height = d; - var tmpCtx = tmpCanvas.getContext('2d'); - var vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1; - var dw = Math.ceil(d * width / iw); - var dh = Math.ceil(d * height / ih / vertSquashRatio); - var sy = 0; - var dy = 0; - while (sy < ih) { - var sx = 0; - var dx = 0; - while (sx < iw) { - tmpCtx.clearRect(0, 0, d, d); - tmpCtx.drawImage(img, -sx, -sy); - ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh); - sx += d; - dx += dw; - } - sy += d; - dy += dh; - } - ctx.restore(); - tmpCanvas = tmpCtx = null; - } - - /** - * Transform canvas coordination according to specified frame size and orientation - * Orientation value is from EXIF tag - */ - function transformCoordinate(canvas, width, height, orientation) { - switch (orientation) { - case 5: - case 6: - case 7: - case 8: - canvas.width = height; - canvas.height = width; - break; - default: - canvas.width = width; - canvas.height = height; - } - var ctx = canvas.getContext('2d'); - switch (orientation) { - case 2: - // horizontal flip - ctx.translate(width, 0); - ctx.scale(-1, 1); - break; - case 3: - // 180 rotate left - ctx.translate(width, height); - ctx.rotate(Math.PI); - break; - case 4: - // vertical flip - ctx.translate(0, height); - ctx.scale(1, -1); - break; - case 5: - // vertical flip + 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.scale(1, -1); - break; - case 6: - // 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.translate(0, -height); - break; - case 7: - // horizontal flip + 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.translate(width, -height); - ctx.scale(-1, 1); - break; - case 8: - // 90 rotate left - ctx.rotate(-0.5 * Math.PI); - ctx.translate(-width, 0); - break; - default: - break; - } - } - - - /** - * MegaPixImage class - */ - function MegaPixImage(srcImage) { - if (window.Blob && srcImage instanceof Blob) { - var img = new Image(); - var URL = window.URL && window.URL.createObjectURL ? window.URL : - window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : - null; - if (!URL) { throw Error("No createObjectURL function found to create blob url"); } - img.src = URL.createObjectURL(srcImage); - this.blob = srcImage; - srcImage = img; - } - if (!srcImage.naturalWidth && !srcImage.naturalHeight) { - var _this = this; - srcImage.onload = function() { - var listeners = _this.imageLoadListeners; - if (listeners) { - _this.imageLoadListeners = null; - for (var i=0, len=listeners.length; i maxWidth) { - width = maxWidth; - height = (imgHeight * width / imgWidth) << 0; - } - if (maxHeight && height > maxHeight) { - height = maxHeight; - width = (imgWidth * height / imgHeight) << 0; - } - var opt = { width : width, height : height }; - for (var k in options) opt[k] = options[k]; - - var tagName = target.tagName.toLowerCase(); - if (tagName === 'img') { - target.src = renderImageToDataURL(this.srcImage, opt, doSquash); - } else if (tagName === 'canvas') { - renderImageToCanvas(this.srcImage, target, opt, doSquash); - } - if (typeof this.onrender === 'function') { - this.onrender(target); - } - }; - - /** - * Export class to global - */ - if (typeof define === 'function' && define.amd) { - define([], function() { return MegaPixImage; }); // for AMD loader - } else { - this.MegaPixImage = MegaPixImage; - } - -})(); diff --git a/public/src/js/jsqrcode/alignpat.js b/public/src/js/jsqrcode/alignpat.js deleted file mode 100644 index 967473f..0000000 --- a/public/src/js/jsqrcode/alignpat.js +++ /dev/null @@ -1,279 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function AlignmentPattern(posX, posY, estimatedModuleSize) -{ - this.x=posX; - this.y=posY; - this.count = 1; - this.estimatedModuleSize = estimatedModuleSize; - - this.__defineGetter__("EstimatedModuleSize", function() - { - return this.estimatedModuleSize; - }); - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("X", function() - { - return Math.floor(this.x); - }); - this.__defineGetter__("Y", function() - { - return Math.floor(this.y); - }); - this.incrementCount = function() - { - this.count++; - } - this.aboutEquals=function( moduleSize, i, j) - { - if (Math.abs(i - this.y) <= moduleSize && Math.abs(j - this.x) <= moduleSize) - { - var moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff / this.estimatedModuleSize <= 1.0; - } - return false; - } - -} - -function AlignmentPatternFinder( image, startX, startY, width, height, moduleSize, resultPointCallback) -{ - this.image = image; - this.possibleCenters = new Array(); - this.startX = startX; - this.startY = startY; - this.width = width; - this.height = height; - this.moduleSize = moduleSize; - this.crossCheckStateCount = new Array(0,0,0); - this.resultPointCallback = resultPointCallback; - - this.centerFromEnd=function(stateCount, end) - { - return (end - stateCount[2]) - stateCount[1] / 2.0; - } - this.foundPatternCross = function(stateCount) - { - var moduleSize = this.moduleSize; - var maxVariance = moduleSize / 2.0; - for (var i = 0; i < 3; i++) - { - if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) - { - return false; - } - } - return true; - } - - this.crossCheckVertical=function( startI, centerJ, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxI = qrcode.height; - var stateCount = this.crossCheckStateCount; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - - // Start counting up from center - var i = startI; - while (i >= 0 && image[centerJ + i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (i >= 0 && !image[centerJ + i*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image[centerJ + i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i++; - } - if (i == maxI || stateCount[1] > maxCount) - { - return NaN; - } - while (i < maxI && !image[centerJ + i*qrcode.width] && stateCount[2] <= maxCount) - { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) - { - return NaN; - } - - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, i):NaN; - } - - this.handlePossibleCenter=function( stateCount, i, j) - { - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - var centerJ = this.centerFromEnd(stateCount, j); - var centerI = this.crossCheckVertical(i, Math.floor (centerJ), 2 * stateCount[1], stateCountTotal); - if (!isNaN(centerI)) - { - var estimatedModuleSize = (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0; - var max = this.possibleCenters.length; - for (var index = 0; index < max; index++) - { - var center = this.possibleCenters[index]; - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) - { - return new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - } - } - // Hadn't found this before; save it - var point = new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - this.possibleCenters.push(point); - if (this.resultPointCallback != null) - { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return null; - } - - this.find = function() - { - var startX = this.startX; - var height = this.height; - var maxJ = startX + width; - var middleI = startY + (height >> 1); - // We are looking for black/white/black modules in 1:1:1 ratio; - // this tracks the number of black/white/black modules seen so far - var stateCount = new Array(0,0,0); - for (var iGen = 0; iGen < height; iGen++) - { - // Search from middle outwards - var i = middleI + ((iGen & 0x01) == 0?((iGen + 1) >> 1):- ((iGen + 1) >> 1)); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - var j = startX; - // Burn off leading white pixels before anything else; if we start in the middle of - // a white run, it doesn't make sense to count its length, since we don't know if the - // white run continued to the left of the start point - while (j < maxJ && !image[j + qrcode.width* i]) - { - j++; - } - var currentState = 0; - while (j < maxJ) - { - if (image[j + i*qrcode.width]) - { - // Black pixel - if (currentState == 1) - { - // Counting black pixels - stateCount[currentState]++; - } - else - { - // Counting white pixels - if (currentState == 2) - { - // A winner? - if (this.foundPatternCross(stateCount)) - { - // Yes - var confirmed = this.handlePossibleCenter(stateCount, i, j); - if (confirmed != null) - { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } - else - { - stateCount[++currentState]++; - } - } - } - else - { - // White pixel - if (currentState == 1) - { - // Counting black pixels - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (this.foundPatternCross(stateCount)) - { - var confirmed = this.handlePossibleCenter(stateCount, i, maxJ); - if (confirmed != null) - { - return confirmed; - } - } - } - - // Hmm, nothing we saw was observed and confirmed twice. If we had - // any guess at all, return it. - if (!(this.possibleCenters.length == 0)) - { - return this.possibleCenters[0]; - } - - throw "Couldn't find enough alignment patterns"; - } - -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/bitmat.js b/public/src/js/jsqrcode/bitmat.js deleted file mode 100644 index 5b00784..0000000 --- a/public/src/js/jsqrcode/bitmat.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function BitMatrix( width, height) -{ - if(!height) - height=width; - if (width < 1 || height < 1) - { - throw "Both dimensions must be greater than 0"; - } - this.width = width; - this.height = height; - var rowSize = width >> 5; - if ((width & 0x1f) != 0) - { - rowSize++; - } - this.rowSize = rowSize; - this.bits = new Array(rowSize * height); - for(var i=0;i> 5); - return ((URShift(this.bits[offset], (x & 0x1f))) & 1) != 0; - } - this.set_Renamed=function( x, y) - { - var offset = y * this.rowSize + (x >> 5); - this.bits[offset] |= 1 << (x & 0x1f); - } - this.flip=function( x, y) - { - var offset = y * this.rowSize + (x >> 5); - this.bits[offset] ^= 1 << (x & 0x1f); - } - this.clear=function() - { - var max = this.bits.length; - for (var i = 0; i < max; i++) - { - this.bits[i] = 0; - } - } - this.setRegion=function( left, top, width, height) - { - if (top < 0 || left < 0) - { - throw "Left and top must be nonnegative"; - } - if (height < 1 || width < 1) - { - throw "Height and width must be at least 1"; - } - var right = left + width; - var bottom = top + height; - if (bottom > this.height || right > this.width) - { - throw "The region must fit inside the matrix"; - } - for (var y = top; y < bottom; y++) - { - var offset = y * this.rowSize; - for (var x = left; x < right; x++) - { - this.bits[offset + (x >> 5)] |= 1 << (x & 0x1f); - } - } - } -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/bmparser.js b/public/src/js/jsqrcode/bmparser.js deleted file mode 100644 index 51c6e85..0000000 --- a/public/src/js/jsqrcode/bmparser.js +++ /dev/null @@ -1,203 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function BitMatrixParser(bitMatrix) -{ - var dimension = bitMatrix.Dimension; - if (dimension < 21 || (dimension & 0x03) != 1) - { - throw "Error BitMatrixParser"; - } - this.bitMatrix = bitMatrix; - this.parsedVersion = null; - this.parsedFormatInfo = null; - - this.copyBit=function( i, j, versionBits) - { - return this.bitMatrix.get_Renamed(i, j)?(versionBits << 1) | 0x1:versionBits << 1; - } - - this.readFormatInformation=function() - { - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - - // Read top-left format info bits - var formatInfoBits = 0; - for (var i = 0; i < 6; i++) - { - formatInfoBits = this.copyBit(i, 8, formatInfoBits); - } - // .. and skip a bit in the timing pattern ... - formatInfoBits = this.copyBit(7, 8, formatInfoBits); - formatInfoBits = this.copyBit(8, 8, formatInfoBits); - formatInfoBits = this.copyBit(8, 7, formatInfoBits); - // .. and skip a bit in the timing pattern ... - for (var j = 5; j >= 0; j--) - { - formatInfoBits = this.copyBit(8, j, formatInfoBits); - } - - this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits); - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - - // Hmm, failed. Try the top-right/bottom-left pattern - var dimension = this.bitMatrix.Dimension; - formatInfoBits = 0; - var iMin = dimension - 8; - for (var i = dimension - 1; i >= iMin; i--) - { - formatInfoBits = this.copyBit(i, 8, formatInfoBits); - } - for (var j = dimension - 7; j < dimension; j++) - { - formatInfoBits = this.copyBit(8, j, formatInfoBits); - } - - this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits); - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - throw "Error readFormatInformation"; - } - this.readVersion=function() - { - - if (this.parsedVersion != null) - { - return this.parsedVersion; - } - - var dimension = this.bitMatrix.Dimension; - - var provisionalVersion = (dimension - 17) >> 2; - if (provisionalVersion <= 6) - { - return Version.getVersionForNumber(provisionalVersion); - } - - // Read top-right version info: 3 wide by 6 tall - var versionBits = 0; - var ijMin = dimension - 11; - for (var j = 5; j >= 0; j--) - { - for (var i = dimension - 9; i >= ijMin; i--) - { - versionBits = this.copyBit(i, j, versionBits); - } - } - - this.parsedVersion = Version.decodeVersionInformation(versionBits); - if (this.parsedVersion != null && this.parsedVersion.DimensionForVersion == dimension) - { - return this.parsedVersion; - } - - // Hmm, failed. Try bottom left: 6 wide by 3 tall - versionBits = 0; - for (var i = 5; i >= 0; i--) - { - for (var j = dimension - 9; j >= ijMin; j--) - { - versionBits = this.copyBit(i, j, versionBits); - } - } - - this.parsedVersion = Version.decodeVersionInformation(versionBits); - if (this.parsedVersion != null && this.parsedVersion.DimensionForVersion == dimension) - { - return this.parsedVersion; - } - throw "Error readVersion"; - } - this.readCodewords=function() - { - - var formatInfo = this.readFormatInformation(); - var version = this.readVersion(); - - // Get the data mask for the format used in this QR Code. This will exclude - // some bits from reading as we wind through the bit matrix. - var dataMask = DataMask.forReference( formatInfo.DataMask); - var dimension = this.bitMatrix.Dimension; - dataMask.unmaskBitMatrix(this.bitMatrix, dimension); - - var functionPattern = version.buildFunctionPattern(); - - var readingUp = true; - var result = new Array(version.TotalCodewords); - var resultOffset = 0; - var currentByte = 0; - var bitsRead = 0; - // Read columns in pairs, from right to left - for (var j = dimension - 1; j > 0; j -= 2) - { - if (j == 6) - { - // Skip whole column with vertical alignment pattern; - // saves time and makes the other code proceed more cleanly - j--; - } - // Read alternatingly from bottom to top then top to bottom - for (var count = 0; count < dimension; count++) - { - var i = readingUp?dimension - 1 - count:count; - for (var col = 0; col < 2; col++) - { - // Ignore bits covered by the function pattern - if (!functionPattern.get_Renamed(j - col, i)) - { - // Read a bit - bitsRead++; - currentByte <<= 1; - if (this.bitMatrix.get_Renamed(j - col, i)) - { - currentByte |= 1; - } - // If we've made a whole byte, save it off - if (bitsRead == 8) - { - result[resultOffset++] = currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp ^= true; // readingUp = !readingUp; // switch directions - } - if (resultOffset != version.TotalCodewords) - { - throw "Error readCodewords"; - } - return result; - } -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/datablock.js b/public/src/js/jsqrcode/datablock.js deleted file mode 100644 index 3cb277a..0000000 --- a/public/src/js/jsqrcode/datablock.js +++ /dev/null @@ -1,117 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function DataBlock(numDataCodewords, codewords) -{ - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - - this.__defineGetter__("NumDataCodewords", function() - { - return this.numDataCodewords; - }); - this.__defineGetter__("Codewords", function() - { - return this.codewords; - }); -} - -DataBlock.getDataBlocks=function(rawCodewords, version, ecLevel) -{ - - if (rawCodewords.length != version.TotalCodewords) - { - throw "ArgumentException"; - } - - // Figure out the number and size of data blocks used by this version and - // error correction level - var ecBlocks = version.getECBlocksForLevel(ecLevel); - - // First count the total number of data blocks - var totalBlocks = 0; - var ecBlockArray = ecBlocks.getECBlocks(); - for (var i = 0; i < ecBlockArray.length; i++) - { - totalBlocks += ecBlockArray[i].Count; - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - var result = new Array(totalBlocks); - var numResultBlocks = 0; - for (var j = 0; j < ecBlockArray.length; j++) - { - var ecBlock = ecBlockArray[j]; - for (var i = 0; i < ecBlock.Count; i++) - { - var numDataCodewords = ecBlock.DataCodewords; - var numBlockCodewords = ecBlocks.ECCodewordsPerBlock + numDataCodewords; - result[numResultBlocks++] = new DataBlock(numDataCodewords, new Array(numBlockCodewords)); - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - var shorterBlocksTotalCodewords = result[0].codewords.length; - var longerBlocksStartAt = result.length - 1; - while (longerBlocksStartAt >= 0) - { - var numCodewords = result[longerBlocksStartAt].codewords.length; - if (numCodewords == shorterBlocksTotalCodewords) - { - break; - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - - var shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.ECCodewordsPerBlock; - // The last elements of result may be 1 element longer; - // first fill out as many elements as all of them have - var rawCodewordsOffset = 0; - for (var i = 0; i < shorterBlocksNumDataCodewords; i++) - { - for (var j = 0; j < numResultBlocks; j++) - { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (var j = longerBlocksStartAt; j < numResultBlocks; j++) - { - result[j].codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - var max = result[0].codewords.length; - for (var i = shorterBlocksNumDataCodewords; i < max; i++) - { - for (var j = 0; j < numResultBlocks; j++) - { - var iOffset = j < longerBlocksStartAt?i:i + 1; - result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - return result; -} diff --git a/public/src/js/jsqrcode/databr.js b/public/src/js/jsqrcode/databr.js deleted file mode 100644 index 66279c4..0000000 --- a/public/src/js/jsqrcode/databr.js +++ /dev/null @@ -1,325 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function QRCodeDataBlockReader(blocks, version, numErrorCorrectionCode) -{ - this.blockPointer = 0; - this.bitPointer = 7; - this.dataLength = 0; - this.blocks = blocks; - this.numErrorCorrectionCode = numErrorCorrectionCode; - if (version <= 9) - this.dataLengthMode = 0; - else if (version >= 10 && version <= 26) - this.dataLengthMode = 1; - else if (version >= 27 && version <= 40) - this.dataLengthMode = 2; - - this.getNextBits = function( numBits) - { - var bits = 0; - if (numBits < this.bitPointer + 1) - { - // next word fits into current data block - var mask = 0; - for (var i = 0; i < numBits; i++) - { - mask += (1 << i); - } - mask <<= (this.bitPointer - numBits + 1); - - bits = (this.blocks[this.blockPointer] & mask) >> (this.bitPointer - numBits + 1); - this.bitPointer -= numBits; - return bits; - } - else if (numBits < this.bitPointer + 1 + 8) - { - // next word crosses 2 data blocks - var mask1 = 0; - for (var i = 0; i < this.bitPointer + 1; i++) - { - mask1 += (1 << i); - } - bits = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1)); - this.blockPointer++; - bits += ((this.blocks[this.blockPointer]) >> (8 - (numBits - (this.bitPointer + 1)))); - - this.bitPointer = this.bitPointer - numBits % 8; - if (this.bitPointer < 0) - { - this.bitPointer = 8 + this.bitPointer; - } - return bits; - } - else if (numBits < this.bitPointer + 1 + 16) - { - // next word crosses 3 data blocks - var mask1 = 0; // mask of first block - var mask3 = 0; // mask of 3rd block - //bitPointer + 1 : number of bits of the 1st block - //8 : number of the 2nd block (note that use already 8bits because next word uses 3 data blocks) - //numBits - (bitPointer + 1 + 8) : number of bits of the 3rd block - for (var i = 0; i < this.bitPointer + 1; i++) - { - mask1 += (1 << i); - } - var bitsFirstBlock = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1)); - this.blockPointer++; - - var bitsSecondBlock = this.blocks[this.blockPointer] << (numBits - (this.bitPointer + 1 + 8)); - this.blockPointer++; - - for (var i = 0; i < numBits - (this.bitPointer + 1 + 8); i++) - { - mask3 += (1 << i); - } - mask3 <<= 8 - (numBits - (this.bitPointer + 1 + 8)); - var bitsThirdBlock = (this.blocks[this.blockPointer] & mask3) >> (8 - (numBits - (this.bitPointer + 1 + 8))); - - bits = bitsFirstBlock + bitsSecondBlock + bitsThirdBlock; - this.bitPointer = this.bitPointer - (numBits - 8) % 8; - if (this.bitPointer < 0) - { - this.bitPointer = 8 + this.bitPointer; - } - return bits; - } - else - { - return 0; - } - } - this.NextMode=function() - { - if ((this.blockPointer > this.blocks.length - this.numErrorCorrectionCode - 2)) - return 0; - else - return this.getNextBits(4); - } - this.getDataLength=function( modeIndicator) - { - var index = 0; - while (true) - { - if ((modeIndicator >> index) == 1) - break; - index++; - } - - return this.getNextBits(qrcode.sizeOfDataLengthInfo[this.dataLengthMode][index]); - } - this.getRomanAndFigureString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var strData = ""; - var tableRomanAndFigure = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':'); - do - { - if (length > 1) - { - intData = this.getNextBits(11); - var firstLetter = Math.floor(intData / 45); - var secondLetter = intData % 45; - strData += tableRomanAndFigure[firstLetter]; - strData += tableRomanAndFigure[secondLetter]; - length -= 2; - } - else if (length == 1) - { - intData = this.getNextBits(6); - strData += tableRomanAndFigure[intData]; - length -= 1; - } - } - while (length > 0); - - return strData; - } - this.getFigureString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var strData = ""; - do - { - if (length >= 3) - { - intData = this.getNextBits(10); - if (intData < 100) - strData += "0"; - if (intData < 10) - strData += "0"; - length -= 3; - } - else if (length == 2) - { - intData = this.getNextBits(7); - if (intData < 10) - strData += "0"; - length -= 2; - } - else if (length == 1) - { - intData = this.getNextBits(4); - length -= 1; - } - strData += intData; - } - while (length > 0); - - return strData; - } - this.get8bitByteArray=function( dataLength) - { - var length = dataLength; - var intData = 0; - var output = new Array(); - - do - { - intData = this.getNextBits(8); - output.push( intData); - length--; - } - while (length > 0); - return output; - } - this.getKanjiString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var unicodeString = ""; - do - { - intData = getNextBits(13); - var lowerByte = intData % 0xC0; - var higherByte = intData / 0xC0; - - var tempWord = (higherByte << 8) + lowerByte; - var shiftjisWord = 0; - if (tempWord + 0x8140 <= 0x9FFC) - { - // between 8140 - 9FFC on Shift_JIS character set - shiftjisWord = tempWord + 0x8140; - } - else - { - // between E040 - EBBF on Shift_JIS character set - shiftjisWord = tempWord + 0xC140; - } - - //var tempByte = new Array(0,0); - //tempByte[0] = (sbyte) (shiftjisWord >> 8); - //tempByte[1] = (sbyte) (shiftjisWord & 0xFF); - //unicodeString += new String(SystemUtils.ToCharArray(SystemUtils.ToByteArray(tempByte))); - unicodeString += String.fromCharCode(shiftjisWord); - length--; - } - while (length > 0); - - - return unicodeString; - } - - this.__defineGetter__("DataByte", function() - { - var output = new Array(); - var MODE_NUMBER = 1; - var MODE_ROMAN_AND_NUMBER = 2; - var MODE_8BIT_BYTE = 4; - var MODE_KANJI = 8; - do - { - var mode = this.NextMode(); - //canvas.println("mode: " + mode); - if (mode == 0) - { - if (output.length > 0) - break; - else - throw "Empty data block"; - } - //if (mode != 1 && mode != 2 && mode != 4 && mode != 8) - // break; - //} - if (mode != MODE_NUMBER && mode != MODE_ROMAN_AND_NUMBER && mode != MODE_8BIT_BYTE && mode != MODE_KANJI) - { - /* canvas.println("Invalid mode: " + mode); - mode = guessMode(mode); - canvas.println("Guessed mode: " + mode); */ - throw "Invalid mode: " + mode + " in (block:" + this.blockPointer + " bit:" + this.bitPointer + ")"; - } - dataLength = this.getDataLength(mode); - if (dataLength < 1) - throw "Invalid data length: " + dataLength; - //canvas.println("length: " + dataLength); - switch (mode) - { - - case MODE_NUMBER: - //canvas.println("Mode: Figure"); - var temp_str = this.getFigureString(dataLength); - var ta = new Array(temp_str.length); - for(var j=0;j 7) - { - throw "System.ArgumentException"; - } - return DataMask.DATA_MASKS[reference]; -} - -function DataMask000() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return ((i + j) & 0x01) == 0; - } -} - -function DataMask001() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (i & 0x01) == 0; - } -} - -function DataMask010() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return j % 3 == 0; - } -} - -function DataMask011() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (i + j) % 3 == 0; - } -} - -function DataMask100() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (((URShift(i, 1)) + (j / 3)) & 0x01) == 0; - } -} - -function DataMask101() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - var temp = i * j; - return (temp & 0x01) + (temp % 3) == 0; - } -} - -function DataMask110() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - var temp = i * j; - return (((temp & 0x01) + (temp % 3)) & 0x01) == 0; - } -} -function DataMask111() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0; - } -} - -DataMask.DATA_MASKS = new Array(new DataMask000(), new DataMask001(), new DataMask010(), new DataMask011(), new DataMask100(), new DataMask101(), new DataMask110(), new DataMask111()); - diff --git a/public/src/js/jsqrcode/decoder.js b/public/src/js/jsqrcode/decoder.js deleted file mode 100644 index 58467c3..0000000 --- a/public/src/js/jsqrcode/decoder.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -Decoder={}; -Decoder.rsDecoder = new ReedSolomonDecoder(GF256.QR_CODE_FIELD); - -Decoder.correctErrors=function( codewordBytes, numDataCodewords) -{ - var numCodewords = codewordBytes.length; - // First read into an array of ints - var codewordsInts = new Array(numCodewords); - for (var i = 0; i < numCodewords; i++) - { - codewordsInts[i] = codewordBytes[i] & 0xFF; - } - var numECCodewords = codewordBytes.length - numDataCodewords; - try - { - Decoder.rsDecoder.decode(codewordsInts, numECCodewords); - //var corrector = new ReedSolomon(codewordsInts, numECCodewords); - //corrector.correct(); - } - catch ( rse) - { - throw rse; - } - // Copy back into array of bytes -- only need to worry about the bytes that were data - // We don't care about errors in the error-correction codewords - for (var i = 0; i < numDataCodewords; i++) - { - codewordBytes[i] = codewordsInts[i]; - } -} - -Decoder.decode=function(bits) -{ - var parser = new BitMatrixParser(bits); - var version = parser.readVersion(); - var ecLevel = parser.readFormatInformation().ErrorCorrectionLevel; - - // Read codewords - var codewords = parser.readCodewords(); - - // Separate into data blocks - var dataBlocks = DataBlock.getDataBlocks(codewords, version, ecLevel); - - // Count total number of data bytes - var totalBytes = 0; - for (var i = 0; i < dataBlocks.length; i++) - { - totalBytes += dataBlocks[i].NumDataCodewords; - } - var resultBytes = new Array(totalBytes); - var resultOffset = 0; - - // Error-correct and copy data blocks together into a stream of bytes - for (var j = 0; j < dataBlocks.length; j++) - { - var dataBlock = dataBlocks[j]; - var codewordBytes = dataBlock.Codewords; - var numDataCodewords = dataBlock.NumDataCodewords; - Decoder.correctErrors(codewordBytes, numDataCodewords); - for (var i = 0; i < numDataCodewords; i++) - { - resultBytes[resultOffset++] = codewordBytes[i]; - } - } - - // Decode the contents of that stream of bytes - var reader = new QRCodeDataBlockReader(resultBytes, version.VersionNumber, ecLevel.Bits); - return reader; - //return DecodedBitStreamParser.decode(resultBytes, version, ecLevel); -} diff --git a/public/src/js/jsqrcode/detector.js b/public/src/js/jsqrcode/detector.js deleted file mode 100644 index 012f8c5..0000000 --- a/public/src/js/jsqrcode/detector.js +++ /dev/null @@ -1,413 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function PerspectiveTransform( a11, a21, a31, a12, a22, a32, a13, a23, a33) -{ - this.a11 = a11; - this.a12 = a12; - this.a13 = a13; - this.a21 = a21; - this.a22 = a22; - this.a23 = a23; - this.a31 = a31; - this.a32 = a32; - this.a33 = a33; - this.transformPoints1=function( points) - { - var max = points.length; - var a11 = this.a11; - var a12 = this.a12; - var a13 = this.a13; - var a21 = this.a21; - var a22 = this.a22; - var a23 = this.a23; - var a31 = this.a31; - var a32 = this.a32; - var a33 = this.a33; - for (var i = 0; i < max; i += 2) - { - var x = points[i]; - var y = points[i + 1]; - var denominator = a13 * x + a23 * y + a33; - points[i] = (a11 * x + a21 * y + a31) / denominator; - points[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } - } - this. transformPoints2=function(xValues, yValues) - { - var n = xValues.length; - for (var i = 0; i < n; i++) - { - var x = xValues[i]; - var y = yValues[i]; - var denominator = this.a13 * x + this.a23 * y + this.a33; - xValues[i] = (this.a11 * x + this.a21 * y + this.a31) / denominator; - yValues[i] = (this.a12 * x + this.a22 * y + this.a32) / denominator; - } - } - - this.buildAdjoint=function() - { - // Adjoint is the transpose of the cofactor matrix: - return new PerspectiveTransform(this.a22 * this.a33 - this.a23 * this.a32, this.a23 * this.a31 - this.a21 * this.a33, this.a21 * this.a32 - this.a22 * this.a31, this.a13 * this.a32 - this.a12 * this.a33, this.a11 * this.a33 - this.a13 * this.a31, this.a12 * this.a31 - this.a11 * this.a32, this.a12 * this.a23 - this.a13 * this.a22, this.a13 * this.a21 - this.a11 * this.a23, this.a11 * this.a22 - this.a12 * this.a21); - } - this.times=function( other) - { - return new PerspectiveTransform(this.a11 * other.a11 + this.a21 * other.a12 + this.a31 * other.a13, this.a11 * other.a21 + this.a21 * other.a22 + this.a31 * other.a23, this.a11 * other.a31 + this.a21 * other.a32 + this.a31 * other.a33, this.a12 * other.a11 + this.a22 * other.a12 + this.a32 * other.a13, this.a12 * other.a21 + this.a22 * other.a22 + this.a32 * other.a23, this.a12 * other.a31 + this.a22 * other.a32 + this.a32 * other.a33, this.a13 * other.a11 + this.a23 * other.a12 +this.a33 * other.a13, this.a13 * other.a21 + this.a23 * other.a22 + this.a33 * other.a23, this.a13 * other.a31 + this.a23 * other.a32 + this.a33 * other.a33); - } - -} - -PerspectiveTransform.quadrilateralToQuadrilateral=function( x0, y0, x1, y1, x2, y2, x3, y3, x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p) -{ - - var qToS = this.quadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); - var sToQ = this.squareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); - return sToQ.times(qToS); -} - -PerspectiveTransform.squareToQuadrilateral=function( x0, y0, x1, y1, x2, y2, x3, y3) -{ - dy2 = y3 - y2; - dy3 = y0 - y1 + y2 - y3; - if (dy2 == 0.0 && dy3 == 0.0) - { - return new PerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0, y2 - y1, y0, 0.0, 0.0, 1.0); - } - else - { - dx1 = x1 - x2; - dx2 = x3 - x2; - dx3 = x0 - x1 + x2 - x3; - dy1 = y1 - y2; - denominator = dx1 * dy2 - dx2 * dy1; - a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return new PerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, a13, a23, 1.0); - } -} - -PerspectiveTransform.quadrilateralToSquare=function( x0, y0, x1, y1, x2, y2, x3, y3) -{ - // Here, the adjoint serves as the inverse: - return this.squareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3).buildAdjoint(); -} - -function DetectorResult(bits, points) -{ - this.bits = bits; - this.points = points; -} - - -function Detector(image) -{ - this.image=image; - this.resultPointCallback = null; - - this.sizeOfBlackWhiteBlackRun=function( fromX, fromY, toX, toY) - { - // Mild variant of Bresenham's algorithm; - // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm - var steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) - { - var temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - var dx = Math.abs(toX - fromX); - var dy = Math.abs(toY - fromY); - var error = - dx >> 1; - var ystep = fromY < toY?1:- 1; - var xstep = fromX < toX?1:- 1; - var state = 0; // In black pixels, looking for white, first or second time - for (var x = fromX, y = fromY; x != toX; x += xstep) - { - - var realX = steep?y:x; - var realY = steep?x:y; - if (state == 1) - { - // In white pixels, looking for black - if (this.image[realX + realY*qrcode.width]) - { - state++; - } - } - else - { - if (!this.image[realX + realY*qrcode.width]) - { - state++; - } - } - - if (state == 3) - { - // Found black, white, black, and stumbled back onto white; done - var diffX = x - fromX; - var diffY = y - fromY; - return Math.sqrt( (diffX * diffX + diffY * diffY)); - } - error += dy; - if (error > 0) - { - if (y == toY) - { - break; - } - y += ystep; - error -= dx; - } - } - var diffX2 = toX - fromX; - var diffY2 = toY - fromY; - return Math.sqrt( (diffX2 * diffX2 + diffY2 * diffY2)); - } - - - this.sizeOfBlackWhiteBlackRunBothWays=function( fromX, fromY, toX, toY) - { - - var result = this.sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - - // Now count other way -- don't run off image though of course - var scale = 1.0; - var otherToX = fromX - (toX - fromX); - if (otherToX < 0) - { - scale = fromX / (fromX - otherToX); - otherToX = 0; - } - else if (otherToX >= qrcode.width) - { - scale = (qrcode.width - 1 - fromX) / (otherToX - fromX); - otherToX = qrcode.width - 1; - } - var otherToY = Math.floor (fromY - (toY - fromY) * scale); - - scale = 1.0; - if (otherToY < 0) - { - scale = fromY / (fromY - otherToY); - otherToY = 0; - } - else if (otherToY >= qrcode.height) - { - scale = (qrcode.height - 1 - fromY) / (otherToY - fromY); - otherToY = qrcode.height - 1; - } - otherToX = Math.floor (fromX + (otherToX - fromX) * scale); - - result += this.sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - return result - 1.0; // -1 because we counted the middle pixel twice - } - - - - this.calculateModuleSizeOneWay=function( pattern, otherPattern) - { - var moduleSizeEst1 = this.sizeOfBlackWhiteBlackRunBothWays(Math.floor( pattern.X), Math.floor( pattern.Y), Math.floor( otherPattern.X), Math.floor(otherPattern.Y)); - var moduleSizeEst2 = this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(otherPattern.X), Math.floor(otherPattern.Y), Math.floor( pattern.X), Math.floor(pattern.Y)); - if (isNaN(moduleSizeEst1)) - { - return moduleSizeEst2 / 7.0; - } - if (isNaN(moduleSizeEst2)) - { - return moduleSizeEst1 / 7.0; - } - // Average them, and divide by 7 since we've counted the width of 3 black modules, - // and 1 white and 1 black module on either side. Ergo, divide sum by 14. - return (moduleSizeEst1 + moduleSizeEst2) / 14.0; - } - - - this.calculateModuleSize=function( topLeft, topRight, bottomLeft) - { - // Take the average - return (this.calculateModuleSizeOneWay(topLeft, topRight) + this.calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0; - } - - this.distance=function( pattern1, pattern2) - { - xDiff = pattern1.X - pattern2.X; - yDiff = pattern1.Y - pattern2.Y; - return Math.sqrt( (xDiff * xDiff + yDiff * yDiff)); - } - this.computeDimension=function( topLeft, topRight, bottomLeft, moduleSize) - { - - var tltrCentersDimension = Math.round(this.distance(topLeft, topRight) / moduleSize); - var tlblCentersDimension = Math.round(this.distance(topLeft, bottomLeft) / moduleSize); - var dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; - switch (dimension & 0x03) - { - - // mod 4 - case 0: - dimension++; - break; - // 1? do nothing - - case 2: - dimension--; - break; - - case 3: - throw "Error"; - } - return dimension; - } - - this.findAlignmentInRegion=function( overallEstModuleSize, estAlignmentX, estAlignmentY, allowanceFactor) - { - // Look for an alignment pattern (3 modules in size) around where it - // should be - var allowance = Math.floor (allowanceFactor * overallEstModuleSize); - var alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); - var alignmentAreaRightX = Math.min(qrcode.width - 1, estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) - { - throw "Error"; - } - - var alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); - var alignmentAreaBottomY = Math.min(qrcode.height - 1, estAlignmentY + allowance); - - var alignmentFinder = new AlignmentPatternFinder(this.image, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize, this.resultPointCallback); - return alignmentFinder.find(); - } - - this.createTransform=function( topLeft, topRight, bottomLeft, alignmentPattern, dimension) - { - var dimMinusThree = dimension - 3.5; - var bottomRightX; - var bottomRightY; - var sourceBottomRightX; - var sourceBottomRightY; - if (alignmentPattern != null) - { - bottomRightX = alignmentPattern.X; - bottomRightY = alignmentPattern.Y; - sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0; - } - else - { - // Don't have an alignment pattern, just make up the bottom-right point - bottomRightX = (topRight.X - topLeft.X) + bottomLeft.X; - bottomRightY = (topRight.Y - topLeft.Y) + bottomLeft.Y; - sourceBottomRightX = sourceBottomRightY = dimMinusThree; - } - - var transform = PerspectiveTransform.quadrilateralToQuadrilateral(3.5, 3.5, dimMinusThree, 3.5, sourceBottomRightX, sourceBottomRightY, 3.5, dimMinusThree, topLeft.X, topLeft.Y, topRight.X, topRight.Y, bottomRightX, bottomRightY, bottomLeft.X, bottomLeft.Y); - - return transform; - } - - this.sampleGrid=function( image, transform, dimension) - { - - var sampler = GridSampler; - return sampler.sampleGrid3(image, dimension, transform); - } - - this.processFinderPatternInfo = function( info) - { - - var topLeft = info.TopLeft; - var topRight = info.TopRight; - var bottomLeft = info.BottomLeft; - - var moduleSize = this.calculateModuleSize(topLeft, topRight, bottomLeft); - if (moduleSize < 1.0) - { - throw "Error"; - } - var dimension = this.computeDimension(topLeft, topRight, bottomLeft, moduleSize); - var provisionalVersion = Version.getProvisionalVersionForDimension(dimension); - var modulesBetweenFPCenters = provisionalVersion.DimensionForVersion - 7; - - var alignmentPattern = null; - // Anything above version 1 has an alignment pattern - if (provisionalVersion.AlignmentPatternCenters.length > 0) - { - - // Guess where a "bottom right" finder pattern would have been - var bottomRightX = topRight.X - topLeft.X + bottomLeft.X; - var bottomRightY = topRight.Y - topLeft.Y + bottomLeft.Y; - - // Estimate that alignment pattern is closer by 3 modules - // from "bottom right" to known top left location - var correctionToTopLeft = 1.0 - 3.0 / modulesBetweenFPCenters; - var estAlignmentX = Math.floor (topLeft.X + correctionToTopLeft * (bottomRightX - topLeft.X)); - var estAlignmentY = Math.floor (topLeft.Y + correctionToTopLeft * (bottomRightY - topLeft.Y)); - - // Kind of arbitrary -- expand search radius before giving up - for (var i = 4; i <= 16; i <<= 1) - { - //try - //{ - alignmentPattern = this.findAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, i); - break; - //} - //catch (re) - //{ - // try next round - //} - } - // If we didn't find alignment pattern... well try anyway without it - } - - var transform = this.createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension); - - var bits = this.sampleGrid(this.image, transform, dimension); - - var points; - if (alignmentPattern == null) - { - points = new Array(bottomLeft, topLeft, topRight); - } - else - { - points = new Array(bottomLeft, topLeft, topRight, alignmentPattern); - } - return new DetectorResult(bits, points); - } - - - - this.detect=function() - { - var info = new FinderPatternFinder().findFinderPattern(this.image); - - return this.processFinderPatternInfo(info); - } -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/errorlevel.js b/public/src/js/jsqrcode/errorlevel.js deleted file mode 100644 index 222398e..0000000 --- a/public/src/js/jsqrcode/errorlevel.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function ErrorCorrectionLevel(ordinal, bits, name) -{ - this.ordinal_Renamed_Field = ordinal; - this.bits = bits; - this.name = name; - this.__defineGetter__("Bits", function() - { - return this.bits; - }); - this.__defineGetter__("Name", function() - { - return this.name; - }); - this.ordinal=function() - { - return this.ordinal_Renamed_Field; - } -} - -ErrorCorrectionLevel.forBits=function( bits) -{ - if (bits < 0 || bits >= FOR_BITS.length) - { - throw "ArgumentException"; - } - return FOR_BITS[bits]; -} - -var L = new ErrorCorrectionLevel(0, 0x01, "L"); -var M = new ErrorCorrectionLevel(1, 0x00, "M"); -var Q = new ErrorCorrectionLevel(2, 0x03, "Q"); -var H = new ErrorCorrectionLevel(3, 0x02, "H"); -var FOR_BITS = new Array( M, L, H, Q); diff --git a/public/src/js/jsqrcode/findpat.js b/public/src/js/jsqrcode/findpat.js deleted file mode 100644 index ad1547b..0000000 --- a/public/src/js/jsqrcode/findpat.js +++ /dev/null @@ -1,649 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -var MIN_SKIP = 3; -var MAX_MODULES = 57; -var INTEGER_MATH_SHIFT = 8; -var CENTER_QUORUM = 2; - -qrcode.orderBestPatterns=function(patterns) - { - - function distance( pattern1, pattern2) - { - xDiff = pattern1.X - pattern2.X; - yDiff = pattern1.Y - pattern2.Y; - return Math.sqrt( (xDiff * xDiff + yDiff * yDiff)); - } - - /// Returns the z component of the cross product between vectors BC and BA. - function crossProductZ( pointA, pointB, pointC) - { - var bX = pointB.x; - var bY = pointB.y; - return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); - } - - - // Find distances between pattern centers - var zeroOneDistance = distance(patterns[0], patterns[1]); - var oneTwoDistance = distance(patterns[1], patterns[2]); - var zeroTwoDistance = distance(patterns[0], patterns[2]); - - var pointA, pointB, pointC; - // Assume one closest to other two is B; A and C will just be guesses at first - if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) - { - pointB = patterns[0]; - pointA = patterns[1]; - pointC = patterns[2]; - } - else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) - { - pointB = patterns[1]; - pointA = patterns[0]; - pointC = patterns[2]; - } - else - { - pointB = patterns[2]; - pointA = patterns[0]; - pointC = patterns[1]; - } - - // Use cross product to figure out whether A and C are correct or flipped. - // This asks whether BC x BA has a positive z component, which is the arrangement - // we want for A, B, C. If it's negative, then we've got it flipped around and - // should swap A and C. - if (crossProductZ(pointA, pointB, pointC) < 0.0) - { - var temp = pointA; - pointA = pointC; - pointC = temp; - } - - patterns[0] = pointA; - patterns[1] = pointB; - patterns[2] = pointC; - } - - -function FinderPattern(posX, posY, estimatedModuleSize) -{ - this.x=posX; - this.y=posY; - this.count = 1; - this.estimatedModuleSize = estimatedModuleSize; - - this.__defineGetter__("EstimatedModuleSize", function() - { - return this.estimatedModuleSize; - }); - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("X", function() - { - return this.x; - }); - this.__defineGetter__("Y", function() - { - return this.y; - }); - this.incrementCount = function() - { - this.count++; - } - this.aboutEquals=function( moduleSize, i, j) - { - if (Math.abs(i - this.y) <= moduleSize && Math.abs(j - this.x) <= moduleSize) - { - var moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff / this.estimatedModuleSize <= 1.0; - } - return false; - } - -} - -function FinderPatternInfo(patternCenters) -{ - this.bottomLeft = patternCenters[0]; - this.topLeft = patternCenters[1]; - this.topRight = patternCenters[2]; - this.__defineGetter__("BottomLeft", function() - { - return this.bottomLeft; - }); - this.__defineGetter__("TopLeft", function() - { - return this.topLeft; - }); - this.__defineGetter__("TopRight", function() - { - return this.topRight; - }); -} - -function FinderPatternFinder() -{ - this.image=null; - this.possibleCenters = []; - this.hasSkipped = false; - this.crossCheckStateCount = new Array(0,0,0,0,0); - this.resultPointCallback = null; - - this.__defineGetter__("CrossCheckStateCount", function() - { - this.crossCheckStateCount[0] = 0; - this.crossCheckStateCount[1] = 0; - this.crossCheckStateCount[2] = 0; - this.crossCheckStateCount[3] = 0; - this.crossCheckStateCount[4] = 0; - return this.crossCheckStateCount; - }); - - this.foundPatternCross=function( stateCount) - { - var totalModuleSize = 0; - for (var i = 0; i < 5; i++) - { - var count = stateCount[i]; - if (count == 0) - { - return false; - } - totalModuleSize += count; - } - if (totalModuleSize < 7) - { - return false; - } - var moduleSize = Math.floor((totalModuleSize << INTEGER_MATH_SHIFT) / 7); - var maxVariance = Math.floor(moduleSize / 2); - // Allow less than 50% variance from 1-1-3-1-1 proportions - return Math.abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance && Math.abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; - } - this.centerFromEnd=function( stateCount, end) - { - return (end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0; - } - this.crossCheckVertical=function( startI, centerJ, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxI = qrcode.height; - var stateCount = this.CrossCheckStateCount; - - // Start counting up from center - var i = startI; - while (i >= 0 && image[centerJ + i*qrcode.width]) - { - stateCount[2]++; - i--; - } - if (i < 0) - { - return NaN; - } - while (i >= 0 && !image[centerJ +i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (i >= 0 && image[centerJ + i*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image[centerJ +i*qrcode.width]) - { - stateCount[2]++; - i++; - } - if (i == maxI) - { - return NaN; - } - while (i < maxI && !image[centerJ + i*qrcode.width] && stateCount[3] < maxCount) - { - stateCount[3]++; - i++; - } - if (i == maxI || stateCount[3] >= maxCount) - { - return NaN; - } - while (i < maxI && image[centerJ + i*qrcode.width] && stateCount[4] < maxCount) - { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) - { - return NaN; - } - - // If we found a finder-pattern-like section, but its size is more than 40% different than - // the original, assume it's a false positive - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, i):NaN; - } - this.crossCheckHorizontal=function( startJ, centerI, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxJ = qrcode.width; - var stateCount = this.CrossCheckStateCount; - - var j = startJ; - while (j >= 0 && image[j+ centerI*qrcode.width]) - { - stateCount[2]++; - j--; - } - if (j < 0) - { - return NaN; - } - while (j >= 0 && !image[j+ centerI*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (j >= 0 && image[j+ centerI*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - j = startJ + 1; - while (j < maxJ && image[j+ centerI*qrcode.width]) - { - stateCount[2]++; - j++; - } - if (j == maxJ) - { - return NaN; - } - while (j < maxJ && !image[j+ centerI*qrcode.width] && stateCount[3] < maxCount) - { - stateCount[3]++; - j++; - } - if (j == maxJ || stateCount[3] >= maxCount) - { - return NaN; - } - while (j < maxJ && image[j+ centerI*qrcode.width] && stateCount[4] < maxCount) - { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) - { - return NaN; - } - - // If we found a finder-pattern-like section, but its size is significantly different than - // the original, assume it's a false positive - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, j):NaN; - } - this.handlePossibleCenter=function( stateCount, i, j) - { - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - var centerJ = this.centerFromEnd(stateCount, j); //float - var centerI = this.crossCheckVertical(i, Math.floor( centerJ), stateCount[2], stateCountTotal); //float - if (!isNaN(centerI)) - { - // Re-cross check - centerJ = this.crossCheckHorizontal(Math.floor( centerJ), Math.floor( centerI), stateCount[2], stateCountTotal); - if (!isNaN(centerJ)) - { - var estimatedModuleSize = stateCountTotal / 7.0; - var found = false; - var max = this.possibleCenters.length; - for (var index = 0; index < max; index++) - { - var center = this.possibleCenters[index]; - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) - { - center.incrementCount(); - found = true; - break; - } - } - if (!found) - { - var point = new FinderPattern(centerJ, centerI, estimatedModuleSize); - this.possibleCenters.push(point); - if (this.resultPointCallback != null) - { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return true; - } - } - return false; - } - - this.selectBestPatterns=function() - { - - var startSize = this.possibleCenters.length; - if (startSize < 3) - { - // Couldn't find enough finder patterns - throw "Couldn't find enough finder patterns"; - } - - // Filter outlier possibilities whose module size is too different - if (startSize > 3) - { - // But we can only afford to do so if we have at least 4 possibilities to choose from - var totalModuleSize = 0.0; - var square = 0.0; - for (var i = 0; i < startSize; i++) - { - //totalModuleSize += this.possibleCenters[i].EstimatedModuleSize; - var centerValue=this.possibleCenters[i].EstimatedModuleSize; - totalModuleSize += centerValue; - square += (centerValue * centerValue); - } - var average = totalModuleSize / startSize; - this.possibleCenters.sort(function(center1,center2) { - var dA=Math.abs(center2.EstimatedModuleSize - average); - var dB=Math.abs(center1.EstimatedModuleSize - average); - if (dA < dB) { - return (-1); - } else if (dA == dB) { - return 0; - } else { - return 1; - } - }); - - var stdDev = Math.sqrt(square / startSize - average * average); - var limit = Math.max(0.2 * average, stdDev); - for (var i = 0; i < this.possibleCenters.length && this.possibleCenters.length > 3; i++) - { - var pattern = this.possibleCenters[i]; - //if (Math.abs(pattern.EstimatedModuleSize - average) > 0.2 * average) - if (Math.abs(pattern.EstimatedModuleSize - average) > limit) - { - this.possibleCenters.remove(i); - i--; - } - } - } - - if (this.possibleCenters.length > 3) - { - // Throw away all but those first size candidate points we found. - this.possibleCenters.sort(function(a, b){ - if (a.count > b.count){return -1;} - if (a.count < b.count){return 1;} - return 0; - }); - } - - return new Array( this.possibleCenters[0], this.possibleCenters[1], this.possibleCenters[2]); - } - - this.findRowSkip=function() - { - var max = this.possibleCenters.length; - if (max <= 1) - { - return 0; - } - var firstConfirmedCenter = null; - for (var i = 0; i < max; i++) - { - var center = this.possibleCenters[i]; - if (center.Count >= CENTER_QUORUM) - { - if (firstConfirmedCenter == null) - { - firstConfirmedCenter = center; - } - else - { - // We have two confirmed centers - // How far down can we skip before resuming looking for the next - // pattern? In the worst case, only the difference between the - // difference in the x / y coordinates of the two centers. - // This is the case where you find top left last. - this.hasSkipped = true; - return Math.floor ((Math.abs(firstConfirmedCenter.X - center.X) - Math.abs(firstConfirmedCenter.Y - center.Y)) / 2); - } - } - } - return 0; - } - - this.haveMultiplyConfirmedCenters=function() - { - var confirmedCount = 0; - var totalModuleSize = 0.0; - var max = this.possibleCenters.length; - for (var i = 0; i < max; i++) - { - var pattern = this.possibleCenters[i]; - if (pattern.Count >= CENTER_QUORUM) - { - confirmedCount++; - totalModuleSize += pattern.EstimatedModuleSize; - } - } - if (confirmedCount < 3) - { - return false; - } - // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" - // and that we need to keep looking. We detect this by asking if the estimated module sizes - // vary too much. We arbitrarily say that when the total deviation from average exceeds - // 5% of the total module size estimates, it's too much. - var average = totalModuleSize / max; - var totalDeviation = 0.0; - for (var i = 0; i < max; i++) - { - pattern = this.possibleCenters[i]; - totalDeviation += Math.abs(pattern.EstimatedModuleSize - average); - } - return totalDeviation <= 0.05 * totalModuleSize; - } - - this.findFinderPattern = function(image){ - var tryHarder = false; - this.image=image; - var maxI = qrcode.height; - var maxJ = qrcode.width; - var iSkip = Math.floor((3 * maxI) / (4 * MAX_MODULES)); - if (iSkip < MIN_SKIP || tryHarder) - { - iSkip = MIN_SKIP; - } - - var done = false; - var stateCount = new Array(5); - for (var i = iSkip - 1; i < maxI && !done; i += iSkip) - { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - var currentState = 0; - for (var j = 0; j < maxJ; j++) - { - if (image[j+i*qrcode.width] ) - { - // Black pixel - if ((currentState & 1) == 1) - { - // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } - else - { - // White pixel - if ((currentState & 1) == 0) - { - // Counting black pixels - if (currentState == 4) - { - // A winner? - if (this.foundPatternCross(stateCount)) - { - // Yes - var confirmed = this.handlePossibleCenter(stateCount, i, j); - if (confirmed) - { - // Start examining every other line. Checking each line turned out to be too - // expensive and didn't improve performance. - iSkip = 2; - if (this.hasSkipped) - { - done = this.haveMultiplyConfirmedCenters(); - } - else - { - var rowSkip = this.findRowSkip(); - if (rowSkip > stateCount[2]) - { - // Skip rows between row of lower confirmed center - // and top of presumed third confirmed center - // but back up a bit to get a full chance of detecting - // it, entire width of center of finder pattern - - // Skip by rowSkip, but back off by stateCount[2] (size of last center - // of pattern we saw) to be conservative, and also back off by iSkip which - // is about to be re-added - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } - else - { - // Advance to next black pixel - do - { - j++; - } - while (j < maxJ && !image[j + i*qrcode.width]); - j--; // back up to that last white pixel - } - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } - else - { - // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } - else - { - stateCount[++currentState]++; - } - } - else - { - // Counting white pixels - stateCount[currentState]++; - } - } - } - if (this.foundPatternCross(stateCount)) - { - var confirmed = this.handlePossibleCenter(stateCount, i, maxJ); - if (confirmed) - { - iSkip = stateCount[0]; - if (this.hasSkipped) - { - // Found a third one - done = haveMultiplyConfirmedCenters(); - } - } - } - } - - var patternInfo = this.selectBestPatterns(); - qrcode.orderBestPatterns(patternInfo); - - return new FinderPatternInfo(patternInfo); - }; -} diff --git a/public/src/js/jsqrcode/formatinf.js b/public/src/js/jsqrcode/formatinf.js deleted file mode 100644 index 7e4b592..0000000 --- a/public/src/js/jsqrcode/formatinf.js +++ /dev/null @@ -1,104 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -var FORMAT_INFO_MASK_QR = 0x5412; -var FORMAT_INFO_DECODE_LOOKUP = new Array(new Array(0x5412, 0x00), new Array(0x5125, 0x01), new Array(0x5E7C, 0x02), new Array(0x5B4B, 0x03), new Array(0x45F9, 0x04), new Array(0x40CE, 0x05), new Array(0x4F97, 0x06), new Array(0x4AA0, 0x07), new Array(0x77C4, 0x08), new Array(0x72F3, 0x09), new Array(0x7DAA, 0x0A), new Array(0x789D, 0x0B), new Array(0x662F, 0x0C), new Array(0x6318, 0x0D), new Array(0x6C41, 0x0E), new Array(0x6976, 0x0F), new Array(0x1689, 0x10), new Array(0x13BE, 0x11), new Array(0x1CE7, 0x12), new Array(0x19D0, 0x13), new Array(0x0762, 0x14), new Array(0x0255, 0x15), new Array(0x0D0C, 0x16), new Array(0x083B, 0x17), new Array(0x355F, 0x18), new Array(0x3068, 0x19), new Array(0x3F31, 0x1A), new Array(0x3A06, 0x1B), new Array(0x24B4, 0x1C), new Array(0x2183, 0x1D), new Array(0x2EDA, 0x1E), new Array(0x2BED, 0x1F)); -var BITS_SET_IN_HALF_BYTE = new Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); - - -function FormatInformation(formatInfo) -{ - this.errorCorrectionLevel = ErrorCorrectionLevel.forBits((formatInfo >> 3) & 0x03); - this.dataMask = (formatInfo & 0x07); - - this.__defineGetter__("ErrorCorrectionLevel", function() - { - return this.errorCorrectionLevel; - }); - this.__defineGetter__("DataMask", function() - { - return this.dataMask; - }); - this.GetHashCode=function() - { - return (this.errorCorrectionLevel.ordinal() << 3) | dataMask; - } - this.Equals=function( o) - { - var other = o; - return this.errorCorrectionLevel == other.errorCorrectionLevel && this.dataMask == other.dataMask; - } -} - -FormatInformation.numBitsDiffering=function( a, b) -{ - a ^= b; // a now has a 1 bit exactly where its bit differs with b's - // Count bits set quickly with a series of lookups: - return BITS_SET_IN_HALF_BYTE[a & 0x0F] + BITS_SET_IN_HALF_BYTE[(URShift(a, 4) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 8) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 12) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 16) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 20) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 24) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 28) & 0x0F)]; -} - -FormatInformation.decodeFormatInformation=function( maskedFormatInfo) -{ - var formatInfo = FormatInformation.doDecodeFormatInformation(maskedFormatInfo); - if (formatInfo != null) - { - return formatInfo; - } - // Should return null, but, some QR codes apparently - // do not mask this info. Try again by actually masking the pattern - // first - return FormatInformation.doDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR); -} -FormatInformation.doDecodeFormatInformation=function( maskedFormatInfo) -{ - // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing - var bestDifference = 0xffffffff; - var bestFormatInfo = 0; - for (var i = 0; i < FORMAT_INFO_DECODE_LOOKUP.length; i++) - { - var decodeInfo = FORMAT_INFO_DECODE_LOOKUP[i]; - var targetInfo = decodeInfo[0]; - if (targetInfo == maskedFormatInfo) - { - // Found an exact match - return new FormatInformation(decodeInfo[1]); - } - var bitsDifference = this.numBitsDiffering(maskedFormatInfo, targetInfo); - if (bitsDifference < bestDifference) - { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits - // differing means we found a match - if (bestDifference <= 3) - { - return new FormatInformation(bestFormatInfo); - } - return null; -} - - \ No newline at end of file diff --git a/public/src/js/jsqrcode/gf256.js b/public/src/js/jsqrcode/gf256.js deleted file mode 100644 index 9765862..0000000 --- a/public/src/js/jsqrcode/gf256.js +++ /dev/null @@ -1,117 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function GF256( primitive) -{ - this.expTable = new Array(256); - this.logTable = new Array(256); - var x = 1; - for (var i = 0; i < 256; i++) - { - this.expTable[i] = x; - x <<= 1; // x = x * 2; we're assuming the generator alpha is 2 - if (x >= 0x100) - { - x ^= primitive; - } - } - for (var i = 0; i < 255; i++) - { - this.logTable[this.expTable[i]] = i; - } - // logTable[0] == 0 but this should never be used - var at0=new Array(1);at0[0]=0; - this.zero = new GF256Poly(this, new Array(at0)); - var at1=new Array(1);at1[0]=1; - this.one = new GF256Poly(this, new Array(at1)); - - this.__defineGetter__("Zero", function() - { - return this.zero; - }); - this.__defineGetter__("One", function() - { - return this.one; - }); - this.buildMonomial=function( degree, coefficient) - { - if (degree < 0) - { - throw "System.ArgumentException"; - } - if (coefficient == 0) - { - return zero; - } - var coefficients = new Array(degree + 1); - for(var i=0;i 1 && coefficients[0] == 0) - { - // Leading term must be non-zero for anything except the constant polynomial "0" - var firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) - { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) - { - this.coefficients = field.Zero.coefficients; - } - else - { - this.coefficients = new Array(coefficientsLength - firstNonZero); - for(var i=0;i largerCoefficients.length) - { - var temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - var sumDiff = new Array(largerCoefficients.length); - var lengthDiff = largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - //Array.Copy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - for(var ci=0;ci= other.Degree && !remainder.Zero) - { - var degreeDifference = remainder.Degree - other.Degree; - var scale = this.field.multiply(remainder.getCoefficient(remainder.Degree), inverseDenominatorLeadingTerm); - var term = other.multiplyByMonomial(degreeDifference, scale); - var iterationQuotient = this.field.buildMonomial(degreeDifference, scale); - quotient = quotient.addOrSubtract(iterationQuotient); - remainder = remainder.addOrSubtract(term); - } - - return new Array(quotient, remainder); - } -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/grid.js b/public/src/js/jsqrcode/grid.js deleted file mode 100644 index cf9150e..0000000 --- a/public/src/js/jsqrcode/grid.js +++ /dev/null @@ -1,152 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -GridSampler = {}; - -GridSampler.checkAndNudgePoints=function( image, points) - { - var width = qrcode.width; - var height = qrcode.height; - // Check and nudge points from start until we see some that are OK: - var nudged = true; - for (var offset = 0; offset < points.length && nudged; offset += 2) - { - var x = Math.floor (points[offset]); - var y = Math.floor( points[offset + 1]); - if (x < - 1 || x > width || y < - 1 || y > height) - { - throw "Error.checkAndNudgePoints "; - } - nudged = false; - if (x == - 1) - { - points[offset] = 0.0; - nudged = true; - } - else if (x == width) - { - points[offset] = width - 1; - nudged = true; - } - if (y == - 1) - { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y == height) - { - points[offset + 1] = height - 1; - nudged = true; - } - } - // Check and nudge points from end: - nudged = true; - for (var offset = points.length - 2; offset >= 0 && nudged; offset -= 2) - { - var x = Math.floor( points[offset]); - var y = Math.floor( points[offset + 1]); - if (x < - 1 || x > width || y < - 1 || y > height) - { - throw "Error.checkAndNudgePoints "; - } - nudged = false; - if (x == - 1) - { - points[offset] = 0.0; - nudged = true; - } - else if (x == width) - { - points[offset] = width - 1; - nudged = true; - } - if (y == - 1) - { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y == height) - { - points[offset + 1] = height - 1; - nudged = true; - } - } - } - - - -GridSampler.sampleGrid3=function( image, dimension, transform) - { - var bits = new BitMatrix(dimension); - var points = new Array(dimension << 1); - for (var y = 0; y < dimension; y++) - { - var max = points.length; - var iValue = y + 0.5; - for (var x = 0; x < max; x += 2) - { - points[x] = (x >> 1) + 0.5; - points[x + 1] = iValue; - } - transform.transformPoints1(points); - // Quick check to see if points transformed to something inside the image; - // sufficient to check the endpoints - GridSampler.checkAndNudgePoints(image, points); - try - { - for (var x = 0; x < max; x += 2) - { - var xpoint = (Math.floor( points[x]) * 4) + (Math.floor( points[x + 1]) * qrcode.width * 4); - var bit = image[Math.floor( points[x])+ qrcode.width* Math.floor( points[x + 1])]; - qrcode.imagedata.data[xpoint] = bit?255:0; - qrcode.imagedata.data[xpoint+1] = bit?255:0; - qrcode.imagedata.data[xpoint+2] = 0; - qrcode.imagedata.data[xpoint+3] = 255; - //bits[x >> 1][ y]=bit; - if(bit) - bits.set_Renamed(x >> 1, y); - } - } - catch ( aioobe) - { - // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting - // transform gets "twisted" such that it maps a straight line of points to a set of points - // whose endpoints are in bounds, but others are not. There is probably some mathematical - // way to detect this about the transformation that I don't know yet. - // This results in an ugly runtime exception despite our clever checks above -- can't have - // that. We could check each point's coordinates but that feels duplicative. We settle for - // catching and wrapping ArrayIndexOutOfBoundsException. - throw "Error.checkAndNudgePoints"; - } - } - return bits; - } - -GridSampler.sampleGridx=function( image, dimension, p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY) -{ - var transform = PerspectiveTransform.quadrilateralToQuadrilateral(p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY); - - return GridSampler.sampleGrid3(image, dimension, transform); -} diff --git a/public/src/js/jsqrcode/qrcode.js b/public/src/js/jsqrcode/qrcode.js deleted file mode 100644 index a8e658b..0000000 --- a/public/src/js/jsqrcode/qrcode.js +++ /dev/null @@ -1,319 +0,0 @@ -/* - Copyright 2011 Lazar Laszlo (lazarsoft@gmail.com, www.lazarsoft.info) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - - -qrcode = window.qrcode || {}; -qrcode.imagedata = null; -qrcode.width = 0; -qrcode.height = 0; -qrcode.qrCodeSymbol = null; -qrcode.debug = false; -qrcode.maxImgSize = 1024*1024; - -qrcode.sizeOfDataLengthInfo = [ [ 10, 9, 8, 8 ], [ 12, 11, 16, 10 ], [ 14, 13, 16, 12 ] ]; - -qrcode.callback = null; - -qrcode.decode = function(src){ - - if(arguments.length==0) - { - var canvas_qr = document.getElementById("qr-canvas"); - var context = canvas_qr.getContext('2d'); - qrcode.width = canvas_qr.width; - qrcode.height = canvas_qr.height; - qrcode.imagedata = context.getImageData(0, 0, qrcode.width, qrcode.height); - qrcode.result = qrcode.process(context); - if(qrcode.callback!=null) - qrcode.callback(qrcode.result); - return qrcode.result; - } - else - { - var image = new Image(); - image.onload=function(){ - //var canvas_qr = document.getElementById("qr-canvas"); - var canvas_qr = document.createElement('canvas'); - var context = canvas_qr.getContext('2d'); - var nheight = image.height; - var nwidth = image.width; - if(image.width*image.height>qrcode.maxImgSize) - { - var ir = image.width / image.height; - nheight = Math.sqrt(qrcode.maxImgSize/ir); - nwidth=ir*nheight; - } - - canvas_qr.width = nwidth; - canvas_qr.height = nheight; - - context.drawImage(image, 0, 0, canvas_qr.width, canvas_qr.height ); - qrcode.width = canvas_qr.width; - qrcode.height = canvas_qr.height; - try{ - qrcode.imagedata = context.getImageData(0, 0, canvas_qr.width, canvas_qr.height); - }catch(e){ - qrcode.result = "Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!"; - if(qrcode.callback!=null) - qrcode.callback(qrcode.result); - return; - } - - try - { - qrcode.result = qrcode.process(context); - } - catch(e) - { - console.log(e); - qrcode.result = "error decoding QR Code"; - } - if(qrcode.callback!=null) - qrcode.callback(qrcode.result); - } - image.src = src; - } -} - -qrcode.isUrl = function(s) -{ - var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; - return regexp.test(s); -} - -qrcode.decode_url = function (s) -{ - var escaped = ""; - try{ - escaped = escape( s ); - } - catch(e) - { - console.log(e); - escaped = s; - } - var ret = ""; - try{ - ret = decodeURIComponent( escaped ); - } - catch(e) - { - console.log(e); - ret = escaped; - } - return ret; -} - -qrcode.decode_utf8 = function ( s ) -{ - if(qrcode.isUrl(s)) - return qrcode.decode_url(s); - else - return s; -} - -qrcode.process = function(ctx){ - - var start = new Date().getTime(); - - var image = qrcode.grayScaleToBitmap(qrcode.grayscale()); - //var image = qrcode.binarize(128); - - if(qrcode.debug) - { - for (var y = 0; y < qrcode.height; y++) - { - for (var x = 0; x < qrcode.width; x++) - { - var point = (x * 4) + (y * qrcode.width * 4); - qrcode.imagedata.data[point] = image[x+y*qrcode.width]?0:0; - qrcode.imagedata.data[point+1] = image[x+y*qrcode.width]?0:0; - qrcode.imagedata.data[point+2] = image[x+y*qrcode.width]?255:0; - } - } - ctx.putImageData(qrcode.imagedata, 0, 0); - } - - //var finderPatternInfo = new FinderPatternFinder().findFinderPattern(image); - - var detector = new Detector(image); - - var qRCodeMatrix = detector.detect(); - - /*for (var y = 0; y < qRCodeMatrix.bits.Height; y++) - { - for (var x = 0; x < qRCodeMatrix.bits.Width; x++) - { - var point = (x * 4*2) + (y*2 * qrcode.width * 4); - qrcode.imagedata.data[point] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0; - qrcode.imagedata.data[point+1] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0; - qrcode.imagedata.data[point+2] = qRCodeMatrix.bits.get_Renamed(x,y)?255:0; - } - }*/ - if(qrcode.debug) - ctx.putImageData(qrcode.imagedata, 0, 0); - - var reader = Decoder.decode(qRCodeMatrix.bits); - var data = reader.DataByte; - var str=""; - for(var i=0;i minmax[ax][ay][1]) - minmax[ax][ay][1] = target; - } - } - //minmax[ax][ay][0] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2; - } - } - var middle = new Array(numSqrtArea); - for (var i3 = 0; i3 < numSqrtArea; i3++) - { - middle[i3] = new Array(numSqrtArea); - } - for (var ay = 0; ay < numSqrtArea; ay++) - { - for (var ax = 0; ax < numSqrtArea; ax++) - { - middle[ax][ay] = Math.floor((minmax[ax][ay][0] + minmax[ax][ay][1]) / 2); - //Console.out.print(middle[ax][ay] + ","); - } - //Console.out.println(""); - } - //Console.out.println(""); - - return middle; -} - -qrcode.grayScaleToBitmap=function(grayScale) -{ - var middle = qrcode.getMiddleBrightnessPerArea(grayScale); - var sqrtNumArea = middle.length; - var areaWidth = Math.floor(qrcode.width / sqrtNumArea); - var areaHeight = Math.floor(qrcode.height / sqrtNumArea); - var bitmap = new Array(qrcode.height*qrcode.width); - - for (var ay = 0; ay < sqrtNumArea; ay++) - { - for (var ax = 0; ax < sqrtNumArea; ax++) - { - for (var dy = 0; dy < areaHeight; dy++) - { - for (var dx = 0; dx < areaWidth; dx++) - { - bitmap[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] = (grayScale[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] < middle[ax][ay])?true:false; - } - } - } - } - return bitmap; -} - -qrcode.grayscale = function(){ - var ret = new Array(qrcode.width*qrcode.height); - for (var y = 0; y < qrcode.height; y++) - { - for (var x = 0; x < qrcode.width; x++) - { - var gray = qrcode.getPixel(x, y); - - ret[x+y*qrcode.width] = gray; - } - } - return ret; -} - - - - -function URShift( number, bits) -{ - if (number >= 0) - return number >> bits; - else - return (number >> bits) + (2 << ~bits); -} - - -Array.prototype.remove = function(from, to) { - var rest = this.slice((to || from) + 1 || this.length); - this.length = from < 0 ? this.length + from : from; - return this.push.apply(this, rest); -}; diff --git a/public/src/js/jsqrcode/rsdecoder.js b/public/src/js/jsqrcode/rsdecoder.js deleted file mode 100644 index 640769a..0000000 --- a/public/src/js/jsqrcode/rsdecoder.js +++ /dev/null @@ -1,178 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function ReedSolomonDecoder(field) -{ - this.field = field; - this.decode=function(received, twoS) - { - var poly = new GF256Poly(this.field, received); - var syndromeCoefficients = new Array(twoS); - for(var i=0;i= b's - if (a.Degree < b.Degree) - { - var temp = a; - a = b; - b = temp; - } - - var rLast = a; - var r = b; - var sLast = this.field.One; - var s = this.field.Zero; - var tLast = this.field.Zero; - var t = this.field.One; - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.Degree >= Math.floor(R / 2)) - { - var rLastLast = rLast; - var sLastLast = sLast; - var tLastLast = tLast; - rLast = r; - sLast = s; - tLast = t; - - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.Zero) - { - // Oops, Euclidean algorithm already terminated? - throw "r_{i-1} was zero"; - } - r = rLastLast; - var q = this.field.Zero; - var denominatorLeadingTerm = rLast.getCoefficient(rLast.Degree); - var dltInverse = this.field.inverse(denominatorLeadingTerm); - while (r.Degree >= rLast.Degree && !r.Zero) - { - var degreeDiff = r.Degree - rLast.Degree; - var scale = this.field.multiply(r.getCoefficient(r.Degree), dltInverse); - q = q.addOrSubtract(this.field.buildMonomial(degreeDiff, scale)); - r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); - //r.EXE(); - } - - s = q.multiply1(sLast).addOrSubtract(sLastLast); - t = q.multiply1(tLast).addOrSubtract(tLastLast); - } - - var sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero == 0) - { - throw "ReedSolomonException sigmaTilde(0) was zero"; - } - - var inverse = this.field.inverse(sigmaTildeAtZero); - var sigma = t.multiply2(inverse); - var omega = r.multiply2(inverse); - return new Array(sigma, omega); - } - this.findErrorLocations=function( errorLocator) - { - // This is a direct application of Chien's search - var numErrors = errorLocator.Degree; - if (numErrors == 1) - { - // shortcut - return new Array(errorLocator.getCoefficient(1)); - } - var result = new Array(numErrors); - var e = 0; - for (var i = 1; i < 256 && e < numErrors; i++) - { - if (errorLocator.evaluateAt(i) == 0) - { - result[e] = this.field.inverse(i); - e++; - } - } - if (e != numErrors) - { - throw "Error locator degree does not match number of roots"; - } - return result; - } - this.findErrorMagnitudes=function( errorEvaluator, errorLocations, dataMatrix) - { - // This is directly applying Forney's Formula - var s = errorLocations.length; - var result = new Array(s); - for (var i = 0; i < s; i++) - { - var xiInverse = this.field.inverse(errorLocations[i]); - var denominator = 1; - for (var j = 0; j < s; j++) - { - if (i != j) - { - denominator = this.field.multiply(denominator, GF256.addOrSubtract(1, this.field.multiply(errorLocations[j], xiInverse))); - } - } - result[i] = this.field.multiply(errorEvaluator.evaluateAt(xiInverse), this.field.inverse(denominator)); - // Thanks to sanfordsquires for this fix: - if (dataMatrix) - { - result[i] = this.field.multiply(result[i], xiInverse); - } - } - return result; - } -} \ No newline at end of file diff --git a/public/src/js/jsqrcode/test.html b/public/src/js/jsqrcode/test.html deleted file mode 100644 index 9f400d0..0000000 --- a/public/src/js/jsqrcode/test.html +++ /dev/null @@ -1,149 +0,0 @@ - - -QRCODE - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - -
    -
    - - - - \ No newline at end of file diff --git a/public/src/js/jsqrcode/version.js b/public/src/js/jsqrcode/version.js deleted file mode 100644 index 4e19c7f..0000000 --- a/public/src/js/jsqrcode/version.js +++ /dev/null @@ -1,261 +0,0 @@ -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - - -function ECB(count, dataCodewords) -{ - this.count = count; - this.dataCodewords = dataCodewords; - - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("DataCodewords", function() - { - return this.dataCodewords; - }); -} - -function ECBlocks( ecCodewordsPerBlock, ecBlocks1, ecBlocks2) -{ - this.ecCodewordsPerBlock = ecCodewordsPerBlock; - if(ecBlocks2) - this.ecBlocks = new Array(ecBlocks1, ecBlocks2); - else - this.ecBlocks = new Array(ecBlocks1); - - this.__defineGetter__("ECCodewordsPerBlock", function() - { - return this.ecCodewordsPerBlock; - }); - - this.__defineGetter__("TotalECCodewords", function() - { - return this.ecCodewordsPerBlock * this.NumBlocks; - }); - - this.__defineGetter__("NumBlocks", function() - { - var total = 0; - for (var i = 0; i < this.ecBlocks.length; i++) - { - total += this.ecBlocks[i].length; - } - return total; - }); - - this.getECBlocks=function() - { - return this.ecBlocks; - } -} - -function Version( versionNumber, alignmentPatternCenters, ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4) -{ - this.versionNumber = versionNumber; - this.alignmentPatternCenters = alignmentPatternCenters; - this.ecBlocks = new Array(ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4); - - var total = 0; - var ecCodewords = ecBlocks1.ECCodewordsPerBlock; - var ecbArray = ecBlocks1.getECBlocks(); - for (var i = 0; i < ecbArray.length; i++) - { - var ecBlock = ecbArray[i]; - total += ecBlock.Count * (ecBlock.DataCodewords + ecCodewords); - } - this.totalCodewords = total; - - this.__defineGetter__("VersionNumber", function() - { - return this.versionNumber; - }); - - this.__defineGetter__("AlignmentPatternCenters", function() - { - return this.alignmentPatternCenters; - }); - this.__defineGetter__("TotalCodewords", function() - { - return this.totalCodewords; - }); - this.__defineGetter__("DimensionForVersion", function() - { - return 17 + 4 * this.versionNumber; - }); - - this.buildFunctionPattern=function() - { - var dimension = this.DimensionForVersion; - var bitMatrix = new BitMatrix(dimension); - - // Top left finder pattern + separator + format - bitMatrix.setRegion(0, 0, 9, 9); - // Top right finder pattern + separator + format - bitMatrix.setRegion(dimension - 8, 0, 8, 9); - // Bottom left finder pattern + separator + format - bitMatrix.setRegion(0, dimension - 8, 9, 8); - - // Alignment patterns - var max = this.alignmentPatternCenters.length; - for (var x = 0; x < max; x++) - { - var i = this.alignmentPatternCenters[x] - 2; - for (var y = 0; y < max; y++) - { - if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) - { - // No alignment patterns near the three finder paterns - continue; - } - bitMatrix.setRegion(this.alignmentPatternCenters[y] - 2, i, 5, 5); - } - } - - // Vertical timing pattern - bitMatrix.setRegion(6, 9, 1, dimension - 17); - // Horizontal timing pattern - bitMatrix.setRegion(9, 6, dimension - 17, 1); - - if (this.versionNumber > 6) - { - // Version info, top right - bitMatrix.setRegion(dimension - 11, 0, 3, 6); - // Version info, bottom left - bitMatrix.setRegion(0, dimension - 11, 6, 3); - } - - return bitMatrix; - } - this.getECBlocksForLevel=function( ecLevel) - { - return this.ecBlocks[ecLevel.ordinal()]; - } -} - -Version.VERSION_DECODE_INFO = new Array(0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69); - -Version.VERSIONS = buildVersions(); - -Version.getVersionForNumber=function( versionNumber) -{ - if (versionNumber < 1 || versionNumber > 40) - { - throw "ArgumentException"; - } - return Version.VERSIONS[versionNumber - 1]; -} - -Version.getProvisionalVersionForDimension=function(dimension) -{ - if (dimension % 4 != 1) - { - throw "Error getProvisionalVersionForDimension"; - } - try - { - return Version.getVersionForNumber((dimension - 17) >> 2); - } - catch ( iae) - { - throw "Error getVersionForNumber"; - } -} - -Version.decodeVersionInformation=function( versionBits) -{ - var bestDifference = 0xffffffff; - var bestVersion = 0; - for (var i = 0; i < Version.VERSION_DECODE_INFO.length; i++) - { - var targetVersion = Version.VERSION_DECODE_INFO[i]; - // Do the version info bits match exactly? done. - if (targetVersion == versionBits) - { - return this.getVersionForNumber(i + 7); - } - // Otherwise see if this is the closest to a real version info bit string - // we have seen so far - var bitsDifference = FormatInformation.numBitsDiffering(versionBits, targetVersion); - if (bitsDifference < bestDifference) - { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 4 bits. - if (bestDifference <= 3) - { - return this.getVersionForNumber(bestVersion); - } - // If we didn't find a close enough match, fail - return null; -} - -function buildVersions() -{ - return new Array(new Version(1, new Array(), new ECBlocks(7, new ECB(1, 19)), new ECBlocks(10, new ECB(1, 16)), new ECBlocks(13, new ECB(1, 13)), new ECBlocks(17, new ECB(1, 9))), - new Version(2, new Array(6, 18), new ECBlocks(10, new ECB(1, 34)), new ECBlocks(16, new ECB(1, 28)), new ECBlocks(22, new ECB(1, 22)), new ECBlocks(28, new ECB(1, 16))), - new Version(3, new Array(6, 22), new ECBlocks(15, new ECB(1, 55)), new ECBlocks(26, new ECB(1, 44)), new ECBlocks(18, new ECB(2, 17)), new ECBlocks(22, new ECB(2, 13))), - new Version(4, new Array(6, 26), new ECBlocks(20, new ECB(1, 80)), new ECBlocks(18, new ECB(2, 32)), new ECBlocks(26, new ECB(2, 24)), new ECBlocks(16, new ECB(4, 9))), - new Version(5, new Array(6, 30), new ECBlocks(26, new ECB(1, 108)), new ECBlocks(24, new ECB(2, 43)), new ECBlocks(18, new ECB(2, 15), new ECB(2, 16)), new ECBlocks(22, new ECB(2, 11), new ECB(2, 12))), - new Version(6, new Array(6, 34), new ECBlocks(18, new ECB(2, 68)), new ECBlocks(16, new ECB(4, 27)), new ECBlocks(24, new ECB(4, 19)), new ECBlocks(28, new ECB(4, 15))), - new Version(7, new Array(6, 22, 38), new ECBlocks(20, new ECB(2, 78)), new ECBlocks(18, new ECB(4, 31)), new ECBlocks(18, new ECB(2, 14), new ECB(4, 15)), new ECBlocks(26, new ECB(4, 13), new ECB(1, 14))), - new Version(8, new Array(6, 24, 42), new ECBlocks(24, new ECB(2, 97)), new ECBlocks(22, new ECB(2, 38), new ECB(2, 39)), new ECBlocks(22, new ECB(4, 18), new ECB(2, 19)), new ECBlocks(26, new ECB(4, 14), new ECB(2, 15))), - new Version(9, new Array(6, 26, 46), new ECBlocks(30, new ECB(2, 116)), new ECBlocks(22, new ECB(3, 36), new ECB(2, 37)), new ECBlocks(20, new ECB(4, 16), new ECB(4, 17)), new ECBlocks(24, new ECB(4, 12), new ECB(4, 13))), - new Version(10, new Array(6, 28, 50), new ECBlocks(18, new ECB(2, 68), new ECB(2, 69)), new ECBlocks(26, new ECB(4, 43), new ECB(1, 44)), new ECBlocks(24, new ECB(6, 19), new ECB(2, 20)), new ECBlocks(28, new ECB(6, 15), new ECB(2, 16))), - new Version(11, new Array(6, 30, 54), new ECBlocks(20, new ECB(4, 81)), new ECBlocks(30, new ECB(1, 50), new ECB(4, 51)), new ECBlocks(28, new ECB(4, 22), new ECB(4, 23)), new ECBlocks(24, new ECB(3, 12), new ECB(8, 13))), - new Version(12, new Array(6, 32, 58), new ECBlocks(24, new ECB(2, 92), new ECB(2, 93)), new ECBlocks(22, new ECB(6, 36), new ECB(2, 37)), new ECBlocks(26, new ECB(4, 20), new ECB(6, 21)), new ECBlocks(28, new ECB(7, 14), new ECB(4, 15))), - new Version(13, new Array(6, 34, 62), new ECBlocks(26, new ECB(4, 107)), new ECBlocks(22, new ECB(8, 37), new ECB(1, 38)), new ECBlocks(24, new ECB(8, 20), new ECB(4, 21)), new ECBlocks(22, new ECB(12, 11), new ECB(4, 12))), - new Version(14, new Array(6, 26, 46, 66), new ECBlocks(30, new ECB(3, 115), new ECB(1, 116)), new ECBlocks(24, new ECB(4, 40), new ECB(5, 41)), new ECBlocks(20, new ECB(11, 16), new ECB(5, 17)), new ECBlocks(24, new ECB(11, 12), new ECB(5, 13))), - new Version(15, new Array(6, 26, 48, 70), new ECBlocks(22, new ECB(5, 87), new ECB(1, 88)), new ECBlocks(24, new ECB(5, 41), new ECB(5, 42)), new ECBlocks(30, new ECB(5, 24), new ECB(7, 25)), new ECBlocks(24, new ECB(11, 12), new ECB(7, 13))), - new Version(16, new Array(6, 26, 50, 74), new ECBlocks(24, new ECB(5, 98), new ECB(1, 99)), new ECBlocks(28, new ECB(7, 45), new ECB(3, 46)), new ECBlocks(24, new ECB(15, 19), new ECB(2, 20)), new ECBlocks(30, new ECB(3, 15), new ECB(13, 16))), - new Version(17, new Array(6, 30, 54, 78), new ECBlocks(28, new ECB(1, 107), new ECB(5, 108)), new ECBlocks(28, new ECB(10, 46), new ECB(1, 47)), new ECBlocks(28, new ECB(1, 22), new ECB(15, 23)), new ECBlocks(28, new ECB(2, 14), new ECB(17, 15))), - new Version(18, new Array(6, 30, 56, 82), new ECBlocks(30, new ECB(5, 120), new ECB(1, 121)), new ECBlocks(26, new ECB(9, 43), new ECB(4, 44)), new ECBlocks(28, new ECB(17, 22), new ECB(1, 23)), new ECBlocks(28, new ECB(2, 14), new ECB(19, 15))), - new Version(19, new Array(6, 30, 58, 86), new ECBlocks(28, new ECB(3, 113), new ECB(4, 114)), new ECBlocks(26, new ECB(3, 44), new ECB(11, 45)), new ECBlocks(26, new ECB(17, 21), new ECB(4, 22)), new ECBlocks(26, new ECB(9, 13), new ECB(16, 14))), - new Version(20, new Array(6, 34, 62, 90), new ECBlocks(28, new ECB(3, 107), new ECB(5, 108)), new ECBlocks(26, new ECB(3, 41), new ECB(13, 42)), new ECBlocks(30, new ECB(15, 24), new ECB(5, 25)), new ECBlocks(28, new ECB(15, 15), new ECB(10, 16))), - new Version(21, new Array(6, 28, 50, 72, 94), new ECBlocks(28, new ECB(4, 116), new ECB(4, 117)), new ECBlocks(26, new ECB(17, 42)), new ECBlocks(28, new ECB(17, 22), new ECB(6, 23)), new ECBlocks(30, new ECB(19, 16), new ECB(6, 17))), - new Version(22, new Array(6, 26, 50, 74, 98), new ECBlocks(28, new ECB(2, 111), new ECB(7, 112)), new ECBlocks(28, new ECB(17, 46)), new ECBlocks(30, new ECB(7, 24), new ECB(16, 25)), new ECBlocks(24, new ECB(34, 13))), - new Version(23, new Array(6, 30, 54, 74, 102), new ECBlocks(30, new ECB(4, 121), new ECB(5, 122)), new ECBlocks(28, new ECB(4, 47), new ECB(14, 48)), new ECBlocks(30, new ECB(11, 24), new ECB(14, 25)), new ECBlocks(30, new ECB(16, 15), new ECB(14, 16))), - new Version(24, new Array(6, 28, 54, 80, 106), new ECBlocks(30, new ECB(6, 117), new ECB(4, 118)), new ECBlocks(28, new ECB(6, 45), new ECB(14, 46)), new ECBlocks(30, new ECB(11, 24), new ECB(16, 25)), new ECBlocks(30, new ECB(30, 16), new ECB(2, 17))), - new Version(25, new Array(6, 32, 58, 84, 110), new ECBlocks(26, new ECB(8, 106), new ECB(4, 107)), new ECBlocks(28, new ECB(8, 47), new ECB(13, 48)), new ECBlocks(30, new ECB(7, 24), new ECB(22, 25)), new ECBlocks(30, new ECB(22, 15), new ECB(13, 16))), - new Version(26, new Array(6, 30, 58, 86, 114), new ECBlocks(28, new ECB(10, 114), new ECB(2, 115)), new ECBlocks(28, new ECB(19, 46), new ECB(4, 47)), new ECBlocks(28, new ECB(28, 22), new ECB(6, 23)), new ECBlocks(30, new ECB(33, 16), new ECB(4, 17))), - new Version(27, new Array(6, 34, 62, 90, 118), new ECBlocks(30, new ECB(8, 122), new ECB(4, 123)), new ECBlocks(28, new ECB(22, 45), new ECB(3, 46)), new ECBlocks(30, new ECB(8, 23), new ECB(26, 24)), new ECBlocks(30, new ECB(12, 15), new ECB(28, 16))), - new Version(28, new Array(6, 26, 50, 74, 98, 122), new ECBlocks(30, new ECB(3, 117), new ECB(10, 118)), new ECBlocks(28, new ECB(3, 45), new ECB(23, 46)), new ECBlocks(30, new ECB(4, 24), new ECB(31, 25)), new ECBlocks(30, new ECB(11, 15), new ECB(31, 16))), - new Version(29, new Array(6, 30, 54, 78, 102, 126), new ECBlocks(30, new ECB(7, 116), new ECB(7, 117)), new ECBlocks(28, new ECB(21, 45), new ECB(7, 46)), new ECBlocks(30, new ECB(1, 23), new ECB(37, 24)), new ECBlocks(30, new ECB(19, 15), new ECB(26, 16))), - new Version(30, new Array(6, 26, 52, 78, 104, 130), new ECBlocks(30, new ECB(5, 115), new ECB(10, 116)), new ECBlocks(28, new ECB(19, 47), new ECB(10, 48)), new ECBlocks(30, new ECB(15, 24), new ECB(25, 25)), new ECBlocks(30, new ECB(23, 15), new ECB(25, 16))), - new Version(31, new Array(6, 30, 56, 82, 108, 134), new ECBlocks(30, new ECB(13, 115), new ECB(3, 116)), new ECBlocks(28, new ECB(2, 46), new ECB(29, 47)), new ECBlocks(30, new ECB(42, 24), new ECB(1, 25)), new ECBlocks(30, new ECB(23, 15), new ECB(28, 16))), - new Version(32, new Array(6, 34, 60, 86, 112, 138), new ECBlocks(30, new ECB(17, 115)), new ECBlocks(28, new ECB(10, 46), new ECB(23, 47)), new ECBlocks(30, new ECB(10, 24), new ECB(35, 25)), new ECBlocks(30, new ECB(19, 15), new ECB(35, 16))), - new Version(33, new Array(6, 30, 58, 86, 114, 142), new ECBlocks(30, new ECB(17, 115), new ECB(1, 116)), new ECBlocks(28, new ECB(14, 46), new ECB(21, 47)), new ECBlocks(30, new ECB(29, 24), new ECB(19, 25)), new ECBlocks(30, new ECB(11, 15), new ECB(46, 16))), - new Version(34, new Array(6, 34, 62, 90, 118, 146), new ECBlocks(30, new ECB(13, 115), new ECB(6, 116)), new ECBlocks(28, new ECB(14, 46), new ECB(23, 47)), new ECBlocks(30, new ECB(44, 24), new ECB(7, 25)), new ECBlocks(30, new ECB(59, 16), new ECB(1, 17))), - new Version(35, new Array(6, 30, 54, 78, 102, 126, 150), new ECBlocks(30, new ECB(12, 121), new ECB(7, 122)), new ECBlocks(28, new ECB(12, 47), new ECB(26, 48)), new ECBlocks(30, new ECB(39, 24), new ECB(14, 25)),new ECBlocks(30, new ECB(22, 15), new ECB(41, 16))), - new Version(36, new Array(6, 24, 50, 76, 102, 128, 154), new ECBlocks(30, new ECB(6, 121), new ECB(14, 122)), new ECBlocks(28, new ECB(6, 47), new ECB(34, 48)), new ECBlocks(30, new ECB(46, 24), new ECB(10, 25)), new ECBlocks(30, new ECB(2, 15), new ECB(64, 16))), - new Version(37, new Array(6, 28, 54, 80, 106, 132, 158), new ECBlocks(30, new ECB(17, 122), new ECB(4, 123)), new ECBlocks(28, new ECB(29, 46), new ECB(14, 47)), new ECBlocks(30, new ECB(49, 24), new ECB(10, 25)), new ECBlocks(30, new ECB(24, 15), new ECB(46, 16))), - new Version(38, new Array(6, 32, 58, 84, 110, 136, 162), new ECBlocks(30, new ECB(4, 122), new ECB(18, 123)), new ECBlocks(28, new ECB(13, 46), new ECB(32, 47)), new ECBlocks(30, new ECB(48, 24), new ECB(14, 25)), new ECBlocks(30, new ECB(42, 15), new ECB(32, 16))), - new Version(39, new Array(6, 26, 54, 82, 110, 138, 166), new ECBlocks(30, new ECB(20, 117), new ECB(4, 118)), new ECBlocks(28, new ECB(40, 47), new ECB(7, 48)), new ECBlocks(30, new ECB(43, 24), new ECB(22, 25)), new ECBlocks(30, new ECB(10, 15), new ECB(67, 16))), - new Version(40, new Array(6, 30, 58, 86, 114, 142, 170), new ECBlocks(30, new ECB(19, 118), new ECB(6, 119)), new ECBlocks(28, new ECB(18, 47), new ECB(31, 48)), new ECBlocks(30, new ECB(34, 24), new ECB(34, 25)), new ECBlocks(30, new ECB(20, 15), new ECB(61, 16)))); -} \ No newline at end of file diff --git a/public/src/js/services/address.js b/public/src/js/services/address.js deleted file mode 100644 index 1decea7..0000000 --- a/public/src/js/services/address.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -angular.module('insight.address').factory('Address', - function($resource, Api) { - return $resource(Api.apiPrefix + '/addr/:addrStr/?noTxList=1', { - addrStr: '@addStr' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); -}); - - diff --git a/public/src/js/services/api.js b/public/src/js/services/api.js deleted file mode 100644 index 519402f..0000000 --- a/public/src/js/services/api.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -angular.module('insight.api') - .factory('Api', - function() { - return { - apiPrefix: '/insight-api' - } - }); diff --git a/public/src/js/services/blocks.js b/public/src/js/services/blocks.js deleted file mode 100644 index e10513a..0000000 --- a/public/src/js/services/blocks.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; - -angular.module('insight.blocks') - .factory('Block', - function($resource, Api) { - return $resource(Api.apiPrefix + '/block/:blockHash', { - blockHash: '@blockHash' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); - }) - .factory('Blocks', - function($resource, Api) { - return $resource(Api.apiPrefix + '/blocks'); - }) - .factory('BlockByHeight', - function($resource, Api) { - return $resource(Api.apiPrefix + '/block-index/:blockHeight'); - }); diff --git a/public/src/js/services/currency.js b/public/src/js/services/currency.js deleted file mode 100644 index 076057e..0000000 --- a/public/src/js/services/currency.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -angular.module('insight.currency').factory('Currency', - function($resource, Api) { - return $resource(Api.apiPrefix + '/currency'); -}); diff --git a/public/src/js/services/global.js b/public/src/js/services/global.js deleted file mode 100644 index 72cd82b..0000000 --- a/public/src/js/services/global.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -//Global service for global variables -angular.module('insight.system') - .factory('Global',[ - function() { - } - ]) - .factory('Version', - function($resource, Api) { - return $resource(Api.apiPrefix + '/version'); - }); diff --git a/public/src/js/services/socket.js b/public/src/js/services/socket.js deleted file mode 100644 index a8d6d35..0000000 --- a/public/src/js/services/socket.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict'; - -var ScopedSocket = function(socket, $rootScope) { - this.socket = socket; - this.$rootScope = $rootScope; - this.listeners = []; -}; - -ScopedSocket.prototype.removeAllListeners = function(opts) { - if (!opts) opts = {}; - for (var i = 0; i < this.listeners.length; i++) { - var details = this.listeners[i]; - if (opts.skipConnect && details.event === 'connect') { - continue; - } - this.socket.removeListener(details.event, details.fn); - } - this.listeners = []; -}; - -ScopedSocket.prototype.on = function(event, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; - - var wrapped_callback = function() { - var args = arguments; - $rootScope.$apply(function() { - callback.apply(socket, args); - }); - }; - socket.on(event, wrapped_callback); - - this.listeners.push({ - event: event, - fn: wrapped_callback - }); -}; - -ScopedSocket.prototype.emit = function(event, data, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; - var args = Array.prototype.slice.call(arguments); - - args.push(function() { - var args = arguments; - $rootScope.$apply(function() { - if (callback) { - callback.apply(socket, args); - } - }); - }); - - socket.emit.apply(socket, args); -}; - -angular.module('insight.socket').factory('getSocket', - function($rootScope) { - var socket = io.connect(null, { - 'reconnect': true, - 'reconnection delay': 500, - }); - return function(scope) { - var scopedSocket = new ScopedSocket(socket, $rootScope); - scope.$on('$destroy', function() { - scopedSocket.removeAllListeners(); - }); - socket.on('connect', function() { - scopedSocket.removeAllListeners({ - skipConnect: true - }); - }); - return scopedSocket; - }; - }); diff --git a/public/src/js/services/status.js b/public/src/js/services/status.js deleted file mode 100644 index ab520ec..0000000 --- a/public/src/js/services/status.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; - -angular.module('insight.status') - .factory('Status', - function($resource, Api) { - return $resource(Api.apiPrefix + '/status', { - q: '@q' - }); - }) - .factory('Sync', - function($resource, Api) { - return $resource(Api.apiPrefix + '/sync'); - }) - .factory('PeerSync', - function($resource, Api) { - return $resource(Api.apiPrefix + '/peer'); - }); diff --git a/public/src/js/services/transactions.js b/public/src/js/services/transactions.js deleted file mode 100644 index 7ba62e9..0000000 --- a/public/src/js/services/transactions.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -angular.module('insight.transactions') - .factory('Transaction', - function($resource, Api) { - return $resource(Api.apiPrefix + '/tx/:txId', { - txId: '@txId' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); - }) - .factory('TransactionsByBlock', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs', { - block: '@block' - }); - }) - .factory('TransactionsByAddress', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs', { - address: '@address' - }); - }) - .factory('Transactions', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs'); - }); diff --git a/public/src/js/translations.js b/public/src/js/translations.js deleted file mode 100644 index 3f3dae2..0000000 --- a/public/src/js/translations.js +++ /dev/null @@ -1,7 +0,0 @@ -angular.module('insight').run(['gettextCatalog', function (gettextCatalog) { -/* jshint -W100 */ - gettextCatalog.setStrings('de_DE', {"(Input unconfirmed)":"(Eingabe unbestätigt)","404 Page not found :(":"404 Seite nicht gefunden :(","insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen REST und Websocket APIs um eigene Wallets oder Applikationen zu implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der aktuelle Quellcode ist auf Github zu finden.","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insight befindet sich aktuell noch in der Entwicklung. Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren Verbesserung an unseren Github Issue Tracker.","About":"Über insight","Address":"Adresse","Age":"Alter","Application Status":"Programmstatus","Best Block":"Bester Block","Bitcoin node information":"Bitcoin-Node Info","Block":"Block","Block Reward":"Belohnung","Blocks":"Blöcke","Bytes Serialized":"Serialisierte Bytes","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:{{port}} ist fehlgeschlagen.)","Can't connect to insight server. Attempting to reconnect...":"Keine Verbindung zum insight-Server möglich. Es wird versucht die Verbindung neu aufzubauen...","Can't connect to internet. Please, check your connection.":"Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen.","Complete":"Vollständig","Confirmations":"Bestätigungen","Conn":"Verbindungen","Connections to other nodes":"Verbindungen zu Nodes","Current Blockchain Tip (insight)":"Aktueller Blockchain Tip (insight)","Current Sync Status":"Aktueller Status","Details":"Details","Difficulty":"Schwierigkeit","Double spent attempt detected. From tx:":"Es wurde ein \"double Spend\" Versuch erkannt.Von tx:","Error!":"Fehler!","Fee":"Gebühr","Final Balance":"Schlussbilanz","Finish Date":"Fertigstellung","Go to home":"Zur Startseite","Hash Serialized":"Hash Serialisiert","Height":"Höhe","Included in Block":"Eingefügt in Block","Incoherence in levelDB detected:":"Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:","Info Errors":"Fehlerbeschreibung","Initial Block Chain Height":"Ursprüngliche Blockchain Höhe","Input":"Eingänge","Last Block":"Letzter Block","Last Block Hash (Bitcoind)":"Letzter Hash (Bitcoind)","Latest Blocks":"Letzte Blöcke","Latest Transactions":"Letzte Transaktionen","Loading Address Information":"Lade Adressinformationen","Loading Block Information":"Lade Blockinformation","Loading Selected Date...":"Lade gewähltes Datum...","Loading Transaction Details":"Lade Transaktionsdetails","Loading Transactions...":"Lade Transaktionen...","Loading...":"Lade...","Mined Time":"Block gefunden (Mining)","Mined by":"Gefunden von","Mining Difficulty":"Schwierigkeitgrad","Next Block":"Nächster Block","No Inputs (Newly Generated Coins)":"Keine Eingänge (Neu generierte Coins)","No blocks yet.":"Keine Blöcke bisher.","No matching records found!":"Keine passenden Einträge gefunden!","No. Transactions":"Anzahl Transaktionen","Number Of Transactions":"Anzahl der Transaktionen","Output":"Ausgänge","Powered by":"Powered by","Previous Block":"Letzter Block","Protocol version":"Protokollversion","Proxy setting":"Proxyeinstellung","Received Time":"Eingangszeitpunkt","Redirecting...":"Umleitung...","Search for block, transaction or address":"Suche Block, Transaktion oder Adresse","See all blocks":"Alle Blöcke anzeigen","Show Transaction Output data":"Zeige Abgänge","Show all":"Zeige Alles","Show input":"Zeige Eingänge","Show less":"Weniger anzeigen","Show more":"Mehr anzeigen","Size":"Größe","Size (bytes)":"Größe (bytes)","Skipped Blocks (previously synced)":"Verworfene Blöcke (bereits syncronisiert)","Start Date":"Startdatum","Status":"Status","Summary":"Zusammenfassung","Summary confirmed":"Zusammenfassung bestätigt","Sync Progress":"Fortschritt","Sync Status":"Syncronisation","Sync Type":"Art der Syncronisation","Synced Blocks":"Syncronisierte Blöcke","Testnet":"Testnet aktiv","There are no transactions involving this address.":"Es gibt keine Transaktionen zu dieser Adressse","Time Offset":"Zeitoffset zu UTC","Timestamp":"Zeitstempel","Today":"Heute","Total Amount":"Gesamtsumme","Total Received":"Insgesamt empfangen","Total Sent":"Insgesamt gesendet","Transaction":"Transaktion","Transaction Output Set Information":"Transaktions Abgänge","Transaction Outputs":"Abgänge","Transactions":"Transaktionen","Type":"Typ","Unconfirmed":"Unbestätigt","Unconfirmed Transaction!":"Unbestätigte Transaktion!","Unconfirmed Txs Balance":"Unbestätigtes Guthaben","Value Out":"Wert","Version":"Version","Waiting for blocks...":"Warte auf Blöcke...","Waiting for transactions...":"Warte auf Transaktionen...","by date.":"nach Datum.","first seen at":"zuerst gesehen am","mined":"gefunden","mined on:":"vom:","Waiting for blocks":"Warte auf Blöcke"}); - gettextCatalog.setStrings('es', {"(Input unconfirmed)":"(Entrada sin confirmar)","404 Page not found :(":"404 Página no encontrada :(","insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insight es un explorador de bloques de Bitcoin open-source con un completo conjunto de REST y APIs de websockets que pueden ser usadas para escribir monederos de Bitcoins y otras aplicaciones que requieran consultar un explorador de bloques. Obtén el código en el repositorio abierto de Github.","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insight esta en desarrollo aún, por ello agradecemos que nos reporten errores o sugerencias para mejorar el software. Github issue tracker.","About":"Acerca de","Address":"Dirección","Age":"Edad","Application Status":"Estado de la Aplicación","Best Block":"Mejor Bloque","Bitcoin node information":"Información del nodo Bitcoin","Block":"Bloque","Block Reward":"Bloque Recompensa","Blocks":"Bloques","Bytes Serialized":"Bytes Serializados","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)","Can't connect to insight server. Attempting to reconnect...":"No se pudo conectar al servidor insight. Intentando re-conectar...","Can't connect to internet. Please, check your connection.":"No se pudo conectar a Internet. Por favor, verifique su conexión.","Complete":"Completado","Confirmations":"Confirmaciones","Conn":"Con","Connections to other nodes":"Conexiones a otros nodos","Current Blockchain Tip (insight)":"Actual Blockchain Tip (insight)","Current Sync Status":"Actual Estado de Sincronización","Details":"Detalles","Difficulty":"Dificultad","Double spent attempt detected. From tx:":"Intento de doble gasto detectado. De la transacción:","Error!":"¡Error!","Fee":"Tasa","Final Balance":"Balance Final","Finish Date":"Fecha Final","Go to home":"Volver al Inicio","Hash Serialized":"Hash Serializado","Height":"Altura","Included in Block":"Incluido en el Bloque","Incoherence in levelDB detected:":"Detectada una incoherencia en levelDB:","Info Errors":"Errores de Información","Initial Block Chain Height":"Altura de la Cadena en Bloque Inicial","Input":"Entrada","Last Block":"Último Bloque","Last Block Hash (Bitcoind)":"Último Bloque Hash (Bitcoind)","Latest Blocks":"Últimos Bloques","Latest Transactions":"Últimas Transacciones","Loading Address Information":"Cargando Información de la Dirección","Loading Block Information":"Cargando Información del Bloque","Loading Selected Date...":"Cargando Fecha Seleccionada...","Loading Transaction Details":"Cargando Detalles de la Transacción","Loading Transactions...":"Cargando Transacciones...","Loading...":"Cargando...","Mined Time":"Hora de Minado","Mined by":"Minado por","Mining Difficulty":"Dificultad de Minado","Next Block":"Próximo Bloque","No Inputs (Newly Generated Coins)":"Sin Entradas (Monedas Recién Generadas)","No blocks yet.":"No hay bloques aún.","No matching records found!":"¡No se encontraron registros coincidentes!","No. Transactions":"Nro. de Transacciones","Number Of Transactions":"Número de Transacciones","Output":"Salida","Powered by":"Funciona con","Previous Block":"Bloque Anterior","Protocol version":"Versión del protocolo","Proxy setting":"Opción de proxy","Received Time":"Hora de Recibido","Redirecting...":"Redireccionando...","Search for block, transaction or address":"Buscar bloques, transacciones o direcciones","See all blocks":"Ver todos los bloques","Show Transaction Output data":"Mostrar dato de Salida de la Transacción","Show all":"Mostrar todos","Show input":"Mostrar entrada","Show less":"Ver menos","Show more":"Ver más","Size":"Tamaño","Size (bytes)":"Tamaño (bytes)","Skipped Blocks (previously synced)":"Bloques Saltados (previamente sincronizado)","Start Date":"Fecha de Inicio","Status":"Estado","Summary":"Resumen","Summary confirmed":"Resumen confirmados","Sync Progress":"Proceso de Sincronización","Sync Status":"Estado de Sincronización","Sync Type":"Tipo de Sincronización","Synced Blocks":"Bloques Sincornizados","Testnet":"Red de prueba","There are no transactions involving this address.":"No hay transacciones para esta dirección","Time Offset":"Desplazamiento de hora","Timestamp":"Fecha y hora","Today":"Hoy","Total Amount":"Cantidad Total","Total Received":"Total Recibido","Total Sent":"Total Enviado","Transaction":"Transacción","Transaction Output Set Information":"Información del Conjunto de Salida de la Transacción","Transaction Outputs":"Salidas de la Transacción","Transactions":"Transacciones","Type":"Tipo","Unconfirmed":"Sin confirmar","Unconfirmed Transaction!":"¡Transacción sin confirmar!","Unconfirmed Txs Balance":"Balance sin confirmar","Value Out":"Valor de Salida","Version":"Versión","Waiting for blocks...":"Esperando bloques...","Waiting for transactions...":"Esperando transacciones...","by date.":"por fecha.","first seen at":"Visto a","mined":"minado","mined on:":"minado el:","Waiting for blocks":"Esperando bloques"}); - gettextCatalog.setStrings('ja', {"(Input unconfirmed)":"(入力は未検証です)","404 Page not found :(":"404 ページがみつかりません (´・ω・`)","insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insightは、bitcoind RPCの提供するものよりも詳細なブロックチェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソースコードを確認","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insightは現在開発中です。githubのissueトラッカにてバグの報告や改善案の提案をお願いします。","About":"はじめに","Address":"アドレス","Age":"生成後経過時間","An error occured in the verification process.":"検証過程でエラーが発生しました。","An error occured:
    {{error}}":"エラーが発生しました:
    {{error}}","Application Status":"アプリケーションの状態","Best Block":"最良ブロック","Bitcoin comes with a way of signing arbitrary messages.":"Bitcoinには任意のメッセージを署名する昨日が備わっています。","Bitcoin node information":"Bitcoinノード情報","Block":"ブロック","Block Reward":"ブロック報酬","Blocks":"ブロック","Broadcast Raw Transaction":"生のトランザクションを配信","Bytes Serialized":"シリアライズ後の容量 (バイト)","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませんでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)","Can't connect to insight server. Attempting to reconnect...":"insight サーバに接続できません。再接続しています...","Can't connect to internet. Please, check your connection.":"インターネットに接続できません。コネクションを確認してください。","Complete":"完了","Confirmations":"検証数","Conn":"接続数","Connections to other nodes":"他ノードへの接続","Current Blockchain Tip (insight)":"現在のブロックチェインのTip (insight)","Current Sync Status":"現在の同期状況","Details":"詳細","Difficulty":"難易度","Double spent attempt detected. From tx:":"二重支払い攻撃をこのトランザクションから検知しました:","Error message:":"エラーメッセージ:","Error!":"エラー!","Fee":"手数料","Final Balance":"最終残高","Finish Date":"終了日時","Go to home":"ホームへ","Hash Serialized":"シリアライズデータのハッシュ値","Height":"ブロック高","Included in Block":"取り込まれたブロック","Incoherence in levelDB detected:":"levelDBの破損を検知しました:","Info Errors":"エラー情報","Initial Block Chain Height":"起動時のブロック高","Input":"入力","Last Block":"直前のブロック","Last Block Hash (Bitcoind)":"直前のブロックのハッシュ値 (Bitcoind)","Latest Blocks":"最新のブロック","Latest Transactions":"最新のトランザクション","Loading Address Information":"アドレス情報を読み込んでいます","Loading Block Information":"ブロック情報を読み込んでいます","Loading Selected Date...":"選択されたデータを読み込んでいます...","Loading Transaction Details":"トランザクションの詳細を読み込んでいます","Loading Transactions...":"トランザクションを読み込んでいます...","Loading...":"ロード中...","Message":"メッセージ","Mined Time":"採掘時刻","Mined by":"採掘者","Mining Difficulty":"採掘難易度","Next Block":"次のブロック","No Inputs (Newly Generated Coins)":"入力なし (新しく生成されたコイン)","No blocks yet.":"ブロックはありません。","No matching records found!":"一致するレコードはありません!","No. Transactions":"トランザクション数","Number Of Transactions":"トランザクション数","Output":"出力","Powered by":"Powered by","Previous Block":"前のブロック","Protocol version":"プロトコルバージョン","Proxy setting":"プロキシ設定","Raw transaction data":"トランザクションの生データ","Raw transaction data must be a valid hexadecimal string.":"生のトランザクションデータは有効な16進数でなければいけません。","Received Time":"受信時刻","Redirecting...":"リダイレクトしています...","Search for block, transaction or address":"ブロック、トランザクション、アドレスを検索","See all blocks":"すべてのブロックをみる","Send transaction":"トランザクションを送信","Show Transaction Output data":"トランザクションの出力データをみる","Show all":"すべて表示","Show input":"入力を表示","Show less":"隠す","Show more":"表示する","Signature":"署名","Size":"サイズ","Size (bytes)":"サイズ (バイト)","Skipped Blocks (previously synced)":"スキップされたブロック (同期済み)","Start Date":"開始日時","Status":"ステータス","Summary":"概要","Summary confirmed":"サマリ 検証済み","Sync Progress":"同期の進捗状況","Sync Status":"同期ステータス","Sync Type":"同期タイプ","Synced Blocks":"同期されたブロック数","Testnet":"テストネット","The message failed to verify.":"メッセージの検証に失敗しました。","The message is verifiably from {{verification.address}}.":"メッセージは{{verification.address}}により検証されました。","There are no transactions involving this address.":"このアドレスに対するトランザクションはありません。","This form can be used to broadcast a raw transaction in hex format over\n the Bitcoin network.":"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワーク上に配信することができます。","This form can be used to verify that a message comes from\n a specific Bitcoin address.":"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証することができます。","Time Offset":"時間オフセット","Timestamp":"タイムスタンプ","Today":"今日","Total Amount":"Bitcoin総量","Total Received":"総入金額","Total Sent":"総送金額","Transaction":"トランザクション","Transaction Output Set Information":"トランザクションの出力セット情報","Transaction Outputs":"トランザクションの出力","Transaction succesfully broadcast.
    Transaction id: {{txid}}":"トランザクションの配信に成功しました。
    トランザクションID: {{txid}}","Transactions":"トランザクション","Type":"タイプ","Unconfirmed":"未検証","Unconfirmed Transaction!":"未検証のトランザクションです!","Unconfirmed Txs Balance":"未検証トランザクションの残高","Value Out":"出力値","Verify":"検証","Verify signed message":"署名済みメッセージを検証","Version":"バージョン","Waiting for blocks...":"ブロックを待っています...","Waiting for transactions...":"トランザクションを待っています...","by date.":"日毎。","first seen at":"最初に発見された日時","mined":"採掘された","mined on:":"採掘日時:","(Mainchain)":"(メインチェーン)","(Orphaned)":"(孤立したブロック)","Bits":"Bits","Block #{{block.height}}":"ブロック #{{block.height}}","BlockHash":"ブロックのハッシュ値","Blocks
    mined on:":"ブロック
    採掘日","Coinbase":"コインベース","Hash":"ハッシュ値","LockTime":"ロック時間","Merkle Root":"Merkleルート","Nonce":"Nonce","Ooops!":"おぉっと!","Output is spent":"出力は使用済みです","Output is unspent":"出力は未使用です","Scan":"スキャン","Show/Hide items details":"アイテムの詳細を表示または隠す","Waiting for blocks":"ブロックを待っています","by date. {{detail}} {{before}}":"日時順 {{detail}} {{before}}","scriptSig":"scriptSig","{{tx.confirmations}} Confirmations":"{{tx.confirmations}} 検証"," (Orphaned)":" (孤立したブロック)"," Incoherence in levelDB detected: {{vin.dbError}}":" Incoherence in levelDB detected: {{vin.dbError}}","Waiting for blocks ":"ブロックを待っています "}); -/* jshint +W100 */ -}]); \ No newline at end of file diff --git a/public/src/templates/api.js b/public/src/templates/api.js deleted file mode 100644 index d5cea3d..0000000 --- a/public/src/templates/api.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -angular.module('insight.api') - .factory('Api', - function() { - return { - apiPrefix: '/INSIGHT_API_PREFIX' - } - }); diff --git a/public/views/404.html b/public/views/404.html deleted file mode 100644 index 08c5238..0000000 --- a/public/views/404.html +++ /dev/null @@ -1,6 +0,0 @@ -
    -
    -

    Ooops!

    -

    404 Page not found :(

    -

    Go to home

    -
    diff --git a/public/views/address.html b/public/views/address.html deleted file mode 100644 index edca68c..0000000 --- a/public/views/address.html +++ /dev/null @@ -1,80 +0,0 @@ -
    -
    - -

    Address {{$root.currency.getConvertion(address.balance) || address.balance + ' BTC'}}

    -
    - Loading Address Information -
    -
    -
    - Address - {{address.addrStr}} - -
    -

    Summary confirmed

    -
    -
    - - - - - - - - - - - - - - - - - - - -
    Total Received{{$root.currency.getConvertion(address.totalReceived) || address.totalReceived + ' BTC'}}
    Total Sent{{$root.currency.getConvertion(address.totalSent) || address.totalSent + ' BTC'}}
    Final Balance{{$root.currency.getConvertion(address.balance) || address.balance + ' BTC'}}
    No. Transactions{{address.txApperances}}
    -
    -
    - -
    -
    -
    -

    Unconfirmed

    - - - - - - - - - - - - -
    Unconfirmed Txs Balance{{$root.currency.getConvertion(address.unconfirmedBalance)}}
    No. Transactions{{address.unconfirmedTxApperances}}
    -
    -
    -
    -

    Transactions

    -
    -
    -
    - diff --git a/public/views/block.html b/public/views/block.html deleted file mode 100644 index 4a56365..0000000 --- a/public/views/block.html +++ /dev/null @@ -1,128 +0,0 @@ -
    -
    - -

    Block #{{block.height}}

    -
    - Loading Block Information -
    -
    -
    - BlockHash - {{block.hash}} - -
    -

    Summary

    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Number Of Transactions{{block.tx.length}}
    Height{{block.height}} - (Mainchain) - (Orphaned) -
    Block Reward{{$root.currency.getConvertion(block.reward) || block.reward + ' BTC'}}
    Timestamp{{block.time * 1000 | date:'medium'}}
    Mined by - {{block.poolInfo.poolName}} -
    Merkle Root -
    - - {{block.merkleroot}} -
    -
    Previous Block{{block.height-1}}
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Difficulty{{block.difficulty}}
    Bits{{block.bits}}
    Size (bytes){{block.size}}
    Version{{block.version}}
    Nonce{{block.nonce}}
    Next Block{{block.height+1}}
    -
    -
    -
    -
    -

    Transactions

    -
    -
    - -
    - diff --git a/public/views/block_list.html b/public/views/block_list.html deleted file mode 100644 index 9de2872..0000000 --- a/public/views/block_list.html +++ /dev/null @@ -1,69 +0,0 @@ -
    -
    -
    -
    -
    -
    - -

    Blocks
    - mined on:

    -
    -
    -

    - {{pagination.current}} UTC - -

    -
    - Loading Selected Date... -
    -
    -

     

    -

    Today

    -

    {{humanSince(pagination.currentTs)}} -

     

    - -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - -
    HeightTimestampTransactionsSize
    Waiting for blocks...
    {{b.height}}{{b.time * 1000 | date:'medium'}}{{b.txlength}}{{b.size}}
    - -
    -
    -

    No blocks yet.

    -
    - diff --git a/public/views/dummy-translations.html b/public/views/dummy-translations.html deleted file mode 100644 index ddd9aab..0000000 --- a/public/views/dummy-translations.html +++ /dev/null @@ -1,2 +0,0 @@ -{{'Blocks'|translate}} -{{'Status'|translate}} diff --git a/public/views/includes/connection.html b/public/views/includes/connection.html deleted file mode 100644 index 5518d6e..0000000 --- a/public/views/includes/connection.html +++ /dev/null @@ -1,22 +0,0 @@ -
    - -
    - - Error! - -

    - Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.) -

    - -

    - Can't connect to insight server. Attempting to reconnect... -

    - -

    - Can't connect to internet. Please, check your connection. -

    - -
    -
    diff --git a/public/views/includes/currency.html b/public/views/includes/currency.html deleted file mode 100644 index 483893b..0000000 --- a/public/views/includes/currency.html +++ /dev/null @@ -1,18 +0,0 @@ - - {{currency.symbol}} - - - diff --git a/public/views/includes/header.html b/public/views/includes/header.html deleted file mode 100644 index c00b8ff..0000000 --- a/public/views/includes/header.html +++ /dev/null @@ -1,48 +0,0 @@ -
    -
    - - -
    -
    diff --git a/public/views/includes/infoStatus.html b/public/views/includes/infoStatus.html deleted file mode 100644 index 054d16a..0000000 --- a/public/views/includes/infoStatus.html +++ /dev/null @@ -1,4 +0,0 @@ -Loading... -{{error}} - - diff --git a/public/views/includes/search.html b/public/views/includes/search.html deleted file mode 100644 index 4366974..0000000 --- a/public/views/includes/search.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/public/views/index.html b/public/views/index.html deleted file mode 100644 index 5d88b73..0000000 --- a/public/views/index.html +++ /dev/null @@ -1,79 +0,0 @@ -
    - {{$root.flashMessage}} -
    -
    -
    -
    -
    -
    - -
    - -

    Latest Blocks

    - - - - - - - - - - - - - - - - - - - - -
    HeightAgeTransactionsSize
    Waiting for blocks...
    - {{b.height}} - {{humanSince(b.time)}}{{b.txlength}}{{b.size}}
    - - -

    Latest Transactions

    - - - - - - - - - - - - - - - -
    HashValue Out
    Waiting for transactions...
    - {{tx.txid}} - {{$root.currency.getConvertion(tx.valueOut) || tx.valueOut + ' BTC'}}
    - -
    - -
    -

    About

    -

    insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.

    -

    insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.

    -
    -
    - Powered by -
    - - - - -
    -
    -
    -
    -
    diff --git a/public/views/messages_verify.html b/public/views/messages_verify.html deleted file mode 100644 index 5fae22b..0000000 --- a/public/views/messages_verify.html +++ /dev/null @@ -1,81 +0,0 @@ -
    - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - Loading... -
    -
    - The message is verifiably from {{verification.address}}. -
    -
    - The message failed to verify. -
    -
    -

    An error occured in the verification process.

    -

    - Error message: - {{verification.error}} -

    -
    -
    -
    -
    -
    -

    - Bitcoin comes with a way of signing arbitrary messages. -

    -

    - This form can be used to verify that a message comes from - a specific Bitcoin address. -

    -
    -
    -
    diff --git a/public/views/redirect.html b/public/views/redirect.html deleted file mode 100644 index f7ebaf2..0000000 --- a/public/views/redirect.html +++ /dev/null @@ -1 +0,0 @@ -
    Redirecting...
    diff --git a/public/views/status.html b/public/views/status.html deleted file mode 100644 index 1f174c3..0000000 --- a/public/views/status.html +++ /dev/null @@ -1,124 +0,0 @@ -
    -
    - -
    - -
    -

    Sync Status

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Sync Progress -
    -
    - {{sync.syncPercentage}}% - Complete - -
    -
    -
    Current Sync Status - {{sync.status}} - - - {{sync.error}} - -
    Start Date
    Finish Date
    Initial Block Chain Height{{sync.blockChainHeight}}
    Synced Blocks{{sync.syncedBlocks}}
    Skipped Blocks (previously synced){{sync.skippedBlocks}}
    Sync Type{{sync.type}}
    - -

    Last Block

    - - - - - - - - - - - - -
    Last Block Hash (Bitcoind){{lastblockhash}}
    Current Blockchain Tip (insight){{syncTipHash}}
    - -
    - -
    -

    Bitcoin node information

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Version{{info.version}}
    Protocol version{{info.protocolversion}}
    Blocks{{info.blocks}}
    Time Offset{{info.timeoffset}}
    Connections to other nodes{{info.connections}}
    Mining Difficulty{{info.difficulty}}
    Network{{info.network}}
    Proxy setting{{info.proxy}}
    Info Errors{{info.infoErrors}}
    -
    -
    -
    - diff --git a/public/views/transaction.html b/public/views/transaction.html deleted file mode 100644 index b4bda8a..0000000 --- a/public/views/transaction.html +++ /dev/null @@ -1,98 +0,0 @@ -
    -
    - -
    -

    Transaction - - Input - Output - {{v_index}} - -

    -
    -
    - Loading Transaction Details -
    -
    -
    -
    - Transaction - {{tx.txid}} - -
    -

    Summary

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Size{{tx.size}} (bytes)
    Fee Rate{{$root.currency.getConvertion((tx.fees * 1000) / tx.size) + ' per kB' || ((tx.fees * 1000) / tx.size) + 'BTC per kB'}}
    Received Time{{tx.time * 1000|date:'medium'}}N/A
    Mined Time{{tx.blocktime * 1000|date:'medium'}}N/A
    Included in Block - - Unconfirmed
    LockTime{{tx.locktime}}
    Coinbase -
    - - {{tx.vin[0].coinbase}} -
    -
    -
    -

    Details

    -
    -
    -
    -
    -
    diff --git a/public/views/transaction/list.html b/public/views/transaction/list.html deleted file mode 100644 index d1d8d9e..0000000 --- a/public/views/transaction/list.html +++ /dev/null @@ -1,11 +0,0 @@ -
    There are no transactions involving this address.
    -
    -
    -
    -
    -
    - Loading Transactions... -
    -
    diff --git a/public/views/transaction/tx.html b/public/views/transaction/tx.html deleted file mode 100644 index da9214c..0000000 --- a/public/views/transaction/tx.html +++ /dev/null @@ -1,211 +0,0 @@ -
    -
    - -
    -
    -
    - first seen at - -
    -
    - mined - -
    -
    -
    -
    -
    -
    -
    -
    - No Inputs (Newly Generated Coins) -
    -
    -
    -
    - - -
    -
    -
    -
    - {{$root.currency.getConvertion(vin.value) || vin.value + ' BTC'}} -
    -
    - {{vin.addr}} - {{vin.addr}} - {{vin.addr}} -
    -
    (Input unconfirmed)
    -
    - - Incoherence in levelDB detected: {{vin.dbError}} -
    -
    - - Double spent attempt detected. From tx: - {{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}} -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    - {{$root.currency.getConvertion(vin.value) || vin.value + ' BTC'}} -
    -
    - - {{vin.addr}} - {{vin.addr}} -
    -
    - - (Input unconfirmed) -
    -
    - - Incoherence in levelDB detected: {{vin.dbError}} -
    -
    - - Double spent attempt detected. From tx: - doubleSpentTxID}}">{{vin.doubleSpentTxID}},{{vin.doubleSpentIndex}} -
    -
    -
    -
    -

    Confirmations: {{vin.confirmations}}

    -

    scriptSig

    -
    -

    {{item}}

    -

    -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    - - -
    -
    -
    - -
    -
    -
    -
    -
    - {{$root.currency.getConvertion(vout.value) || vout.value + ' BTC' }} - (S) - (U) -
    - -
    - {{vout.addr}} - {{vout.addr}} - {{address}} -
    -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    - {{$root.currency.getConvertion(vout.value) || vout.value + ' BTC'}} - (U) - - -
    - -
    -
    -
    -

    - Type - {{vout.scriptPubKey.type}} -

    -
    -

    scriptPubKey

    - {{vout.scriptPubKey.asm}} - -
    -
    -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    - -
    - Included in Block {{tx.blockhash}} - -
    - -
    -
    - Fee: {{$root.currency.getConvertion(tx.fees) || tx.fees + 'BTC'}} -
    -
    - {{tx.confirmations}} Confirmations - Unconfirmed Transaction! - {{$root.currency.getConvertion(tx.valueOut) || tx.valueOut + ' BTC' }} -
    -
    diff --git a/public/views/transaction_sendraw.html b/public/views/transaction_sendraw.html deleted file mode 100644 index 9458301..0000000 --- a/public/views/transaction_sendraw.html +++ /dev/null @@ -1,55 +0,0 @@ -
    - -
    -
    -
    -
    - -
    - - - Raw transaction data must be a valid hexadecimal string. - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - Loading... -
    -
    - Transaction succesfully broadcast.
    Transaction id: {{txid}} -
    -
    - An error occured:
    {{error}} -
    -
    -
    -
    -
    -

    - This form can be used to broadcast a raw transaction in hex format over - the Bitcoin network. -

    -
    -
    -
    diff --git a/server/insight-ui/Gruntfile.js b/server/insight-ui/Gruntfile.js deleted file mode 100644 index ad12b37..0000000 --- a/server/insight-ui/Gruntfile.js +++ /dev/null @@ -1,148 +0,0 @@ -'use strict'; - -// var config = require('insight-config.json'); - -module.exports = function(grunt) { - - //Load NPM tasks - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-css'); - grunt.loadNpmTasks('grunt-markdown'); - grunt.loadNpmTasks('grunt-macreload'); - grunt.loadNpmTasks('grunt-angular-gettext'); - grunt.loadNpmTasks('grunt-replace'); - - // Project Configuration - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - replace: { - dist: { - options: { - patterns: [ - { - match: 'INSIGHT_API_PREFIX', - replacement: '<%= pkg.insightConfig.apiPrefix %>' - } - ], - usePrefix: false - }, - files: [ - {src: ['public/src/templates/api.js'], dest: 'public/src/js/services/api.js'} - ] - } - }, - concat: { - options: { - process: function(src, filepath) { - if (filepath.substr(filepath.length - 2) === 'js') { - return '// Source: ' + filepath + '\n' + - src.replace(/(^|\n)[ \t]*('use strict'|"use strict");?\s*/g, '$1'); - } else { - return src; - } - } - }, - vendors: { - src: ['public/src/js/ios-imagefile-megapixel/megapix-image.js', 'public/lib/qrcode-generator/js/qrcode.js', 'public/src/js/jsqrcode/grid.js', 'public/src/js/jsqrcode/version.js', 'public/src/js/jsqrcode/detector.js', 'public/src/js/jsqrcode/formatinf.js', 'public/src/js/jsqrcode/errorlevel.js', 'public/src/js/jsqrcode/bitmat.js', 'public/src/js/jsqrcode/datablock.js', 'public/src/js/jsqrcode/bmparser.js', 'public/src/js/jsqrcode/datamask.js', 'public/src/js/jsqrcode/rsdecoder.js', 'public/src/js/jsqrcode/gf256poly.js', 'public/src/js/jsqrcode/gf256.js', 'public/src/js/jsqrcode/decoder.js', 'public/src/js/jsqrcode/qrcode.js', 'public/src/js/jsqrcode/findpat.js', 'public/src/js/jsqrcode/alignpat.js', 'public/src/js/jsqrcode/databr.js', 'public/lib/momentjs/min/moment.min.js', 'public/lib/moment/lang/es.js', 'public/lib/zeroclipboard/ZeroClipboard.min.js'], - dest: 'public/js/vendors.js' - }, - angular: { - src: ['public/lib/angular/angular.min.js', 'public/lib/angular-resource/angular-resource.min.js', 'public/lib/angular-route/angular-route.min.js', 'public/lib/angular-qrcode/qrcode.js', 'public/lib/angular-animate/angular-animate.min.js', 'public/lib/angular-bootstrap/ui-bootstrap.js', 'public/lib/angular-bootstrap/ui-bootstrap-tpls.js', 'public/lib/angular-ui-utils/ui-utils.min.js', 'public/lib/ngprogress/build/ngProgress.min.js', 'public/lib/angular-gettext/dist/angular-gettext.min.js', 'public/lib/angular-moment/angular-moment.min.js'], - dest: 'public/js/angularjs-all.js' - }, - main: { - src: ['public/src/js/app.js', 'public/src/js/controllers/*.js', 'public/src/js/services/*.js', 'public/src/js/directives.js', 'public/src/js/filters.js', 'public/src/js/config.js', 'public/src/js/init.js', 'public/src/js/translations.js'], - dest: 'public/js/main.js' - }, - css: { - src: ['public/lib/bootstrap/dist/css/bootstrap.min.css', 'public/src/css/**/*.css'], - dest: 'public/css/main.css' - } - }, - uglify: { - options: { - banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n', - mangle: false - }, - vendors: { - src: 'public/js/vendors.js', - dest: 'public/js/vendors.min.js' - }, - angular: { - src: 'public/js/angularjs-all.js', - dest: 'public/js/angularjs-all.min.js' - }, - main: { - src: 'public/js/main.js', - dest: 'public/js/main.min.js' - } - }, - cssmin: { - css: { - src: 'public/css/main.css', - dest: 'public/css/main.min.css' - } - }, - markdown: { - all: { - files: [ - { - expand: true, - src: 'README.md', - dest: '.', - ext: '.html' - } - ] - } - }, - macreload: { - chrome: { - browser: 'chrome', - editor: 'macvim' - } - }, - watch: { - main: { - files: ['public/src/js/**/*.js'], - tasks: ['concat:main', 'uglify:main'], - }, - css: { - files: ['public/src/css/**/*.css'], - tasks: ['concat:css', 'cssmin'], - }, - }, - nggettext_extract: { - pot: { - files: { - 'po/template.pot': ['public/views/*.html', 'public/views/**/*.html'] - } - }, - }, - nggettext_compile: { - all: { - options: { - module: 'insight' - }, - files: { - 'public/src/js/translations.js': ['po/*.po'] - } - }, - } - }); - - //Making grunt default to force in order not to break the project. - grunt.option('force', true); - - //Default task(s). - grunt.registerTask('default', ['replace', 'watch']); - - //Update .pot file - grunt.registerTask('translate', ['nggettext_extract']); - - //Compile task (concat + minify) - grunt.registerTask('compile', ['replace', 'nggettext_compile', 'concat', 'uglify', 'cssmin']); - - -}; diff --git a/server/insight-ui/README.md b/server/insight-ui/README.md deleted file mode 100644 index e88fe4f..0000000 --- a/server/insight-ui/README.md +++ /dev/null @@ -1,118 +0,0 @@ -# Insight UI - -A Bitcoin blockchain explorer web application service for [Bitcore Node](https://github.com/bitpay/bitcore-node) using the [Insight API](https://github.com/bitpay/insight-api). - -## Quick Start - -Please see the guide at [https://bitcore.io/guides/full-node](https://bitcore.io/guides/full-node) for information about getting a block explorer running. This is only the front-end component of the block explorer, and is packaged together with all of the necessary components in [Bitcore](https://github.com/bitpay/bitcore). - -## Getting Started - -To manually install all of the necessary components, you can run these commands: - -```bash -npm install -g bitcore-node -bitcore-node create mynode -cd mynode -bitcore-node install insight-api -bitcore-node install insight-ui -bitcore-node start -``` - -Open a web browser to `http://localhost:3001/insight/` - -## Development - -To build Insight UI locally: - -``` -$ npm run build -``` - -A watch task is also available: - -``` -$ npm run watch -``` - -## Changing routePrefix and apiPrefix - -By default, the `insightConfig` in `package.json` is: - -```json - "insightConfig": { - "apiPrefix": "insight-api", - "routePrefix": "insight" - } -``` - -To change these routes, first make your changes to `package.json`, for example: - -```json - "insightConfig": { - "apiPrefix": "api", - "routePrefix": "" - } -``` - -Then rebuild the `insight-ui` service: - -``` -$ npm run build -``` - -## Multilanguage support - -Insight UI uses [angular-gettext](http://angular-gettext.rocketeer.be) for multilanguage support. - -To enable a text to be translated, add the ***translate*** directive to html tags. See more details [here](http://angular-gettext.rocketeer.be/dev-guide/annotate/). Then, run: - -``` -grunt compile -``` - -This action will create a template.pot file in ***po/*** folder. You can open it with some PO editor ([Poedit](http://poedit.net)). Read this [guide](http://angular-gettext.rocketeer.be/dev-guide/translate/) to learn how to edit/update/import PO files from a generated POT file. PO file will be generated inside po/ folder. - -If you make new changes, simply run **grunt compile** again to generate a new .pot template and the angular javascript ***js/translations.js***. Then (if use Poedit), open .po file and choose ***update from POT File*** from **Catalog** menu. - -Finally changes your default language from ***public/src/js/config*** - -``` -gettextCatalog.currentLanguage = 'es'; -``` - -This line will take a look at any *.po files inside ***po/*** folder, e.g. -**po/es.po**, **po/nl.po**. After any change do not forget to run ***grunt -compile***. - - -## Note - -For more details about the [Insight API](https://github.com/bitpay/insight-api) configuration and end-points, go to [Insight API GitHub repository](https://github.com/bitpay/insight-api). - -## Contribute - -Contributions and suggestions are welcomed at the [Insight UI GitHub repository](https://github.com/bitpay/insight-ui). - - -## License -(The MIT License) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/server/insight-ui/bitcore-node/index.js b/server/insight-ui/bitcore-node/index.js deleted file mode 100644 index a013267..0000000 --- a/server/insight-ui/bitcore-node/index.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -var BaseService = require('./service'); -var inherits = require('util').inherits; -var fs = require('fs'); -var pkg = require('../package'); - -var InsightUI = function(options) { - BaseService.call(this, options); - // we don't use the options object for routePrefix and apiPrefix, since the - // client must be rebuilt with the proper options. A future version of - // Bitcore should allow for a service "build" step to make this better. - this.apiPrefix = pkg.insightConfig.apiPrefix; - this.routePrefix = pkg.insightConfig.routePrefix; -}; - -InsightUI.dependencies = ['insight-api']; - -inherits(InsightUI, BaseService); - -InsightUI.prototype.start = function(callback) { - this.indexFile = this.filterIndexHTML(fs.readFileSync(__dirname + '/../public/index-template.html', {encoding: 'utf8'})); - setImmediate(callback); -}; - -InsightUI.prototype.getRoutePrefix = function() { - return this.routePrefix; -}; - -InsightUI.prototype.setupRoutes = function(app, express) { - var self = this; - app.use(express.static(__dirname + '/../public')); - // if not in found, fall back to indexFile (404 is handled client-side) - app.use(function(req, res, next) { - res.setHeader('Content-Type', 'text/html'); - res.send(self.indexFile); - }); -}; - -InsightUI.prototype.filterIndexHTML = function(data) { - var transformed = data; - if (this.routePrefix !== '') { - transformed = transformed.replace('\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.1\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de_DE\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(Eingabe unbestätigt)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 Seite nicht gefunden :(" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen " -"REST und Websocket APIs um eigene Wallets oder Applikationen zu " -"implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain " -"ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der " -"aktuelle Quellcode ist auf Github zu finden." - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insight befindet sich aktuell noch in der Entwicklung. " -"Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren " -"Verbesserung an unseren Github Issue Tracker." - -#: public/views/index.html -msgid "About" -msgstr "Über insight" - -#: public/views/address.html -msgid "Address" -msgstr "Adresse" - -#: public/views/index.html -msgid "Age" -msgstr "Alter" - -#: public/views/status.html -msgid "Application Status" -msgstr "Programmstatus" - -#: public/views/status.html -msgid "Best Block" -msgstr "Bester Block" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Bitcoin-Node Info" - -#: public/views/block.html -msgid "Block" -msgstr "Block" - -#: public/views/block.html -msgid "Block Reward" -msgstr "Belohnung" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "Blöcke" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "Serialisierte Bytes" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom " -"P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:" -"{{port}} ist fehlgeschlagen.)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "" -"Keine Verbindung zum insight-Server möglich. Es wird versucht die " -"Verbindung neu aufzubauen..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen." - -#: public/views/status.html -msgid "Complete" -msgstr "Vollständig" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "Bestätigungen" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "Verbindungen" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "Verbindungen zu Nodes" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "Aktueller Blockchain Tip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "Aktueller Status" - -#: public/views/transaction.html -msgid "Details" -msgstr "Details" - -#: public/views/block.html -msgid "Difficulty" -msgstr "Schwierigkeit" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "Es wurde ein \"double Spend\" Versuch erkannt.Von tx:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "Fehler!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "Gebühr" - -#: public/views/address.html -msgid "Final Balance" -msgstr "Schlussbilanz" - -#: public/views/status.html -msgid "Finish Date" -msgstr "Fertigstellung" - -#: public/views/404.html -msgid "Go to home" -msgstr "Zur Startseite" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "Hash Serialisiert" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "Höhe" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "Eingefügt in Block" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "Fehlerbeschreibung" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "Ursprüngliche Blockchain Höhe" - -#: public/views/transaction.html -msgid "Input" -msgstr "Eingänge" - -#: public/views/status.html -msgid "Last Block" -msgstr "Letzter Block" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "Letzter Hash (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "Letzte Blöcke" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "Letzte Transaktionen" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "Lade Adressinformationen" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "Lade Blockinformation" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "Lade gewähltes Datum..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "Lade Transaktionsdetails" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "Lade Transaktionen..." - -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "Lade..." - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "Block gefunden (Mining)" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "Gefunden von" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "Schwierigkeitgrad" - -#: public/views/block.html -msgid "Next Block" -msgstr "Nächster Block" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "Keine Eingänge (Neu generierte Coins)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "Keine Blöcke bisher." - -#: public/views/includes/header.html public/views/includes/search.html -msgid "No matching records found!" -msgstr "Keine passenden Einträge gefunden!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "Anzahl Transaktionen" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "Anzahl der Transaktionen" - -#: public/views/transaction.html -msgid "Output" -msgstr "Ausgänge" - -#: public/views/index.html -msgid "Powered by" -msgstr "Powered by" - -#: public/views/block.html -msgid "Previous Block" -msgstr "Letzter Block" - -#: public/views/status.html -msgid "Protocol version" -msgstr "Protokollversion" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "Proxyeinstellung" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "Eingangszeitpunkt" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "Umleitung..." - -#: public/views/includes/header.html -msgid "Search for block, transaction or address" -msgstr "Suche Block, Transaktion oder Adresse" - -#: public/views/index.html -msgid "See all blocks" -msgstr "Alle Blöcke anzeigen" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "Zeige Abgänge" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "Zeige Alles" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "Zeige Eingänge" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "Weniger anzeigen" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "Mehr anzeigen" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "Größe" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "Größe (bytes)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "Verworfene Blöcke (bereits syncronisiert)" - -#: public/views/status.html -msgid "Start Date" -msgstr "Startdatum" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "Status" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "Zusammenfassung" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "Zusammenfassung bestätigt" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "Fortschritt" - -#: public/views/status.html -msgid "Sync Status" -msgstr "Syncronisation" - -#: public/views/status.html -msgid "Sync Type" -msgstr "Art der Syncronisation" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "Syncronisierte Blöcke" - -#: public/views/status.html -msgid "Testnet" -msgstr "Testnet aktiv" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "Es gibt keine Transaktionen zu dieser Adressse" - -#: public/views/status.html -msgid "Time Offset" -msgstr "Zeitoffset zu UTC" - -#: public/views/block.html -msgid "Timestamp" -msgstr "Zeitstempel" - -#: public/views/block_list.html -msgid "Today" -msgstr "Heute" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Gesamtsumme" - -#: public/views/address.html -msgid "Total Received" -msgstr "Insgesamt empfangen" - -#: public/views/address.html -msgid "Total Sent" -msgstr "Insgesamt gesendet" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "Transaktion" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "Transaktions Abgänge" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "Abgänge" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "Transaktionen" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "Typ" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "Unbestätigt" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "Unbestätigte Transaktion!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "Unbestätigtes Guthaben" - -#: public/views/index.html -msgid "Value Out" -msgstr "Wert" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "Version" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "Warte auf Blöcke..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "Warte auf Transaktionen..." - -#: public/views/block_list.html -msgid "by date." -msgstr "nach Datum." - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "zuerst gesehen am" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "gefunden" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "vom:" - -msgid "Waiting for blocks" -msgstr "Warte auf Blöcke" diff --git a/server/insight-ui/po/es.po b/server/insight-ui/po/es.po deleted file mode 100644 index 90fbca5..0000000 --- a/server/insight-ui/po/es.po +++ /dev/null @@ -1,470 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Insight\n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.6.8\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(Entrada sin confirmar)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 Página no encontrada :(" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insight es un explorador de bloques de Bitcoin open-source con un completo " -"conjunto de REST y APIs de websockets que pueden ser usadas para escribir " -"monederos de Bitcoins y otras aplicaciones que requieran consultar un " -"explorador de bloques. Obtén el código en el repositorio abierto de Github." - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insight esta en desarrollo aún, por ello agradecemos que " -"nos reporten errores o sugerencias para mejorar el software. Github issue " -"tracker." - -#: public/views/index.html -msgid "About" -msgstr "Acerca de" - -#: public/views/address.html -msgid "Address" -msgstr "Dirección" - -#: public/views/index.html -msgid "Age" -msgstr "Edad" - -#: public/views/status.html -msgid "Application Status" -msgstr "Estado de la Aplicación" - -#: public/views/status.html -msgid "Best Block" -msgstr "Mejor Bloque" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Información del nodo Bitcoin" - -#: public/views/block.html -msgid "Block" -msgstr "Bloque" - -#: public/views/block.html -msgid "Block Reward" -msgstr "Bloque Recompensa" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "Bloques" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "Bytes Serializados" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la " -"red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "No se pudo conectar al servidor insight. Intentando re-conectar..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "No se pudo conectar a Internet. Por favor, verifique su conexión." - -#: public/views/status.html -msgid "Complete" -msgstr "Completado" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "Confirmaciones" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "Con" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "Conexiones a otros nodos" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "Actual Blockchain Tip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "Actual Estado de Sincronización" - -#: public/views/transaction.html -msgid "Details" -msgstr "Detalles" - -#: public/views/block.html -msgid "Difficulty" -msgstr "Dificultad" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "Intento de doble gasto detectado. De la transacción:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "¡Error!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "Tasa" - -#: public/views/address.html -msgid "Final Balance" -msgstr "Balance Final" - -#: public/views/status.html -msgid "Finish Date" -msgstr "Fecha Final" - -#: public/views/404.html -msgid "Go to home" -msgstr "Volver al Inicio" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "Hash Serializado" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "Altura" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "Incluido en el Bloque" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "Detectada una incoherencia en levelDB:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "Errores de Información" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "Altura de la Cadena en Bloque Inicial" - -#: public/views/transaction.html -msgid "Input" -msgstr "Entrada" - -#: public/views/status.html -msgid "Last Block" -msgstr "Último Bloque" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "Último Bloque Hash (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "Últimos Bloques" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "Últimas Transacciones" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "Cargando Información de la Dirección" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "Cargando Información del Bloque" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "Cargando Fecha Seleccionada..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "Cargando Detalles de la Transacción" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "Cargando Transacciones..." - -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "Cargando..." - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "Hora de Minado" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "Minado por" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "Dificultad de Minado" - -#: public/views/block.html -msgid "Next Block" -msgstr "Próximo Bloque" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "Sin Entradas (Monedas Recién Generadas)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "No hay bloques aún." - -#: public/views/includes/header.html public/views/includes/search.html -msgid "No matching records found!" -msgstr "¡No se encontraron registros coincidentes!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "Nro. de Transacciones" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "Número de Transacciones" - -#: public/views/transaction.html -msgid "Output" -msgstr "Salida" - -#: public/views/index.html -msgid "Powered by" -msgstr "Funciona con" - -#: public/views/block.html -msgid "Previous Block" -msgstr "Bloque Anterior" - -#: public/views/status.html -msgid "Protocol version" -msgstr "Versión del protocolo" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "Opción de proxy" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "Hora de Recibido" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "Redireccionando..." - -#: public/views/includes/header.html -msgid "Search for block, transaction or address" -msgstr "Buscar bloques, transacciones o direcciones" - -#: public/views/index.html -msgid "See all blocks" -msgstr "Ver todos los bloques" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "Mostrar dato de Salida de la Transacción" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "Mostrar todos" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "Mostrar entrada" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "Ver menos" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "Ver más" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "Tamaño" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "Tamaño (bytes)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "Bloques Saltados (previamente sincronizado)" - -#: public/views/status.html -msgid "Start Date" -msgstr "Fecha de Inicio" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "Estado" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "Resumen" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "Resumen confirmados" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "Proceso de Sincronización" - -#: public/views/status.html -msgid "Sync Status" -msgstr "Estado de Sincronización" - -#: public/views/status.html -msgid "Sync Type" -msgstr "Tipo de Sincronización" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "Bloques Sincornizados" - -#: public/views/status.html -msgid "Testnet" -msgstr "Red de prueba" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "No hay transacciones para esta dirección" - -#: public/views/status.html -msgid "Time Offset" -msgstr "Desplazamiento de hora" - -#: public/views/block.html -msgid "Timestamp" -msgstr "Fecha y hora" - -#: public/views/block_list.html -msgid "Today" -msgstr "Hoy" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Cantidad Total" - -#: public/views/address.html -msgid "Total Received" -msgstr "Total Recibido" - -#: public/views/address.html -msgid "Total Sent" -msgstr "Total Enviado" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "Transacción" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "Información del Conjunto de Salida de la Transacción" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "Salidas de la Transacción" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "Transacciones" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "Tipo" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "Sin confirmar" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "¡Transacción sin confirmar!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "Balance sin confirmar" - -#: public/views/index.html -msgid "Value Out" -msgstr "Valor de Salida" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "Versión" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "Esperando bloques..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "Esperando transacciones..." - -#: public/views/block_list.html -msgid "by date." -msgstr "por fecha." - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "Visto a" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "minado" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "minado el:" - -#~ msgid "Waiting for blocks" -#~ msgstr "Esperando bloques" diff --git a/server/insight-ui/po/ja.po b/server/insight-ui/po/ja.po deleted file mode 100644 index 53d31ab..0000000 --- a/server/insight-ui/po/ja.po +++ /dev/null @@ -1,617 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: Vis Virial \n" -"Language-Team: \n" -"Language: ja\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.4\n" - -#: public/views/transaction/tx.html -msgid "(Input unconfirmed)" -msgstr "(入力は未検証です)" - -#: public/views/404.html -msgid "404 Page not found :(" -msgstr "404 ページがみつかりません (´・ω・`)" - -#: public/views/index.html -msgid "" -"insight is an open-source Bitcoin blockchain explorer with complete REST " -"and websocket APIs that can be used for writing web wallets and other apps " -"that need more advanced blockchain queries than provided by bitcoind RPC. " -"Check out the source code." -msgstr "" -"insightは、bitcoind RPCの提供するものよりも詳細なブロック" -"チェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに" -"使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソース" -"コードを確認" - -#: public/views/index.html -msgid "" -"insight is still in development, so be sure to report any " -"bugs and provide feedback for improvement at our github issue tracker." -msgstr "" -"insightは現在開発中です。githubのissueトラッカにてバグの" -"報告や改善案の提案をお願いします。" - -#: public/views/index.html -msgid "About" -msgstr "はじめに" - -#: public/views/address.html public/views/messages_verify.html -msgid "Address" -msgstr "アドレス" - -#: public/views/index.html -msgid "Age" -msgstr "生成後経過時間" - -#: public/views/messages_verify.html -msgid "An error occured in the verification process." -msgstr "検証過程でエラーが発生しました。" - -#: public/views/transaction_sendraw.html -msgid "An error occured:
    {{error}}" -msgstr "エラーが発生しました:
    {{error}}" - -#: public/views/status.html -msgid "Application Status" -msgstr "アプリケーションの状態" - -#: public/views/status.html -msgid "Best Block" -msgstr "最良ブロック" - -#: public/views/messages_verify.html -msgid "Bitcoin comes with a way of signing arbitrary messages." -msgstr "Bitcoinには任意のメッセージを署名する昨日が備わっています。" - -#: public/views/status.html -msgid "Bitcoin node information" -msgstr "Bitcoinノード情報" - -#: public/views/block.html -msgid "Block" -msgstr "ブロック" - -#: public/views/block.html -msgid "Block Reward" -msgstr "ブロック報酬" - -#: public/views/block_list.html public/views/dummy-translations.html -#: public/views/status.html -msgid "Blocks" -msgstr "ブロック" - -#: public/views/transaction_sendraw.html -msgid "Broadcast Raw Transaction" -msgstr "生のトランザクションを配信" - -#: public/views/status.html -msgid "Bytes Serialized" -msgstr "シリアライズ後の容量 (バイト)" - -#: public/views/includes/connection.html -msgid "" -"Can't connect to bitcoind to get live updates from the p2p network. (Tried " -"connecting to bitcoind at {{host}}:{{port}} and failed.)" -msgstr "" -"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませ" -"んでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)" - -#: public/views/includes/connection.html -msgid "Can't connect to insight server. Attempting to reconnect..." -msgstr "insight サーバに接続できません。再接続しています..." - -#: public/views/includes/connection.html -msgid "Can't connect to internet. Please, check your connection." -msgstr "インターネットに接続できません。コネクションを確認してください。" - -#: public/views/status.html -msgid "Complete" -msgstr "完了" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Confirmations" -msgstr "検証数" - -#: public/views/includes/header.html -msgid "Conn" -msgstr "接続数" - -#: public/views/status.html -msgid "Connections to other nodes" -msgstr "他ノードへの接続" - -#: public/views/status.html -msgid "Current Blockchain Tip (insight)" -msgstr "現在のブロックチェインのTip (insight)" - -#: public/views/status.html -msgid "Current Sync Status" -msgstr "現在の同期状況" - -#: public/views/transaction.html -msgid "Details" -msgstr "詳細" - -#: public/views/block.html -msgid "Difficulty" -msgstr "難易度" - -#: public/views/transaction/tx.html -msgid "Double spent attempt detected. From tx:" -msgstr "二重支払い攻撃をこのトランザクションから検知しました:" - -#: public/views/messages_verify.html -msgid "Error message:" -msgstr "エラーメッセージ:" - -#: public/views/includes/connection.html -msgid "Error!" -msgstr "エラー!" - -#: public/views/transaction/tx.html -msgid "Fee" -msgstr "手数料" - -#: public/views/address.html -msgid "Final Balance" -msgstr "最終残高" - -#: public/views/status.html -msgid "Finish Date" -msgstr "終了日時" - -#: public/views/404.html -msgid "Go to home" -msgstr "ホームへ" - -#: public/views/status.html -msgid "Hash Serialized" -msgstr "シリアライズデータのハッシュ値" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html public/views/status.html -#: public/views/includes/header.html -msgid "Height" -msgstr "ブロック高" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Included in Block" -msgstr "取り込まれたブロック" - -#: public/views/transaction/tx.html -msgid "Incoherence in levelDB detected:" -msgstr "levelDBの破損を検知しました:" - -#: public/views/status.html -msgid "Info Errors" -msgstr "エラー情報" - -#: public/views/status.html -msgid "Initial Block Chain Height" -msgstr "起動時のブロック高" - -#: public/views/transaction.html -msgid "Input" -msgstr "入力" - -#: public/views/status.html -msgid "Last Block" -msgstr "直前のブロック" - -#: public/views/status.html -msgid "Last Block Hash (Bitcoind)" -msgstr "直前のブロックのハッシュ値 (Bitcoind)" - -#: public/views/index.html -msgid "Latest Blocks" -msgstr "最新のブロック" - -#: public/views/index.html -msgid "Latest Transactions" -msgstr "最新のトランザクション" - -#: public/views/address.html -msgid "Loading Address Information" -msgstr "アドレス情報を読み込んでいます" - -#: public/views/block.html -msgid "Loading Block Information" -msgstr "ブロック情報を読み込んでいます" - -#: public/views/block_list.html -msgid "Loading Selected Date..." -msgstr "選択されたデータを読み込んでいます..." - -#: public/views/transaction.html -msgid "Loading Transaction Details" -msgstr "トランザクションの詳細を読み込んでいます" - -#: public/views/transaction/list.html -msgid "Loading Transactions..." -msgstr "トランザクションを読み込んでいます..." - -#: public/views/messages_verify.html public/views/transaction_sendraw.html -#: public/views/includes/infoStatus.html -msgid "Loading..." -msgstr "ロード中..." - -#: public/views/messages_verify.html -msgid "Message" -msgstr "メッセージ" - -#: public/views/transaction.html -msgid "Mined Time" -msgstr "採掘時刻" - -#: public/views/block.html public/views/block_list.html -#: public/views/index.html -msgid "Mined by" -msgstr "採掘者" - -#: public/views/status.html -msgid "Mining Difficulty" -msgstr "採掘難易度" - -#: public/views/block.html -msgid "Next Block" -msgstr "次のブロック" - -#: public/views/transaction/tx.html -msgid "No Inputs (Newly Generated Coins)" -msgstr "入力なし (新しく生成されたコイン)" - -#: public/views/block_list.html -msgid "No blocks yet." -msgstr "ブロックはありません。" - -#: public/views/includes/search.html -msgid "No matching records found!" -msgstr "一致するレコードはありません!" - -#: public/views/address.html -msgid "No. Transactions" -msgstr "トランザクション数" - -#: public/views/block.html -msgid "Number Of Transactions" -msgstr "トランザクション数" - -#: public/views/transaction.html -msgid "Output" -msgstr "出力" - -#: public/views/index.html -msgid "Powered by" -msgstr "Powered by" - -#: public/views/block.html -msgid "Previous Block" -msgstr "前のブロック" - -#: public/views/status.html -msgid "Protocol version" -msgstr "プロトコルバージョン" - -#: public/views/status.html -msgid "Proxy setting" -msgstr "プロキシ設定" - -#: public/views/transaction_sendraw.html -msgid "Raw transaction data" -msgstr "トランザクションの生データ" - -#: public/views/transaction_sendraw.html -msgid "Raw transaction data must be a valid hexadecimal string." -msgstr "生のトランザクションデータは有効な16進数でなければいけません。" - -#: public/views/transaction.html -msgid "Received Time" -msgstr "受信時刻" - -#: public/views/redirect.html -msgid "Redirecting..." -msgstr "リダイレクトしています..." - -#: public/views/includes/search.html -msgid "Search for block, transaction or address" -msgstr "ブロック、トランザクション、アドレスを検索" - -#: public/views/index.html -msgid "See all blocks" -msgstr "すべてのブロックをみる" - -#: public/views/transaction_sendraw.html -msgid "Send transaction" -msgstr "トランザクションを送信" - -#: public/views/status.html -msgid "Show Transaction Output data" -msgstr "トランザクションの出力データをみる" - -#: public/views/transaction/tx.html -msgid "Show all" -msgstr "すべて表示" - -#: public/views/transaction/tx.html -msgid "Show input" -msgstr "入力を表示" - -#: public/views/transaction/tx.html -msgid "Show less" -msgstr "隠す" - -#: public/views/transaction/tx.html -msgid "Show more" -msgstr "表示する" - -#: public/views/messages_verify.html -msgid "Signature" -msgstr "署名" - -#: public/views/block_list.html public/views/index.html -#: public/views/transaction.html -msgid "Size" -msgstr "サイズ" - -#: public/views/block.html -msgid "Size (bytes)" -msgstr "サイズ (バイト)" - -#: public/views/status.html -msgid "Skipped Blocks (previously synced)" -msgstr "スキップされたブロック (同期済み)" - -#: public/views/status.html -msgid "Start Date" -msgstr "開始日時" - -#: public/views/dummy-translations.html -msgid "Status" -msgstr "ステータス" - -#: public/views/block.html public/views/transaction.html -msgid "Summary" -msgstr "概要" - -#: public/views/address.html -msgid "Summary confirmed" -msgstr "サマリ 検証済み" - -#: public/views/status.html -msgid "Sync Progress" -msgstr "同期の進捗状況" - -#: public/views/status.html -msgid "Sync Status" -msgstr "同期ステータス" - -#: public/views/status.html -msgid "Sync Type" -msgstr "同期タイプ" - -#: public/views/status.html -msgid "Synced Blocks" -msgstr "同期されたブロック数" - -#: public/views/status.html -msgid "Testnet" -msgstr "テストネット" - -#: public/views/messages_verify.html -msgid "The message failed to verify." -msgstr "メッセージの検証に失敗しました。" - -#: public/views/messages_verify.html -msgid "The message is verifiably from {{verification.address}}." -msgstr "メッセージは{{verification.address}}により検証されました。" - -#: public/views/transaction/list.html -msgid "There are no transactions involving this address." -msgstr "このアドレスに対するトランザクションはありません。" - -#: public/views/transaction_sendraw.html -msgid "" -"This form can be used to broadcast a raw transaction in hex format over\n" -" the Bitcoin network." -msgstr "" -"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワー" -"ク上に配信することができます。" - -#: public/views/messages_verify.html -msgid "" -"This form can be used to verify that a message comes from\n" -" a specific Bitcoin address." -msgstr "" -"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証する" -"ことができます。" - -#: public/views/status.html -msgid "Time Offset" -msgstr "時間オフセット" - -#: public/views/block.html public/views/block_list.html -msgid "Timestamp" -msgstr "タイムスタンプ" - -#: public/views/block_list.html -msgid "Today" -msgstr "今日" - -#: public/views/status.html -msgid "Total Amount" -msgstr "Bitcoin総量" - -#: public/views/address.html -msgid "Total Received" -msgstr "総入金額" - -#: public/views/address.html -msgid "Total Sent" -msgstr "総送金額" - -#: public/views/transaction.html -msgid "Transaction" -msgstr "トランザクション" - -#: public/views/status.html -msgid "Transaction Output Set Information" -msgstr "トランザクションの出力セット情報" - -#: public/views/status.html -msgid "Transaction Outputs" -msgstr "トランザクションの出力" - -#: public/views/transaction_sendraw.html -msgid "Transaction succesfully broadcast.
    Transaction id: {{txid}}" -msgstr "トランザクションの配信に成功しました。
    トランザクションID: {{txid}}" - -#: public/views/address.html public/views/block.html -#: public/views/block_list.html public/views/index.html -#: public/views/status.html -msgid "Transactions" -msgstr "トランザクション" - -#: public/views/transaction/tx.html -msgid "Type" -msgstr "タイプ" - -#: public/views/address.html -msgid "Unconfirmed" -msgstr "未検証" - -#: public/views/transaction.html public/views/transaction/tx.html -msgid "Unconfirmed Transaction!" -msgstr "未検証のトランザクションです!" - -#: public/views/address.html -msgid "Unconfirmed Txs Balance" -msgstr "未検証トランザクションの残高" - -#: public/views/index.html -msgid "Value Out" -msgstr "出力値" - -#: public/views/messages_verify.html -msgid "Verify" -msgstr "検証" - -#: public/views/messages_verify.html -msgid "Verify signed message" -msgstr "署名済みメッセージを検証" - -#: public/views/block.html public/views/status.html -msgid "Version" -msgstr "バージョン" - -#: public/views/block_list.html public/views/index.html -msgid "Waiting for blocks..." -msgstr "ブロックを待っています..." - -#: public/views/index.html -msgid "Waiting for transactions..." -msgstr "トランザクションを待っています..." - -#: public/views/block_list.html -msgid "by date." -msgstr "日毎。" - -#: public/views/transaction/tx.html -msgid "first seen at" -msgstr "最初に発見された日時" - -#: public/views/transaction/tx.html -msgid "mined" -msgstr "採掘された" - -#: public/views/block_list.html -msgid "mined on:" -msgstr "採掘日時:" - -#~ msgid "(Mainchain)" -#~ msgstr "(メインチェーン)" - -#~ msgid "(Orphaned)" -#~ msgstr "(孤立したブロック)" - -#~ msgid "Bits" -#~ msgstr "Bits" - -#~ msgid "Block #{{block.height}}" -#~ msgstr "ブロック #{{block.height}}" - -#~ msgid "BlockHash" -#~ msgstr "ブロックのハッシュ値" - -#~ msgid "Blocks
    mined on:" -#~ msgstr "ブロック
    採掘日" - -#~ msgid "Coinbase" -#~ msgstr "コインベース" - -#~ msgid "Hash" -#~ msgstr "ハッシュ値" - -#~ msgid "LockTime" -#~ msgstr "ロック時間" - -#~ msgid "Merkle Root" -#~ msgstr "Merkleルート" - -#~ msgid "Nonce" -#~ msgstr "Nonce" - -#~ msgid "Ooops!" -#~ msgstr "おぉっと!" - -#~ msgid "Output is spent" -#~ msgstr "出力は使用済みです" - -#~ msgid "Output is unspent" -#~ msgstr "出力は未使用です" - -#~ msgid "Scan" -#~ msgstr "スキャン" - -#~ msgid "Show/Hide items details" -#~ msgstr "アイテムの詳細を表示または隠す" - -#~ msgid "Waiting for blocks" -#~ msgstr "ブロックを待っています" - -#~ msgid "by date. {{detail}} {{before}}" -#~ msgstr "日時順 {{detail}} {{before}}" - -#~ msgid "scriptSig" -#~ msgstr "scriptSig" - -#~ msgid "{{tx.confirmations}} Confirmations" -#~ msgstr "{{tx.confirmations}} 検証" - -#~ msgid " (Orphaned)" -#~ msgstr "" -#~ " (孤立したブロッ" -#~ "ク)" - -#~ msgid "" -#~ " Incoherence in " -#~ "levelDB detected: {{vin.dbError}}" -#~ msgstr "" -#~ " Incoherence in " -#~ "levelDB detected: {{vin.dbError}}" - -#~ msgid "Waiting for blocks " -#~ msgstr "ブロックを待っています " diff --git a/server/insight-ui/public/css/main.css b/server/insight-ui/public/css/main.css deleted file mode 100644 index 18f1f47..0000000 --- a/server/insight-ui/public/css/main.css +++ /dev/null @@ -1,859 +0,0 @@ -/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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}}*{-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:62.5%;-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;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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:#999}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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right: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;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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.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.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.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;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,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:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.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]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{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{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}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.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;border-color:#3c763d;background-color:#dff0d8}.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;border-color:#8a6d3b;background-color:#fcf8e3}.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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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>.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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.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{outline:0;background-image:none;-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{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.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:#ebebeb;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:#3276b1;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:#47a447;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:#39b3d7;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:#ed9c28;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:#d2322d;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{color:#428bca;font-weight:400;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:#999;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%;padding-left:0;padding-right:0}.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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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"}.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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right: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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-bottom:0;padding-left: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:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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{text-align:center;margin-bottom:5px}.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-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.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}@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;padding:15px;font-size:18px;line-height:20px;height:50px}.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;margin-right:15px;padding:9px 10px;margin-top:8px;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;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{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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>.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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;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;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom: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-right-radius:0;border-top-left-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-left:15px;margin-right: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{background-color:#e7e7e7;color:#555}@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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{background-color:#080808;color:#fff}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-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;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.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-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-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-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.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;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;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}.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-left:60px;padding-right: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;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right: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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.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: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: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: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: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{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-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{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.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-right-radius:3px;border-top-left-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-right-radius:3px;border-top-left-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}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.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-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-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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.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{bottom:0;right:5px;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:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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{content:" ";display:table}.clearfix: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-left:auto;margin-right: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}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{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 (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: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: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 (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}}@media print{.hidden-print{display:none!important}} -/* Sticky footer styles --------------------------------------------------- */ -@charset "UTF-8"; - - -html, -body { - color: #373D42; - font-family: 'Ubuntu', sans-serif; - height: 100%; - /* The html and body elements cannot have any padding or margin. */ -} - -h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { - color: #373D42; - font-family: 'Ubuntu', sans-serif; -} - -[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], -.ng-cloak, .x-ng-cloak, -.ng-hide { - display: none !important; -} - -/* Styling for the ngProgress itself */ -#ngProgress { - background-color: #6C9032 !important; - box-shadow: none !important; - color: #373D42 !important; - height: 3px !important; - margin: 0; - opacity: 0; - padding: 0; - z-index: 99998; - - /* Add CSS3 styles for transition smoothing */ - -webkit-transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; -} - -/* Styling for the ngProgress-container */ -#ngProgress-container { - position: fixed; - margin: 0; - padding: 0; - top: 63px; - left: 0; - right: 0; - z-index: 99999; -} - -/* QR modal */ -#qr-canvas { display: none; } -#qrcode-scanner-video { - margin: 0 auto 10px auto; - display: block; -} -#file-input-wrapper { - padding: 0; - width: 100%; -} -#file-input-wrapper input { - opacity: 0; - padding: 5px; -} -#file-input-wrapper span { - padding-top: 5px; - width: 100%; -} -#file-input-wrapper i { display: none; } - -/* Wrapper for page content to push down footer */ -#wrap { - min-height: 100%; - height: auto; - /* Negative indent footer by its height */ - margin: 0 auto -51px; - /* Pad bottom by footer height */ - padding: 0 0 75px; -} - -.m10h { margin: 0 10px; } -.m20h { margin: 0 20px; } -.m5v { margin: 5px 0; } -.m20v { margin: 20px 0; } -.m10v { margin: 10px 0; } -.m50v { margin: 50px 0; } -.m10b { margin-bottom: 10px; } -.m10l { margin-left: 10px; } -.m20t { margin-top: 20px; } -.vm { vertical-align: middle; } -.pa {position: absolute;} -.pr {position: relative;} - -.bgwhite { - background-color: white; -} - -.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { -margin-left: 0; -} - -.table-hover>tbody>tr:hover>td, .table-hover>tbody>tr:hover>th { - background-color: #F0F7E2; -} -.navbar { min-height: 64px; } -.navbar-default .navbar-toggle { - border-color: #fff; - margin-top: 15px; -} - -.navbar-default .navbar-toggle .icon-bar { background-color: #fff; } -.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {background-color: #373D42;} - -.navbar-default { - background-color: #8DC429; - margin: 0; - border: 0; -} - -.navbar-default .navbar-nav>li>a { - color: #F4FBE8; - font-family: 'Ubuntu', sans-serif; - padding-left: 20px; - padding-right: 20px; -} - -.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus { - background-color: #6C9032; - color: #fff; -} - -.navbar-default .navbar-nav>li>a:hover, .navbar-default .navbar-nav>.active>a:hover { - background-color: #fff; -} - -.navbar-form .form-group { - display: block; -} - -.navbar-form { - margin-top: 15px; -} - -.nav-tabs.nav-justified>li>a:hover { - cursor: pointer; -} - -.insight { - font-family: 'Ubuntu', sans-serif; - font-size: 34px; - font-style: italic; - font-weight: 700; - overflow: hidden; -} - -.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { - color: #fffffe; -} - -.navbar-default .navbar-brand { - color: #FFFFFF; - padding: 20px 15px; -} - -.navbar-form .form-control { - background-color: #7CAD23; - border-radius: 3px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border: 0; - -webkit-box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); - -moz-box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); - box-shadow: 1px 1px 0px 0px rgba(255,255,255,0.41), inset 1px 1px 3px 0px rgba(0,0,0,0.10); -} - -.navbar-nav>li>a { - padding-top: 22px; - padding-bottom: 22px; -} - -#search-form { color: #fff; } - -#search.loading { - background-image: url('../img/loading.gif'); - background-position: 5px center; - background-repeat: no-repeat; - padding-left: 25px; -} - -.loader-gif { - display: inline-block; - width: 16px; - height: 11px; - background: transparent url(../img/loading.gif) no-repeat; - margin-left: 5px; -} - -#search { color: #fff; } - -#search::-webkit-input-placeholder { - color: #BCDF7E; - font-family: 'Ubuntu', sans-serif; - font-style: italic; - font-weight: 100; -} - -#search::-moz-placeholder { - color: #BCDF7E; - font-family: 'Ubuntu', sans-serif; - font-weight: 100; -} - -.status { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - background-color: #597338; - border-radius: 3px; - margin: 15px 0; - padding: 8px 10px; - font-size: 12px; - color: #eee; - text-align: center; - margin-right: 10px; -} - -.status .tooltip { - margin: 0; -} - -.col-gray { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - background-color: #F4F4F4; - border-radius: 5px; - padding: 14px; - border: 1px solid #eee; -} - -.col-gray-responsive { - width: auto; -} - -.col-gray-fixed { - margin-top: 15px; - position: fixed; - width: 250px; - border: 1px solid #eee; - z-index: 1; -} - -.ellipsis { - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.line20 { - border: 1px solid #D4D4D4; - margin-bottom: 15px; -} - -.line10 { - border: 1px solid #EAEAEA; - margin: 10px 0; -} - -.block-id { - background-color: #373D42; - border: 3px solid #FFFFFF; - margin: 0 auto; - width: 165px; - color: #fff; - text-align: center; -} - -.block-id span { - font-size: 40px; - margin: 30px 0; -} - -.block-id h2 { - color: #FFFFFF; - font-weight: bold; - line-height: 30px; - font-size: 24px; - margin-top: 0; - margin-bottom: 10px; -} - -.icon-block { - color: #FFFFFF; - font-size: 35px; - margin-top: 10px; -} - -.icon-block h3 { - color: #fff; -} - -.block-tx { - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - background-color: #F4F4F4; - border-radius: 2px; - margin: 20px 0 10px; - overflow: hidden; - padding: 15px; - border: 1px solid #eee; -} - -.btn { - border-radius: 2px; -} -.btn-primary { - background-color: #8DC429; - border: 2px solid #76AF0F; -} - -.btn-primary:hover, .btn-primary:focus, .btn-primary:active, -.btn-primary.active, .open .dropdown-toggle.btn-primary, -.btn-success:hover, .btn-success:focus, .btn-success:active, -.btn-success.active, .open .dropdown-toggle.btn-success, -.btn-danger:hover, .btn-danger:focus, .btn-danger:active, -.btn-danger.active, .open .dropdown-toggle.btn-danger { - background-color: #fff; - border: 2px solid #ccc; - color: #373D42; -} - -.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { - background-color: #fff; -} - -.btn-default { - background-color: #E7E7E7; -} - -.btn-success { - background-color: #2FA4D7; - border: 2px solid #237FA7; -} - -.btn-danger { - background-color: #AC0015; - border: 2px solid #6C0000; -} - -.txvalues { - display: inline-block; - padding: .7em 2em; - font-size: 13px; - text-transform: uppercase; - font-weight:100; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.txvalues-primary { - background-color: #8DC429; -} - -.txvalues-default { - background-color: #EBEBEB; - color: #333; -} - -.txvalues-success { - background-color: #2FA4D7; -} - -.txvalues-danger { - background-color: #AC0015; -} - -.txvalues-normal { - background-color: transparent; - text-transform: none; - color: #333; - font-size: 14px; - font-weight: normal; -} -.progress-bar-info { background-color: #8DC429; } - -/* Set the fixed height of the footer here */ -#footer { - background-color: #373D42; - color: #fff; - height: 51px; - overflow: hidden; -} - -#footer a.insight { - font-size: 20px; - text-decoration: none; - color: #fff; -} - -#footer a.insight:hover { - color: #fffffe; -} - -#footer a.insight small { font-size: 11px; } -.line-footer { border-top: 2px dashed #ccc; } - -#footer .links { - color: #ddd; - font-size: 10px; -} - -#footer .links a { - color: #ddd; -} - -#footer .links a.selected { - color: #eee; - font-weight: bold; -} - -#footer .links a:hover { - text-decoration: none; - color: #fffffe; -} - -.line-bot { - border-bottom: 2px solid #EAEAEA; - padding: 0 0 10px 0; -} -.line-mid { padding: 15px;} -.line-top { - border-top: 1px solid #EAEAEA; - padding: 15px 0 0 0; -} - -/* Custom page CSS --------------------------------------------------- */ -/* Not required for template or sticky footer method. */ - -#wrap > .container { padding: 70px 15px 0; } - -#footer > .container { padding: auto 15px; } - -.code { font-size: 80%; } - -.address { font-size: 11px; } - -.no_matching { - -moz-border-radius-bottomleft: 2px; - -moz-border-radius-bottomright: 2px; - -webkit-border-bottom-left-radius: 2px; - -webkit-border-bottom-right-radius: 2px; - background-color: #FFFFFF; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - border-top: none; - border: 1px solid #64920F; - padding: 10px 20px; - position: absolute; - text-align: center; - top: 45px; - width: 300px; -} - -/*Animations*/ -.fader.ng-enter { - opacity: 0; - -webkit-transition: opacity 1s; - -moz-transition: opacity 1s; - -o-transition: opacity 1s; - transition: opacity 1s; -} - -.fader.ng-enter-active { opacity: 1; } - -.tx-bg { - background-color: #F4F4F4; - left: 0; - min-height: 340px; - position: absolute; - top: 0; - width: 100%; - z-index: -9999; -} - -.badge { - -moz-border-radius: 9px; - -webkit-border-radius: 9px; - background-color: #999999; - border-radius: 9px; - color: #ffffff; - font-size: 12.025px; - font-weight: bold; - padding: 1px 9px 2px; - white-space: nowrap; -} - -.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.badge-error { background-color: #b94a48; } -.badge-error:hover { background-color: #953b39; } -.badge-warning { background-color: #f89406; } -.badge-warning:hover { background-color: #c67605; } -.badge-success { background-color: #468847; } -.badge-success:hover { background-color: #356635; } -.badge-info { background-color: #3a87ad; } -.badge-info:hover { background-color: #2d6987; } -.badge-inverse { background-color: #333333; } -.badge-inverse:hover { background-color: #1a1a1a; } - -.status .t { - color: white; -} - -.status .text-danger { background: red; } - -.status .text-warning { - background: yellow; - color: black; -} - -.btn-copy { - color: #9b9b9b; - display: inline-block; - height: 16px; - width: 16px; - outline: none; - vertical-align: sub; -} - -.btn-expand { - color: #9b9b9b; - vertical-align: middle; -} - -.btn-copy:hover, .btn-expand:hover { - color: #000; - text-decoration: none; -} - -.btn-copy { - background: transparent url('../img/icons/copy.png') center center no-repeat; -} - -.btn-copy .tooltip { - display: block; - margin-left: 20px; - margin-top: -2px; - opacity: 0; -} -.btn-copy.zeroclipboard-is-hover { color: #2a6496; } -.btn-copy.zeroclipboard-is-active .tooltip { opacity: 1; } - -.tx-id { - background-color: #373D42; - border: 3px solid #FFFFFF; - margin: 0 auto; - width: 165px; - color: #FFFFFF; - text-align: center; -} - -.tx-id span { - font-size: 40px; - margin: 30px 0; -} - -.page-header { margin-top: 0; } - -.panel { margin-bottom: 1em;} -.panel-body { - padding: 0.7em; - word-wrap: break-word; -} - -/* Index */ -#home .btn-more { - border-top: 1px solid #ddd; - margin: 30px auto 0; - text-align: center; - width: 90%; -} -#home .btn-more .btn-default { - margin-top: -23px; -} - -#powered .powered-text { - border-top: 1px solid #ddd; - margin: 30px auto 0; - text-align: center; - width: 90%; -} -#powered .powered-text small { - background-color: #f4f4f4; - padding: 4px; - position: relative; - top: -12px; -} - -#powered a { - background-repeat: no-repeat; - background-position: center center; - display: inline-block; - float: left; - height: 45px; -} -#powered a.bitcore { - background-image: url('../img/logo.svg'); - background-size: 80px; - width: 30%; -} -#powered a.nodejs { - background-image: url('../img/nodejs.png'); - background-size: 80px; - width: 30%; -} -#powered a.angularjs { - background-image: url('../img/angularjs.png'); - background-size: 50px; - width: 20%; -} -#powered a.leveldb { - background-image: url('../img/leveldb.png'); - background-size: 50px; - width: 20%; -} - -@keyframes rotateThis { - from { transform: scale( 1 ) rotate( 0deg ); } - to { transform: scale( 1 ) rotate( 360deg ); } -} - -@-webkit-keyframes rotateThis { - from { -webkit-transform: scale( 1 ) rotate( 0deg ); } - to { -webkit-transform: scale( 1 ) rotate( 360deg ); } -} - -.icon-rotate { - animation-name: rotateThis; - animation-duration: 2s; - animation-iteration-count: infinite; - animation-timing-function: linear; - -webkit-animation-name: rotateThis; - -webkit-animation-duration: 2s; - -webkit-animation-iteration-count: infinite; - -webkit-animation-timing-function: linear; -} - -.transaction-vin-vout { -} - -.v_highlight { - margin-bottom: 1em; - padding: 1em 0; - background-color: #e9e9e9; - overflow: hidden; - color: #333; -} - -a.v_highlight_more { - background-color: #F0F7E2; - color: #333; -} - -.secondary_navbar { - width: 100%; - background: #fff; - position: fixed; - top: 64px; - left: 0; - text-align: center; - z-index: 1000; - margin: 0 auto; - -moz-box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); - -webkit-box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); - box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.20); -} - -.secondary_navbar .container { - margin: 0 auto; - padding: 1.8em 0; -} - -.secondary_navbar h3, .secondary_navbar p, .secondary_navbar .lead { - margin: 0; -} - -.secondary_navbar p { - line-height: 1.9em; -} - -.hide_snavbar { - border-bottom-right-radius: 0.3em; - border-bottom-left-radius: 0.3em; - position: absolute; - right: 25px; - padding: 5px 10px; - background: #fff; - -moz-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); - -webkit-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); - box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.20); -} - -#search-form-mobile { - margin-top: 15px; -} - -@media (max-width: 991px) { - .status { - display: none; - } - .navbar-form { - width: auto; - } - .btn-copy { - display: none; - } - .col-gray-fixed { - position:static; - width: 100%; - margin-top: 0; - padding: 0; - } - .m50v { - margin: 15px 0; - } - .block-id span { - font-size: 24px; - margin: 10px 0; - } - .icon-block { - font-size: initial; - margin: 10px 0; - } - body { - font-size: 12px; - } - h1 { - font-size: 26px; - } - h2 { - font-size: 22px; - } - h3 { - font-size: 18px; - } - .insight { - font-size: 30px; - } - .navbar-default .navbar-nav>li>a { - padding-left: 15px; - padding-right: 15px; - } -} - -@media (max-width: 767px) { - .navbar-form { - width: auto; - } - .status { - display: none; - } - #wrap>.container { - padding: 50px 15px 0; - } - #ngProgress-container { - top: 50px; - } - body { - font-size: 11px; - } - h1 { - font-size: 24px; - } - h2 { - font-size: 20px; - } - .navbar-default .navbar-brand { - padding: 15px; - } - .insight { - font-size: 26px; - } - .navbar-nav>li>a { - padding-top: 15px; - padding-bottom: 15px; - } - .container { - padding-left: 0; - padding-right: 0; - } - .navbar-default .navbar-toggle { - margin-top: 7px; - } - .navbar { - min-height: 50px; - } - #search { color: #000; } - .txvalues { - display: block; - margin: 5px; - padding: 0.5em 2em; - font-size: 11px; - } - .navbar-default .navbar-nav .open .dropdown-menu>li>a { - color: #fff; - } - .txvalues { - display: inline; - margin: 0; - padding: 0; - font-weight: bold; - } - .txvalues-success { - background: none; - color: #2FA4D7; - } - .txvalues-primary { - background: none; - color: #8DC429; - } - .txvalues-default { - background: none; - color: #A09E9E; - } - .txvalues-danger { - background: none; - color: #AC0015; - } - .btn-expand { - font-size: 18px; - } -} - -@media (min-width: 1200px) { - .col-gray-fixed { - width: 280px; - } - .navbar-form .form-control { - width: 350px; - } -} - diff --git a/server/insight-ui/public/css/main.min.css b/server/insight-ui/public/css/main.min.css deleted file mode 100644 index 86e5a04..0000000 --- a/server/insight-ui/public/css/main.min.css +++ /dev/null @@ -1,5 +0,0 @@ -@charset "UTF-8";/*! - * Bootstrap v3.1.1 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-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{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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}}*{-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:62.5%;-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;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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:#999}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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right: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;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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-left:15px;padding-right: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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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.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.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.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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;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,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:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.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]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{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{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}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.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;border-color:#3c763d;background-color:#dff0d8}.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;border-color:#8a6d3b;background-color:#fcf8e3}.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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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>.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;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.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{outline:0;background-image:none;-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{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.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:#ebebeb;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:#3276b1;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:#47a447;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:#39b3d7;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:#ed9c28;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:#d2322d;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{color:#428bca;font-weight:400;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:#999;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%;padding-left:0;padding-right:0}.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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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"}.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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right: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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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{margin-bottom:0;padding-left: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:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.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;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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{text-align:center;margin-bottom:5px}.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-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.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}@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;padding:15px;font-size:18px;line-height:20px;height:50px}.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;margin-right:15px;padding:9px 10px;margin-top:8px;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;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{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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>.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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;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;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom: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-right-radius:0;border-top-left-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-left:15px;margin-right: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{background-color:#e7e7e7;color:#555}@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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.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{background-color:#080808;color:#fff}@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:#999}.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:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-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;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.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-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-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-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.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;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;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}.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-left:60px;padding-right: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;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right: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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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;transition:width .6s ease}.progress-striped .progress-bar{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: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-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.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: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: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: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: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{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-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{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.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-right-radius:3px;border-top-left-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-right-radius:3px;border-top-left-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}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.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-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-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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.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{bottom:0;right:5px;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:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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{content:" ";display:table}.clearfix: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-left:auto;margin-right: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}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{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 (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: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: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 (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}}@media print{.hidden-print{display:none!important}}html,body{color:#373D42;font-family:Ubuntu,sans-serif;height:100%}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{color:#373D42;font-family:Ubuntu,sans-serif}[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none!important}#ngProgress{background-color:#6C9032!important;box-shadow:none!important;color:#373D42!important;height:3px!important;margin:0;opacity:0;padding:0;z-index:99998;-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out;transition:all .5s ease-in-out}#ngProgress-container{position:fixed;margin:0;padding:0;top:63px;left:0;right:0;z-index:99999}#qr-canvas{display:none}#qrcode-scanner-video{margin:0 auto 10px;display:block}#file-input-wrapper{padding:0;width:100%}#file-input-wrapper input{opacity:0;padding:5px}#file-input-wrapper span{padding-top:5px;width:100%}#file-input-wrapper i{display:none}#wrap{min-height:100%;height:auto;margin:0 auto -51px;padding:0 0 75px}.m10h{margin:0 10px}.m20h{margin:0 20px}.m5v{margin:5px 0}.m20v{margin:20px 0}.m10v{margin:10px 0}.m50v{margin:50px 0}.m10b{margin-bottom:10px}.m10l{margin-left:10px}.m20t{margin-top:20px}.vm{vertical-align:middle}.pa{position:absolute}.pr{position:relative}.bgwhite{background-color:#fff}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:0}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#F0F7E2}.navbar{min-height:64px}.navbar-default .navbar-toggle{border-color:#fff;margin-top:15px}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#373D42}.navbar-default{background-color:#8DC429;margin:0;border:0}.navbar-default .navbar-nav>li>a{color:#F4FBE8;font-family:Ubuntu,sans-serif;padding-left:20px;padding-right:20px}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{background-color:#6C9032;color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>.active>a:hover{background-color:#fff}.navbar-form .form-group{display:block}.navbar-form{margin-top:15px}.nav-tabs.nav-justified>li>a:hover{cursor:pointer}.insight{font-family:Ubuntu,sans-serif;font-size:34px;font-style:italic;font-weight:700;overflow:hidden}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fffffe}.navbar-default .navbar-brand{color:#FFF;padding:20px 15px}.navbar-form .form-control{background-color:#7CAD23;border-radius:3px;-webkit-border-radius:3px;-moz-border-radius:3px;border:0;-webkit-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);-moz-box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10);box-shadow:1px 1px 0 0 rgba(255,255,255,.41),inset 1px 1px 3px 0 rgba(0,0,0,.10)}.navbar-nav>li>a{padding-top:22px;padding-bottom:22px}#search-form{color:#fff}#search.loading{background-image:url(../img/loading.gif);background-position:5px center;background-repeat:no-repeat;padding-left:25px}.loader-gif{display:inline-block;width:16px;height:11px;background:transparent url(../img/loading.gif) no-repeat;margin-left:5px}#search{color:#fff}#search::-webkit-input-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-style:italic;font-weight:100}#search::-moz-placeholder{color:#BCDF7E;font-family:Ubuntu,sans-serif;font-weight:100}.status{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#597338;border-radius:3px;margin:15px 0;padding:8px 10px;font-size:12px;color:#eee;text-align:center;margin-right:10px}.status .tooltip{margin:0}.col-gray{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:#F4F4F4;border-radius:5px;padding:14px;border:1px solid #eee}.col-gray-responsive{width:auto}.col-gray-fixed{margin-top:15px;position:fixed;width:250px;border:1px solid #eee;z-index:1}.ellipsis{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.line20{border:1px solid #D4D4D4;margin-bottom:15px}.line10{border:1px solid #EAEAEA;margin:10px 0}.block-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#fff;text-align:center}.block-id span{font-size:40px;margin:30px 0}.block-id h2{color:#FFF;font-weight:700;line-height:30px;font-size:24px;margin-top:0;margin-bottom:10px}.icon-block{color:#FFF;font-size:35px;margin-top:10px}.icon-block h3{color:#fff}.block-tx{-moz-border-radius:2px;-webkit-border-radius:2px;background-color:#F4F4F4;border-radius:2px;margin:20px 0 10px;overflow:hidden;padding:15px;border:1px solid #eee}.btn{border-radius:2px}.btn-primary{background-color:#8DC429;border:2px solid #76AF0F}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary,.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success,.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#fff;border:2px solid #ccc;color:#373D42}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#fff}.btn-default{background-color:#E7E7E7}.btn-success{background-color:#2FA4D7;border:2px solid #237FA7}.btn-danger{background-color:#AC0015;border:2px solid #6C0000}.txvalues{display:inline-block;padding:.7em 2em;font-size:13px;text-transform:uppercase;font-weight:100;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.txvalues-primary{background-color:#8DC429}.txvalues-default{background-color:#EBEBEB;color:#333}.txvalues-success{background-color:#2FA4D7}.txvalues-danger{background-color:#AC0015}.txvalues-normal{background-color:transparent;text-transform:none;color:#333;font-size:14px;font-weight:400}.progress-bar-info{background-color:#8DC429}#footer{background-color:#373D42;color:#fff;height:51px;overflow:hidden}#footer a.insight{font-size:20px;text-decoration:none;color:#fff}#footer a.insight:hover{color:#fffffe}#footer a.insight small{font-size:11px}.line-footer{border-top:2px dashed #ccc}#footer .links{color:#ddd;font-size:10px}#footer .links a{color:#ddd}#footer .links a.selected{color:#eee;font-weight:700}#footer .links a:hover{text-decoration:none;color:#fffffe}.line-bot{border-bottom:2px solid #EAEAEA;padding:0 0 10px}.line-mid{padding:15px}.line-top{border-top:1px solid #EAEAEA;padding:15px 0 0}#wrap>.container{padding:70px 15px 0}#footer>.container{padding:auto 15px}.code{font-size:80%}.address{font-size:11px}.no_matching{-moz-border-radius-bottomleft:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-left-radius:2px;-webkit-border-bottom-right-radius:2px;background-color:#FFF;border-bottom-left-radius:2px;border-bottom-right-radius:2px;border-top:0;border:1px solid #64920F;padding:10px 20px;position:absolute;text-align:center;top:45px;width:300px}.fader.ng-enter{opacity:0;-webkit-transition:opacity 1s;-moz-transition:opacity 1s;-o-transition:opacity 1s;transition:opacity 1s}.fader.ng-enter-active{opacity:1}.tx-bg{background-color:#F4F4F4;left:0;min-height:340px;position:absolute;top:0;width:100%;z-index:-9999}.badge{-moz-border-radius:9px;-webkit-border-radius:9px;background-color:#999;border-radius:9px;color:#fff;font-size:12.025px;font-weight:700;padding:1px 9px 2px;white-space:nowrap}.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.badge-error{background-color:#b94a48}.badge-error:hover{background-color:#953b39}.badge-warning{background-color:#f89406}.badge-warning:hover{background-color:#c67605}.badge-success{background-color:#468847}.badge-success:hover{background-color:#356635}.badge-info{background-color:#3a87ad}.badge-info:hover{background-color:#2d6987}.badge-inverse{background-color:#333}.badge-inverse:hover{background-color:#1a1a1a}.status .t{color:#fff}.status .text-danger{background:red}.status .text-warning{background:#ff0;color:#000}.btn-copy{color:#9b9b9b;display:inline-block;height:16px;width:16px;outline:0;vertical-align:sub}.btn-expand{color:#9b9b9b;vertical-align:middle}.btn-copy:hover,.btn-expand:hover{color:#000;text-decoration:none}.btn-copy{background:transparent url(../img/icons/copy.png) center center no-repeat}.btn-copy .tooltip{display:block;margin-left:20px;margin-top:-2px;opacity:0}.btn-copy.zeroclipboard-is-hover{color:#2a6496}.btn-copy.zeroclipboard-is-active .tooltip{opacity:1}.tx-id{background-color:#373D42;border:3px solid #FFF;margin:0 auto;width:165px;color:#FFF;text-align:center}.tx-id span{font-size:40px;margin:30px 0}.page-header{margin-top:0}.panel{margin-bottom:1em}.panel-body{padding:.7em;word-wrap:break-word}#home .btn-more{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#home .btn-more .btn-default{margin-top:-23px}#powered .powered-text{border-top:1px solid #ddd;margin:30px auto 0;text-align:center;width:90%}#powered .powered-text small{background-color:#f4f4f4;padding:4px;position:relative;top:-12px}#powered a{background-repeat:no-repeat;background-position:center center;display:inline-block;float:left;height:45px}#powered a.bitcore{background-image:url(../img/logo.svg);background-size:80px;width:30%}#powered a.nodejs{background-image:url(../img/nodejs.png);background-size:80px;width:30%}#powered a.angularjs{background-image:url(../img/angularjs.png);background-size:50px;width:20%}#powered a.leveldb{background-image:url(../img/leveldb.png);background-size:50px;width:20%}@keyframes rotateThis{from{transform:scale(1) rotate(0deg)}to{transform:scale(1) rotate(360deg)}}@-webkit-keyframes rotateThis{from{-webkit-transform:scale(1) rotate(0deg)}to{-webkit-transform:scale(1) rotate(360deg)}}.icon-rotate{animation-name:rotateThis;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear;-webkit-animation-name:rotateThis;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.transaction-vin-vout{}.v_highlight{margin-bottom:1em;padding:1em 0;background-color:#e9e9e9;overflow:hidden;color:#333}a.v_highlight_more{background-color:#F0F7E2;color:#333}.secondary_navbar{width:100%;background:#fff;position:fixed;top:64px;left:0;text-align:center;z-index:1000;margin:0 auto;-moz-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 1px 4px 0 rgba(0,0,0,.20);box-shadow:0 1px 4px 0 rgba(0,0,0,.20)}.secondary_navbar .container{margin:0 auto;padding:1.8em 0}.secondary_navbar h3,.secondary_navbar p,.secondary_navbar .lead{margin:0}.secondary_navbar p{line-height:1.9em}.hide_snavbar{border-bottom-right-radius:.3em;border-bottom-left-radius:.3em;position:absolute;right:25px;padding:5px 10px;background:#fff;-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.20);box-shadow:0 2px 3px 0 rgba(0,0,0,.20)}#search-form-mobile{margin-top:15px}@media (max-width:991px){.status{display:none}.navbar-form{width:auto}.btn-copy{display:none}.col-gray-fixed{position:static;width:100%;margin-top:0;padding:0}.m50v{margin:15px 0}.block-id span{font-size:24px;margin:10px 0}.icon-block{font-size:initial;margin:10px 0}body{font-size:12px}h1{font-size:26px}h2{font-size:22px}h3{font-size:18px}.insight{font-size:30px}.navbar-default .navbar-nav>li>a{padding-left:15px;padding-right:15px}}@media (max-width:767px){.navbar-form{width:auto}.status{display:none}#wrap>.container{padding:50px 15px 0}#ngProgress-container{top:50px}body{font-size:11px}h1{font-size:24px}h2{font-size:20px}.navbar-default .navbar-brand{padding:15px}.insight{font-size:26px}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.container{padding-left:0;padding-right:0}.navbar-default .navbar-toggle{margin-top:7px}.navbar{min-height:50px}#search{color:#000}.txvalues{display:block;margin:5px;padding:.5em 2em;font-size:11px}.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.txvalues{display:inline;margin:0;padding:0;font-weight:700}.txvalues-success{background:0;color:#2FA4D7}.txvalues-primary{background:0;color:#8DC429}.txvalues-default{background:0;color:#A09E9E}.txvalues-danger{background:0;color:#AC0015}.btn-expand{font-size:18px}}@media (min-width:1200px){.col-gray-fixed{width:280px}.navbar-form .form-control{width:350px}} \ No newline at end of file diff --git a/server/insight-ui/public/fonts/glyphicons-halflings-regular.eot b/server/insight-ui/public/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20335 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

    !oRptb@n+ zj;Sj1EzP&rTH|dsUF5T#cGro6G4AR2oYP4A6C$$HZsMhb-}MgVJ|9Df9nr7lJz}vl z148Mpnh9;=>i)2Bv@-|m)b&vQU&MMd0hk@(3OOg^&bfmPD_5YKI;h1GgnmUyKMvNS z*Dl@jFEe{GgQYV82Q5l}U@Y#R&i56es!fO#KF~6>m8^j5_VYi$aL3MIurDD=iV!Y# zw)C$KqzsWw6ml!_bkB58+Pnr)j72yJ19dZ;QpeC@=Ysqc6~m1XlxJ}t=Y?#A9ovZP z4*s&io?KSB=5X_Mq0Qr!nZ-97Pc{p8>NN2hw6L1$?|*wdwE()u@GV+8cRmVu4i|nF z2YCia`{H&dzX+@+F~z3}&2HZ~A$J#(3rizQU8HeGveHLO?>XOiq=P#{F`>io&|}#} z+qQJb#$=b8bg=Ps!{v58DK!Z#EWBz+L4AD9zp%|)i>xTf3e{0+~^1&1o6#K zwr3ZRDa!hJPfU|eB7lm6qeNDi)%|oq=$rtSjhii9m6^WZH{st=9fQ#dhr52sEKcDV z){U(4C-G#*1B4TJGjp`CK?-PIECS&zl`y!FXqtN(X=qEa*gBq3^TFm}Cpj!nLubX7V)$@?A?AU0HyDi|)^#d;oP?m&OB|M4~*^s!BC_{@R=DqVy`) z^iz3jFK^wAHbnd?@;r6FdFZxmHA=CJY>9NY7`vW2a@8_3y<&DFpgBkW@T`=eFK8oO zT(y#eS}lrO`ZBfcPaK>$9u2=+_Mtg1J;2yBN4^5}D8XEx0WdGci3PQk{1UaBgCLjA8J&l$QM)18CRi~T;S54ZH(@Xo~$ZF&Js?~!|%D|ZX{Jj z*pc-L3P~#WkVf!P51DxQ^K}CDD=Y?hNA?;=vpqJIB;E8gGMv4?>|>Zb{znXRL*?)Qk_|}2j?T(SeEif3wmvZ0!0BKWR*&#M-@We+n zd!Y-D_)%BP<+!zHM-WgMA-<|E26O*5#V&wF-H?7K{bi0t!Ja@<#T11p`z7kR9bL^I zxiX|bgk@gG;U~e3#Vwfd>bW+G#e;04x)I0s4A&VgI(Fju_0T|cY>fvK^f~+n#M)-I zKA?@0B{P@33F-*DS_^ETL0XcaOIRdDW5V4B_zY`Nd?M#7>oeG!Z^6Ba-dCk{J;lsy ziiSUhyO+>s{C7)Dns`2Rf*jY`gHkmU5gRa2MLAKjTZu0mAO#oAut#vEzYF_C!?|MG zQb|RYeITrDng~^K9yR@$=Tu)pB6?55gtAr{5~EPTj*pnXeR>Z%m;6GME0_TE(4-rw zME3E8f@iqWlgt=}U9DMBcpA3%b9qbF|E~5M9NWd;*ghbr%TH)&^)5!yC%XZ`v?wJT zr0zUE{g^+XtUw(UkwXI0C z{Oks!jZS1P^C2&m%)dTuRCl66MJ9OSvo;iOkk@*49_fS4UK2sIg}$oN5`T)WV_j~$ z#*y;(_hW2|toQ1WCxQ6-vCr-?6*3i$CB?T(Iy(Uu4B{Jjn3Fs5)HYKiwn<7UMvAhM ztl~cib)k*j3wl0-&k>Du))lCI$!YL3LpY?I>g)lzF_iS&;YrENcF9RH%gj>X+UNtpO7cW z=y9bt%UHUm14b%KvB>fmkT=b_ zigd)xBgK2#{h33=bql4K;;83zkU~UB12jdN28+Nt#W^PWf(SsT=lZwNXYAXwH8p+D z2T-wD1`6V}x`JJU5)g?l{KfbY3U{K*jkF9_;!&pOj7b7b<4O5g2XbEfm_g;#Ldp;i zD-*QR?1x>UX&lEA{7w}jiYCK zu00NA=#@FmB`CEgOPGL>*m* z6L!@dqJzFD(40JE-qoB9C0HFL3|4tOJ91pPVZFhw7eu;Rz0}w$sh&XNz#XOq2TvIr zi{~9k7L7M7L#!M~crc`I6W5)r$aG3}pV7pj%;E`lEP-KW&v?w!L}n}ma35b;S~Q7u zWn6QD1W4v?bv$l;!Bx=gbOuF)QJieN_M$nWNG4939a7d{0~7Bj<(#O7(pw&_f1Hi_ z;$$f3(K$+laQ-ssV9rcZ7sUxH?h(ODxMpu8`~q0R@3V<5ZUR7N0B>X7i^k1P11+>c z0#{3cU70M%f?eOzWe+MNx@4`O6KfNE}>-%Ay*gOP`j%nlT#j2qpj#O3UrUg4^id>oy3kT*kQp^XA&x9M7QbcQ+v;w05OGe_zv}@RU3qi z$Z4ZBchBcVa$fo1DFN}YOT80bTTwDSQdcHnV+giyD-Lt zKm&qZyc%9CTM%PKoN%g{XgsPsNM}kO0}&4>JwWdya=9)5Ash~^0(uV>M^ySibGCwz z5$PN+Ml%p$>JJ^#x6tLs0KGyLupO&M$44kv!@+P4tPv-(Q) znW!s-B&%k8 zp97OXN@#wwog-#6l6D~%M86snd|3)a+4OKr(u$6rle32G24##}>NW&kj7TOs3VXJL zc4+@7K%h<|@DEF@-){fDoU^iaDFf32}t$^lA zpl+iL|J2M+g9i#^{QP|PQi<;e0S?)xbB1g1_`<>Y)*w#P&y}I!c21Uq3LcPcH;4bqI0F zG%ZQswtudr3r3w}tQ`@KXB^ZxMGFdmidyI|W43A#-3$(6N2%hin*4IsSIG5R3xLv0o-OG?OH@C^*jHSMd|)m^=k z8q!UF2K{Nd9S!5tX!S5^0(g18+nY#vy3{(tRE6@P4?zeK<>TM)kmGd_VPnQA7kRXf zk$~)TlH+gOn7m=j2vbKXB-!=9II_qaR7Fbv(Ms=PC#2#w`w#W z=rj4$Sqg431ZfI;P81F=%2aAK&1MMC_yLxuW9PMtShb@O%)R9~IY2N4HjJUXmwXHl z=J7qh5e!n|i23lJ3Aori$qjbqY+@PGGUPbj6mN#$9u42-kWv1HK)Xf*7du4zI&Ap; z+W-ZUfh=WXWVbD>z!yT90&Ktv@`?P+^ljzwm*P~Gn%)O?gB56rc2k8*yqZ4@7nX_L)j_!4bYw280A2s4z^0{)=R3vJz7Qz(N>0jX`Il$M5BbQk_^? zmb=2DwO)gQyg->t3JD)mBx;B)gI6cNIfElwxl5wF%+%+FNg$PFXf~%ubeSK6L2;*k z-ZS~l5;+l-wl6{w7Dyq}{-FV>Nn6E;24mwA6(n)DhTzooXGRi@WQFLUlc&&iO=I^T zivywJNawc^=E=0XFqsVRR01*cO<5HEij|eEmVK8g?IfsAJNmq~EgQff zwRv%UW^p&6vzpem6AVaGtc3Q>G5wiRktPK3ep>JKPbd%NiVnQsT{NC%oJLL-qJ!8- zP-h)BwRyVw&H(-~!h9FwJlK~Tt)s~GW9=N{%H zkHahpK^rHdVncAWv!My;Py*&Okv>@=Pj<^*TyrRLzrxUph})=cnGJ9$3I}j$lr?}= zz=2t)jatn_^K@B=I_NPS=#K1BtCqqQnsGNTQfmt49zY^Or3XLIkcNQ*9`Dm{tm+te zGzr-e8FMH~?kI6@V_qIbW6`2CEQp*Gn9!4LSZEWt8?F-u?T9E8^I{i=*dP+gY2|H` zMGdiKCZIJ#i3pZ4sls`onRd=e0U%n#Ca`${WrC4WU~lwxS=8N0NZz6!0k>0lr7=-Wgf`_F=oh+|pA(=&dOHWYHAe`np>Wv*)f@;~V6i<7s3mijc zZ4@C`gzXJ?yt*=6ewBc>XeQn}>W!UeP|~t^p?bStnK{#S5dlPbxd9>u#Kz1>gvttK zd3?&C7ALU8TXCu$a(pA?no^B&vR|6~ij}sirp*p(@KQZ_I24%eSY5CJm0AN|Z&CLzOTfN7OG#0F=>!FqSk3<=Di4`u1Z0Ib8selOlzIIm3id zjw-_NQX_~=kIB1OdIh4uG&6)a$uAeQ-?@5aMkFz+U%>fER>c2C))6vM$q`s74=$Kg ziBjcvbZ75zzxgoHpoIECg8=M24@g-g`GL-3<#WPqoB05WJPdl z87W0Pv(0o1vBq6^KzM1C(IlMdk&y!2xc`xZBy4 zbk(td%vXIm4b=}{q%u%bFrCz%#{%S}5bPliB~ozxLV*SG38`@jJQSBCAc+;i@e`;N zt0M8yifw!cxT+TeLU39XDrBSe#GhY&)-T|b;$R9NG^AMHI2^Lq9 zN)VG}(M5cuIe|8Czv84=B1p?kNhb&-+kCJ~Cp@^WbcRlQNgg+8V1=ctJWBX)kq0fd zAfF&H0wQim;D^RNLt*)8>Blbt34>^ZniMi^9|qnB%ES;E!kSQ!IK8Y>A1x=m76zre zZ2g#{aC_l);B}ZbGf3Y$5Pf?Ha!#0t3<5F`ED$p<#rl0e5CFtqc!!Oi7M~UH7I8~> zKcNUu8%}Z~Bb?-HK-;xoKCjL8>_&0cLO;{MS&3$vA|)_!KSn*s%ug690fdLcraD7- fD&x8tjE$WbXjs&snU8)|^B;s6yTptcKAzx$Qp3K0 diff --git a/server/insight-ui/public/fonts/glyphicons-halflings-regular.svg b/server/insight-ui/public/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc7..0000000 --- a/server/insight-ui/public/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server/insight-ui/public/fonts/glyphicons-halflings-regular.ttf b/server/insight-ui/public/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41280 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

    PBK;&Wcg|NX{>QR@W3{K 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 diff --git a/server/insight-ui/public/fonts/glyphicons-halflings-regular.woff b/server/insight-ui/public/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23320 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 AtN;K2 diff --git a/server/insight-ui/public/img/icons/copy.png b/server/insight-ui/public/img/icons/copy.png deleted file mode 100644 index b43ca063492c22a1436ae1d2ce852d638df9e38c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fhQyQAu+S>l}xG*h< za+8=Xc(dWxud1e5($dl|6Bs-MH!>_|JhH3p8(YF>zD;*LiWzq;yi(3+R-bgag-2qe w=Ar3p64y1WW^UqXSe1C>HB(KU`#B$mX;bUjd88Ho0j**1boFyt=akR{0FnYUOaK4? diff --git a/server/insight-ui/public/img/icons/favicon.ico b/server/insight-ui/public/img/icons/favicon.ico deleted file mode 100644 index c943f00496582633c1213109ab8fca70c2ac53dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYH+z~Rn+42L`alZh$Oi`Pz( zV}1WYm`r#5hk=38fAYg)uoFVBt|QA2rf27Y^}qW0nJoPvf5X5)g~8JwAHhzrIlqu> eKalHon7)Ay1CTp7j&#$~|CHpxe;DNfi2?vqx@(&N diff --git a/server/insight-ui/public/img/leveldb.png b/server/insight-ui/public/img/leveldb.png deleted file mode 100644 index da13a671aaabef5febe267d4d10fa663fbbab21a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12009 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 diff --git a/server/insight-ui/public/img/loading.gif b/server/insight-ui/public/img/loading.gif deleted file mode 100644 index 64e5614b46875d4b9905f8f3abf9a4e4207ddbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmZ?wbhEHb6kyY~S+8;RKIf@w#hVu4|_`VKYG`AyI-gVcv>N znf8hM4%|Al^3A2?z0cq5eZ4zEUtZ=E6w0k7GR^Oh05+pcfkrLia1{(;>V0gI zq~dw;l}*3!`O?bg*0Xq*GoNU&OWNT6OSJ#Y#9~Vpsmj&Yx_4>K4N}Brk`W|4u5F5V z<`Ou0hsUL)pitM7TVfws#l4+&n=$QheBcXZ#@-XpPOv7=^ICcJs}xqhnL~_GDU5Ad zu_Z`1Zf!3WHG(|uL?XP7X>>oS;`onEl-K@bNvC+S1X zdIEIMicRlU70IXuZQ*@jy8icenS$xu-@1;>Dr}Yc6{pK!!sZ;gehJn9BH0XUP!a(H E00rLqw*UYD diff --git a/server/insight-ui/public/img/logo.svg b/server/insight-ui/public/img/logo.svg deleted file mode 100644 index 856b0a1..0000000 --- a/server/insight-ui/public/img/logo.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - Group copy + bitcore copy@2x - Created with Sketch (http://www.bohemiancoding.com/sketch) - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/server/insight-ui/public/img/nodejs.png b/server/insight-ui/public/img/nodejs.png deleted file mode 100644 index 4cba6f8c6432f5aa83c366fd49d10d9ea84b296a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3253 zcmV;m3`+BfP)u%bCJPqM zqcv+^pr%cm8vXn%BbPCbvH4=S9)Ar{|8Xj1_Eo6vtnHAnF|qud5Q5pp8*78H-^} zU2zH8Xr-^K0+*nTSpu#KT!Omd64Vt}T!Omd64Vt}T!Omdic3&eT!Omdic3&eTnUS} zqN1YSPwMgV%t+x64cY0Zgxbskervn=d`+pgu8tJNC69rzlLnb;M+th{q_I}E|2|_f zV;AFL#-~JTpWkJ)WUOFRHV`oeQm6@KD`TmsxBLdJd7`~c{G5oV0{levp`x!sN zq@BRHjqwYrzeedV!%*EAwm%H9c;8_xU_8n=#k!)(nld_d_ISMG?PYYrwT+SEds$-b zkcrtaQSOWGxAu%DDAe;PH|G^ISETXjJgQ16TO!rGo9xPXC_)jD@+}be&zLaB%^Xn9 z?ePT2>t%wPZ-DE-cz|)MP9Ik?{=xVUJ||Ps8Fw>&$!M+nZ2)5v<2lB!7#}5R3@sSb zF)?LXK`Hbi6ZBqiVisdO#<48jB2v z<4hslI~3}16}>;n=)+jV_?U4QCW^RvSxvAU7JaaZ;~!#dVQgpoMy#+AK_#ww3$D~k z7x)oq@sjvjBhxkSaEZUq1Zf=`$%vsD=__4#hF_`rH9){stysr+5Ulx&)!v z#w=xKj6<<;%m!b=5%9D7)f^v3I6paM@LMy)q`M-l{1ANi0W$GTs5nTe>lp(B zRBmMuW{Eiora6~P);%vWu`-eV$G92Qf_EBX6<1CUWA4n)Jdkjij*Ps+tj4DyST{9j_mZ5Z1X7HP2a}&QnP?UGVy@bT&^S5~UnXc{oDAc-Rkoa~9T7b`DNhQpX z`txHHYAlk1z0_eZLy60B*&$I9t4SygHC9m^n)Hc|LSZW@G3a?u`k1Ibe;qZE-*wTn zl+L7BzV1Ati}h?m#H6-sJqcEE6^xiFG6CZcmKE0xdM06#FIiZjudL8r%M8>x(`=IwC|-1 z;ka`jqf{&_ll3H$w&=_f>)BtSmK=N5ok?gowXl#qk-aZ5*e0A%R+EL^VV9uRMe2W2 za+{!w>EscqJO<3Ir*U-fq|(arquQN2mTS}7byo^}XuhjF5whX2mZSu&XPQ_~4pkFN zZ#_sHm%+tLf3UP1?nK-v`jYZwc-e+DkJPyYO}>P?rB=f_=o^^pMc9(c}CjhFwXBsF$mM|V%M|_s31k$)8uUTw_c>kUar@& zj*+M9VWPx4#~GAjvMe4~nyKd^{E%f9&qurYLd=7kHEP#Wp_H_!_0Ko)?>#6R$r6+I z@m&fK(4C_gZakKZKsb<%?GM_W&5{+$v*u^woKUhx>FYDqBPc=qv3CPhQx(icBPW3@ zw0bK^q}T`xQxUe{ocYq3axHQUgiLdF63HoTZnI5P0p!`W-ChUjPFqQ#=imbkZ#v(D z&x$qLwIUF7@lh=4Mr7X-W6COvLb&n)u$C=goXplW<=OojT$hkj`WJ4ZIFE;o2r5=) z7BaJyCQmLiD<89Ccgz!ta@gJ$zkR`K%1yZVA5-Xwj1zJI%9RPUS5E_jHSwbC8?k+% zgT(w8ajGOy@0r;CT?+L&T#u5G9g*&$@G^@F+_aRKj_ucI_sT%fqeV%oqz_aYLH+=5 zE9=y@qmm)A6c#_0vadB8Q!0eggj>A;-kq)C{vajthEtcZ^UG|Gr`GH30?MsC$d^`lsaY( zl8+LbS@!s7mNX@uZ&Hy)pX`nKZh#WFdC{e;OpqFJLmImdb(7jMRs^WQ^ z(TDLzMvbiUj0a`ps38&ud=N1^oRZdvTf`!cCSCDX*2ibxqz1Fe7@4HZURm9Doyl{C zC)xcJ>fnx=q>1(1{Dhw>N8UL zUCXP51lc*^R%K`zqONiVXZ33 z;89qDBC+Xo48Ghb(yA<#7%*nyybrPIC=nocV;rpzM$Nh>~y2h6Du)v4ZUtVeu04UE}{B+H - - - - - - - - Insight - - - - - - - -

    - -
    -
    - -
    -
    - - - - - - - diff --git a/server/insight-ui/public/js/angularjs-all.js b/server/insight-ui/public/js/angularjs-all.js deleted file mode 100644 index c397e5b..0000000 --- a/server/insight-ui/public/js/angularjs-all.js +++ /dev/null @@ -1,7555 +0,0 @@ -// Source: public/lib/angular/angular.min.js -/* - AngularJS v1.2.32 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(V,W,v){'use strict';function z(b){return function(){var a=arguments[0],c,a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.32/"+(b?b+"/":"")+a;for(c=1;c").append(b).html();try{return 3===b[0].nodeType?A(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+A(b)})}catch(d){return A(c)}}function ac(b){try{return decodeURIComponent(b)}catch(a){}}function bc(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=ac(c[0]),G(d)&&(b=G(c[1])?ac(c[1]):!0,kb.call(a,d)?M(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Bb(b){var a= -[];r(b,function(b,d){M(b)?r(b,function(b){a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))}):a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))});return a.length?a.join("&"):""}function lb(b){return Ca(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ca(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Xc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g=["ng:app","ng-app","x-ng-app", -"data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;r(g,function(a){g[a]=!0;c(W.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(r(b.querySelectorAll("."+a),c),r(b.querySelectorAll("."+a+"\\:"),c),r(b.querySelectorAll("["+a+"]"),c))});r(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):r(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}});e&&a(e,f?[f]:[])}function cc(b,a){var c=function(){b=D(b);if(b.injector()){var c=b[0]===W? -"document":ia(b);throw Ua("btstrpd",c.replace(//,">"));}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=dc(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(V&&!d.test(V.name))return c();V.name=V.name.replace(d,"");Wa.resumeBootstrap=function(b){r(b,function(b){a.push(b)});c()}}function mb(b,a){a= -a||"_";return b.replace(Yc,function(b,d){return(d?a:"")+b.toLowerCase()})}function Cb(b,a,c){if(!b)throw Ua("areq",a||"?",c||"required");return b}function Xa(b,a,c){c&&M(b)&&(b=b[b.length-1]);Cb(O(b),a,"not a function, got "+(b&&"object"===typeof b?b.constructor.name||"Object":typeof b));return b}function Da(b,a){if("hasOwnProperty"===b)throw Ua("badname",a);}function ec(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g 
    "+e[1]+a.replace(me,"<$1>")+e[2];d.removeChild(d.firstChild);for(a=e[0];a--;)d=d.lastChild;a=0;for(e=d.childNodes.length;a=u?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function La(b,a){var c=typeof b,d;"function"==c||"object"==c&&null!==b?"function"==typeof(d= -b.$$hashKey)?d=b.$$hashKey():d===v&&(d=b.$$hashKey=(a||hb)()):d=b;return c+":"+d}function cb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function pc(b){var a,c;"function"===typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(pe,""),c=c.match(qe),r(c[1].split(re),function(b){b.replace(se,function(b,c,d){a.push(d)})})),b.$inject=a):M(b)?(c=b.length-1,Xa(b[c],"fn"),a=b.slice(0,c)):Xa(b,"fn",!0);return a}function dc(b){function a(a){return function(b,c){if(T(b))r(b, -Xb(a));else return a(b,c)}}function c(a,b){Da(a,"service");if(O(b)||M(b))b=n.instantiate(b);if(!b.$get)throw db("pget",a);return m[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,f,h;r(a,function(a){if(!l.get(a)){l.put(a,!0);try{if(E(a))for(c=Za(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,f=0,h=d.length;f 4096 bytes)!"));else{if(k.cookie!==ba)for(ba=k.cookie,d=ba.split("; "),N={},f=0;fl&&this.remove(q.key), -b},get:function(a){if(l").parent()[0])});var f=P(a,b,a,c,d,e);aa(a,"ng-scope");return function(b,c,d,e){Cb(b,"scope");var g=c?Ma.clone.call(a):a;r(d,function(a,b){g.data("$"+b+"Controller",a)});d=0;for(var k=g.length;darguments.length&&(b=a,a=v);Ga&&(c=ba);return n(a,b,c)}var x,R,y,N,C,Q,ba={},ra;x=c===f?d:ha(d,new Nb(D(f),d.$attr));R=x.$$element;if(L){var ve=/^\s*([@=&])(\??)\s*(\w*)\s*$/; -Q=e.$new(!0);!J||J!==L&&J!==L.$$originalDirective?R.data("$isolateScopeNoTemplate",Q):R.data("$isolateScope",Q);aa(R,"ng-isolate-scope");r(L.scope,function(a,c){var d=a.match(ve)||[],f=d[3]||c,g="?"==d[2],d=d[1],k,m,n,q;Q.$$isolateBindings[c]=d+f;switch(d){case "@":x.$observe(f,function(a){Q[c]=a});x.$$observers[f].$$scope=e;x[f]&&(Q[c]=b(x[f])(e));break;case "=":if(g&&!x[f])break;m=p(x[f]);q=m.literal?Ba:function(a,b){return a===b||a!==a&&b!==b};n=m.assign||function(){k=Q[c]=m(e);throw ja("nonassign", -x[f],L.name);};k=Q[c]=m(e);Q.$watch(function(){var a=m(e);q(a,Q[c])||(q(a,k)?n(e,a=Q[c]):Q[c]=a);return k=a},null,m.literal);break;case "&":m=p(x[f]);Q[c]=function(a){return m(e,a)};break;default:throw ja("iscp",L.name,c,a);}})}ra=n&&w;P&&r(P,function(a){var b={$scope:a===L||a.$$isolateScope?Q:e,$element:R,$attrs:x,$transclude:ra},c;C=a.controller;"@"==C&&(C=x[a.name]);c=s(C,b);ba[a.name]=c;Ga||R.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});g=0;for(y=k.length;gI.priority)break;if(u=I.scope)N=N||I,I.templateUrl||(eb("new/isolated scope",L,I,A),T(u)&&(L=I));z=I.name;!I.templateUrl&&I.controller&&(u=I.controller,P=P||{},eb("'"+z+"' controller",P[z],I,A),P[z]=I);if(u=I.transclude)H=!0,I.$$tlb||(eb("transclusion",da,I,A),da=I),"element"==u?(Ga=!0,x=I.priority,u=A,A=d.$$element=D(W.createComment(" "+z+": "+d[z]+" ")),c=A[0],ra(f,va.call(u,0),c),S=y(u,e,x,g&& -g.name,{nonTlbTranscludeDirective:da})):(u=D(Jb(c)).contents(),A.empty(),S=y(u,e));if(I.template)if(F=!0,eb("template",J,I,A),J=I,u=O(I.template)?I.template(A,d):I.template,u=V(u),I.replace){g=I;u=Hb.test(u)?D($(u)):[];c=u[0];if(1!=u.length||1!==c.nodeType)throw ja("tplrt",z,"");ra(f,A,c);U={$attr:{}};u=ba(c,[],U);var we=a.splice(ka+1,a.length-(ka+1));L&&G(u);a=a.concat(u).concat(we);B(d,U);U=a.length}else A.html(u);if(I.templateUrl)F=!0,eb("template",J,I,A),J=I,I.replace&&(g=I),K=ue(a.splice(ka, -a.length-ka),A,d,f,H&&S,k,q,{controllerDirectives:P,newIsolateScopeDirective:L,templateDirective:J,nonTlbTranscludeDirective:da}),U=a.length;else if(I.compile)try{Oa=I.compile(A,d,S),O(Oa)?w(null,Oa,X,Y):Oa&&w(Oa.pre,Oa.post,X,Y)}catch(Z){m(Z,ia(A))}I.terminal&&(K.terminal=!0,x=Math.max(x,I.priority))}K.scope=N&&!0===N.scope;K.transcludeOnThisElement=H;K.templateOnThisElement=F;K.transclude=S;n.hasElementTranscludeDirective=Ga;return K}function G(a){for(var b=0,c=a.length;bq.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Zb(q,{$$start:l,$$end:n})),b.push(q),p=q)}catch(x){m(x)}}return p}function B(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,f){"class"==f?(aa(e,b),a["class"]=(a["class"]?a["class"]+" ": -"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function ue(a,b,c,d,e,f,g,k){var p=[],l,m,w=b[0],s=a.shift(),x=F({},s,{templateUrl:null,transclude:null,replace:null,$$originalDirective:s}),K=O(s.templateUrl)?s.templateUrl(b,c):s.templateUrl;b.empty();n.get(t.getTrustedResourceUrl(K),{cache:q}).success(function(q){var n,t;q=V(q);if(s.replace){q=Hb.test(q)?D($(q)):[];n=q[0];if(1!=q.length||1!==n.nodeType)throw ja("tplrt", -s.name,K);q={$attr:{}};ra(d,b,n);var y=ba(n,[],q);T(s.scope)&&G(y);a=y.concat(a);B(c,q)}else n=w,b.html(q);a.unshift(x);l=J(a,n,c,e,b,s,f,g,k);r(d,function(a,c){a==n&&(d[c]=b[0])});for(m=P(b[0].childNodes,e);p.length;){q=p.shift();t=p.shift();var L=p.shift(),C=p.shift(),y=b[0];if(t!==w){var Q=t.className;k.hasElementTranscludeDirective&&s.replace||(y=Jb(n));ra(L,D(t),y);aa(D(y),Q)}t=l.transcludeOnThisElement?N(q,l.transclude,C):C;l(m,q,y,d,t)}p=null}).error(function(a,b,c,d){throw ja("tpload",d.url); -});return function(a,b,c,d,e){a=e;p?(p.push(b),p.push(c),p.push(d),p.push(a)):(l.transcludeOnThisElement&&(a=N(b,l.transclude,e)),l(m,b,c,d,a))}}function H(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.namea.status?d:n.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var b=e.headers,c=F({},a.headers),d,f,b=F({},b.common,b[A(a.method)]);a:for(d in b){a=A(d);for(f in c)if(A(f)===a)continue a;c[d]=b[d]}(function(a){var b;r(a,function(c,d){O(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})})(c); -return c}(a);F(c,a);c.headers=d;c.method=Ja(c.method);var f=[function(a){d=a.headers;var c=uc(a.data,tc(d),a.transformRequest);H(c)&&r(d,function(a,b){"content-type"===A(b)&&delete d[b]});H(a.withCredentials)&&!H(e.withCredentials)&&(a.withCredentials=e.withCredentials);return s(a,c,d).then(b,b)},v],g=n.when(c);for(r(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError);(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(), -g=g.then(a,h)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,c)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,c)});return g};return g}function s(c,f,g){function l(a,b,c,e){C&&(200<=a&&300>a?C.put(u,[a,b,sc(c),e]):C.remove(u));q(b,a,c,e);d.$$phase||d.$apply()}function q(a,b,d,e){b=Math.max(b,0);(200<=b&&300>b?t.resolve:t.reject)({data:a,status:b,headers:tc(d),config:c,statusText:e})}function s(){var a=Sa(p.pendingRequests,c);-1!==a&&p.pendingRequests.splice(a, -1)}var t=n.defer(),r=t.promise,C,J,u=K(c.url,c.params);p.pendingRequests.push(c);r.then(s,s);!c.cache&&!e.cache||(!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method)||(C=T(c.cache)?c.cache:T(e.cache)?e.cache:w);if(C)if(J=C.get(u),G(J)){if(J&&O(J.then))return J.then(s,s),J;M(J)?q(J[1],J[0],ha(J[2]),J[3]):q(J,200,{},"OK")}else C.put(u,r);H(J)&&((J=Ob(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:v)&&(g[c.xsrfHeaderName||e.xsrfHeaderName]=J),a(c.method,u,f,l,g,c.timeout,c.withCredentials,c.responseType)); -return r}function K(a,b){if(!b)return a;var c=[];Tc(b,function(a,b){null===a||H(a)||(M(a)||(a=[a]),r(a,function(a){T(a)&&(a=ua(a)?a.toISOString():oa(a));c.push(Ca(b)+"="+Ca(a))}))});0=u&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!V.XMLHttpRequest))return new V.ActiveXObject("Microsoft.XMLHTTP");if(V.XMLHttpRequest)return new V.XMLHttpRequest;throw z("$httpBackend")("noxhr"); -}function Vd(){this.$get=["$browser","$window","$document",function(b,a,c){return ze(b,ye,b.defer,a.angular.callbacks,c[0])}]}function ze(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),g=null;f.type="text/javascript";f.src=a;f.async=!0;g=function(a){ab(f,"load",g);ab(f,"error",g);e.body.removeChild(f);f=null;var h=-1,s="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),s=a.type,h="error"===a.type?404:200);c&&c(h,s)};rb(f,"load",g);rb(f,"error",g);8>=u&&(f.onreadystatechange= -function(){E(f.readyState)&&/loaded|complete/.test(f.readyState)&&(f.onreadystatechange=null,g({type:"load"}))});e.body.appendChild(f);return g}var g=-1;return function(e,k,l,m,n,q,p,s){function K(){t=g;L&&L();y&&y.abort()}function w(a,d,e,f,g){P&&c.cancel(P);L=y=null;0===d&&(d=e?200:"file"==wa(k).protocol?404:0);a(1223===d?204:d,e,f,g||"");b.$$completeOutstandingRequest(B)}var t;b.$$incOutstandingRequestCount();k=k||b.url();if("jsonp"==A(e)){var x="_"+(d.counter++).toString(36);d[x]=function(a){d[x].data= -a;d[x].called=!0};var L=f(k.replace("JSON_CALLBACK","angular.callbacks."+x),x,function(a,b){w(m,a,d[x].data,"",b);d[x]=B})}else{var y=a(e);y.open(e,k,!0);r(n,function(a,b){G(a)&&y.setRequestHeader(b,a)});y.onreadystatechange=function(){if(y&&4==y.readyState){var a=null,b=null,c="";t!==g&&(a=y.getAllResponseHeaders(),b="response"in y?y.response:y.responseText);t===g&&10>u||(c=y.statusText);w(m,t||y.status,b,a,c)}};p&&(y.withCredentials=!0);if(s)try{y.responseType=s}catch(aa){if("json"!==s)throw aa; -}y.send(l||null)}if(0=h&&(n.resolve(p),m(q.$$intervalId),delete e[q.$$intervalId]);s||b.$apply()},g);e[q.$$intervalId]=n;return q}var e={};d.cancel=function(b){return b&&b.$$intervalId in e?(e[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete e[b.$$intervalId], -!0):!1};return d}]}function bd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "), -DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Pb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function wc(b,a,c){b=wa(b,c);a.$$protocol= -b.protocol;a.$$host=b.hostname;a.$$port=U(b.port)||Ae[b.protocol]||null}function xc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=wa(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=bc(b.search);a.$$hash=decodeURIComponent(b.hash);a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function sa(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function yc(b){return b.replace(/(#.+)|#$/, -"$1")}function Qb(b){return b.substr(0,Fa(b).lastIndexOf("/")+1)}function zc(b,a){this.$$html5=!0;a=a||"";var c=Qb(b);wc(b,this,b);this.$$parse=function(a){var e=sa(c,a);if(!E(e))throw Rb("ipthprfx",a,c);xc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Bb(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$parseLinkUrl=function(d,e){var f,g;(f=sa(b,d))!==v?(g=f,g=(f= -sa(a,f))!==v?c+(sa("/",f)||f):b+g):(f=sa(c,d))!==v?g=c+f:c==d+"/"&&(g=c);g&&this.$$parse(g);return!!g}}function Sb(b,a){var c=Qb(b);wc(b,this,b);this.$$parse=function(d){var e=sa(b,d)||sa(c,d),e="#"==e.charAt(0)?sa(a,e):this.$$html5?e:"";if(!E(e))throw Rb("ihshprfx",d,a);xc(e,this,b);d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash): -"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Ac(b,a){this.$$html5=!0;Sb.apply(this,arguments);var c=Qb(b);this.$$parseLinkUrl=function(d,e){var f,g;b==Fa(d)?f=d:(g=sa(c,d))?f=b+a+g:c===d+"/"&&(f=c);f&&this.$$parse(f);return!!f};this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl= -b+a+this.$$url}}function sb(b){return function(){return this[b]}}function Bc(b,a){return function(c){if(H(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Wd(){var b="",a=!1;this.hashPrefix=function(a){return G(a)?(b=a,this):b};this.html5Mode=function(b){return G(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,k=d.baseHref(),l=d.url();a?(k=l.substring(0,l.indexOf("/", -l.indexOf("//")+2))+(k||"/"),e=e.history?zc:Ac):(k=Fa(l),e=Sb);h=new e(k,"#"+b);h.$$parseLinkUrl(l,l);var m=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=D(a.target);"a"!==A(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=b.attr("href")||b.attr("xlink:href");T(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=wa(e.animVal).href);m.test(e)||(!e||(b.attr("target")||a.isDefaultPrevented())||!h.$$parseLinkUrl(e, -g))||(a.preventDefault(),h.absUrl()!=d.url()&&(c.$apply(),V.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=l&&d.url(h.absUrl(),!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var n=0;c.$watch(function(){var a=yc(d.url()),b=yc(h.absUrl()),e=h.$$replace;n&&a==b||(n++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart", -h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),e),g(a))}));h.$$replace=!1;return n});return h}]}function Xd(){var b=!0,a=this;this.debugEnabled=function(a){return G(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(k){}return a? -function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function la(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ea("isecfld",a);return b}function Cc(b,a){b+="";if(!E(b))throw ea("iseccst",a);return b}function ma(b, -a){if(b){if(b.constructor===b)throw ea("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ea("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ea("isecdom",a);if(b===Object)throw ea("isecobj",a);}return b}function tb(b,a,c,d,e){ma(b,d);e=e||{};a=a.split(".");for(var f,g=0;1g?Dc(f[0],f[1],f[2],f[3],f[4],c,a):function(b,d){var e=0,h;do h= -Dc(f[e++],f[e++],f[e++],f[e++],f[e++],c,a)(b,d),d=v,b=h;while(ea||37<=a&&40>=a)||p()});if(e.hasEvent("paste"))a.on("paste cut",p)}a.on("change",n);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var s=c.ngPattern;s&&((e=s.match(/^\/(.*)\/([gim]*)$/))?(s=RegExp(e[1],e[2]),e=function(a){return ta(d,"pattern",d.$isEmpty(a)||s.test(a),a)}):e=function(c){var e=b.$eval(s);if(!e||!e.test)throw z("ngPattern")("noregexp",s, -e,ia(a));return ta(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var r=U(c.ngMinlength);e=function(a){return ta(d,"minlength",d.$isEmpty(a)||a.length>=r,a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var w=U(c.ngMaxlength);e=function(a){return ta(d,"maxlength",d.$isEmpty(a)||a.length<=w,a)};d.$parsers.push(e);d.$formatters.push(e)}}function Vb(b,a){b="ngClass"+b;return["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d< -a.length;d++){for(var e=a[d],m=0;mu?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ja(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Ya=function(){if(G(Ya.isActive_))return Ya.isActive_;var b=!(!W.querySelector("[ng-csp]")&&!W.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Ya.isActive_=b},Yc=/[A-Z]/g,ad={full:"1.2.32",major:1,minor:2, -dot:32,codeName:"alternation-intention"};S.expando="ng339";var bb=S.cache={},ne=1,rb=V.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},ab=V.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};S._data=function(b){return this.cache[b[this.expando]]||{}};var ie=/([\:\-\_]+(.))/g,je=/^moz([A-Z])/,Gb=z("jqLite"),ke=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Hb=/<|&#?\w+;/,le=/<([\w:]+)/,me= -/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ca={option:[1,'"],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ca.optgroup=ca.option;ca.tbody=ca.tfoot=ca.colgroup=ca.caption=ca.thead;ca.th=ca.td;var Ma=S.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===W.readyState? -setTimeout(a):(this.on("DOMContentLoaded",a),S(V).on("load",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?D(this[b]):D(this[this.length+b])},length:0,push:Qe,sort:[].sort,splice:[].splice},qb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){qb[A(b)]=b});var oc={};r("input select option textarea button form details".split(" "),function(b){oc[Ja(b)]=!0});r({data:Lb,removeData:Kb},function(b, -a){S[a]=b});r({data:Lb,inheritedData:pb,scope:function(b){return D.data(b,"$scope")||pb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:lc,injector:function(b){return pb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Mb,css:function(b,a,c){a=$a(a);if(G(c))b.style[a]=c;else{var d;8>=u&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=u&&(d=""=== -d?v:d);return d}},attr:function(b,a,c){var d=A(a);if(qb[d])if(G(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:v;else if(G(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?v:b},prop:function(b,a,c){if(G(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(H(d))return e?b[e]:"";b[e]=d}var a=[];9>u?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent"; -b.$dv="";return b}(),val:function(b,a){if(H(a)){if("SELECT"===Na(b)&&b.multiple){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(H(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Ve={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'}, -Tb=function(a){this.options=a};Tb.prototype={constructor:Tb,lex:function(a){this.text=a;this.index=0;this.ch=v;this.lastCh=":";for(this.tokens=[];this.index=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=G(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ea("lexerr", -a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(fb.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()): -this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Ec(d,this.options,this.text);return F(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){(h=a(e,h))||a.assign(e,h={});return tb(h,d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return F(function(e,f){var g=a(e,f),h=Cc(d(e,f),c.text),k;la(h,c.text);if(!g)return v;(g=ma(g[h],c.text))&&(g.then&&c.options.unwrapPromises)&&(k=g,"$$v"in g||(k.$$v=v,k.then(function(a){k.$$v= -a})),g=g.$$v);return g},{assign:function(e,f,g){var h=la(Cc(d(e,g),c.text),c.text);(g=ma(a(e,g),c.text))||a.assign(e,g={});return g[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(f,g){for(var h=[],k=c?c(f,g):f,l=0;la.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Ub(Math[0=u&&(c.href||c.name||c.$set("href",""),a.append(W.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===Aa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)|| -a.preventDefault()})}}}),Eb={};r(qb,function(a,c){if("multiple"!=a){var d=qa("ng-"+c);Eb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(["src","srcset","href"],function(a){var c=qa("ng-"+a);Eb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===Aa.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null);f.$observe(c,function(c){c?(f.$set(h,c),u&&g&&e.prop(g,f[h])):"href"=== -a&&f.$set(h,null)})}}}});var xb={$addControl:B,$removeControl:B,$setValidity:B,$setDirty:B,$setPristine:B};Oc.$inject=["$element","$attrs","$scope","$animate"];var Rc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};rb(e[0],"submit",h);e.on("$destroy",function(){c(function(){ab(e[0],"submit",h)},0,!1)})}var k=e.parent().controller("form"), -l=f.name||f.ngForm;l&&tb(a,l,g,l);if(k)e.on("$destroy",function(){k.$removeControl(g);l&&tb(a,l,v,l);F(g,xb)})}}}}}]},ed=Rc(),rd=Rc(!0),We=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Xe=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Ye=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Sc={text:zb,number:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||Ye.test(a))return e.$setValidity("number", -!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return v});Oe(e,"number",Ze,null,e.$$validityState);e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);return ta(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return ta(e,"max",e.$isEmpty(a)||a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return ta(e,"number",e.$isEmpty(a)|| -ib(a),a)})},url:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);a=function(a){return ta(e,"url",e.$isEmpty(a)||We.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,f,g){zb(a,c,d,e,f,g);a=function(a){return ta(e,"email",e.$isEmpty(a)||Xe.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){H(d.name)&&c.attr("name",hb());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue}; -d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;E(f)||(f=!0);E(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a===f});e.$parsers.push(function(a){return a?f:g})},hidden:B,button:B,submit:B,reset:B,file:B},Ze=["badInput"],gc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel", -link:function(d,e,f,g){g&&(Sc[A(f.type)]||Sc.text)(d,e,f,g,c,a)}}}],vb="ng-valid",wb="ng-invalid",Qa="ng-pristine",yb="ng-dirty",$e=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,f,g){function h(a,c){c=c?"-"+mb(c,"-"):"";g.removeClass(e,(a?wb:vb)+c);g.addClass(e,(a?vb:wb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name= -d.name;var k=f(d.ngModel),l=k.assign;if(!l)throw z("ngModel")("nonassign",d.ngModel,ia(e));this.$render=B;this.$isEmpty=function(a){return H(a)||""===a||null===a||a!==a};var m=e.inheritedData("$formController")||xb,n=0,q=this.$error={};e.addClass(Qa);h(!0);this.$setValidity=function(a,c){q[a]!==!c&&(c?(q[a]&&n--,n||(h(!0),this.$valid=!0,this.$invalid=!1)):(h(!1),this.$invalid=!0,this.$valid=!1,n++),q[a]=!c,h(c,a),m.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine= -!0;g.removeClass(e,yb);g.addClass(e,Qa)};this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,yb),m.$setDirty());r(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,l(a,d),r(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var p=this;a.$watch(function(){var c=k(a);if(p.$modelValue!==c){var d=p.$formatters,e=d.length;for(p.$modelValue=c;e--;)c=d[e](c);p.$viewValue!==c&&(p.$viewValue= -c,p.$render())}return c})}],Gd=function(){return{require:["ngModel","^?form"],controller:$e,link:function(a,c,d,e){var f=e[0],g=e[1]||xb;g.$addControl(f);a.$on("$destroy",function(){g.$removeControl(f)})}}},Id=Z({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),hc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required", -!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required",function(){f(e.$viewValue)})}}}},Hd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!H(a)){var c=[];a&&r(a.split(f),function(a){a&&c.push($(a))});return c}});e.$formatters.push(function(a){return M(a)?a.join(", "):v});e.$isEmpty=function(a){return!a||!a.length}}}},af=/^(true|false|\d+)$/,Jd=function(){return{priority:100, -compile:function(a,c){return af.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},jd=za({compile:function(a){a.addClass("ng-binding");return function(a,d,e){d.data("$binding",e.ngBind);a.$watch(e.ngBind,function(a){d.text(a==v?"":a)})}}}),ld=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}], -kd=["$sce","$parse",function(a,c){return{compile:function(d){d.addClass("ng-binding");return function(d,f,g){f.data("$binding",g.ngBindHtml);var h=c(g.ngBindHtml);d.$watch(function(){return(h(d)||"").toString()},function(c){f.html(a.getTrustedHtml(h(d))||"")})}}}}],md=Vb("",!0),od=Vb("Odd",0),nd=Vb("Even",1),pd=za({compile:function(a,c){c.$set("ngCloak",v);a.removeClass("ng-cloak")}}),qd=[function(){return{scope:!0,controller:"@",priority:500}}],ic={},bf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "), -function(a){var c=qa("ng-"+a);ic[c]=["$parse","$rootScope",function(d,e){return{compile:function(f,g){var h=d(g[c],!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};bf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var td=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,k,l;c.$watch(e.ngIf,function(f){Va(f)?k||(k=c.$new(),g(k,function(c){c[c.length++]=W.createComment(" end ngIf: "+e.ngIf+ -" ");h={clone:c};a.enter(c,d.parent(),d)})):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=Db(h.clone),a.leave(l,function(){l=null}),h=null))})}}}],ud=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Wa.noop,compile:function(g,h){var k=h.ngInclude||h.src,l=h.onload||"",m=h.autoscroll;return function(g,h,p,r,K){var w=0,t,x,u,y=function(){x&&(x.remove(),x=null);t&&(t.$destroy(),t=null); -u&&(e.leave(u,function(){x=null}),x=u,u=null)};g.$watch(f.parseAsResourceUrl(k),function(f){var k=function(){!G(m)||m&&!g.$eval(m)||d()},p=++w;f?(a.get(f,{cache:c}).success(function(a){if(p===w){var c=g.$new();r.template=a;a=K(c,function(a){y();e.enter(a,null,h,k)});t=c;u=a;t.$emit("$includeContentLoaded");g.$eval(l)}}).error(function(){p===w&&y()}),g.$emit("$includeContentRequested")):(y(),r.template=null)})}}}}],Kd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude", -link:function(c,d,e,f){d.html(f.template);a(d.contents())(c)}}}],vd=za({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),wd=za({terminal:!0,priority:1E3}),xd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var h=g.count,k=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(k)||{},n={},q=c.startSymbol(),p=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[A(c.replace("when","").replace("Minus","-"))]= -f.attr(g.$attr[c]))});r(m,function(a,e){n[e]=c(a.replace(d,q+h+"-"+l+p))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in m||(c=a.pluralCat(c-l));return n[c](e,f,!0)},function(a){f.text(a)})}}}],yd=["$parse","$animate",function(a,c){var d=z("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,link:function(e,f,g,h,k){var l=g.ngRepeat,m=l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),n,q,p,s,u,v,t={$id:La};if(!m)throw d("iexp", -l);g=m[1];h=m[2];(m=m[3])?(n=a(m),q=function(a,c,d){v&&(t[v]=a);t[u]=c;t.$index=d;return n(e,t)}):(p=function(a,c){return La(c)},s=function(a){return a});m=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!m)throw d("iidexp",g);u=m[3]||m[1];v=m[2];var x={};e.$watchCollection(h,function(a){var g,h,m=f[0],n,t={},G,C,J,A,E,B,z,H=[];if(Ra(a))B=a,E=q||p;else{E=q||s;B=[];for(J in a)a.hasOwnProperty(J)&&"$"!=J.charAt(0)&&B.push(J);B.sort()}G=B.length;h=H.length=B.length;for(g=0;gC;)d=v.pop(),q.removeOption(d.label),d.element.remove()}for(;D.length>R;)D.pop()[0].element.remove()}var k;if(!(k=s.match(d)))throw cf("iexp",s,ia(f));var l=c(k[2]||k[1]), -m=k[4]||k[6],n=k[5],r=c(k[3]||""),A=c(k[2]?k[1]:m),B=c(k[7]),y=k[8]?c(k[8]):null,D=[[{element:f,label:""}]];z&&(a(z)(e),z.removeClass("ng-scope"),z.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=B(e)||[],d={},k,l,q,r,s,t,u;if(p)for(l=[],r=0,t=D.length;r@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}.ng-hide-add-active,.ng-hide-remove{display:block!important;}'); -//# sourceMappingURL=angular.min.js.map - -// Source: public/lib/angular-resource/angular-resource.min.js -/* - AngularJS v1.2.32 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(H,a,A){'use strict';function D(p,g){g=g||{};a.forEach(g,function(a,c){delete g[c]});for(var c in p)!p.hasOwnProperty(c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(g[c]=p[c]);return g}var v=a.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;a.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(p,g){function c(a,c){this.template=a;this.defaults=c||{};this.urlParams={}}function t(n,w,l){function r(h,d){var e={};d=x({},w,d);s(d,function(b,d){u(b)&&(b=b());var k;if(b&& -b.charAt&&"@"==b.charAt(0)){k=h;var a=b.substr(1);if(null==a||""===a||"hasOwnProperty"===a||!C.test("."+a))throw v("badmember",a);for(var a=a.split("."),f=0,c=a.length;f', - link: function(scope, element, attrs) { - var domElement = element[0], - canvas = element.find('canvas')[0], - context = canvas2D ? canvas.getContext('2d') : null, - trim = /^\s+|\s+$/g, - error, - version, - errorCorrectionLevel, - data, - size, - modules, - tile, - qr, - setVersion = function(value) { - version = Math.max(1, Math.min(parseInt(value, 10), 10)) || 4; - }, - setErrorCorrectionLevel = function(value) { - errorCorrectionLevel = value in levels ? value : 'M'; - }, - setData = function(value) { - if (!value) { - return; - } - - data = value.replace(trim, ''); - qr = qrcode(version, errorCorrectionLevel); - qr.addData(data); - - try { - qr.make(); - } catch(e) { - error = e.message; - return; - } - - error = false; - modules = qr.getModuleCount(); - }, - setSize = function(value) { - size = parseInt(value, 10) || modules * 2; - tile = size / modules; - canvas.width = canvas.height = size; - }, - render = function() { - if (!qr) { - return; - } - - if (error) { - if (!canvas2D) { - domElement.innerHTML = ''; - } - scope.$emit('qrcode:error', error); - return; - } - - if (canvas2D) { - draw(context, qr, modules, tile); - } else { - domElement.innerHTML = qr.createImgTag(tile, 0); - } - }; - - setVersion(attrs.version); - setErrorCorrectionLevel(attrs.errorCorrectionLevel); - setSize(attrs.size); - - attrs.$observe('version', function(value) { - if (!value) { - return; - } - - setVersion(value); - setData(data); - setSize(size); - render(); - }); - - attrs.$observe('errorCorrectionLevel', function(value) { - if (!value) { - return; - } - - setErrorCorrectionLevel(value); - setData(data); - setSize(size); - render(); - }); - - attrs.$observe('data', function(value) { - if (!value) { - return; - } - - setData(value); - setSize(size); - render(); - }); - - attrs.$observe('size', function(value) { - if (!value) { - return; - } - - setSize(value); - render(); - }); - } - }; - }]); - -// Source: public/lib/angular-animate/angular-animate.min.js -/* - AngularJS v1.2.32 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(G,d,P){'use strict';d.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(H,k,e){e=e.ngAnimateChildren;d.isString(e)&&0===e.length?k.data("$$ngAnimateChildren",!0):H.$watch(e,function(d){k.data("$$ngAnimateChildren",!!d)})}}).factory("$$animateReflow",["$$rAF","$document",function(d,k){var e=k[0].body;return function(k){return d(function(){k(e.offsetWidth)})}}]).config(["$provide","$animateProvider",function(H,k){function e(d){for(var e=0;e=y&&b>=r&&d()}var k=e(b);a=b.data(v);if(-1!=k.getAttribute("class").indexOf(c)&&a){var l="";x(c.split(" "),function(a,b){l+=(0 -// Heading containing HTML - -// -.directive('accordionHeading', function() { - return { - restrict: 'EA', - transclude: true, // Grab the contents to be used as the heading - template: '', // In effect remove this element! - replace: true, - require: '^accordionGroup', - compile: function(element, attr, transclude) { - return function link(scope, element, attr, accordionGroupCtrl) { - // Pass the heading to the accordion-group controller - // so that it can be transcluded into the right place in the template - // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] - accordionGroupCtrl.setHeading(transclude(scope, function() {})); - }; - } - }; -}) - -// Use in the accordion-group template to indicate where you want the heading to be transcluded -// You must provide the property on the accordion-group controller that will hold the transcluded element -//
    -// -// ... -//
    -.directive('accordionTransclude', function() { - return { - require: '^accordionGroup', - link: function(scope, element, attr, controller) { - scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { - if ( heading ) { - element.html(''); - element.append(heading); - } - }); - } - }; -}); - -angular.module("ui.bootstrap.alert", []) - -.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { - $scope.closeable = 'close' in $attrs; -}]) - -.directive('alert', function () { - return { - restrict:'EA', - controller:'AlertController', - templateUrl:'template/alert/alert.html', - transclude:true, - replace:true, - scope: { - type: '=', - close: '&' - } - }; -}); - -angular.module('ui.bootstrap.bindHtml', []) - - .directive('bindHtmlUnsafe', function () { - return function (scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); - scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { - element.html(value || ''); - }); - }; - }); -angular.module('ui.bootstrap.buttons', []) - -.constant('buttonConfig', { - activeClass: 'active', - toggleEvent: 'click' -}) - -.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { - this.activeClass = buttonConfig.activeClass || 'active'; - this.toggleEvent = buttonConfig.toggleEvent || 'click'; -}]) - -.directive('btnRadio', function () { - return { - require: ['btnRadio', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - if (!element.hasClass(buttonsCtrl.activeClass)) { - scope.$apply(function () { - ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)); - ngModelCtrl.$render(); - }); - } - }); - } - }; -}) - -.directive('btnCheckbox', function () { - return { - require: ['btnCheckbox', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - function getTrueValue() { - return getCheckboxValue(attrs.btnCheckboxTrue, true); - } - - function getFalseValue() { - return getCheckboxValue(attrs.btnCheckboxFalse, false); - } - - function getCheckboxValue(attributeValue, defaultValue) { - var val = scope.$eval(attributeValue); - return angular.isDefined(val) ? val : defaultValue; - } - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - scope.$apply(function () { - ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); - ngModelCtrl.$render(); - }); - }); - } - }; -}); - -/** -* @ngdoc overview -* @name ui.bootstrap.carousel -* -* @description -* AngularJS version of an image carousel. -* -*/ -angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) -.controller('CarouselController', ['$scope', '$timeout', '$transition', '$q', function ($scope, $timeout, $transition, $q) { - var self = this, - slides = self.slides = [], - currentIndex = -1, - currentTimeout, isPlaying; - self.currentSlide = null; - - var destroyed = false; - /* direction: "prev" or "next" */ - self.select = function(nextSlide, direction) { - var nextIndex = slides.indexOf(nextSlide); - //Decide direction if it's not given - if (direction === undefined) { - direction = nextIndex > currentIndex ? "next" : "prev"; - } - if (nextSlide && nextSlide !== self.currentSlide) { - if ($scope.$currentTransition) { - $scope.$currentTransition.cancel(); - //Timeout so ng-class in template has time to fix classes for finished slide - $timeout(goNext); - } else { - goNext(); - } - } - function goNext() { - // Scope has been destroyed, stop here. - if (destroyed) { return; } - //If we have a slide to transition from and we have a transition type and we're allowed, go - if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { - //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime - nextSlide.$element.addClass(direction); - var reflow = nextSlide.$element[0].offsetWidth; //force reflow - - //Set all other slides to stop doing their stuff for the new transition - angular.forEach(slides, function(slide) { - angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); - }); - angular.extend(nextSlide, {direction: direction, active: true, entering: true}); - angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); - - $scope.$currentTransition = $transition(nextSlide.$element, {}); - //We have to create new pointers inside a closure since next & current will change - (function(next,current) { - $scope.$currentTransition.then( - function(){ transitionDone(next, current); }, - function(){ transitionDone(next, current); } - ); - }(nextSlide, self.currentSlide)); - } else { - transitionDone(nextSlide, self.currentSlide); - } - self.currentSlide = nextSlide; - currentIndex = nextIndex; - //every time you change slides, reset the timer - restartTimer(); - } - function transitionDone(next, current) { - angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); - angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); - $scope.$currentTransition = null; - } - }; - $scope.$on('$destroy', function () { - destroyed = true; - }); - - /* Allow outside people to call indexOf on slides array */ - self.indexOfSlide = function(slide) { - return slides.indexOf(slide); - }; - - $scope.next = function() { - var newIndex = (currentIndex + 1) % slides.length; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'next'); - } - }; - - $scope.prev = function() { - var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'prev'); - } - }; - - $scope.select = function(slide) { - self.select(slide); - }; - - $scope.isActive = function(slide) { - return self.currentSlide === slide; - }; - - $scope.slides = function() { - return slides; - }; - - $scope.$watch('interval', restartTimer); - $scope.$on('$destroy', resetTimer); - - function restartTimer() { - resetTimer(); - var interval = +$scope.interval; - if (!isNaN(interval) && interval>=0) { - currentTimeout = $timeout(timerFn, interval); - } - } - - function resetTimer() { - if (currentTimeout) { - $timeout.cancel(currentTimeout); - currentTimeout = null; - } - } - - function timerFn() { - if (isPlaying) { - $scope.next(); - restartTimer(); - } else { - $scope.pause(); - } - } - - $scope.play = function() { - if (!isPlaying) { - isPlaying = true; - restartTimer(); - } - }; - $scope.pause = function() { - if (!$scope.noPause) { - isPlaying = false; - resetTimer(); - } - }; - - self.addSlide = function(slide, element) { - slide.$element = element; - slides.push(slide); - //if this is the first slide or the slide is set to active, select it - if(slides.length === 1 || slide.active) { - self.select(slides[slides.length-1]); - if (slides.length == 1) { - $scope.play(); - } - } else { - slide.active = false; - } - }; - - self.removeSlide = function(slide) { - //get the index of the slide inside the carousel - var index = slides.indexOf(slide); - slides.splice(index, 1); - if (slides.length > 0 && slide.active) { - if (index >= slides.length) { - self.select(slides[index-1]); - } else { - self.select(slides[index]); - } - } else if (currentIndex > index) { - currentIndex--; - } - }; - -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:carousel - * @restrict EA - * - * @description - * Carousel is the outer container for a set of image 'slides' to showcase. - * - * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. - * @param {boolean=} noTransition Whether to disable transitions on the carousel. - * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). - * - * @example - - - - - - - - - - - - - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - - - */ -.directive('carousel', [function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - controller: 'CarouselController', - require: 'carousel', - templateUrl: 'template/carousel/carousel.html', - scope: { - interval: '=', - noTransition: '=', - noPause: '=' - } - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:slide - * @restrict EA - * - * @description - * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. - * - * @param {boolean=} active Model binding, whether or not this slide is currently active. - * - * @example - - -
    - - - - - - -
    -
    -
      -
    • - - {{$index}}: {{slide.text}} -
    • -
    - Add Slide -
    -
    - Interval, in milliseconds: -
    Enter a negative number to stop the interval. -
    -
    -
    -
    - -function CarouselDemoCtrl($scope) { - $scope.myInterval = 5000; - var slides = $scope.slides = []; - $scope.addSlide = function() { - var newWidth = 200 + ((slides.length + (25 * slides.length)) % 150); - slides.push({ - image: 'http://placekitten.com/' + newWidth + '/200', - text: ['More','Extra','Lots of','Surplus'][slides.length % 4] + ' ' - ['Cats', 'Kittys', 'Felines', 'Cutes'][slides.length % 4] - }); - }; - for (var i=0; i<4; i++) $scope.addSlide(); -} - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - -
    -*/ - -.directive('slide', ['$parse', function($parse) { - return { - require: '^carousel', - restrict: 'EA', - transclude: true, - replace: true, - templateUrl: 'template/carousel/slide.html', - scope: { - }, - link: function (scope, element, attrs, carouselCtrl) { - //Set up optional 'active' = binding - if (attrs.active) { - var getActive = $parse(attrs.active); - var setActive = getActive.assign; - var lastValue = scope.active = getActive(scope.$parent); - scope.$watch(function parentActiveWatch() { - var parentActive = getActive(scope.$parent); - - if (parentActive !== scope.active) { - // we are out of sync and need to copy - if (parentActive !== lastValue) { - // parent changed and it has precedence - lastValue = scope.active = parentActive; - } else { - // if the parent can be assigned then do so - setActive(scope.$parent, parentActive = lastValue = scope.active); - } - } - return parentActive; - }); - } - - carouselCtrl.addSlide(scope, element); - //when the scope is destroyed then remove the slide from the current slides array - scope.$on('$destroy', function() { - carouselCtrl.removeSlide(scope); - }); - - scope.$watch('active', function(active) { - if (active) { - carouselCtrl.select(scope); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.position', []) - -/** - * A set of utility methods that can be use to retrieve position of DOM elements. - * It is meant to be used where we need to absolute-position DOM elements in - * relation to other, existing elements (this is the case for tooltips, popovers, - * typeahead suggestions etc.). - */ - .factory('$position', ['$document', '$window', function ($document, $window) { - - function getStyle(el, cssprop) { - if (el.currentStyle) { //IE - return el.currentStyle[cssprop]; - } else if ($window.getComputedStyle) { - return $window.getComputedStyle(el)[cssprop]; - } - // finally try and get inline style - return el.style[cssprop]; - } - - /** - * Checks if a given element is statically positioned - * @param element - raw DOM element - */ - function isStaticPositioned(element) { - return (getStyle(element, "position") || 'static' ) === 'static'; - } - - /** - * returns the closest, non-statically positioned parentOffset of a given element - * @param element - */ - var parentOffsetEl = function (element) { - var docDomEl = $document[0]; - var offsetParent = element.offsetParent || docDomEl; - while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || docDomEl; - }; - - return { - /** - * Provides read-only equivalent of jQuery's position function: - * http://api.jquery.com/position/ - */ - position: function (element) { - var elBCR = this.offset(element); - var offsetParentBCR = { top: 0, left: 0 }; - var offsetParentEl = parentOffsetEl(element[0]); - if (offsetParentEl != $document[0]) { - offsetParentBCR = this.offset(angular.element(offsetParentEl)); - offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; - offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; - } - - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: elBCR.top - offsetParentBCR.top, - left: elBCR.left - offsetParentBCR.left - }; - }, - - /** - * Provides read-only equivalent of jQuery's offset function: - * http://api.jquery.com/offset/ - */ - offset: function (element) { - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop), - left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft) - }; - } - }; - }]); - -angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.position']) - -.constant('datepickerConfig', { - dayFormat: 'dd', - monthFormat: 'MMMM', - yearFormat: 'yyyy', - dayHeaderFormat: 'EEE', - dayTitleFormat: 'MMMM yyyy', - monthTitleFormat: 'yyyy', - showWeeks: true, - startingDay: 0, - yearRange: 20, - minDate: null, - maxDate: null -}) - -.controller('DatepickerController', ['$scope', '$attrs', 'dateFilter', 'datepickerConfig', function($scope, $attrs, dateFilter, dtConfig) { - var format = { - day: getValue($attrs.dayFormat, dtConfig.dayFormat), - month: getValue($attrs.monthFormat, dtConfig.monthFormat), - year: getValue($attrs.yearFormat, dtConfig.yearFormat), - dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat), - dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat), - monthTitle: getValue($attrs.monthTitleFormat, dtConfig.monthTitleFormat) - }, - startingDay = getValue($attrs.startingDay, dtConfig.startingDay), - yearRange = getValue($attrs.yearRange, dtConfig.yearRange); - - this.minDate = dtConfig.minDate ? new Date(dtConfig.minDate) : null; - this.maxDate = dtConfig.maxDate ? new Date(dtConfig.maxDate) : null; - - function getValue(value, defaultValue) { - return angular.isDefined(value) ? $scope.$parent.$eval(value) : defaultValue; - } - - function getDaysInMonth( year, month ) { - return new Date(year, month, 0).getDate(); - } - - function getDates(startDate, n) { - var dates = new Array(n); - var current = startDate, i = 0; - while (i < n) { - dates[i++] = new Date(current); - current.setDate( current.getDate() + 1 ); - } - return dates; - } - - function makeDate(date, format, isSelected, isSecondary) { - return { date: date, label: dateFilter(date, format), selected: !!isSelected, secondary: !!isSecondary }; - } - - this.modes = [ - { - name: 'day', - getVisibleDates: function(date, selected) { - var year = date.getFullYear(), month = date.getMonth(), firstDayOfMonth = new Date(year, month, 1); - var difference = startingDay - firstDayOfMonth.getDay(), - numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, - firstDate = new Date(firstDayOfMonth), numDates = 0; - - if ( numDisplayedFromPreviousMonth > 0 ) { - firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); - numDates += numDisplayedFromPreviousMonth; // Previous - } - numDates += getDaysInMonth(year, month + 1); // Current - numDates += (7 - numDates % 7) % 7; // Next - - var days = getDates(firstDate, numDates), labels = new Array(7); - for (var i = 0; i < numDates; i ++) { - var dt = new Date(days[i]); - days[i] = makeDate(dt, format.day, (selected && selected.getDate() === dt.getDate() && selected.getMonth() === dt.getMonth() && selected.getFullYear() === dt.getFullYear()), dt.getMonth() !== month); - } - for (var j = 0; j < 7; j++) { - labels[j] = dateFilter(days[j].date, format.dayHeader); - } - return { objects: days, title: dateFilter(date, format.dayTitle), labels: labels }; - }, - compare: function(date1, date2) { - return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); - }, - split: 7, - step: { months: 1 } - }, - { - name: 'month', - getVisibleDates: function(date, selected) { - var months = new Array(12), year = date.getFullYear(); - for ( var i = 0; i < 12; i++ ) { - var dt = new Date(year, i, 1); - months[i] = makeDate(dt, format.month, (selected && selected.getMonth() === i && selected.getFullYear() === year)); - } - return { objects: months, title: dateFilter(date, format.monthTitle) }; - }, - compare: function(date1, date2) { - return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); - }, - split: 3, - step: { years: 1 } - }, - { - name: 'year', - getVisibleDates: function(date, selected) { - var years = new Array(yearRange), year = date.getFullYear(), startYear = parseInt((year - 1) / yearRange, 10) * yearRange + 1; - for ( var i = 0; i < yearRange; i++ ) { - var dt = new Date(startYear + i, 0, 1); - years[i] = makeDate(dt, format.year, (selected && selected.getFullYear() === dt.getFullYear())); - } - return { objects: years, title: [years[0].label, years[yearRange - 1].label].join(' - ') }; - }, - compare: function(date1, date2) { - return date1.getFullYear() - date2.getFullYear(); - }, - split: 5, - step: { years: yearRange } - } - ]; - - this.isDisabled = function(date, mode) { - var currentMode = this.modes[mode || 0]; - return ((this.minDate && currentMode.compare(date, this.minDate) < 0) || (this.maxDate && currentMode.compare(date, this.maxDate) > 0) || ($scope.dateDisabled && $scope.dateDisabled({date: date, mode: currentMode.name}))); - }; -}]) - -.directive( 'datepicker', ['dateFilter', '$parse', 'datepickerConfig', '$log', function (dateFilter, $parse, datepickerConfig, $log) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/datepicker/datepicker.html', - scope: { - dateDisabled: '&' - }, - require: ['datepicker', '?^ngModel'], - controller: 'DatepickerController', - link: function(scope, element, attrs, ctrls) { - var datepickerCtrl = ctrls[0], ngModel = ctrls[1]; - - if (!ngModel) { - return; // do nothing if no ng-model - } - - // Configuration parameters - var mode = 0, selected = new Date(), showWeeks = datepickerConfig.showWeeks; - - if (attrs.showWeeks) { - scope.$parent.$watch($parse(attrs.showWeeks), function(value) { - showWeeks = !! value; - updateShowWeekNumbers(); - }); - } else { - updateShowWeekNumbers(); - } - - if (attrs.min) { - scope.$parent.$watch($parse(attrs.min), function(value) { - datepickerCtrl.minDate = value ? new Date(value) : null; - refill(); - }); - } - if (attrs.max) { - scope.$parent.$watch($parse(attrs.max), function(value) { - datepickerCtrl.maxDate = value ? new Date(value) : null; - refill(); - }); - } - - function updateShowWeekNumbers() { - scope.showWeekNumbers = mode === 0 && showWeeks; - } - - // Split array into smaller arrays - function split(arr, size) { - var arrays = []; - while (arr.length > 0) { - arrays.push(arr.splice(0, size)); - } - return arrays; - } - - function refill( updateSelected ) { - var date = null, valid = true; - - if ( ngModel.$modelValue ) { - date = new Date( ngModel.$modelValue ); - - if ( isNaN(date) ) { - valid = false; - $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else if ( updateSelected ) { - selected = date; - } - } - ngModel.$setValidity('date', valid); - - var currentMode = datepickerCtrl.modes[mode], data = currentMode.getVisibleDates(selected, date); - angular.forEach(data.objects, function(obj) { - obj.disabled = datepickerCtrl.isDisabled(obj.date, mode); - }); - - ngModel.$setValidity('date-disabled', (!date || !datepickerCtrl.isDisabled(date))); - - scope.rows = split(data.objects, currentMode.split); - scope.labels = data.labels || []; - scope.title = data.title; - } - - function setMode(value) { - mode = value; - updateShowWeekNumbers(); - refill(); - } - - ngModel.$render = function() { - refill( true ); - }; - - scope.select = function( date ) { - if ( mode === 0 ) { - var dt = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); - dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); - ngModel.$setViewValue( dt ); - refill( true ); - } else { - selected = date; - setMode( mode - 1 ); - } - }; - scope.move = function(direction) { - var step = datepickerCtrl.modes[mode].step; - selected.setMonth( selected.getMonth() + direction * (step.months || 0) ); - selected.setFullYear( selected.getFullYear() + direction * (step.years || 0) ); - refill(); - }; - scope.toggleMode = function() { - setMode( (mode + 1) % datepickerCtrl.modes.length ); - }; - scope.getWeekNumber = function(row) { - return ( mode === 0 && scope.showWeekNumbers && row.length === 7 ) ? getISO8601WeekNumber(row[0].date) : null; - }; - - function getISO8601WeekNumber(date) { - var checkDate = new Date(date); - checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday - var time = checkDate.getTime(); - checkDate.setMonth(0); // Compare with Jan 1 - checkDate.setDate(1); - return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; - } - } - }; -}]) - -.constant('datepickerPopupConfig', { - dateFormat: 'yyyy-MM-dd', - currentText: 'Today', - toggleWeeksText: 'Weeks', - clearText: 'Clear', - closeText: 'Done', - closeOnDateSelection: true, - appendToBody: false, - showButtonBar: true -}) - -.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'datepickerPopupConfig', 'datepickerConfig', -function ($compile, $parse, $document, $position, dateFilter, datepickerPopupConfig, datepickerConfig) { - return { - restrict: 'EA', - require: 'ngModel', - link: function(originalScope, element, attrs, ngModel) { - var scope = originalScope.$new(), // create a child scope so we are not polluting original one - dateFormat, - closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? originalScope.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, - appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? originalScope.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; - - attrs.$observe('datepickerPopup', function(value) { - dateFormat = value || datepickerPopupConfig.dateFormat; - ngModel.$render(); - }); - - scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? originalScope.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; - - originalScope.$on('$destroy', function() { - $popup.remove(); - scope.$destroy(); - }); - - attrs.$observe('currentText', function(text) { - scope.currentText = angular.isDefined(text) ? text : datepickerPopupConfig.currentText; - }); - attrs.$observe('toggleWeeksText', function(text) { - scope.toggleWeeksText = angular.isDefined(text) ? text : datepickerPopupConfig.toggleWeeksText; - }); - attrs.$observe('clearText', function(text) { - scope.clearText = angular.isDefined(text) ? text : datepickerPopupConfig.clearText; - }); - attrs.$observe('closeText', function(text) { - scope.closeText = angular.isDefined(text) ? text : datepickerPopupConfig.closeText; - }); - - var getIsOpen, setIsOpen; - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - originalScope.$watch(getIsOpen, function updateOpen(value) { - scope.isOpen = !! value; - }); - } - scope.isOpen = getIsOpen ? getIsOpen(originalScope) : false; // Initial state - - function setOpen( value ) { - if (setIsOpen) { - setIsOpen(originalScope, !!value); - } else { - scope.isOpen = !!value; - } - } - - var documentClickBind = function(event) { - if (scope.isOpen && event.target !== element[0]) { - scope.$apply(function() { - setOpen(false); - }); - } - }; - - var elementFocusBind = function() { - scope.$apply(function() { - setOpen( true ); - }); - }; - - // popup element used to display calendar - var popupEl = angular.element('
    '); - popupEl.attr({ - 'ng-model': 'date', - 'ng-change': 'dateSelection()' - }); - var datepickerEl = angular.element(popupEl.children()[0]), - datepickerOptions = {}; - if (attrs.datepickerOptions) { - datepickerOptions = originalScope.$eval(attrs.datepickerOptions); - datepickerEl.attr(angular.extend({}, datepickerOptions)); - } - - // TODO: reverse from dateFilter string to Date object - function parseDate(viewValue) { - if (!viewValue) { - ngModel.$setValidity('date', true); - return null; - } else if (angular.isDate(viewValue)) { - ngModel.$setValidity('date', true); - return viewValue; - } else if (angular.isString(viewValue)) { - var date = new Date(viewValue); - if (isNaN(date)) { - ngModel.$setValidity('date', false); - return undefined; - } else { - ngModel.$setValidity('date', true); - return date; - } - } else { - ngModel.$setValidity('date', false); - return undefined; - } - } - ngModel.$parsers.unshift(parseDate); - - // Inner change - scope.dateSelection = function(dt) { - if (angular.isDefined(dt)) { - scope.date = dt; - } - ngModel.$setViewValue(scope.date); - ngModel.$render(); - - if (closeOnDateSelection) { - setOpen( false ); - } - }; - - element.bind('input change keyup', function() { - scope.$apply(function() { - scope.date = ngModel.$modelValue; - }); - }); - - // Outter change - ngModel.$render = function() { - var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; - element.val(date); - scope.date = ngModel.$modelValue; - }; - - function addWatchableAttribute(attribute, scopeProperty, datepickerAttribute) { - if (attribute) { - originalScope.$watch($parse(attribute), function(value){ - scope[scopeProperty] = value; - }); - datepickerEl.attr(datepickerAttribute || scopeProperty, scopeProperty); - } - } - addWatchableAttribute(attrs.min, 'min'); - addWatchableAttribute(attrs.max, 'max'); - if (attrs.showWeeks) { - addWatchableAttribute(attrs.showWeeks, 'showWeeks', 'show-weeks'); - } else { - scope.showWeeks = 'show-weeks' in datepickerOptions ? datepickerOptions['show-weeks'] : datepickerConfig.showWeeks; - datepickerEl.attr('show-weeks', 'showWeeks'); - } - if (attrs.dateDisabled) { - datepickerEl.attr('date-disabled', attrs.dateDisabled); - } - - function updatePosition() { - scope.position = appendToBody ? $position.offset(element) : $position.position(element); - scope.position.top = scope.position.top + element.prop('offsetHeight'); - } - - var documentBindingInitialized = false, elementFocusInitialized = false; - scope.$watch('isOpen', function(value) { - if (value) { - updatePosition(); - $document.bind('click', documentClickBind); - if(elementFocusInitialized) { - element.unbind('focus', elementFocusBind); - } - element[0].focus(); - documentBindingInitialized = true; - } else { - if(documentBindingInitialized) { - $document.unbind('click', documentClickBind); - } - element.bind('focus', elementFocusBind); - elementFocusInitialized = true; - } - - if ( setIsOpen ) { - setIsOpen(originalScope, value); - } - }); - - scope.today = function() { - scope.dateSelection(new Date()); - }; - scope.clear = function() { - scope.dateSelection(null); - }; - - var $popup = $compile(popupEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; -}]) - -.directive('datepickerPopupWrap', function() { - return { - restrict:'EA', - replace: true, - transclude: true, - templateUrl: 'template/datepicker/popup.html', - link:function (scope, element, attrs) { - element.bind('click', function(event) { - event.preventDefault(); - event.stopPropagation(); - }); - } - }; -}); - -/* - * dropdownToggle - Provides dropdown menu functionality in place of bootstrap js - * @restrict class or attribute - * @example: - - */ - -angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) { - var openElement = null, - closeMenu = angular.noop; - return { - restrict: 'CA', - link: function(scope, element, attrs) { - scope.$watch('$location.path', function() { closeMenu(); }); - element.parent().bind('click', function() { closeMenu(); }); - element.bind('click', function (event) { - - var elementWasOpen = (element === openElement); - - event.preventDefault(); - event.stopPropagation(); - - if (!!openElement) { - closeMenu(); - } - - if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) { - element.parent().addClass('open'); - openElement = element; - closeMenu = function (event) { - if (event) { - event.preventDefault(); - event.stopPropagation(); - } - $document.unbind('click', closeMenu); - element.parent().removeClass('open'); - closeMenu = angular.noop; - openElement = null; - }; - $document.bind('click', closeMenu); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) - -/** - * A helper, internal data structure that acts as a map but also allows getting / removing - * elements in the LIFO order - */ - .factory('$$stackedMap', function () { - return { - createNew: function () { - var stack = []; - - return { - add: function (key, value) { - stack.push({ - key: key, - value: value - }); - }, - get: function (key) { - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - return stack[i]; - } - } - }, - keys: function() { - var keys = []; - for (var i = 0; i < stack.length; i++) { - keys.push(stack[i].key); - } - return keys; - }, - top: function () { - return stack[stack.length - 1]; - }, - remove: function (key) { - var idx = -1; - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - idx = i; - break; - } - } - return stack.splice(idx, 1)[0]; - }, - removeTop: function () { - return stack.splice(stack.length - 1, 1)[0]; - }, - length: function () { - return stack.length; - } - }; - } - }; - }) - -/** - * A helper directive for the $modal service. It creates a backdrop element. - */ - .directive('modalBackdrop', ['$timeout', function ($timeout) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/modal/backdrop.html', - link: function (scope) { - - scope.animate = false; - - //trigger CSS transitions - $timeout(function () { - scope.animate = true; - }); - } - }; - }]) - - .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { - return { - restrict: 'EA', - scope: { - index: '@', - animate: '=' - }, - replace: true, - transclude: true, - templateUrl: 'template/modal/window.html', - link: function (scope, element, attrs) { - scope.windowClass = attrs.windowClass || ''; - - $timeout(function () { - // trigger CSS transitions - scope.animate = true; - // focus a freshly-opened modal - element[0].focus(); - }); - - scope.close = function (evt) { - var modal = $modalStack.getTop(); - if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { - evt.preventDefault(); - evt.stopPropagation(); - $modalStack.dismiss(modal.key, 'backdrop click'); - } - }; - } - }; - }]) - - .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', - function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { - - var OPENED_MODAL_CLASS = 'modal-open'; - - var backdropDomEl, backdropScope; - var openedWindows = $$stackedMap.createNew(); - var $modalStack = {}; - - function backdropIndex() { - var topBackdropIndex = -1; - var opened = openedWindows.keys(); - for (var i = 0; i < opened.length; i++) { - if (openedWindows.get(opened[i]).value.backdrop) { - topBackdropIndex = i; - } - } - return topBackdropIndex; - } - - $rootScope.$watch(backdropIndex, function(newBackdropIndex){ - if (backdropScope) { - backdropScope.index = newBackdropIndex; - } - }); - - function removeModalWindow(modalInstance) { - - var body = $document.find('body').eq(0); - var modalWindow = openedWindows.get(modalInstance).value; - - //clean up the stack - openedWindows.remove(modalInstance); - - //remove window DOM element - removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, checkRemoveBackdrop); - body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); - } - - function checkRemoveBackdrop() { - //remove backdrop if no longer needed - if (backdropDomEl && backdropIndex() == -1) { - var backdropScopeRef = backdropScope; - removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { - backdropScopeRef.$destroy(); - backdropScopeRef = null; - }); - backdropDomEl = undefined; - backdropScope = undefined; - } - } - - function removeAfterAnimate(domEl, scope, emulateTime, done) { - // Closing animation - scope.animate = false; - - var transitionEndEventName = $transition.transitionEndEventName; - if (transitionEndEventName) { - // transition out - var timeout = $timeout(afterAnimating, emulateTime); - - domEl.bind(transitionEndEventName, function () { - $timeout.cancel(timeout); - afterAnimating(); - scope.$apply(); - }); - } else { - // Ensure this call is async - $timeout(afterAnimating, 0); - } - - function afterAnimating() { - if (afterAnimating.done) { - return; - } - afterAnimating.done = true; - - domEl.remove(); - if (done) { - done(); - } - } - } - - $document.bind('keydown', function (evt) { - var modal; - - if (evt.which === 27) { - modal = openedWindows.top(); - if (modal && modal.value.keyboard) { - $rootScope.$apply(function () { - $modalStack.dismiss(modal.key); - }); - } - } - }); - - $modalStack.open = function (modalInstance, modal) { - - openedWindows.add(modalInstance, { - deferred: modal.deferred, - modalScope: modal.scope, - backdrop: modal.backdrop, - keyboard: modal.keyboard - }); - - var body = $document.find('body').eq(0), - currBackdropIndex = backdropIndex(); - - if (currBackdropIndex >= 0 && !backdropDomEl) { - backdropScope = $rootScope.$new(true); - backdropScope.index = currBackdropIndex; - backdropDomEl = $compile('
    ')(backdropScope); - body.append(backdropDomEl); - } - - var angularDomEl = angular.element('
    '); - angularDomEl.attr('window-class', modal.windowClass); - angularDomEl.attr('index', openedWindows.length() - 1); - angularDomEl.attr('animate', 'animate'); - angularDomEl.html(modal.content); - - var modalDomEl = $compile(angularDomEl)(modal.scope); - openedWindows.top().value.modalDomEl = modalDomEl; - body.append(modalDomEl); - body.addClass(OPENED_MODAL_CLASS); - }; - - $modalStack.close = function (modalInstance, result) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.resolve(result); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismiss = function (modalInstance, reason) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.reject(reason); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismissAll = function (reason) { - var topModal = this.getTop(); - while (topModal) { - this.dismiss(topModal.key, reason); - topModal = this.getTop(); - } - }; - - $modalStack.getTop = function () { - return openedWindows.top(); - }; - - return $modalStack; - }]) - - .provider('$modal', function () { - - var $modalProvider = { - options: { - backdrop: true, //can be also false or 'static' - keyboard: true - }, - $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', - function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { - - var $modal = {}; - - function getTemplatePromise(options) { - return options.template ? $q.when(options.template) : - $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { - return result.data; - }); - } - - function getResolvePromises(resolves) { - var promisesArr = []; - angular.forEach(resolves, function (value, key) { - if (angular.isFunction(value) || angular.isArray(value)) { - promisesArr.push($q.when($injector.invoke(value))); - } - }); - return promisesArr; - } - - $modal.open = function (modalOptions) { - - var modalResultDeferred = $q.defer(); - var modalOpenedDeferred = $q.defer(); - - //prepare an instance of a modal to be injected into controllers and returned to a caller - var modalInstance = { - result: modalResultDeferred.promise, - opened: modalOpenedDeferred.promise, - close: function (result) { - $modalStack.close(modalInstance, result); - }, - dismiss: function (reason) { - $modalStack.dismiss(modalInstance, reason); - } - }; - - //merge and clean up options - modalOptions = angular.extend({}, $modalProvider.options, modalOptions); - modalOptions.resolve = modalOptions.resolve || {}; - - //verify options - if (!modalOptions.template && !modalOptions.templateUrl) { - throw new Error('One of template or templateUrl options is required.'); - } - - var templateAndResolvePromise = - $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); - - - templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { - - var modalScope = (modalOptions.scope || $rootScope).$new(); - modalScope.$close = modalInstance.close; - modalScope.$dismiss = modalInstance.dismiss; - - var ctrlInstance, ctrlLocals = {}; - var resolveIter = 1; - - //controllers - if (modalOptions.controller) { - ctrlLocals.$scope = modalScope; - ctrlLocals.$modalInstance = modalInstance; - angular.forEach(modalOptions.resolve, function (value, key) { - ctrlLocals[key] = tplAndVars[resolveIter++]; - }); - - ctrlInstance = $controller(modalOptions.controller, ctrlLocals); - } - - $modalStack.open(modalInstance, { - scope: modalScope, - deferred: modalResultDeferred, - content: tplAndVars[0], - backdrop: modalOptions.backdrop, - keyboard: modalOptions.keyboard, - windowClass: modalOptions.windowClass - }); - - }, function resolveError(reason) { - modalResultDeferred.reject(reason); - }); - - templateAndResolvePromise.then(function () { - modalOpenedDeferred.resolve(true); - }, function () { - modalOpenedDeferred.reject(false); - }); - - return modalInstance; - }; - - return $modal; - }] - }; - - return $modalProvider; - }); - -angular.module('ui.bootstrap.pagination', []) - -.controller('PaginationController', ['$scope', '$attrs', '$parse', '$interpolate', function ($scope, $attrs, $parse, $interpolate) { - var self = this, - setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; - - this.init = function(defaultItemsPerPage) { - if ($attrs.itemsPerPage) { - $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { - self.itemsPerPage = parseInt(value, 10); - $scope.totalPages = self.calculateTotalPages(); - }); - } else { - this.itemsPerPage = defaultItemsPerPage; - } - }; - - this.noPrevious = function() { - return this.page === 1; - }; - this.noNext = function() { - return this.page === $scope.totalPages; - }; - - this.isActive = function(page) { - return this.page === page; - }; - - this.calculateTotalPages = function() { - var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); - return Math.max(totalPages || 0, 1); - }; - - this.getAttributeValue = function(attribute, defaultValue, interpolate) { - return angular.isDefined(attribute) ? (interpolate ? $interpolate(attribute)($scope.$parent) : $scope.$parent.$eval(attribute)) : defaultValue; - }; - - this.render = function() { - this.page = parseInt($scope.page, 10) || 1; - if (this.page > 0 && this.page <= $scope.totalPages) { - $scope.pages = this.getPages(this.page, $scope.totalPages); - } - }; - - $scope.selectPage = function(page) { - if ( ! self.isActive(page) && page > 0 && page <= $scope.totalPages) { - $scope.page = page; - $scope.onSelectPage({ page: page }); - } - }; - - $scope.$watch('page', function() { - self.render(); - }); - - $scope.$watch('totalItems', function() { - $scope.totalPages = self.calculateTotalPages(); - }); - - $scope.$watch('totalPages', function(value) { - setNumPages($scope.$parent, value); // Readonly variable - - if ( self.page > value ) { - $scope.selectPage(value); - } else { - self.render(); - } - }); -}]) - -.constant('paginationConfig', { - itemsPerPage: 10, - boundaryLinks: false, - directionLinks: true, - firstText: 'First', - previousText: 'Previous', - nextText: 'Next', - lastText: 'Last', - rotate: true -}) - -.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pagination.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var maxSize, - boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks ), - directionLinks = paginationCtrl.getAttributeValue(attrs.directionLinks, config.directionLinks ), - firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true), - previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - lastText = paginationCtrl.getAttributeValue(attrs.lastText, config.lastText, true), - rotate = paginationCtrl.getAttributeValue(attrs.rotate, config.rotate); - - paginationCtrl.init(config.itemsPerPage); - - if (attrs.maxSize) { - scope.$parent.$watch($parse(attrs.maxSize), function(value) { - maxSize = parseInt(value, 10); - paginationCtrl.render(); - }); - } - - // Create page object used in template - function makePage(number, text, isActive, isDisabled) { - return { - number: number, - text: text, - active: isActive, - disabled: isDisabled - }; - } - - paginationCtrl.getPages = function(currentPage, totalPages) { - var pages = []; - - // Default page limits - var startPage = 1, endPage = totalPages; - var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); - - // recompute if maxSize - if ( isMaxSized ) { - if ( rotate ) { - // Current page is displayed in the middle of the visible ones - startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); - endPage = startPage + maxSize - 1; - - // Adjust if limit is exceeded - if (endPage > totalPages) { - endPage = totalPages; - startPage = endPage - maxSize + 1; - } - } else { - // Visible pages are paginated with maxSize - startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; - - // Adjust last page if limit is exceeded - endPage = Math.min(startPage + maxSize - 1, totalPages); - } - } - - // Add page number links - for (var number = startPage; number <= endPage; number++) { - var page = makePage(number, number, paginationCtrl.isActive(number), false); - pages.push(page); - } - - // Add links to move between page sets - if ( isMaxSized && ! rotate ) { - if ( startPage > 1 ) { - var previousPageSet = makePage(startPage - 1, '...', false, false); - pages.unshift(previousPageSet); - } - - if ( endPage < totalPages ) { - var nextPageSet = makePage(endPage + 1, '...', false, false); - pages.push(nextPageSet); - } - } - - // Add previous & next links - if (directionLinks) { - var previousPage = makePage(currentPage - 1, previousText, false, paginationCtrl.noPrevious()); - pages.unshift(previousPage); - - var nextPage = makePage(currentPage + 1, nextText, false, paginationCtrl.noNext()); - pages.push(nextPage); - } - - // Add first & last links - if (boundaryLinks) { - var firstPage = makePage(1, firstText, false, paginationCtrl.noPrevious()); - pages.unshift(firstPage); - - var lastPage = makePage(totalPages, lastText, false, paginationCtrl.noNext()); - pages.push(lastPage); - } - - return pages; - }; - } - }; -}]) - -.constant('pagerConfig', { - itemsPerPage: 10, - previousText: '« Previous', - nextText: 'Next »', - align: true -}) - -.directive('pager', ['pagerConfig', function(config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pager.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - align = paginationCtrl.getAttributeValue(attrs.align, config.align); - - paginationCtrl.init(config.itemsPerPage); - - // Create page object used in template - function makePage(number, text, isDisabled, isPrevious, isNext) { - return { - number: number, - text: text, - disabled: isDisabled, - previous: ( align && isPrevious ), - next: ( align && isNext ) - }; - } - - paginationCtrl.getPages = function(currentPage) { - return [ - makePage(currentPage - 1, previousText, paginationCtrl.noPrevious(), true, false), - makePage(currentPage + 1, nextText, paginationCtrl.noNext(), false, true) - ]; - }; - } - }; -}]); - -/** - * The following features are still outstanding: animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html tooltips, and selector delegation. - */ -angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) - -/** - * The $tooltip service creates tooltip- and popover-like directives as well as - * houses global options for them. - */ -.provider( '$tooltip', function () { - // The default options tooltip and popover. - var defaultOptions = { - placement: 'top', - animation: true, - popupDelay: 0 - }; - - // Default hide triggers for each show trigger - var triggerMap = { - 'mouseenter': 'mouseleave', - 'click': 'click', - 'focus': 'blur' - }; - - // The options specified to the provider globally. - var globalOptions = {}; - - /** - * `options({})` allows global configuration of all tooltips in the - * application. - * - * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { - * // place tooltips left instead of top by default - * $tooltipProvider.options( { placement: 'left' } ); - * }); - */ - this.options = function( value ) { - angular.extend( globalOptions, value ); - }; - - /** - * This allows you to extend the set of trigger mappings available. E.g.: - * - * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); - */ - this.setTriggers = function setTriggers ( triggers ) { - angular.extend( triggerMap, triggers ); - }; - - /** - * This is a helper function for translating camel-case to snake-case. - */ - function snake_case(name){ - var regexp = /[A-Z]/g; - var separator = '-'; - return name.replace(regexp, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); - } - - /** - * Returns the actual instance of the $tooltip service. - * TODO support multiple triggers - */ - this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { - return function $tooltip ( type, prefix, defaultTriggerShow ) { - var options = angular.extend( {}, defaultOptions, globalOptions ); - - /** - * Returns an object of show and hide triggers. - * - * If a trigger is supplied, - * it is used to show the tooltip; otherwise, it will use the `trigger` - * option passed to the `$tooltipProvider.options` method; else it will - * default to the trigger supplied to this directive factory. - * - * The hide trigger is based on the show trigger. If the `trigger` option - * was passed to the `$tooltipProvider.options` method, it will use the - * mapped trigger from `triggerMap` or the passed trigger if the map is - * undefined; otherwise, it uses the `triggerMap` value of the show - * trigger; else it will just use the show trigger. - */ - function getTriggers ( trigger ) { - var show = trigger || options.trigger || defaultTriggerShow; - var hide = triggerMap[show] || show; - return { - show: show, - hide: hide - }; - } - - var directiveName = snake_case( type ); - - var startSym = $interpolate.startSymbol(); - var endSym = $interpolate.endSymbol(); - var template = - '
    '+ - '
    '; - - return { - restrict: 'EA', - scope: true, - compile: function (tElem, tAttrs) { - var tooltipLinker = $compile( template ); - - return function link ( scope, element, attrs ) { - var tooltip; - var transitionTimeout; - var popupTimeout; - var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; - var triggers = getTriggers( undefined ); - var hasRegisteredTriggers = false; - var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); - - var positionTooltip = function (){ - var position, - ttWidth, - ttHeight, - ttPosition; - // Get the position of the directive element. - position = appendToBody ? $position.offset( element ) : $position.position( element ); - - // Get the height and width of the tooltip so we can center it. - ttWidth = tooltip.prop( 'offsetWidth' ); - ttHeight = tooltip.prop( 'offsetHeight' ); - - // Calculate the tooltip's top and left coordinates to center it with - // this directive. - switch ( scope.tt_placement ) { - case 'right': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left + position.width - }; - break; - case 'bottom': - ttPosition = { - top: position.top + position.height, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - case 'left': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left - ttWidth - }; - break; - default: - ttPosition = { - top: position.top - ttHeight, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - } - - ttPosition.top += 'px'; - ttPosition.left += 'px'; - - // Now set the calculated positioning. - tooltip.css( ttPosition ); - - }; - - // By default, the tooltip is not open. - // TODO add ability to start tooltip opened - scope.tt_isOpen = false; - - function toggleTooltipBind () { - if ( ! scope.tt_isOpen ) { - showTooltipBind(); - } else { - hideTooltipBind(); - } - } - - // Show the tooltip with delay if specified, otherwise show it immediately - function showTooltipBind() { - if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { - return; - } - if ( scope.tt_popupDelay ) { - popupTimeout = $timeout( show, scope.tt_popupDelay, false ); - popupTimeout.then(function(reposition){reposition();}); - } else { - show()(); - } - } - - function hideTooltipBind () { - scope.$apply(function () { - hide(); - }); - } - - // Show the tooltip popup element. - function show() { - - - // Don't show empty tooltips. - if ( ! scope.tt_content ) { - return angular.noop; - } - - createTooltip(); - - // If there is a pending remove transition, we must cancel it, lest the - // tooltip be mysteriously removed. - if ( transitionTimeout ) { - $timeout.cancel( transitionTimeout ); - } - - // Set the initial positioning. - tooltip.css({ top: 0, left: 0, display: 'block' }); - - // Now we add it to the DOM because need some info about it. But it's not - // visible yet anyway. - if ( appendToBody ) { - $document.find( 'body' ).append( tooltip ); - } else { - element.after( tooltip ); - } - - positionTooltip(); - - // And show the tooltip. - scope.tt_isOpen = true; - scope.$digest(); // digest required as $apply is not called - - // Return positioning function as promise callback for correct - // positioning after draw. - return positionTooltip; - } - - // Hide the tooltip popup element. - function hide() { - // First things first: we don't show it anymore. - scope.tt_isOpen = false; - - //if tooltip is going to be shown after delay, we must cancel this - $timeout.cancel( popupTimeout ); - - // And now we remove it from the DOM. However, if we have animation, we - // need to wait for it to expire beforehand. - // FIXME: this is a placeholder for a port of the transitions library. - if ( scope.tt_animation ) { - transitionTimeout = $timeout(removeTooltip, 500); - } else { - removeTooltip(); - } - } - - function createTooltip() { - // There can only be one tooltip element per directive shown at once. - if (tooltip) { - removeTooltip(); - } - tooltip = tooltipLinker(scope, function () {}); - - // Get contents rendered into the tooltip - scope.$digest(); - } - - function removeTooltip() { - if (tooltip) { - tooltip.remove(); - tooltip = null; - } - } - - /** - * Observe the relevant attributes. - */ - attrs.$observe( type, function ( val ) { - scope.tt_content = val; - - if (!val && scope.tt_isOpen ) { - hide(); - } - }); - - attrs.$observe( prefix+'Title', function ( val ) { - scope.tt_title = val; - }); - - attrs.$observe( prefix+'Placement', function ( val ) { - scope.tt_placement = angular.isDefined( val ) ? val : options.placement; - }); - - attrs.$observe( prefix+'PopupDelay', function ( val ) { - var delay = parseInt( val, 10 ); - scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; - }); - - var unregisterTriggers = function() { - if (hasRegisteredTriggers) { - element.unbind( triggers.show, showTooltipBind ); - element.unbind( triggers.hide, hideTooltipBind ); - } - }; - - attrs.$observe( prefix+'Trigger', function ( val ) { - unregisterTriggers(); - - triggers = getTriggers( val ); - - if ( triggers.show === triggers.hide ) { - element.bind( triggers.show, toggleTooltipBind ); - } else { - element.bind( triggers.show, showTooltipBind ); - element.bind( triggers.hide, hideTooltipBind ); - } - - hasRegisteredTriggers = true; - }); - - var animation = scope.$eval(attrs[prefix + 'Animation']); - scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; - - attrs.$observe( prefix+'AppendToBody', function ( val ) { - appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; - }); - - // if a tooltip is attached to we need to remove it on - // location change as its parent scope will probably not be destroyed - // by the change. - if ( appendToBody ) { - scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { - if ( scope.tt_isOpen ) { - hide(); - } - }); - } - - // Make sure tooltip is destroyed and removed. - scope.$on('$destroy', function onDestroyTooltip() { - $timeout.cancel( transitionTimeout ); - $timeout.cancel( popupTimeout ); - unregisterTriggers(); - removeTooltip(); - }); - }; - } - }; - }; - }]; -}) - -.directive( 'tooltipPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-popup.html' - }; -}) - -.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); -}]) - -.directive( 'tooltipHtmlUnsafePopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' - }; -}) - -.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); -}]); - -/** - * The following features are still outstanding: popup delay, animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html popovers, and selector delegatation. - */ -angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) - -.directive( 'popoverPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/popover/popover.html' - }; -}) - -.directive( 'popover', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'popover', 'popover', 'click' ); -}]); - -angular.module('ui.bootstrap.progressbar', ['ui.bootstrap.transition']) - -.constant('progressConfig', { - animate: true, - max: 100 -}) - -.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', '$transition', function($scope, $attrs, progressConfig, $transition) { - var self = this, - bars = [], - max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max, - animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; - - this.addBar = function(bar, element) { - var oldValue = 0, index = bar.$parent.$index; - if ( angular.isDefined(index) && bars[index] ) { - oldValue = bars[index].value; - } - bars.push(bar); - - this.update(element, bar.value, oldValue); - - bar.$watch('value', function(value, oldValue) { - if (value !== oldValue) { - self.update(element, value, oldValue); - } - }); - - bar.$on('$destroy', function() { - self.removeBar(bar); - }); - }; - - // Update bar element width - this.update = function(element, newValue, oldValue) { - var percent = this.getPercentage(newValue); - - if (animate) { - element.css('width', this.getPercentage(oldValue) + '%'); - $transition(element, {width: percent + '%'}); - } else { - element.css({'transition': 'none', 'width': percent + '%'}); - } - }; - - this.removeBar = function(bar) { - bars.splice(bars.indexOf(bar), 1); - }; - - this.getPercentage = function(value) { - return Math.round(100 * value / max); - }; -}]) - -.directive('progress', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - require: 'progress', - scope: {}, - template: '
    ' - //templateUrl: 'template/progressbar/progress.html' // Works in AngularJS 1.2 - }; -}) - -.directive('bar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - require: '^progress', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/bar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, element); - } - }; -}) - -.directive('progressbar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/progressbar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, angular.element(element.children()[0])); - } - }; -}); -angular.module('ui.bootstrap.rating', []) - -.constant('ratingConfig', { - max: 5, - stateOn: null, - stateOff: null -}) - -.controller('RatingController', ['$scope', '$attrs', '$parse', 'ratingConfig', function($scope, $attrs, $parse, ratingConfig) { - - this.maxRange = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max; - this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; - this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; - - this.createRateObjects = function(states) { - var defaultOptions = { - stateOn: this.stateOn, - stateOff: this.stateOff - }; - - for (var i = 0, n = states.length; i < n; i++) { - states[i] = angular.extend({ index: i }, defaultOptions, states[i]); - } - return states; - }; - - // Get objects used in template - $scope.range = angular.isDefined($attrs.ratingStates) ? this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))): this.createRateObjects(new Array(this.maxRange)); - - $scope.rate = function(value) { - if ( $scope.value !== value && !$scope.readonly ) { - $scope.value = value; - } - }; - - $scope.enter = function(value) { - if ( ! $scope.readonly ) { - $scope.val = value; - } - $scope.onHover({value: value}); - }; - - $scope.reset = function() { - $scope.val = angular.copy($scope.value); - $scope.onLeave(); - }; - - $scope.$watch('value', function(value) { - $scope.val = value; - }); - - $scope.readonly = false; - if ($attrs.readonly) { - $scope.$parent.$watch($parse($attrs.readonly), function(value) { - $scope.readonly = !!value; - }); - } -}]) - -.directive('rating', function() { - return { - restrict: 'EA', - scope: { - value: '=', - onHover: '&', - onLeave: '&' - }, - controller: 'RatingController', - templateUrl: 'template/rating/rating.html', - replace: true - }; -}); - -/** - * @ngdoc overview - * @name ui.bootstrap.tabs - * - * @description - * AngularJS version of the tabs directive. - */ - -angular.module('ui.bootstrap.tabs', []) - -.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { - var ctrl = this, - tabs = ctrl.tabs = $scope.tabs = []; - - ctrl.select = function(tab) { - angular.forEach(tabs, function(tab) { - tab.active = false; - }); - tab.active = true; - }; - - ctrl.addTab = function addTab(tab) { - tabs.push(tab); - if (tabs.length === 1 || tab.active) { - ctrl.select(tab); - } - }; - - ctrl.removeTab = function removeTab(tab) { - var index = tabs.indexOf(tab); - //Select a new tab if the tab to be removed is selected - if (tab.active && tabs.length > 1) { - //If this is the last tab, select the previous tab. else, the next tab. - var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; - ctrl.select(tabs[newActiveIndex]); - } - tabs.splice(index, 1); - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabset - * @restrict EA - * - * @description - * Tabset is the outer container for the tabs directive - * - * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. - * @param {boolean=} justified Whether or not to use justified styling for the tabs. - * - * @example - - - - First Content! - Second Content! - -
    - - First Vertical Content! - Second Vertical Content! - - - First Justified Content! - Second Justified Content! - -
    -
    - */ -.directive('tabset', function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - scope: {}, - controller: 'TabsetController', - templateUrl: 'template/tabs/tabset.html', - link: function(scope, element, attrs) { - scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; - scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; - scope.type = angular.isDefined(attrs.type) ? scope.$parent.$eval(attrs.type) : 'tabs'; - } - }; -}) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tab - * @restrict EA - * - * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. - * @param {string=} select An expression to evaluate when the tab is selected. - * @param {boolean=} active A binding, telling whether or not this tab is selected. - * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. - * - * @description - * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. - * - * @example - - -
    - - -
    - - First Tab - - Alert me! - Second Tab, with alert callback and html heading! - - - {{item.content}} - - -
    -
    - - function TabsDemoCtrl($scope) { - $scope.items = [ - { title:"Dynamic Title 1", content:"Dynamic Item 0" }, - { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } - ]; - - $scope.alertMe = function() { - setTimeout(function() { - alert("You've selected the alert tab!"); - }); - }; - }; - -
    - */ - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabHeading - * @restrict EA - * - * @description - * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. - * - * @example - - - - - HTML in my titles?! - And some content, too! - - - Icon heading?!? - That's right. - - - - - */ -.directive('tab', ['$parse', function($parse) { - return { - require: '^tabset', - restrict: 'EA', - replace: true, - templateUrl: 'template/tabs/tab.html', - transclude: true, - scope: { - heading: '@', - onSelect: '&select', //This callback is called in contentHeadingTransclude - //once it inserts the tab's content into the dom - onDeselect: '&deselect' - }, - controller: function() { - //Empty controller so other directives can require being 'under' a tab - }, - compile: function(elm, attrs, transclude) { - return function postLink(scope, elm, attrs, tabsetCtrl) { - var getActive, setActive; - if (attrs.active) { - getActive = $parse(attrs.active); - setActive = getActive.assign; - scope.$parent.$watch(getActive, function updateActive(value, oldVal) { - // Avoid re-initializing scope.active as it is already initialized - // below. (watcher is called async during init with value === - // oldVal) - if (value !== oldVal) { - scope.active = !!value; - } - }); - scope.active = getActive(scope.$parent); - } else { - setActive = getActive = angular.noop; - } - - scope.$watch('active', function(active) { - // Note this watcher also initializes and assigns scope.active to the - // attrs.active expression. - setActive(scope.$parent, active); - if (active) { - tabsetCtrl.select(scope); - scope.onSelect(); - } else { - scope.onDeselect(); - } - }); - - scope.disabled = false; - if ( attrs.disabled ) { - scope.$parent.$watch($parse(attrs.disabled), function(value) { - scope.disabled = !! value; - }); - } - - scope.select = function() { - if ( ! scope.disabled ) { - scope.active = true; - } - }; - - tabsetCtrl.addTab(scope); - scope.$on('$destroy', function() { - tabsetCtrl.removeTab(scope); - }); - - - //We need to transclude later, once the content container is ready. - //when this link happens, we're inside a tab heading. - scope.$transcludeFn = transclude; - }; - } - }; -}]) - -.directive('tabHeadingTransclude', [function() { - return { - restrict: 'A', - require: '^tab', - link: function(scope, elm, attrs, tabCtrl) { - scope.$watch('headingElement', function updateHeadingElement(heading) { - if (heading) { - elm.html(''); - elm.append(heading); - } - }); - } - }; -}]) - -.directive('tabContentTransclude', function() { - return { - restrict: 'A', - require: '^tabset', - link: function(scope, elm, attrs) { - var tab = scope.$eval(attrs.tabContentTransclude); - - //Now our tab is ready to be transcluded: both the tab heading area - //and the tab content area are loaded. Transclude 'em both. - tab.$transcludeFn(tab.$parent, function(contents) { - angular.forEach(contents, function(node) { - if (isTabHeading(node)) { - //Let tabHeadingTransclude know. - tab.headingElement = node; - } else { - elm.append(node); - } - }); - }); - } - }; - function isTabHeading(node) { - return node.tagName && ( - node.hasAttribute('tab-heading') || - node.hasAttribute('data-tab-heading') || - node.tagName.toLowerCase() === 'tab-heading' || - node.tagName.toLowerCase() === 'data-tab-heading' - ); - } -}) - -; - -angular.module('ui.bootstrap.timepicker', []) - -.constant('timepickerConfig', { - hourStep: 1, - minuteStep: 1, - showMeridian: true, - meridians: null, - readonlyInput: false, - mousewheel: true -}) - -.directive('timepicker', ['$parse', '$log', 'timepickerConfig', '$locale', function ($parse, $log, timepickerConfig, $locale) { - return { - restrict: 'EA', - require:'?^ngModel', - replace: true, - scope: {}, - templateUrl: 'template/timepicker/timepicker.html', - link: function(scope, element, attrs, ngModel) { - if ( !ngModel ) { - return; // do nothing if no ng-model - } - - var selected = new Date(), - meridians = angular.isDefined(attrs.meridians) ? scope.$parent.$eval(attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; - - var hourStep = timepickerConfig.hourStep; - if (attrs.hourStep) { - scope.$parent.$watch($parse(attrs.hourStep), function(value) { - hourStep = parseInt(value, 10); - }); - } - - var minuteStep = timepickerConfig.minuteStep; - if (attrs.minuteStep) { - scope.$parent.$watch($parse(attrs.minuteStep), function(value) { - minuteStep = parseInt(value, 10); - }); - } - - // 12H / 24H mode - scope.showMeridian = timepickerConfig.showMeridian; - if (attrs.showMeridian) { - scope.$parent.$watch($parse(attrs.showMeridian), function(value) { - scope.showMeridian = !!value; - - if ( ngModel.$error.time ) { - // Evaluate from template - var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); - if (angular.isDefined( hours ) && angular.isDefined( minutes )) { - selected.setHours( hours ); - refresh(); - } - } else { - updateTemplate(); - } - }); - } - - // Get scope.hours in 24H mode if valid - function getHoursFromTemplate ( ) { - var hours = parseInt( scope.hours, 10 ); - var valid = ( scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); - if ( !valid ) { - return undefined; - } - - if ( scope.showMeridian ) { - if ( hours === 12 ) { - hours = 0; - } - if ( scope.meridian === meridians[1] ) { - hours = hours + 12; - } - } - return hours; - } - - function getMinutesFromTemplate() { - var minutes = parseInt(scope.minutes, 10); - return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; - } - - function pad( value ) { - return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; - } - - // Input elements - var inputs = element.find('input'), hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1); - - // Respond on mousewheel spin - var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel; - if ( mousewheel ) { - - var isScrollingUp = function(e) { - if (e.originalEvent) { - e = e.originalEvent; - } - //pick correct delta variable depending on event - var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; - return (e.detail || delta > 0); - }; - - hoursInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() ); - e.preventDefault(); - }); - - minutesInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() ); - e.preventDefault(); - }); - } - - scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : timepickerConfig.readonlyInput; - if ( ! scope.readonlyInput ) { - - var invalidate = function(invalidHours, invalidMinutes) { - ngModel.$setViewValue( null ); - ngModel.$setValidity('time', false); - if (angular.isDefined(invalidHours)) { - scope.invalidHours = invalidHours; - } - if (angular.isDefined(invalidMinutes)) { - scope.invalidMinutes = invalidMinutes; - } - }; - - scope.updateHours = function() { - var hours = getHoursFromTemplate(); - - if ( angular.isDefined(hours) ) { - selected.setHours( hours ); - refresh( 'h' ); - } else { - invalidate(true); - } - }; - - hoursInputEl.bind('blur', function(e) { - if ( !scope.validHours && scope.hours < 10) { - scope.$apply( function() { - scope.hours = pad( scope.hours ); - }); - } - }); - - scope.updateMinutes = function() { - var minutes = getMinutesFromTemplate(); - - if ( angular.isDefined(minutes) ) { - selected.setMinutes( minutes ); - refresh( 'm' ); - } else { - invalidate(undefined, true); - } - }; - - minutesInputEl.bind('blur', function(e) { - if ( !scope.invalidMinutes && scope.minutes < 10 ) { - scope.$apply( function() { - scope.minutes = pad( scope.minutes ); - }); - } - }); - } else { - scope.updateHours = angular.noop; - scope.updateMinutes = angular.noop; - } - - ngModel.$render = function() { - var date = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : null; - - if ( isNaN(date) ) { - ngModel.$setValidity('time', false); - $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else { - if ( date ) { - selected = date; - } - makeValid(); - updateTemplate(); - } - }; - - // Call internally when we know that model is valid. - function refresh( keyboardChange ) { - makeValid(); - ngModel.$setViewValue( new Date(selected) ); - updateTemplate( keyboardChange ); - } - - function makeValid() { - ngModel.$setValidity('time', true); - scope.invalidHours = false; - scope.invalidMinutes = false; - } - - function updateTemplate( keyboardChange ) { - var hours = selected.getHours(), minutes = selected.getMinutes(); - - if ( scope.showMeridian ) { - hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system - } - scope.hours = keyboardChange === 'h' ? hours : pad(hours); - scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); - scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; - } - - function addMinutes( minutes ) { - var dt = new Date( selected.getTime() + minutes * 60000 ); - selected.setHours( dt.getHours(), dt.getMinutes() ); - refresh(); - } - - scope.incrementHours = function() { - addMinutes( hourStep * 60 ); - }; - scope.decrementHours = function() { - addMinutes( - hourStep * 60 ); - }; - scope.incrementMinutes = function() { - addMinutes( minuteStep ); - }; - scope.decrementMinutes = function() { - addMinutes( - minuteStep ); - }; - scope.toggleMeridian = function() { - addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); - }; - } - }; -}]); - -angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) - -/** - * A helper service that can parse typeahead's syntax (string provided by users) - * Extracted to a separate service for ease of unit testing - */ - .factory('typeaheadParser', ['$parse', function ($parse) { - - // 00000111000000000000022200000000000000003333333333333330000000000044000 - var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; - - return { - parse:function (input) { - - var match = input.match(TYPEAHEAD_REGEXP), modelMapper, viewMapper, source; - if (!match) { - throw new Error( - "Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_'" + - " but got '" + input + "'."); - } - - return { - itemName:match[3], - source:$parse(match[4]), - viewMapper:$parse(match[2] || match[1]), - modelMapper:$parse(match[1]) - }; - } - }; -}]) - - .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', - function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { - - var HOT_KEYS = [9, 13, 27, 38, 40]; - - return { - require:'ngModel', - link:function (originalScope, element, attrs, modelCtrl) { - - //SUPPORTED ATTRIBUTES (OPTIONS) - - //minimal no of characters that needs to be entered before typeahead kicks-in - var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; - - //minimal wait time after last character typed before typehead kicks-in - var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; - - //should it restrict model values to the ones selected from the popup only? - var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; - - //binding to a variable that indicates if matches are being retrieved asynchronously - var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; - - //a callback executed when a match is selected - var onSelectCallback = $parse(attrs.typeaheadOnSelect); - - var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; - - var appendToBody = attrs.typeaheadAppendToBody ? $parse(attrs.typeaheadAppendToBody) : false; - - //INTERNAL VARIABLES - - //model setter executed upon match selection - var $setModelValue = $parse(attrs.ngModel).assign; - - //expressions used by typeahead - var parserResult = typeaheadParser.parse(attrs.typeahead); - - var hasFocus; - - //pop-up element used to display matches - var popUpEl = angular.element('
    '); - popUpEl.attr({ - matches: 'matches', - active: 'activeIdx', - select: 'select(activeIdx)', - query: 'query', - position: 'position' - }); - //custom item template - if (angular.isDefined(attrs.typeaheadTemplateUrl)) { - popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); - } - - //create a child scope for the typeahead directive so we are not polluting original scope - //with typeahead-specific data (matches, query etc.) - var scope = originalScope.$new(); - originalScope.$on('$destroy', function(){ - scope.$destroy(); - }); - - var resetMatches = function() { - scope.matches = []; - scope.activeIdx = -1; - }; - - var getMatchesAsync = function(inputValue) { - - var locals = {$viewValue: inputValue}; - isLoadingSetter(originalScope, true); - $q.when(parserResult.source(originalScope, locals)).then(function(matches) { - - //it might happen that several async queries were in progress if a user were typing fast - //but we are interested only in responses that correspond to the current view value - if (inputValue === modelCtrl.$viewValue && hasFocus) { - if (matches.length > 0) { - - scope.activeIdx = 0; - scope.matches.length = 0; - - //transform labels - for(var i=0; i= minSearch) { - if (waitTime > 0) { - if (timeoutPromise) { - $timeout.cancel(timeoutPromise);//cancel previous timeout - } - timeoutPromise = $timeout(function () { - getMatchesAsync(inputValue); - }, waitTime); - } else { - getMatchesAsync(inputValue); - } - } else { - isLoadingSetter(originalScope, false); - resetMatches(); - } - - if (isEditable) { - return inputValue; - } else { - if (!inputValue) { - // Reset in case user had typed something previously. - modelCtrl.$setValidity('editable', true); - return inputValue; - } else { - modelCtrl.$setValidity('editable', false); - return undefined; - } - } - }); - - modelCtrl.$formatters.push(function (modelValue) { - - var candidateViewValue, emptyViewValue; - var locals = {}; - - if (inputFormatter) { - - locals['$model'] = modelValue; - return inputFormatter(originalScope, locals); - - } else { - - //it might happen that we don't have enough info to properly render input value - //we need to check for this situation and simply return model value if we can't apply custom formatting - locals[parserResult.itemName] = modelValue; - candidateViewValue = parserResult.viewMapper(originalScope, locals); - locals[parserResult.itemName] = undefined; - emptyViewValue = parserResult.viewMapper(originalScope, locals); - - return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; - } - }); - - scope.select = function (activeIdx) { - //called from within the $digest() cycle - var locals = {}; - var model, item; - - locals[parserResult.itemName] = item = scope.matches[activeIdx].model; - model = parserResult.modelMapper(originalScope, locals); - $setModelValue(originalScope, model); - modelCtrl.$setValidity('editable', true); - - onSelectCallback(originalScope, { - $item: item, - $model: model, - $label: parserResult.viewMapper(originalScope, locals) - }); - - resetMatches(); - - //return focus to the input element if a mach was selected via a mouse click event - element[0].focus(); - }; - - //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) - element.bind('keydown', function (evt) { - - //typeahead is open and an "interesting" key was pressed - if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { - return; - } - - evt.preventDefault(); - - if (evt.which === 40) { - scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; - scope.$digest(); - - } else if (evt.which === 38) { - scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; - scope.$digest(); - - } else if (evt.which === 13 || evt.which === 9) { - scope.$apply(function () { - scope.select(scope.activeIdx); - }); - - } else if (evt.which === 27) { - evt.stopPropagation(); - - resetMatches(); - scope.$digest(); - } - }); - - element.bind('blur', function (evt) { - hasFocus = false; - }); - - // Keep reference to click handler to unbind it. - var dismissClickHandler = function (evt) { - if (element[0] !== evt.target) { - resetMatches(); - scope.$digest(); - } - }; - - $document.bind('click', dismissClickHandler); - - originalScope.$on('$destroy', function(){ - $document.unbind('click', dismissClickHandler); - }); - - var $popup = $compile(popUpEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; - -}]) - - .directive('typeaheadPopup', function () { - return { - restrict:'EA', - scope:{ - matches:'=', - query:'=', - active:'=', - position:'=', - select:'&' - }, - replace:true, - templateUrl:'template/typeahead/typeahead-popup.html', - link:function (scope, element, attrs) { - - scope.templateUrl = attrs.templateUrl; - - scope.isOpen = function () { - return scope.matches.length > 0; - }; - - scope.isActive = function (matchIdx) { - return scope.active == matchIdx; - }; - - scope.selectActive = function (matchIdx) { - scope.active = matchIdx; - }; - - scope.selectMatch = function (activeIdx) { - scope.select({activeIdx:activeIdx}); - }; - } - }; - }) - - .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { - return { - restrict:'EA', - scope:{ - index:'=', - match:'=', - query:'=' - }, - link:function (scope, element, attrs) { - var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; - $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ - element.replaceWith($compile(tplContent.trim())(scope)); - }); - } - }; - }]) - - .filter('typeaheadHighlight', function() { - - function escapeRegexp(queryToEscape) { - return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - } - - return function(matchItem, query) { - return query ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; - }; - }); -// Source: public/lib/angular-bootstrap/ui-bootstrap-tpls.js -/* - * angular-ui-bootstrap - * http://angular-ui.github.io/bootstrap/ - - * Version: 0.10.0 - 2014-01-13 - * License: MIT - */ -angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); -angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); -angular.module('ui.bootstrap.transition', []) - -/** - * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. - * @param {DOMElement} element The DOMElement that will be animated. - * @param {string|object|function} trigger The thing that will cause the transition to start: - * - As a string, it represents the css class to be added to the element. - * - As an object, it represents a hash of style attributes to be applied to the element. - * - As a function, it represents a function to be called that will cause the transition to occur. - * @return {Promise} A promise that is resolved when the transition finishes. - */ -.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { - - var $transition = function(element, trigger, options) { - options = options || {}; - var deferred = $q.defer(); - var endEventName = $transition[options.animation ? "animationEndEventName" : "transitionEndEventName"]; - - var transitionEndHandler = function(event) { - $rootScope.$apply(function() { - element.unbind(endEventName, transitionEndHandler); - deferred.resolve(element); - }); - }; - - if (endEventName) { - element.bind(endEventName, transitionEndHandler); - } - - // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur - $timeout(function() { - if ( angular.isString(trigger) ) { - element.addClass(trigger); - } else if ( angular.isFunction(trigger) ) { - trigger(element); - } else if ( angular.isObject(trigger) ) { - element.css(trigger); - } - //If browser does not support transitions, instantly resolve - if ( !endEventName ) { - deferred.resolve(element); - } - }); - - // Add our custom cancel function to the promise that is returned - // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, - // i.e. it will therefore never raise a transitionEnd event for that transition - deferred.promise.cancel = function() { - if ( endEventName ) { - element.unbind(endEventName, transitionEndHandler); - } - deferred.reject('Transition cancelled'); - }; - - return deferred.promise; - }; - - // Work out the name of the transitionEnd event - var transElement = document.createElement('trans'); - var transitionEndEventNames = { - 'WebkitTransition': 'webkitTransitionEnd', - 'MozTransition': 'transitionend', - 'OTransition': 'oTransitionEnd', - 'transition': 'transitionend' - }; - var animationEndEventNames = { - 'WebkitTransition': 'webkitAnimationEnd', - 'MozTransition': 'animationend', - 'OTransition': 'oAnimationEnd', - 'transition': 'animationend' - }; - function findEndEventName(endEventNames) { - for (var name in endEventNames){ - if (transElement.style[name] !== undefined) { - return endEventNames[name]; - } - } - } - $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); - $transition.animationEndEventName = findEndEventName(animationEndEventNames); - return $transition; -}]); - -angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) - - .directive('collapse', ['$transition', function ($transition, $timeout) { - - return { - link: function (scope, element, attrs) { - - var initialAnimSkip = true; - var currentTransition; - - function doTransition(change) { - var newTransition = $transition(element, change); - if (currentTransition) { - currentTransition.cancel(); - } - currentTransition = newTransition; - newTransition.then(newTransitionDone, newTransitionDone); - return newTransition; - - function newTransitionDone() { - // Make sure it's this transition, otherwise, leave it alone. - if (currentTransition === newTransition) { - currentTransition = undefined; - } - } - } - - function expand() { - if (initialAnimSkip) { - initialAnimSkip = false; - expandDone(); - } else { - element.removeClass('collapse').addClass('collapsing'); - doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); - } - } - - function expandDone() { - element.removeClass('collapsing'); - element.addClass('collapse in'); - element.css({height: 'auto'}); - } - - function collapse() { - if (initialAnimSkip) { - initialAnimSkip = false; - collapseDone(); - element.css({height: 0}); - } else { - // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value - element.css({ height: element[0].scrollHeight + 'px' }); - //trigger reflow so a browser realizes that height was updated from auto to a specific value - var x = element[0].offsetWidth; - - element.removeClass('collapse in').addClass('collapsing'); - - doTransition({ height: 0 }).then(collapseDone); - } - } - - function collapseDone() { - element.removeClass('collapsing'); - element.addClass('collapse'); - } - - scope.$watch(attrs.collapse, function (shouldCollapse) { - if (shouldCollapse) { - collapse(); - } else { - expand(); - } - }); - } - }; - }]); - -angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) - -.constant('accordionConfig', { - closeOthers: true -}) - -.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { - - // This array keeps track of the accordion groups - this.groups = []; - - // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to - this.closeOthers = function(openGroup) { - var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; - if ( closeOthers ) { - angular.forEach(this.groups, function (group) { - if ( group !== openGroup ) { - group.isOpen = false; - } - }); - } - }; - - // This is called from the accordion-group directive to add itself to the accordion - this.addGroup = function(groupScope) { - var that = this; - this.groups.push(groupScope); - - groupScope.$on('$destroy', function (event) { - that.removeGroup(groupScope); - }); - }; - - // This is called from the accordion-group directive when to remove itself - this.removeGroup = function(group) { - var index = this.groups.indexOf(group); - if ( index !== -1 ) { - this.groups.splice(this.groups.indexOf(group), 1); - } - }; - -}]) - -// The accordion directive simply sets up the directive controller -// and adds an accordion CSS class to itself element. -.directive('accordion', function () { - return { - restrict:'EA', - controller:'AccordionController', - transclude: true, - replace: false, - templateUrl: 'template/accordion/accordion.html' - }; -}) - -// The accordion-group directive indicates a block of html that will expand and collapse in an accordion -.directive('accordionGroup', ['$parse', function($parse) { - return { - require:'^accordion', // We need this directive to be inside an accordion - restrict:'EA', - transclude:true, // It transcludes the contents of the directive into the template - replace: true, // The element containing the directive will be replaced with the template - templateUrl:'template/accordion/accordion-group.html', - scope:{ heading:'@' }, // Create an isolated scope and interpolate the heading attribute onto this scope - controller: function() { - this.setHeading = function(element) { - this.heading = element; - }; - }, - link: function(scope, element, attrs, accordionCtrl) { - var getIsOpen, setIsOpen; - - accordionCtrl.addGroup(scope); - - scope.isOpen = false; - - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - scope.$parent.$watch(getIsOpen, function(value) { - scope.isOpen = !!value; - }); - } - - scope.$watch('isOpen', function(value) { - if ( value ) { - accordionCtrl.closeOthers(scope); - } - if ( setIsOpen ) { - setIsOpen(scope.$parent, value); - } - }); - } - }; -}]) - -// Use accordion-heading below an accordion-group to provide a heading containing HTML -// -// Heading containing HTML - -// -.directive('accordionHeading', function() { - return { - restrict: 'EA', - transclude: true, // Grab the contents to be used as the heading - template: '', // In effect remove this element! - replace: true, - require: '^accordionGroup', - compile: function(element, attr, transclude) { - return function link(scope, element, attr, accordionGroupCtrl) { - // Pass the heading to the accordion-group controller - // so that it can be transcluded into the right place in the template - // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] - accordionGroupCtrl.setHeading(transclude(scope, function() {})); - }; - } - }; -}) - -// Use in the accordion-group template to indicate where you want the heading to be transcluded -// You must provide the property on the accordion-group controller that will hold the transcluded element -//
    -// -// ... -//
    -.directive('accordionTransclude', function() { - return { - require: '^accordionGroup', - link: function(scope, element, attr, controller) { - scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { - if ( heading ) { - element.html(''); - element.append(heading); - } - }); - } - }; -}); - -angular.module("ui.bootstrap.alert", []) - -.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { - $scope.closeable = 'close' in $attrs; -}]) - -.directive('alert', function () { - return { - restrict:'EA', - controller:'AlertController', - templateUrl:'template/alert/alert.html', - transclude:true, - replace:true, - scope: { - type: '=', - close: '&' - } - }; -}); - -angular.module('ui.bootstrap.bindHtml', []) - - .directive('bindHtmlUnsafe', function () { - return function (scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); - scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { - element.html(value || ''); - }); - }; - }); -angular.module('ui.bootstrap.buttons', []) - -.constant('buttonConfig', { - activeClass: 'active', - toggleEvent: 'click' -}) - -.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { - this.activeClass = buttonConfig.activeClass || 'active'; - this.toggleEvent = buttonConfig.toggleEvent || 'click'; -}]) - -.directive('btnRadio', function () { - return { - require: ['btnRadio', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - if (!element.hasClass(buttonsCtrl.activeClass)) { - scope.$apply(function () { - ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)); - ngModelCtrl.$render(); - }); - } - }); - } - }; -}) - -.directive('btnCheckbox', function () { - return { - require: ['btnCheckbox', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - function getTrueValue() { - return getCheckboxValue(attrs.btnCheckboxTrue, true); - } - - function getFalseValue() { - return getCheckboxValue(attrs.btnCheckboxFalse, false); - } - - function getCheckboxValue(attributeValue, defaultValue) { - var val = scope.$eval(attributeValue); - return angular.isDefined(val) ? val : defaultValue; - } - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - scope.$apply(function () { - ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); - ngModelCtrl.$render(); - }); - }); - } - }; -}); - -/** -* @ngdoc overview -* @name ui.bootstrap.carousel -* -* @description -* AngularJS version of an image carousel. -* -*/ -angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) -.controller('CarouselController', ['$scope', '$timeout', '$transition', '$q', function ($scope, $timeout, $transition, $q) { - var self = this, - slides = self.slides = [], - currentIndex = -1, - currentTimeout, isPlaying; - self.currentSlide = null; - - var destroyed = false; - /* direction: "prev" or "next" */ - self.select = function(nextSlide, direction) { - var nextIndex = slides.indexOf(nextSlide); - //Decide direction if it's not given - if (direction === undefined) { - direction = nextIndex > currentIndex ? "next" : "prev"; - } - if (nextSlide && nextSlide !== self.currentSlide) { - if ($scope.$currentTransition) { - $scope.$currentTransition.cancel(); - //Timeout so ng-class in template has time to fix classes for finished slide - $timeout(goNext); - } else { - goNext(); - } - } - function goNext() { - // Scope has been destroyed, stop here. - if (destroyed) { return; } - //If we have a slide to transition from and we have a transition type and we're allowed, go - if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { - //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime - nextSlide.$element.addClass(direction); - var reflow = nextSlide.$element[0].offsetWidth; //force reflow - - //Set all other slides to stop doing their stuff for the new transition - angular.forEach(slides, function(slide) { - angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); - }); - angular.extend(nextSlide, {direction: direction, active: true, entering: true}); - angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); - - $scope.$currentTransition = $transition(nextSlide.$element, {}); - //We have to create new pointers inside a closure since next & current will change - (function(next,current) { - $scope.$currentTransition.then( - function(){ transitionDone(next, current); }, - function(){ transitionDone(next, current); } - ); - }(nextSlide, self.currentSlide)); - } else { - transitionDone(nextSlide, self.currentSlide); - } - self.currentSlide = nextSlide; - currentIndex = nextIndex; - //every time you change slides, reset the timer - restartTimer(); - } - function transitionDone(next, current) { - angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); - angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); - $scope.$currentTransition = null; - } - }; - $scope.$on('$destroy', function () { - destroyed = true; - }); - - /* Allow outside people to call indexOf on slides array */ - self.indexOfSlide = function(slide) { - return slides.indexOf(slide); - }; - - $scope.next = function() { - var newIndex = (currentIndex + 1) % slides.length; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'next'); - } - }; - - $scope.prev = function() { - var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'prev'); - } - }; - - $scope.select = function(slide) { - self.select(slide); - }; - - $scope.isActive = function(slide) { - return self.currentSlide === slide; - }; - - $scope.slides = function() { - return slides; - }; - - $scope.$watch('interval', restartTimer); - $scope.$on('$destroy', resetTimer); - - function restartTimer() { - resetTimer(); - var interval = +$scope.interval; - if (!isNaN(interval) && interval>=0) { - currentTimeout = $timeout(timerFn, interval); - } - } - - function resetTimer() { - if (currentTimeout) { - $timeout.cancel(currentTimeout); - currentTimeout = null; - } - } - - function timerFn() { - if (isPlaying) { - $scope.next(); - restartTimer(); - } else { - $scope.pause(); - } - } - - $scope.play = function() { - if (!isPlaying) { - isPlaying = true; - restartTimer(); - } - }; - $scope.pause = function() { - if (!$scope.noPause) { - isPlaying = false; - resetTimer(); - } - }; - - self.addSlide = function(slide, element) { - slide.$element = element; - slides.push(slide); - //if this is the first slide or the slide is set to active, select it - if(slides.length === 1 || slide.active) { - self.select(slides[slides.length-1]); - if (slides.length == 1) { - $scope.play(); - } - } else { - slide.active = false; - } - }; - - self.removeSlide = function(slide) { - //get the index of the slide inside the carousel - var index = slides.indexOf(slide); - slides.splice(index, 1); - if (slides.length > 0 && slide.active) { - if (index >= slides.length) { - self.select(slides[index-1]); - } else { - self.select(slides[index]); - } - } else if (currentIndex > index) { - currentIndex--; - } - }; - -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:carousel - * @restrict EA - * - * @description - * Carousel is the outer container for a set of image 'slides' to showcase. - * - * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. - * @param {boolean=} noTransition Whether to disable transitions on the carousel. - * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). - * - * @example - - - - - - - - - - - - - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - - - */ -.directive('carousel', [function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - controller: 'CarouselController', - require: 'carousel', - templateUrl: 'template/carousel/carousel.html', - scope: { - interval: '=', - noTransition: '=', - noPause: '=' - } - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:slide - * @restrict EA - * - * @description - * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. - * - * @param {boolean=} active Model binding, whether or not this slide is currently active. - * - * @example - - -
    - - - - - - -
    -
    -
      -
    • - - {{$index}}: {{slide.text}} -
    • -
    - Add Slide -
    -
    - Interval, in milliseconds: -
    Enter a negative number to stop the interval. -
    -
    -
    -
    - -function CarouselDemoCtrl($scope) { - $scope.myInterval = 5000; - var slides = $scope.slides = []; - $scope.addSlide = function() { - var newWidth = 200 + ((slides.length + (25 * slides.length)) % 150); - slides.push({ - image: 'http://placekitten.com/' + newWidth + '/200', - text: ['More','Extra','Lots of','Surplus'][slides.length % 4] + ' ' - ['Cats', 'Kittys', 'Felines', 'Cutes'][slides.length % 4] - }); - }; - for (var i=0; i<4; i++) $scope.addSlide(); -} - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - -
    -*/ - -.directive('slide', ['$parse', function($parse) { - return { - require: '^carousel', - restrict: 'EA', - transclude: true, - replace: true, - templateUrl: 'template/carousel/slide.html', - scope: { - }, - link: function (scope, element, attrs, carouselCtrl) { - //Set up optional 'active' = binding - if (attrs.active) { - var getActive = $parse(attrs.active); - var setActive = getActive.assign; - var lastValue = scope.active = getActive(scope.$parent); - scope.$watch(function parentActiveWatch() { - var parentActive = getActive(scope.$parent); - - if (parentActive !== scope.active) { - // we are out of sync and need to copy - if (parentActive !== lastValue) { - // parent changed and it has precedence - lastValue = scope.active = parentActive; - } else { - // if the parent can be assigned then do so - setActive(scope.$parent, parentActive = lastValue = scope.active); - } - } - return parentActive; - }); - } - - carouselCtrl.addSlide(scope, element); - //when the scope is destroyed then remove the slide from the current slides array - scope.$on('$destroy', function() { - carouselCtrl.removeSlide(scope); - }); - - scope.$watch('active', function(active) { - if (active) { - carouselCtrl.select(scope); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.position', []) - -/** - * A set of utility methods that can be use to retrieve position of DOM elements. - * It is meant to be used where we need to absolute-position DOM elements in - * relation to other, existing elements (this is the case for tooltips, popovers, - * typeahead suggestions etc.). - */ - .factory('$position', ['$document', '$window', function ($document, $window) { - - function getStyle(el, cssprop) { - if (el.currentStyle) { //IE - return el.currentStyle[cssprop]; - } else if ($window.getComputedStyle) { - return $window.getComputedStyle(el)[cssprop]; - } - // finally try and get inline style - return el.style[cssprop]; - } - - /** - * Checks if a given element is statically positioned - * @param element - raw DOM element - */ - function isStaticPositioned(element) { - return (getStyle(element, "position") || 'static' ) === 'static'; - } - - /** - * returns the closest, non-statically positioned parentOffset of a given element - * @param element - */ - var parentOffsetEl = function (element) { - var docDomEl = $document[0]; - var offsetParent = element.offsetParent || docDomEl; - while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || docDomEl; - }; - - return { - /** - * Provides read-only equivalent of jQuery's position function: - * http://api.jquery.com/position/ - */ - position: function (element) { - var elBCR = this.offset(element); - var offsetParentBCR = { top: 0, left: 0 }; - var offsetParentEl = parentOffsetEl(element[0]); - if (offsetParentEl != $document[0]) { - offsetParentBCR = this.offset(angular.element(offsetParentEl)); - offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; - offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; - } - - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: elBCR.top - offsetParentBCR.top, - left: elBCR.left - offsetParentBCR.left - }; - }, - - /** - * Provides read-only equivalent of jQuery's offset function: - * http://api.jquery.com/offset/ - */ - offset: function (element) { - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop), - left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft) - }; - } - }; - }]); - -angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.position']) - -.constant('datepickerConfig', { - dayFormat: 'dd', - monthFormat: 'MMMM', - yearFormat: 'yyyy', - dayHeaderFormat: 'EEE', - dayTitleFormat: 'MMMM yyyy', - monthTitleFormat: 'yyyy', - showWeeks: true, - startingDay: 0, - yearRange: 20, - minDate: null, - maxDate: null -}) - -.controller('DatepickerController', ['$scope', '$attrs', 'dateFilter', 'datepickerConfig', function($scope, $attrs, dateFilter, dtConfig) { - var format = { - day: getValue($attrs.dayFormat, dtConfig.dayFormat), - month: getValue($attrs.monthFormat, dtConfig.monthFormat), - year: getValue($attrs.yearFormat, dtConfig.yearFormat), - dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat), - dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat), - monthTitle: getValue($attrs.monthTitleFormat, dtConfig.monthTitleFormat) - }, - startingDay = getValue($attrs.startingDay, dtConfig.startingDay), - yearRange = getValue($attrs.yearRange, dtConfig.yearRange); - - this.minDate = dtConfig.minDate ? new Date(dtConfig.minDate) : null; - this.maxDate = dtConfig.maxDate ? new Date(dtConfig.maxDate) : null; - - function getValue(value, defaultValue) { - return angular.isDefined(value) ? $scope.$parent.$eval(value) : defaultValue; - } - - function getDaysInMonth( year, month ) { - return new Date(year, month, 0).getDate(); - } - - function getDates(startDate, n) { - var dates = new Array(n); - var current = startDate, i = 0; - while (i < n) { - dates[i++] = new Date(current); - current.setDate( current.getDate() + 1 ); - } - return dates; - } - - function makeDate(date, format, isSelected, isSecondary) { - return { date: date, label: dateFilter(date, format), selected: !!isSelected, secondary: !!isSecondary }; - } - - this.modes = [ - { - name: 'day', - getVisibleDates: function(date, selected) { - var year = date.getFullYear(), month = date.getMonth(), firstDayOfMonth = new Date(year, month, 1); - var difference = startingDay - firstDayOfMonth.getDay(), - numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, - firstDate = new Date(firstDayOfMonth), numDates = 0; - - if ( numDisplayedFromPreviousMonth > 0 ) { - firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); - numDates += numDisplayedFromPreviousMonth; // Previous - } - numDates += getDaysInMonth(year, month + 1); // Current - numDates += (7 - numDates % 7) % 7; // Next - - var days = getDates(firstDate, numDates), labels = new Array(7); - for (var i = 0; i < numDates; i ++) { - var dt = new Date(days[i]); - days[i] = makeDate(dt, format.day, (selected && selected.getDate() === dt.getDate() && selected.getMonth() === dt.getMonth() && selected.getFullYear() === dt.getFullYear()), dt.getMonth() !== month); - } - for (var j = 0; j < 7; j++) { - labels[j] = dateFilter(days[j].date, format.dayHeader); - } - return { objects: days, title: dateFilter(date, format.dayTitle), labels: labels }; - }, - compare: function(date1, date2) { - return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); - }, - split: 7, - step: { months: 1 } - }, - { - name: 'month', - getVisibleDates: function(date, selected) { - var months = new Array(12), year = date.getFullYear(); - for ( var i = 0; i < 12; i++ ) { - var dt = new Date(year, i, 1); - months[i] = makeDate(dt, format.month, (selected && selected.getMonth() === i && selected.getFullYear() === year)); - } - return { objects: months, title: dateFilter(date, format.monthTitle) }; - }, - compare: function(date1, date2) { - return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); - }, - split: 3, - step: { years: 1 } - }, - { - name: 'year', - getVisibleDates: function(date, selected) { - var years = new Array(yearRange), year = date.getFullYear(), startYear = parseInt((year - 1) / yearRange, 10) * yearRange + 1; - for ( var i = 0; i < yearRange; i++ ) { - var dt = new Date(startYear + i, 0, 1); - years[i] = makeDate(dt, format.year, (selected && selected.getFullYear() === dt.getFullYear())); - } - return { objects: years, title: [years[0].label, years[yearRange - 1].label].join(' - ') }; - }, - compare: function(date1, date2) { - return date1.getFullYear() - date2.getFullYear(); - }, - split: 5, - step: { years: yearRange } - } - ]; - - this.isDisabled = function(date, mode) { - var currentMode = this.modes[mode || 0]; - return ((this.minDate && currentMode.compare(date, this.minDate) < 0) || (this.maxDate && currentMode.compare(date, this.maxDate) > 0) || ($scope.dateDisabled && $scope.dateDisabled({date: date, mode: currentMode.name}))); - }; -}]) - -.directive( 'datepicker', ['dateFilter', '$parse', 'datepickerConfig', '$log', function (dateFilter, $parse, datepickerConfig, $log) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/datepicker/datepicker.html', - scope: { - dateDisabled: '&' - }, - require: ['datepicker', '?^ngModel'], - controller: 'DatepickerController', - link: function(scope, element, attrs, ctrls) { - var datepickerCtrl = ctrls[0], ngModel = ctrls[1]; - - if (!ngModel) { - return; // do nothing if no ng-model - } - - // Configuration parameters - var mode = 0, selected = new Date(), showWeeks = datepickerConfig.showWeeks; - - if (attrs.showWeeks) { - scope.$parent.$watch($parse(attrs.showWeeks), function(value) { - showWeeks = !! value; - updateShowWeekNumbers(); - }); - } else { - updateShowWeekNumbers(); - } - - if (attrs.min) { - scope.$parent.$watch($parse(attrs.min), function(value) { - datepickerCtrl.minDate = value ? new Date(value) : null; - refill(); - }); - } - if (attrs.max) { - scope.$parent.$watch($parse(attrs.max), function(value) { - datepickerCtrl.maxDate = value ? new Date(value) : null; - refill(); - }); - } - - function updateShowWeekNumbers() { - scope.showWeekNumbers = mode === 0 && showWeeks; - } - - // Split array into smaller arrays - function split(arr, size) { - var arrays = []; - while (arr.length > 0) { - arrays.push(arr.splice(0, size)); - } - return arrays; - } - - function refill( updateSelected ) { - var date = null, valid = true; - - if ( ngModel.$modelValue ) { - date = new Date( ngModel.$modelValue ); - - if ( isNaN(date) ) { - valid = false; - $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else if ( updateSelected ) { - selected = date; - } - } - ngModel.$setValidity('date', valid); - - var currentMode = datepickerCtrl.modes[mode], data = currentMode.getVisibleDates(selected, date); - angular.forEach(data.objects, function(obj) { - obj.disabled = datepickerCtrl.isDisabled(obj.date, mode); - }); - - ngModel.$setValidity('date-disabled', (!date || !datepickerCtrl.isDisabled(date))); - - scope.rows = split(data.objects, currentMode.split); - scope.labels = data.labels || []; - scope.title = data.title; - } - - function setMode(value) { - mode = value; - updateShowWeekNumbers(); - refill(); - } - - ngModel.$render = function() { - refill( true ); - }; - - scope.select = function( date ) { - if ( mode === 0 ) { - var dt = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); - dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); - ngModel.$setViewValue( dt ); - refill( true ); - } else { - selected = date; - setMode( mode - 1 ); - } - }; - scope.move = function(direction) { - var step = datepickerCtrl.modes[mode].step; - selected.setMonth( selected.getMonth() + direction * (step.months || 0) ); - selected.setFullYear( selected.getFullYear() + direction * (step.years || 0) ); - refill(); - }; - scope.toggleMode = function() { - setMode( (mode + 1) % datepickerCtrl.modes.length ); - }; - scope.getWeekNumber = function(row) { - return ( mode === 0 && scope.showWeekNumbers && row.length === 7 ) ? getISO8601WeekNumber(row[0].date) : null; - }; - - function getISO8601WeekNumber(date) { - var checkDate = new Date(date); - checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday - var time = checkDate.getTime(); - checkDate.setMonth(0); // Compare with Jan 1 - checkDate.setDate(1); - return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; - } - } - }; -}]) - -.constant('datepickerPopupConfig', { - dateFormat: 'yyyy-MM-dd', - currentText: 'Today', - toggleWeeksText: 'Weeks', - clearText: 'Clear', - closeText: 'Done', - closeOnDateSelection: true, - appendToBody: false, - showButtonBar: true -}) - -.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'datepickerPopupConfig', 'datepickerConfig', -function ($compile, $parse, $document, $position, dateFilter, datepickerPopupConfig, datepickerConfig) { - return { - restrict: 'EA', - require: 'ngModel', - link: function(originalScope, element, attrs, ngModel) { - var scope = originalScope.$new(), // create a child scope so we are not polluting original one - dateFormat, - closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? originalScope.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, - appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? originalScope.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; - - attrs.$observe('datepickerPopup', function(value) { - dateFormat = value || datepickerPopupConfig.dateFormat; - ngModel.$render(); - }); - - scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? originalScope.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; - - originalScope.$on('$destroy', function() { - $popup.remove(); - scope.$destroy(); - }); - - attrs.$observe('currentText', function(text) { - scope.currentText = angular.isDefined(text) ? text : datepickerPopupConfig.currentText; - }); - attrs.$observe('toggleWeeksText', function(text) { - scope.toggleWeeksText = angular.isDefined(text) ? text : datepickerPopupConfig.toggleWeeksText; - }); - attrs.$observe('clearText', function(text) { - scope.clearText = angular.isDefined(text) ? text : datepickerPopupConfig.clearText; - }); - attrs.$observe('closeText', function(text) { - scope.closeText = angular.isDefined(text) ? text : datepickerPopupConfig.closeText; - }); - - var getIsOpen, setIsOpen; - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - originalScope.$watch(getIsOpen, function updateOpen(value) { - scope.isOpen = !! value; - }); - } - scope.isOpen = getIsOpen ? getIsOpen(originalScope) : false; // Initial state - - function setOpen( value ) { - if (setIsOpen) { - setIsOpen(originalScope, !!value); - } else { - scope.isOpen = !!value; - } - } - - var documentClickBind = function(event) { - if (scope.isOpen && event.target !== element[0]) { - scope.$apply(function() { - setOpen(false); - }); - } - }; - - var elementFocusBind = function() { - scope.$apply(function() { - setOpen( true ); - }); - }; - - // popup element used to display calendar - var popupEl = angular.element('
    '); - popupEl.attr({ - 'ng-model': 'date', - 'ng-change': 'dateSelection()' - }); - var datepickerEl = angular.element(popupEl.children()[0]), - datepickerOptions = {}; - if (attrs.datepickerOptions) { - datepickerOptions = originalScope.$eval(attrs.datepickerOptions); - datepickerEl.attr(angular.extend({}, datepickerOptions)); - } - - // TODO: reverse from dateFilter string to Date object - function parseDate(viewValue) { - if (!viewValue) { - ngModel.$setValidity('date', true); - return null; - } else if (angular.isDate(viewValue)) { - ngModel.$setValidity('date', true); - return viewValue; - } else if (angular.isString(viewValue)) { - var date = new Date(viewValue); - if (isNaN(date)) { - ngModel.$setValidity('date', false); - return undefined; - } else { - ngModel.$setValidity('date', true); - return date; - } - } else { - ngModel.$setValidity('date', false); - return undefined; - } - } - ngModel.$parsers.unshift(parseDate); - - // Inner change - scope.dateSelection = function(dt) { - if (angular.isDefined(dt)) { - scope.date = dt; - } - ngModel.$setViewValue(scope.date); - ngModel.$render(); - - if (closeOnDateSelection) { - setOpen( false ); - } - }; - - element.bind('input change keyup', function() { - scope.$apply(function() { - scope.date = ngModel.$modelValue; - }); - }); - - // Outter change - ngModel.$render = function() { - var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; - element.val(date); - scope.date = ngModel.$modelValue; - }; - - function addWatchableAttribute(attribute, scopeProperty, datepickerAttribute) { - if (attribute) { - originalScope.$watch($parse(attribute), function(value){ - scope[scopeProperty] = value; - }); - datepickerEl.attr(datepickerAttribute || scopeProperty, scopeProperty); - } - } - addWatchableAttribute(attrs.min, 'min'); - addWatchableAttribute(attrs.max, 'max'); - if (attrs.showWeeks) { - addWatchableAttribute(attrs.showWeeks, 'showWeeks', 'show-weeks'); - } else { - scope.showWeeks = 'show-weeks' in datepickerOptions ? datepickerOptions['show-weeks'] : datepickerConfig.showWeeks; - datepickerEl.attr('show-weeks', 'showWeeks'); - } - if (attrs.dateDisabled) { - datepickerEl.attr('date-disabled', attrs.dateDisabled); - } - - function updatePosition() { - scope.position = appendToBody ? $position.offset(element) : $position.position(element); - scope.position.top = scope.position.top + element.prop('offsetHeight'); - } - - var documentBindingInitialized = false, elementFocusInitialized = false; - scope.$watch('isOpen', function(value) { - if (value) { - updatePosition(); - $document.bind('click', documentClickBind); - if(elementFocusInitialized) { - element.unbind('focus', elementFocusBind); - } - element[0].focus(); - documentBindingInitialized = true; - } else { - if(documentBindingInitialized) { - $document.unbind('click', documentClickBind); - } - element.bind('focus', elementFocusBind); - elementFocusInitialized = true; - } - - if ( setIsOpen ) { - setIsOpen(originalScope, value); - } - }); - - scope.today = function() { - scope.dateSelection(new Date()); - }; - scope.clear = function() { - scope.dateSelection(null); - }; - - var $popup = $compile(popupEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; -}]) - -.directive('datepickerPopupWrap', function() { - return { - restrict:'EA', - replace: true, - transclude: true, - templateUrl: 'template/datepicker/popup.html', - link:function (scope, element, attrs) { - element.bind('click', function(event) { - event.preventDefault(); - event.stopPropagation(); - }); - } - }; -}); - -/* - * dropdownToggle - Provides dropdown menu functionality in place of bootstrap js - * @restrict class or attribute - * @example: - - */ - -angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) { - var openElement = null, - closeMenu = angular.noop; - return { - restrict: 'CA', - link: function(scope, element, attrs) { - scope.$watch('$location.path', function() { closeMenu(); }); - element.parent().bind('click', function() { closeMenu(); }); - element.bind('click', function (event) { - - var elementWasOpen = (element === openElement); - - event.preventDefault(); - event.stopPropagation(); - - if (!!openElement) { - closeMenu(); - } - - if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) { - element.parent().addClass('open'); - openElement = element; - closeMenu = function (event) { - if (event) { - event.preventDefault(); - event.stopPropagation(); - } - $document.unbind('click', closeMenu); - element.parent().removeClass('open'); - closeMenu = angular.noop; - openElement = null; - }; - $document.bind('click', closeMenu); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) - -/** - * A helper, internal data structure that acts as a map but also allows getting / removing - * elements in the LIFO order - */ - .factory('$$stackedMap', function () { - return { - createNew: function () { - var stack = []; - - return { - add: function (key, value) { - stack.push({ - key: key, - value: value - }); - }, - get: function (key) { - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - return stack[i]; - } - } - }, - keys: function() { - var keys = []; - for (var i = 0; i < stack.length; i++) { - keys.push(stack[i].key); - } - return keys; - }, - top: function () { - return stack[stack.length - 1]; - }, - remove: function (key) { - var idx = -1; - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - idx = i; - break; - } - } - return stack.splice(idx, 1)[0]; - }, - removeTop: function () { - return stack.splice(stack.length - 1, 1)[0]; - }, - length: function () { - return stack.length; - } - }; - } - }; - }) - -/** - * A helper directive for the $modal service. It creates a backdrop element. - */ - .directive('modalBackdrop', ['$timeout', function ($timeout) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/modal/backdrop.html', - link: function (scope) { - - scope.animate = false; - - //trigger CSS transitions - $timeout(function () { - scope.animate = true; - }); - } - }; - }]) - - .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { - return { - restrict: 'EA', - scope: { - index: '@', - animate: '=' - }, - replace: true, - transclude: true, - templateUrl: 'template/modal/window.html', - link: function (scope, element, attrs) { - scope.windowClass = attrs.windowClass || ''; - - $timeout(function () { - // trigger CSS transitions - scope.animate = true; - // focus a freshly-opened modal - element[0].focus(); - }); - - scope.close = function (evt) { - var modal = $modalStack.getTop(); - if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { - evt.preventDefault(); - evt.stopPropagation(); - $modalStack.dismiss(modal.key, 'backdrop click'); - } - }; - } - }; - }]) - - .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', - function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { - - var OPENED_MODAL_CLASS = 'modal-open'; - - var backdropDomEl, backdropScope; - var openedWindows = $$stackedMap.createNew(); - var $modalStack = {}; - - function backdropIndex() { - var topBackdropIndex = -1; - var opened = openedWindows.keys(); - for (var i = 0; i < opened.length; i++) { - if (openedWindows.get(opened[i]).value.backdrop) { - topBackdropIndex = i; - } - } - return topBackdropIndex; - } - - $rootScope.$watch(backdropIndex, function(newBackdropIndex){ - if (backdropScope) { - backdropScope.index = newBackdropIndex; - } - }); - - function removeModalWindow(modalInstance) { - - var body = $document.find('body').eq(0); - var modalWindow = openedWindows.get(modalInstance).value; - - //clean up the stack - openedWindows.remove(modalInstance); - - //remove window DOM element - removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, checkRemoveBackdrop); - body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); - } - - function checkRemoveBackdrop() { - //remove backdrop if no longer needed - if (backdropDomEl && backdropIndex() == -1) { - var backdropScopeRef = backdropScope; - removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { - backdropScopeRef.$destroy(); - backdropScopeRef = null; - }); - backdropDomEl = undefined; - backdropScope = undefined; - } - } - - function removeAfterAnimate(domEl, scope, emulateTime, done) { - // Closing animation - scope.animate = false; - - var transitionEndEventName = $transition.transitionEndEventName; - if (transitionEndEventName) { - // transition out - var timeout = $timeout(afterAnimating, emulateTime); - - domEl.bind(transitionEndEventName, function () { - $timeout.cancel(timeout); - afterAnimating(); - scope.$apply(); - }); - } else { - // Ensure this call is async - $timeout(afterAnimating, 0); - } - - function afterAnimating() { - if (afterAnimating.done) { - return; - } - afterAnimating.done = true; - - domEl.remove(); - if (done) { - done(); - } - } - } - - $document.bind('keydown', function (evt) { - var modal; - - if (evt.which === 27) { - modal = openedWindows.top(); - if (modal && modal.value.keyboard) { - $rootScope.$apply(function () { - $modalStack.dismiss(modal.key); - }); - } - } - }); - - $modalStack.open = function (modalInstance, modal) { - - openedWindows.add(modalInstance, { - deferred: modal.deferred, - modalScope: modal.scope, - backdrop: modal.backdrop, - keyboard: modal.keyboard - }); - - var body = $document.find('body').eq(0), - currBackdropIndex = backdropIndex(); - - if (currBackdropIndex >= 0 && !backdropDomEl) { - backdropScope = $rootScope.$new(true); - backdropScope.index = currBackdropIndex; - backdropDomEl = $compile('
    ')(backdropScope); - body.append(backdropDomEl); - } - - var angularDomEl = angular.element('
    '); - angularDomEl.attr('window-class', modal.windowClass); - angularDomEl.attr('index', openedWindows.length() - 1); - angularDomEl.attr('animate', 'animate'); - angularDomEl.html(modal.content); - - var modalDomEl = $compile(angularDomEl)(modal.scope); - openedWindows.top().value.modalDomEl = modalDomEl; - body.append(modalDomEl); - body.addClass(OPENED_MODAL_CLASS); - }; - - $modalStack.close = function (modalInstance, result) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.resolve(result); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismiss = function (modalInstance, reason) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.reject(reason); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismissAll = function (reason) { - var topModal = this.getTop(); - while (topModal) { - this.dismiss(topModal.key, reason); - topModal = this.getTop(); - } - }; - - $modalStack.getTop = function () { - return openedWindows.top(); - }; - - return $modalStack; - }]) - - .provider('$modal', function () { - - var $modalProvider = { - options: { - backdrop: true, //can be also false or 'static' - keyboard: true - }, - $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', - function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { - - var $modal = {}; - - function getTemplatePromise(options) { - return options.template ? $q.when(options.template) : - $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { - return result.data; - }); - } - - function getResolvePromises(resolves) { - var promisesArr = []; - angular.forEach(resolves, function (value, key) { - if (angular.isFunction(value) || angular.isArray(value)) { - promisesArr.push($q.when($injector.invoke(value))); - } - }); - return promisesArr; - } - - $modal.open = function (modalOptions) { - - var modalResultDeferred = $q.defer(); - var modalOpenedDeferred = $q.defer(); - - //prepare an instance of a modal to be injected into controllers and returned to a caller - var modalInstance = { - result: modalResultDeferred.promise, - opened: modalOpenedDeferred.promise, - close: function (result) { - $modalStack.close(modalInstance, result); - }, - dismiss: function (reason) { - $modalStack.dismiss(modalInstance, reason); - } - }; - - //merge and clean up options - modalOptions = angular.extend({}, $modalProvider.options, modalOptions); - modalOptions.resolve = modalOptions.resolve || {}; - - //verify options - if (!modalOptions.template && !modalOptions.templateUrl) { - throw new Error('One of template or templateUrl options is required.'); - } - - var templateAndResolvePromise = - $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); - - - templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { - - var modalScope = (modalOptions.scope || $rootScope).$new(); - modalScope.$close = modalInstance.close; - modalScope.$dismiss = modalInstance.dismiss; - - var ctrlInstance, ctrlLocals = {}; - var resolveIter = 1; - - //controllers - if (modalOptions.controller) { - ctrlLocals.$scope = modalScope; - ctrlLocals.$modalInstance = modalInstance; - angular.forEach(modalOptions.resolve, function (value, key) { - ctrlLocals[key] = tplAndVars[resolveIter++]; - }); - - ctrlInstance = $controller(modalOptions.controller, ctrlLocals); - } - - $modalStack.open(modalInstance, { - scope: modalScope, - deferred: modalResultDeferred, - content: tplAndVars[0], - backdrop: modalOptions.backdrop, - keyboard: modalOptions.keyboard, - windowClass: modalOptions.windowClass - }); - - }, function resolveError(reason) { - modalResultDeferred.reject(reason); - }); - - templateAndResolvePromise.then(function () { - modalOpenedDeferred.resolve(true); - }, function () { - modalOpenedDeferred.reject(false); - }); - - return modalInstance; - }; - - return $modal; - }] - }; - - return $modalProvider; - }); - -angular.module('ui.bootstrap.pagination', []) - -.controller('PaginationController', ['$scope', '$attrs', '$parse', '$interpolate', function ($scope, $attrs, $parse, $interpolate) { - var self = this, - setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; - - this.init = function(defaultItemsPerPage) { - if ($attrs.itemsPerPage) { - $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { - self.itemsPerPage = parseInt(value, 10); - $scope.totalPages = self.calculateTotalPages(); - }); - } else { - this.itemsPerPage = defaultItemsPerPage; - } - }; - - this.noPrevious = function() { - return this.page === 1; - }; - this.noNext = function() { - return this.page === $scope.totalPages; - }; - - this.isActive = function(page) { - return this.page === page; - }; - - this.calculateTotalPages = function() { - var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); - return Math.max(totalPages || 0, 1); - }; - - this.getAttributeValue = function(attribute, defaultValue, interpolate) { - return angular.isDefined(attribute) ? (interpolate ? $interpolate(attribute)($scope.$parent) : $scope.$parent.$eval(attribute)) : defaultValue; - }; - - this.render = function() { - this.page = parseInt($scope.page, 10) || 1; - if (this.page > 0 && this.page <= $scope.totalPages) { - $scope.pages = this.getPages(this.page, $scope.totalPages); - } - }; - - $scope.selectPage = function(page) { - if ( ! self.isActive(page) && page > 0 && page <= $scope.totalPages) { - $scope.page = page; - $scope.onSelectPage({ page: page }); - } - }; - - $scope.$watch('page', function() { - self.render(); - }); - - $scope.$watch('totalItems', function() { - $scope.totalPages = self.calculateTotalPages(); - }); - - $scope.$watch('totalPages', function(value) { - setNumPages($scope.$parent, value); // Readonly variable - - if ( self.page > value ) { - $scope.selectPage(value); - } else { - self.render(); - } - }); -}]) - -.constant('paginationConfig', { - itemsPerPage: 10, - boundaryLinks: false, - directionLinks: true, - firstText: 'First', - previousText: 'Previous', - nextText: 'Next', - lastText: 'Last', - rotate: true -}) - -.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pagination.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var maxSize, - boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks ), - directionLinks = paginationCtrl.getAttributeValue(attrs.directionLinks, config.directionLinks ), - firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true), - previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - lastText = paginationCtrl.getAttributeValue(attrs.lastText, config.lastText, true), - rotate = paginationCtrl.getAttributeValue(attrs.rotate, config.rotate); - - paginationCtrl.init(config.itemsPerPage); - - if (attrs.maxSize) { - scope.$parent.$watch($parse(attrs.maxSize), function(value) { - maxSize = parseInt(value, 10); - paginationCtrl.render(); - }); - } - - // Create page object used in template - function makePage(number, text, isActive, isDisabled) { - return { - number: number, - text: text, - active: isActive, - disabled: isDisabled - }; - } - - paginationCtrl.getPages = function(currentPage, totalPages) { - var pages = []; - - // Default page limits - var startPage = 1, endPage = totalPages; - var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); - - // recompute if maxSize - if ( isMaxSized ) { - if ( rotate ) { - // Current page is displayed in the middle of the visible ones - startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); - endPage = startPage + maxSize - 1; - - // Adjust if limit is exceeded - if (endPage > totalPages) { - endPage = totalPages; - startPage = endPage - maxSize + 1; - } - } else { - // Visible pages are paginated with maxSize - startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; - - // Adjust last page if limit is exceeded - endPage = Math.min(startPage + maxSize - 1, totalPages); - } - } - - // Add page number links - for (var number = startPage; number <= endPage; number++) { - var page = makePage(number, number, paginationCtrl.isActive(number), false); - pages.push(page); - } - - // Add links to move between page sets - if ( isMaxSized && ! rotate ) { - if ( startPage > 1 ) { - var previousPageSet = makePage(startPage - 1, '...', false, false); - pages.unshift(previousPageSet); - } - - if ( endPage < totalPages ) { - var nextPageSet = makePage(endPage + 1, '...', false, false); - pages.push(nextPageSet); - } - } - - // Add previous & next links - if (directionLinks) { - var previousPage = makePage(currentPage - 1, previousText, false, paginationCtrl.noPrevious()); - pages.unshift(previousPage); - - var nextPage = makePage(currentPage + 1, nextText, false, paginationCtrl.noNext()); - pages.push(nextPage); - } - - // Add first & last links - if (boundaryLinks) { - var firstPage = makePage(1, firstText, false, paginationCtrl.noPrevious()); - pages.unshift(firstPage); - - var lastPage = makePage(totalPages, lastText, false, paginationCtrl.noNext()); - pages.push(lastPage); - } - - return pages; - }; - } - }; -}]) - -.constant('pagerConfig', { - itemsPerPage: 10, - previousText: '« Previous', - nextText: 'Next »', - align: true -}) - -.directive('pager', ['pagerConfig', function(config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pager.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - align = paginationCtrl.getAttributeValue(attrs.align, config.align); - - paginationCtrl.init(config.itemsPerPage); - - // Create page object used in template - function makePage(number, text, isDisabled, isPrevious, isNext) { - return { - number: number, - text: text, - disabled: isDisabled, - previous: ( align && isPrevious ), - next: ( align && isNext ) - }; - } - - paginationCtrl.getPages = function(currentPage) { - return [ - makePage(currentPage - 1, previousText, paginationCtrl.noPrevious(), true, false), - makePage(currentPage + 1, nextText, paginationCtrl.noNext(), false, true) - ]; - }; - } - }; -}]); - -/** - * The following features are still outstanding: animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html tooltips, and selector delegation. - */ -angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) - -/** - * The $tooltip service creates tooltip- and popover-like directives as well as - * houses global options for them. - */ -.provider( '$tooltip', function () { - // The default options tooltip and popover. - var defaultOptions = { - placement: 'top', - animation: true, - popupDelay: 0 - }; - - // Default hide triggers for each show trigger - var triggerMap = { - 'mouseenter': 'mouseleave', - 'click': 'click', - 'focus': 'blur' - }; - - // The options specified to the provider globally. - var globalOptions = {}; - - /** - * `options({})` allows global configuration of all tooltips in the - * application. - * - * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { - * // place tooltips left instead of top by default - * $tooltipProvider.options( { placement: 'left' } ); - * }); - */ - this.options = function( value ) { - angular.extend( globalOptions, value ); - }; - - /** - * This allows you to extend the set of trigger mappings available. E.g.: - * - * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); - */ - this.setTriggers = function setTriggers ( triggers ) { - angular.extend( triggerMap, triggers ); - }; - - /** - * This is a helper function for translating camel-case to snake-case. - */ - function snake_case(name){ - var regexp = /[A-Z]/g; - var separator = '-'; - return name.replace(regexp, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); - } - - /** - * Returns the actual instance of the $tooltip service. - * TODO support multiple triggers - */ - this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { - return function $tooltip ( type, prefix, defaultTriggerShow ) { - var options = angular.extend( {}, defaultOptions, globalOptions ); - - /** - * Returns an object of show and hide triggers. - * - * If a trigger is supplied, - * it is used to show the tooltip; otherwise, it will use the `trigger` - * option passed to the `$tooltipProvider.options` method; else it will - * default to the trigger supplied to this directive factory. - * - * The hide trigger is based on the show trigger. If the `trigger` option - * was passed to the `$tooltipProvider.options` method, it will use the - * mapped trigger from `triggerMap` or the passed trigger if the map is - * undefined; otherwise, it uses the `triggerMap` value of the show - * trigger; else it will just use the show trigger. - */ - function getTriggers ( trigger ) { - var show = trigger || options.trigger || defaultTriggerShow; - var hide = triggerMap[show] || show; - return { - show: show, - hide: hide - }; - } - - var directiveName = snake_case( type ); - - var startSym = $interpolate.startSymbol(); - var endSym = $interpolate.endSymbol(); - var template = - '
    '+ - '
    '; - - return { - restrict: 'EA', - scope: true, - compile: function (tElem, tAttrs) { - var tooltipLinker = $compile( template ); - - return function link ( scope, element, attrs ) { - var tooltip; - var transitionTimeout; - var popupTimeout; - var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; - var triggers = getTriggers( undefined ); - var hasRegisteredTriggers = false; - var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); - - var positionTooltip = function (){ - var position, - ttWidth, - ttHeight, - ttPosition; - // Get the position of the directive element. - position = appendToBody ? $position.offset( element ) : $position.position( element ); - - // Get the height and width of the tooltip so we can center it. - ttWidth = tooltip.prop( 'offsetWidth' ); - ttHeight = tooltip.prop( 'offsetHeight' ); - - // Calculate the tooltip's top and left coordinates to center it with - // this directive. - switch ( scope.tt_placement ) { - case 'right': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left + position.width - }; - break; - case 'bottom': - ttPosition = { - top: position.top + position.height, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - case 'left': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left - ttWidth - }; - break; - default: - ttPosition = { - top: position.top - ttHeight, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - } - - ttPosition.top += 'px'; - ttPosition.left += 'px'; - - // Now set the calculated positioning. - tooltip.css( ttPosition ); - - }; - - // By default, the tooltip is not open. - // TODO add ability to start tooltip opened - scope.tt_isOpen = false; - - function toggleTooltipBind () { - if ( ! scope.tt_isOpen ) { - showTooltipBind(); - } else { - hideTooltipBind(); - } - } - - // Show the tooltip with delay if specified, otherwise show it immediately - function showTooltipBind() { - if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { - return; - } - if ( scope.tt_popupDelay ) { - popupTimeout = $timeout( show, scope.tt_popupDelay, false ); - popupTimeout.then(function(reposition){reposition();}); - } else { - show()(); - } - } - - function hideTooltipBind () { - scope.$apply(function () { - hide(); - }); - } - - // Show the tooltip popup element. - function show() { - - - // Don't show empty tooltips. - if ( ! scope.tt_content ) { - return angular.noop; - } - - createTooltip(); - - // If there is a pending remove transition, we must cancel it, lest the - // tooltip be mysteriously removed. - if ( transitionTimeout ) { - $timeout.cancel( transitionTimeout ); - } - - // Set the initial positioning. - tooltip.css({ top: 0, left: 0, display: 'block' }); - - // Now we add it to the DOM because need some info about it. But it's not - // visible yet anyway. - if ( appendToBody ) { - $document.find( 'body' ).append( tooltip ); - } else { - element.after( tooltip ); - } - - positionTooltip(); - - // And show the tooltip. - scope.tt_isOpen = true; - scope.$digest(); // digest required as $apply is not called - - // Return positioning function as promise callback for correct - // positioning after draw. - return positionTooltip; - } - - // Hide the tooltip popup element. - function hide() { - // First things first: we don't show it anymore. - scope.tt_isOpen = false; - - //if tooltip is going to be shown after delay, we must cancel this - $timeout.cancel( popupTimeout ); - - // And now we remove it from the DOM. However, if we have animation, we - // need to wait for it to expire beforehand. - // FIXME: this is a placeholder for a port of the transitions library. - if ( scope.tt_animation ) { - transitionTimeout = $timeout(removeTooltip, 500); - } else { - removeTooltip(); - } - } - - function createTooltip() { - // There can only be one tooltip element per directive shown at once. - if (tooltip) { - removeTooltip(); - } - tooltip = tooltipLinker(scope, function () {}); - - // Get contents rendered into the tooltip - scope.$digest(); - } - - function removeTooltip() { - if (tooltip) { - tooltip.remove(); - tooltip = null; - } - } - - /** - * Observe the relevant attributes. - */ - attrs.$observe( type, function ( val ) { - scope.tt_content = val; - - if (!val && scope.tt_isOpen ) { - hide(); - } - }); - - attrs.$observe( prefix+'Title', function ( val ) { - scope.tt_title = val; - }); - - attrs.$observe( prefix+'Placement', function ( val ) { - scope.tt_placement = angular.isDefined( val ) ? val : options.placement; - }); - - attrs.$observe( prefix+'PopupDelay', function ( val ) { - var delay = parseInt( val, 10 ); - scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; - }); - - var unregisterTriggers = function() { - if (hasRegisteredTriggers) { - element.unbind( triggers.show, showTooltipBind ); - element.unbind( triggers.hide, hideTooltipBind ); - } - }; - - attrs.$observe( prefix+'Trigger', function ( val ) { - unregisterTriggers(); - - triggers = getTriggers( val ); - - if ( triggers.show === triggers.hide ) { - element.bind( triggers.show, toggleTooltipBind ); - } else { - element.bind( triggers.show, showTooltipBind ); - element.bind( triggers.hide, hideTooltipBind ); - } - - hasRegisteredTriggers = true; - }); - - var animation = scope.$eval(attrs[prefix + 'Animation']); - scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; - - attrs.$observe( prefix+'AppendToBody', function ( val ) { - appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; - }); - - // if a tooltip is attached to we need to remove it on - // location change as its parent scope will probably not be destroyed - // by the change. - if ( appendToBody ) { - scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { - if ( scope.tt_isOpen ) { - hide(); - } - }); - } - - // Make sure tooltip is destroyed and removed. - scope.$on('$destroy', function onDestroyTooltip() { - $timeout.cancel( transitionTimeout ); - $timeout.cancel( popupTimeout ); - unregisterTriggers(); - removeTooltip(); - }); - }; - } - }; - }; - }]; -}) - -.directive( 'tooltipPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-popup.html' - }; -}) - -.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); -}]) - -.directive( 'tooltipHtmlUnsafePopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' - }; -}) - -.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); -}]); - -/** - * The following features are still outstanding: popup delay, animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html popovers, and selector delegatation. - */ -angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) - -.directive( 'popoverPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/popover/popover.html' - }; -}) - -.directive( 'popover', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'popover', 'popover', 'click' ); -}]); - -angular.module('ui.bootstrap.progressbar', ['ui.bootstrap.transition']) - -.constant('progressConfig', { - animate: true, - max: 100 -}) - -.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', '$transition', function($scope, $attrs, progressConfig, $transition) { - var self = this, - bars = [], - max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max, - animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; - - this.addBar = function(bar, element) { - var oldValue = 0, index = bar.$parent.$index; - if ( angular.isDefined(index) && bars[index] ) { - oldValue = bars[index].value; - } - bars.push(bar); - - this.update(element, bar.value, oldValue); - - bar.$watch('value', function(value, oldValue) { - if (value !== oldValue) { - self.update(element, value, oldValue); - } - }); - - bar.$on('$destroy', function() { - self.removeBar(bar); - }); - }; - - // Update bar element width - this.update = function(element, newValue, oldValue) { - var percent = this.getPercentage(newValue); - - if (animate) { - element.css('width', this.getPercentage(oldValue) + '%'); - $transition(element, {width: percent + '%'}); - } else { - element.css({'transition': 'none', 'width': percent + '%'}); - } - }; - - this.removeBar = function(bar) { - bars.splice(bars.indexOf(bar), 1); - }; - - this.getPercentage = function(value) { - return Math.round(100 * value / max); - }; -}]) - -.directive('progress', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - require: 'progress', - scope: {}, - template: '
    ' - //templateUrl: 'template/progressbar/progress.html' // Works in AngularJS 1.2 - }; -}) - -.directive('bar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - require: '^progress', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/bar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, element); - } - }; -}) - -.directive('progressbar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/progressbar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, angular.element(element.children()[0])); - } - }; -}); -angular.module('ui.bootstrap.rating', []) - -.constant('ratingConfig', { - max: 5, - stateOn: null, - stateOff: null -}) - -.controller('RatingController', ['$scope', '$attrs', '$parse', 'ratingConfig', function($scope, $attrs, $parse, ratingConfig) { - - this.maxRange = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max; - this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; - this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; - - this.createRateObjects = function(states) { - var defaultOptions = { - stateOn: this.stateOn, - stateOff: this.stateOff - }; - - for (var i = 0, n = states.length; i < n; i++) { - states[i] = angular.extend({ index: i }, defaultOptions, states[i]); - } - return states; - }; - - // Get objects used in template - $scope.range = angular.isDefined($attrs.ratingStates) ? this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))): this.createRateObjects(new Array(this.maxRange)); - - $scope.rate = function(value) { - if ( $scope.value !== value && !$scope.readonly ) { - $scope.value = value; - } - }; - - $scope.enter = function(value) { - if ( ! $scope.readonly ) { - $scope.val = value; - } - $scope.onHover({value: value}); - }; - - $scope.reset = function() { - $scope.val = angular.copy($scope.value); - $scope.onLeave(); - }; - - $scope.$watch('value', function(value) { - $scope.val = value; - }); - - $scope.readonly = false; - if ($attrs.readonly) { - $scope.$parent.$watch($parse($attrs.readonly), function(value) { - $scope.readonly = !!value; - }); - } -}]) - -.directive('rating', function() { - return { - restrict: 'EA', - scope: { - value: '=', - onHover: '&', - onLeave: '&' - }, - controller: 'RatingController', - templateUrl: 'template/rating/rating.html', - replace: true - }; -}); - -/** - * @ngdoc overview - * @name ui.bootstrap.tabs - * - * @description - * AngularJS version of the tabs directive. - */ - -angular.module('ui.bootstrap.tabs', []) - -.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { - var ctrl = this, - tabs = ctrl.tabs = $scope.tabs = []; - - ctrl.select = function(tab) { - angular.forEach(tabs, function(tab) { - tab.active = false; - }); - tab.active = true; - }; - - ctrl.addTab = function addTab(tab) { - tabs.push(tab); - if (tabs.length === 1 || tab.active) { - ctrl.select(tab); - } - }; - - ctrl.removeTab = function removeTab(tab) { - var index = tabs.indexOf(tab); - //Select a new tab if the tab to be removed is selected - if (tab.active && tabs.length > 1) { - //If this is the last tab, select the previous tab. else, the next tab. - var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; - ctrl.select(tabs[newActiveIndex]); - } - tabs.splice(index, 1); - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabset - * @restrict EA - * - * @description - * Tabset is the outer container for the tabs directive - * - * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. - * @param {boolean=} justified Whether or not to use justified styling for the tabs. - * - * @example - - - - First Content! - Second Content! - -
    - - First Vertical Content! - Second Vertical Content! - - - First Justified Content! - Second Justified Content! - -
    -
    - */ -.directive('tabset', function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - scope: {}, - controller: 'TabsetController', - templateUrl: 'template/tabs/tabset.html', - link: function(scope, element, attrs) { - scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; - scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; - scope.type = angular.isDefined(attrs.type) ? scope.$parent.$eval(attrs.type) : 'tabs'; - } - }; -}) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tab - * @restrict EA - * - * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. - * @param {string=} select An expression to evaluate when the tab is selected. - * @param {boolean=} active A binding, telling whether or not this tab is selected. - * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. - * - * @description - * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. - * - * @example - - -
    - - -
    - - First Tab - - Alert me! - Second Tab, with alert callback and html heading! - - - {{item.content}} - - -
    -
    - - function TabsDemoCtrl($scope) { - $scope.items = [ - { title:"Dynamic Title 1", content:"Dynamic Item 0" }, - { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } - ]; - - $scope.alertMe = function() { - setTimeout(function() { - alert("You've selected the alert tab!"); - }); - }; - }; - -
    - */ - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabHeading - * @restrict EA - * - * @description - * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. - * - * @example - - - - - HTML in my titles?! - And some content, too! - - - Icon heading?!? - That's right. - - - - - */ -.directive('tab', ['$parse', function($parse) { - return { - require: '^tabset', - restrict: 'EA', - replace: true, - templateUrl: 'template/tabs/tab.html', - transclude: true, - scope: { - heading: '@', - onSelect: '&select', //This callback is called in contentHeadingTransclude - //once it inserts the tab's content into the dom - onDeselect: '&deselect' - }, - controller: function() { - //Empty controller so other directives can require being 'under' a tab - }, - compile: function(elm, attrs, transclude) { - return function postLink(scope, elm, attrs, tabsetCtrl) { - var getActive, setActive; - if (attrs.active) { - getActive = $parse(attrs.active); - setActive = getActive.assign; - scope.$parent.$watch(getActive, function updateActive(value, oldVal) { - // Avoid re-initializing scope.active as it is already initialized - // below. (watcher is called async during init with value === - // oldVal) - if (value !== oldVal) { - scope.active = !!value; - } - }); - scope.active = getActive(scope.$parent); - } else { - setActive = getActive = angular.noop; - } - - scope.$watch('active', function(active) { - // Note this watcher also initializes and assigns scope.active to the - // attrs.active expression. - setActive(scope.$parent, active); - if (active) { - tabsetCtrl.select(scope); - scope.onSelect(); - } else { - scope.onDeselect(); - } - }); - - scope.disabled = false; - if ( attrs.disabled ) { - scope.$parent.$watch($parse(attrs.disabled), function(value) { - scope.disabled = !! value; - }); - } - - scope.select = function() { - if ( ! scope.disabled ) { - scope.active = true; - } - }; - - tabsetCtrl.addTab(scope); - scope.$on('$destroy', function() { - tabsetCtrl.removeTab(scope); - }); - - - //We need to transclude later, once the content container is ready. - //when this link happens, we're inside a tab heading. - scope.$transcludeFn = transclude; - }; - } - }; -}]) - -.directive('tabHeadingTransclude', [function() { - return { - restrict: 'A', - require: '^tab', - link: function(scope, elm, attrs, tabCtrl) { - scope.$watch('headingElement', function updateHeadingElement(heading) { - if (heading) { - elm.html(''); - elm.append(heading); - } - }); - } - }; -}]) - -.directive('tabContentTransclude', function() { - return { - restrict: 'A', - require: '^tabset', - link: function(scope, elm, attrs) { - var tab = scope.$eval(attrs.tabContentTransclude); - - //Now our tab is ready to be transcluded: both the tab heading area - //and the tab content area are loaded. Transclude 'em both. - tab.$transcludeFn(tab.$parent, function(contents) { - angular.forEach(contents, function(node) { - if (isTabHeading(node)) { - //Let tabHeadingTransclude know. - tab.headingElement = node; - } else { - elm.append(node); - } - }); - }); - } - }; - function isTabHeading(node) { - return node.tagName && ( - node.hasAttribute('tab-heading') || - node.hasAttribute('data-tab-heading') || - node.tagName.toLowerCase() === 'tab-heading' || - node.tagName.toLowerCase() === 'data-tab-heading' - ); - } -}) - -; - -angular.module('ui.bootstrap.timepicker', []) - -.constant('timepickerConfig', { - hourStep: 1, - minuteStep: 1, - showMeridian: true, - meridians: null, - readonlyInput: false, - mousewheel: true -}) - -.directive('timepicker', ['$parse', '$log', 'timepickerConfig', '$locale', function ($parse, $log, timepickerConfig, $locale) { - return { - restrict: 'EA', - require:'?^ngModel', - replace: true, - scope: {}, - templateUrl: 'template/timepicker/timepicker.html', - link: function(scope, element, attrs, ngModel) { - if ( !ngModel ) { - return; // do nothing if no ng-model - } - - var selected = new Date(), - meridians = angular.isDefined(attrs.meridians) ? scope.$parent.$eval(attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; - - var hourStep = timepickerConfig.hourStep; - if (attrs.hourStep) { - scope.$parent.$watch($parse(attrs.hourStep), function(value) { - hourStep = parseInt(value, 10); - }); - } - - var minuteStep = timepickerConfig.minuteStep; - if (attrs.minuteStep) { - scope.$parent.$watch($parse(attrs.minuteStep), function(value) { - minuteStep = parseInt(value, 10); - }); - } - - // 12H / 24H mode - scope.showMeridian = timepickerConfig.showMeridian; - if (attrs.showMeridian) { - scope.$parent.$watch($parse(attrs.showMeridian), function(value) { - scope.showMeridian = !!value; - - if ( ngModel.$error.time ) { - // Evaluate from template - var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); - if (angular.isDefined( hours ) && angular.isDefined( minutes )) { - selected.setHours( hours ); - refresh(); - } - } else { - updateTemplate(); - } - }); - } - - // Get scope.hours in 24H mode if valid - function getHoursFromTemplate ( ) { - var hours = parseInt( scope.hours, 10 ); - var valid = ( scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); - if ( !valid ) { - return undefined; - } - - if ( scope.showMeridian ) { - if ( hours === 12 ) { - hours = 0; - } - if ( scope.meridian === meridians[1] ) { - hours = hours + 12; - } - } - return hours; - } - - function getMinutesFromTemplate() { - var minutes = parseInt(scope.minutes, 10); - return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; - } - - function pad( value ) { - return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; - } - - // Input elements - var inputs = element.find('input'), hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1); - - // Respond on mousewheel spin - var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel; - if ( mousewheel ) { - - var isScrollingUp = function(e) { - if (e.originalEvent) { - e = e.originalEvent; - } - //pick correct delta variable depending on event - var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; - return (e.detail || delta > 0); - }; - - hoursInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() ); - e.preventDefault(); - }); - - minutesInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() ); - e.preventDefault(); - }); - } - - scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : timepickerConfig.readonlyInput; - if ( ! scope.readonlyInput ) { - - var invalidate = function(invalidHours, invalidMinutes) { - ngModel.$setViewValue( null ); - ngModel.$setValidity('time', false); - if (angular.isDefined(invalidHours)) { - scope.invalidHours = invalidHours; - } - if (angular.isDefined(invalidMinutes)) { - scope.invalidMinutes = invalidMinutes; - } - }; - - scope.updateHours = function() { - var hours = getHoursFromTemplate(); - - if ( angular.isDefined(hours) ) { - selected.setHours( hours ); - refresh( 'h' ); - } else { - invalidate(true); - } - }; - - hoursInputEl.bind('blur', function(e) { - if ( !scope.validHours && scope.hours < 10) { - scope.$apply( function() { - scope.hours = pad( scope.hours ); - }); - } - }); - - scope.updateMinutes = function() { - var minutes = getMinutesFromTemplate(); - - if ( angular.isDefined(minutes) ) { - selected.setMinutes( minutes ); - refresh( 'm' ); - } else { - invalidate(undefined, true); - } - }; - - minutesInputEl.bind('blur', function(e) { - if ( !scope.invalidMinutes && scope.minutes < 10 ) { - scope.$apply( function() { - scope.minutes = pad( scope.minutes ); - }); - } - }); - } else { - scope.updateHours = angular.noop; - scope.updateMinutes = angular.noop; - } - - ngModel.$render = function() { - var date = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : null; - - if ( isNaN(date) ) { - ngModel.$setValidity('time', false); - $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else { - if ( date ) { - selected = date; - } - makeValid(); - updateTemplate(); - } - }; - - // Call internally when we know that model is valid. - function refresh( keyboardChange ) { - makeValid(); - ngModel.$setViewValue( new Date(selected) ); - updateTemplate( keyboardChange ); - } - - function makeValid() { - ngModel.$setValidity('time', true); - scope.invalidHours = false; - scope.invalidMinutes = false; - } - - function updateTemplate( keyboardChange ) { - var hours = selected.getHours(), minutes = selected.getMinutes(); - - if ( scope.showMeridian ) { - hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system - } - scope.hours = keyboardChange === 'h' ? hours : pad(hours); - scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); - scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; - } - - function addMinutes( minutes ) { - var dt = new Date( selected.getTime() + minutes * 60000 ); - selected.setHours( dt.getHours(), dt.getMinutes() ); - refresh(); - } - - scope.incrementHours = function() { - addMinutes( hourStep * 60 ); - }; - scope.decrementHours = function() { - addMinutes( - hourStep * 60 ); - }; - scope.incrementMinutes = function() { - addMinutes( minuteStep ); - }; - scope.decrementMinutes = function() { - addMinutes( - minuteStep ); - }; - scope.toggleMeridian = function() { - addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); - }; - } - }; -}]); - -angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) - -/** - * A helper service that can parse typeahead's syntax (string provided by users) - * Extracted to a separate service for ease of unit testing - */ - .factory('typeaheadParser', ['$parse', function ($parse) { - - // 00000111000000000000022200000000000000003333333333333330000000000044000 - var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; - - return { - parse:function (input) { - - var match = input.match(TYPEAHEAD_REGEXP), modelMapper, viewMapper, source; - if (!match) { - throw new Error( - "Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_'" + - " but got '" + input + "'."); - } - - return { - itemName:match[3], - source:$parse(match[4]), - viewMapper:$parse(match[2] || match[1]), - modelMapper:$parse(match[1]) - }; - } - }; -}]) - - .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', - function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { - - var HOT_KEYS = [9, 13, 27, 38, 40]; - - return { - require:'ngModel', - link:function (originalScope, element, attrs, modelCtrl) { - - //SUPPORTED ATTRIBUTES (OPTIONS) - - //minimal no of characters that needs to be entered before typeahead kicks-in - var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; - - //minimal wait time after last character typed before typehead kicks-in - var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; - - //should it restrict model values to the ones selected from the popup only? - var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; - - //binding to a variable that indicates if matches are being retrieved asynchronously - var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; - - //a callback executed when a match is selected - var onSelectCallback = $parse(attrs.typeaheadOnSelect); - - var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; - - var appendToBody = attrs.typeaheadAppendToBody ? $parse(attrs.typeaheadAppendToBody) : false; - - //INTERNAL VARIABLES - - //model setter executed upon match selection - var $setModelValue = $parse(attrs.ngModel).assign; - - //expressions used by typeahead - var parserResult = typeaheadParser.parse(attrs.typeahead); - - var hasFocus; - - //pop-up element used to display matches - var popUpEl = angular.element('
    '); - popUpEl.attr({ - matches: 'matches', - active: 'activeIdx', - select: 'select(activeIdx)', - query: 'query', - position: 'position' - }); - //custom item template - if (angular.isDefined(attrs.typeaheadTemplateUrl)) { - popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); - } - - //create a child scope for the typeahead directive so we are not polluting original scope - //with typeahead-specific data (matches, query etc.) - var scope = originalScope.$new(); - originalScope.$on('$destroy', function(){ - scope.$destroy(); - }); - - var resetMatches = function() { - scope.matches = []; - scope.activeIdx = -1; - }; - - var getMatchesAsync = function(inputValue) { - - var locals = {$viewValue: inputValue}; - isLoadingSetter(originalScope, true); - $q.when(parserResult.source(originalScope, locals)).then(function(matches) { - - //it might happen that several async queries were in progress if a user were typing fast - //but we are interested only in responses that correspond to the current view value - if (inputValue === modelCtrl.$viewValue && hasFocus) { - if (matches.length > 0) { - - scope.activeIdx = 0; - scope.matches.length = 0; - - //transform labels - for(var i=0; i= minSearch) { - if (waitTime > 0) { - if (timeoutPromise) { - $timeout.cancel(timeoutPromise);//cancel previous timeout - } - timeoutPromise = $timeout(function () { - getMatchesAsync(inputValue); - }, waitTime); - } else { - getMatchesAsync(inputValue); - } - } else { - isLoadingSetter(originalScope, false); - resetMatches(); - } - - if (isEditable) { - return inputValue; - } else { - if (!inputValue) { - // Reset in case user had typed something previously. - modelCtrl.$setValidity('editable', true); - return inputValue; - } else { - modelCtrl.$setValidity('editable', false); - return undefined; - } - } - }); - - modelCtrl.$formatters.push(function (modelValue) { - - var candidateViewValue, emptyViewValue; - var locals = {}; - - if (inputFormatter) { - - locals['$model'] = modelValue; - return inputFormatter(originalScope, locals); - - } else { - - //it might happen that we don't have enough info to properly render input value - //we need to check for this situation and simply return model value if we can't apply custom formatting - locals[parserResult.itemName] = modelValue; - candidateViewValue = parserResult.viewMapper(originalScope, locals); - locals[parserResult.itemName] = undefined; - emptyViewValue = parserResult.viewMapper(originalScope, locals); - - return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; - } - }); - - scope.select = function (activeIdx) { - //called from within the $digest() cycle - var locals = {}; - var model, item; - - locals[parserResult.itemName] = item = scope.matches[activeIdx].model; - model = parserResult.modelMapper(originalScope, locals); - $setModelValue(originalScope, model); - modelCtrl.$setValidity('editable', true); - - onSelectCallback(originalScope, { - $item: item, - $model: model, - $label: parserResult.viewMapper(originalScope, locals) - }); - - resetMatches(); - - //return focus to the input element if a mach was selected via a mouse click event - element[0].focus(); - }; - - //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) - element.bind('keydown', function (evt) { - - //typeahead is open and an "interesting" key was pressed - if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { - return; - } - - evt.preventDefault(); - - if (evt.which === 40) { - scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; - scope.$digest(); - - } else if (evt.which === 38) { - scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; - scope.$digest(); - - } else if (evt.which === 13 || evt.which === 9) { - scope.$apply(function () { - scope.select(scope.activeIdx); - }); - - } else if (evt.which === 27) { - evt.stopPropagation(); - - resetMatches(); - scope.$digest(); - } - }); - - element.bind('blur', function (evt) { - hasFocus = false; - }); - - // Keep reference to click handler to unbind it. - var dismissClickHandler = function (evt) { - if (element[0] !== evt.target) { - resetMatches(); - scope.$digest(); - } - }; - - $document.bind('click', dismissClickHandler); - - originalScope.$on('$destroy', function(){ - $document.unbind('click', dismissClickHandler); - }); - - var $popup = $compile(popUpEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; - -}]) - - .directive('typeaheadPopup', function () { - return { - restrict:'EA', - scope:{ - matches:'=', - query:'=', - active:'=', - position:'=', - select:'&' - }, - replace:true, - templateUrl:'template/typeahead/typeahead-popup.html', - link:function (scope, element, attrs) { - - scope.templateUrl = attrs.templateUrl; - - scope.isOpen = function () { - return scope.matches.length > 0; - }; - - scope.isActive = function (matchIdx) { - return scope.active == matchIdx; - }; - - scope.selectActive = function (matchIdx) { - scope.active = matchIdx; - }; - - scope.selectMatch = function (activeIdx) { - scope.select({activeIdx:activeIdx}); - }; - } - }; - }) - - .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { - return { - restrict:'EA', - scope:{ - index:'=', - match:'=', - query:'=' - }, - link:function (scope, element, attrs) { - var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; - $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ - element.replaceWith($compile(tplContent.trim())(scope)); - }); - } - }; - }]) - - .filter('typeaheadHighlight', function() { - - function escapeRegexp(queryToEscape) { - return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - } - - return function(matchItem, query) { - return query ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; - }; - }); -angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/accordion/accordion-group.html", - "
    \n" + - "
    \n" + - "

    \n" + - " {{heading}}\n" + - "

    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - "
    "); -}]); - -angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/accordion/accordion.html", - "
    "); -}]); - -angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/alert/alert.html", - "
    \n" + - " \n" + - "
    \n" + - "
    \n" + - ""); -}]); - -angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/carousel/carousel.html", - "
    \n" + - "
      1\">\n" + - "
    1. \n" + - "
    \n" + - "
    \n" + - " 1\">\n" + - " 1\">\n" + - "
    \n" + - ""); -}]); - -angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/carousel/slide.html", - "
    \n" + - ""); -}]); - -angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/datepicker/datepicker.html", - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 0\" class=\"h6\">\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
    #{{label}}
    {{ getWeekNumber(row) }}\n" + - " \n" + - "
    \n" + - ""); -}]); - -angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/datepicker/popup.html", - "
      \n" + - "
    • \n" + - "
    • \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
    • \n" + - "
    \n" + - ""); -}]); - -angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/modal/backdrop.html", - "
    "); -}]); - -angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/modal/window.html", - "
    \n" + - "
    \n" + - "
    "); -}]); - -angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/pagination/pager.html", - ""); -}]); - -angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/pagination/pagination.html", - ""); -}]); - -angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", - "
    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - ""); -}]); - -angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tooltip/tooltip-popup.html", - "
    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - ""); -}]); - -angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/popover/popover.html", - "
    \n" + - "
    \n" + - "\n" + - "
    \n" + - "

    \n" + - "
    \n" + - "
    \n" + - "
    \n" + - ""); -}]); - -angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/bar.html", - "
    "); -}]); - -angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/progress.html", - "
    "); -}]); - -angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/progressbar.html", - "
    "); -}]); - -angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/rating/rating.html", - "\n" + - " \n" + - ""); -}]); - -angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tab.html", - "
  • \n" + - " {{heading}}\n" + - "
  • \n" + - ""); -}]); - -angular.module("template/tabs/tabset-titles.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tabset-titles.html", - "
      \n" + - "
    \n" + - ""); -}]); - -angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tabset.html", - "\n" + - "
    \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - ""); -}]); - -angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/timepicker/timepicker.html", - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
       
      \n" + - " \n" + - " :\n" + - " \n" + - "
       
      \n" + - ""); -}]); - -angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/typeahead/typeahead-match.html", - ""); -}]); - -angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/typeahead/typeahead-popup.html", - "
        \n" + - "
      • \n" + - "
        \n" + - "
      • \n" + - "
      "); -}]); - -// Source: public/lib/angular-ui-utils/ui-utils.min.js -/** - * angular-ui-utils - Swiss-Army-Knife of AngularJS tools (with no external dependencies!) - * @version v0.1.1 - 2014-02-05 - * @link http://angular-ui.github.com - * @license MIT License, http://www.opensource.org/licenses/MIT - */ -angular.module("ui.alias",[]).config(["$compileProvider","uiAliasConfig",function(a,b){b=b||{},angular.forEach(b,function(b,c){angular.isString(b)&&(b={replace:!0,template:b}),a.directive(c,function(){return b})})}]),angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join(''+b+""):a.replace(new RegExp(b,"gi"),'$&')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("
      ").html(a).find(p):angular.element("
      ").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(!a)return 0;if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(!a)return 0;if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return a?void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element(''),c.wrap('').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){e.$setViewValue(d.uiReset?a.$eval(d.uiReset):b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){i(c,a.path().indexOf(b)>-1)})()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))})()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scroll.jqlite",["ui.scroll"]).service("jqLiteExtras",["$log","$window",function(a,b){return{registerFor:function(a){var c,d,e,f,g,h,i;return d=angular.element.prototype.css,a.prototype.css=function(a,b){var c,e;return e=this,c=e[0],c&&3!==c.nodeType&&8!==c.nodeType&&c.style?d.call(e,a,b):void 0},h=function(a){return a&&a.document&&a.location&&a.alert&&a.setInterval},i=function(a,b,c){var d,e,f,g,i;return d=a[0],i={top:["scrollTop","pageYOffset","scrollLeft"],left:["scrollLeft","pageXOffset","scrollTop"]}[b],e=i[0],g=i[1],f=i[2],h(d)?angular.isDefined(c)?d.scrollTo(a[f].call(a),c):g in d?d[g]:d.document.documentElement[e]:angular.isDefined(c)?d[e]=c:d[e]},b.getComputedStyle?(f=function(a){return b.getComputedStyle(a,null)},c=function(a,b){return parseFloat(b)}):(f=function(a){return a.currentStyle},c=function(a,b){var c,d,e,f,g,h,i;return c=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,f=new RegExp("^("+c+")(?!px)[a-z%]+$","i"),f.test(b)?(i=a.style,d=i.left,g=a.runtimeStyle,h=g&&g.left,g&&(g.left=i.left),i.left=b,e=i.pixelLeft,i.left=d,h&&(g.left=h),e):parseFloat(b)}),e=function(a,b){var d,e,g,i,j,k,l,m,n,o,p,q,r;return h(a)?(d=document.documentElement[{height:"clientHeight",width:"clientWidth"}[b]],{base:d,padding:0,border:0,margin:0}):(r={width:[a.offsetWidth,"Left","Right"],height:[a.offsetHeight,"Top","Bottom"]}[b],d=r[0],l=r[1],m=r[2],k=f(a),p=c(a,k["padding"+l])||0,q=c(a,k["padding"+m])||0,e=c(a,k["border"+l+"Width"])||0,g=c(a,k["border"+m+"Width"])||0,i=k["margin"+l],j=k["margin"+m],n=c(a,i)||0,o=c(a,j)||0,{base:d,padding:p+q,border:e+g,margin:n+o})},g=function(a,b,c){var d,g,h;return g=e(a,b),g.base>0?{base:g.base-g.padding-g.border,outer:g.base,outerfull:g.base+g.margin}[c]:(d=f(a),h=d[b],(0>h||null===h)&&(h=a.style[b]||0),h=parseFloat(h)||0,{base:h-g.padding-g.border,outer:h,outerfull:h+g.padding+g.border+g.margin}[c])},angular.forEach({before:function(a){var b,c,d,e,f,g,h;if(f=this,c=f[0],e=f.parent(),b=e.contents(),b[0]===c)return e.prepend(a);for(d=g=1,h=b.length-1;h>=1?h>=g:g>=h;d=h>=1?++g:--g)if(b[d]===c)return void angular.element(b[d-1]).after(a);throw new Error("invalid DOM structure "+c.outerHTML)},height:function(a){var b;return b=this,angular.isDefined(a)?(angular.isNumber(a)&&(a+="px"),d.call(b,"height",a)):g(this[0],"height","base")},outerHeight:function(a){return g(this[0],"height",a?"outerfull":"outer")},offset:function(a){var b,c,d,e,f,g;return f=this,arguments.length?void 0===a?f:a:(b={top:0,left:0},e=f[0],(c=e&&e.ownerDocument)?(d=c.documentElement,e.getBoundingClientRect&&(b=e.getBoundingClientRect()),g=c.defaultView||c.parentWindow,{top:b.top+(g.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(g.pageXOffset||d.scrollLeft)-(d.clientLeft||0)}):void 0)},scrollTop:function(a){return i(this,"top",a)},scrollLeft:function(a){return i(this,"left",a)}},function(b,c){return a.prototype[c]?void 0:a.prototype[c]=b})}}}]).run(["$log","$window","jqLiteExtras",function(a,b,c){return b.jQuery?void 0:c.registerFor(angular.element)}]),angular.module("ui.scroll",[]).directive("ngScrollViewport",["$log",function(){return{controller:["$scope","$element",function(a,b){return b}]}}]).directive("ngScroll",["$log","$injector","$rootScope","$timeout",function(a,b,c,d){return{require:["?^ngScrollViewport"],transclude:"element",priority:1e3,terminal:!0,compile:function(e,f,g){return function(f,h,i,j){var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;if(H=i.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/),!H)throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "'+i.ngScroll+'"');if(F=H[1],v=H[2],D=function(a){return angular.isObject(a)&&a.get&&angular.isFunction(a.get)},u=f[v],!D(u)&&(u=b.get(v),!D(u)))throw new Error(v+" is not a valid datasource");return r=Math.max(3,+i.bufferSize||10),q=function(){return T.height()*Math.max(.1,+i.padding||.1)},O=function(a){return a[0].scrollHeight||a[0].document.documentElement.scrollHeight},k=null,g(R=f.$new(),function(a){var b,c,d,f,g,h;if(f=a[0].localName,"dl"===f)throw new Error("ng-scroll directive does not support <"+a[0].localName+"> as a repeating tag: "+a[0].outerHTML);return"li"!==f&&"tr"!==f&&(f="div"),h=j[0]||angular.element(window),h.css({"overflow-y":"auto",display:"block"}),d=function(a){var b,c,d;switch(a){case"tr":return d=angular.element("
      "),b=d.find("div"),c=d.find("tr"),c.paddingHeight=function(){return b.height.apply(b,arguments)},c;default:return c=angular.element("<"+a+">"),c.paddingHeight=c.height,c}},c=function(a,b,c){return b[{top:"before",bottom:"after"}[c]](a),{paddingHeight:function(){return a.paddingHeight.apply(a,arguments)},insert:function(b){return a[{top:"after",bottom:"before"}[c]](b)}}},g=c(d(f),e,"top"),b=c(d(f),e,"bottom"),R.$destroy(),k={viewport:h,topPadding:g.paddingHeight,bottomPadding:b.paddingHeight,append:b.insert,prepend:g.insert,bottomDataPos:function(){return O(h)-b.paddingHeight()},topDataPos:function(){return g.paddingHeight()}}}),T=k.viewport,B=1,I=1,p=[],J=[],x=!1,n=!1,G=u.loading||function(){},E=!1,L=function(a,b){var c,d;for(c=d=a;b>=a?b>d:d>b;c=b>=a?++d:--d)p[c].scope.$destroy(),p[c].element.remove();return p.splice(a,b-a)},K=function(){return B=1,I=1,L(0,p.length),k.topPadding(0),k.bottomPadding(0),J=[],x=!1,n=!1,l(!1)},o=function(){return T.scrollTop()+T.height()},S=function(){return T.scrollTop()},P=function(){return!x&&k.bottomDataPos()=g?0>=f:f>=0)&&(d=p[c].element.outerHeight(!0),k.bottomDataPos()-b-d>o()+q());c=0>=g?++f:--f)b+=d,e++,x=!1;return e>0?(k.bottomPadding(k.bottomPadding()+b),L(p.length-e,p.length),I-=e,a.log("clipped off bottom "+e+" bottom padding "+k.bottomPadding())):void 0},Q=function(){return!n&&k.topDataPos()>S()-q()},t=function(){var b,c,d,e,f,g;for(e=0,d=0,f=0,g=p.length;g>f&&(b=p[f],c=b.element.outerHeight(!0),k.topDataPos()+e+c0?(k.topPadding(k.topPadding()+e),L(0,d),B+=d,a.log("clipped off top "+d+" top padding "+k.topPadding())):void 0},w=function(a,b){return E||(E=!0,G(!0)),1===J.push(a)?z(b):void 0},C=function(a,b){var c,d,e;return c=f.$new(),c[F]=b,d=a>B,c.$index=a,d&&c.$index--,e={scope:c},g(c,function(b){return e.element=b,d?a===I?(k.append(b),p.push(e)):(p[a-B].element.after(b),p.splice(a-B+1,0,e)):(k.prepend(b),p.unshift(e))}),{appended:d,wrapper:e}},m=function(a,b){var c;return a?k.bottomPadding(Math.max(0,k.bottomPadding()-b.element.outerHeight(!0))):(c=k.topPadding()-b.element.outerHeight(!0),c>=0?k.topPadding(c):T.scrollTop(T.scrollTop()+b.element.outerHeight(!0)))},l=function(b,c,e){var f;return f=function(){return a.log("top {actual="+k.topDataPos()+" visible from="+S()+" bottom {visible through="+o()+" actual="+k.bottomDataPos()+"}"),P()?w(!0,b):Q()&&w(!1,b),e?e():void 0},c?d(function(){var a,b,d;for(b=0,d=c.length;d>b;b++)a=c[b],m(a.appended,a.wrapper);return f()}):f()},A=function(a,b){return l(a,b,function(){return J.shift(),0===J.length?(E=!1,G(!1)):z(a)})},z=function(b){var c;return c=J[0],c?p.length&&!P()?A(b):u.get(I,r,function(c){var d,e,f,g;if(e=[],0===c.length)x=!0,k.bottomPadding(0),a.log("appended: requested "+r+" records starting from "+I+" recieved: eof");else{for(t(),f=0,g=c.length;g>f;f++)d=c[f],e.push(C(++I,d));a.log("appended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)}):p.length&&!Q()?A(b):u.get(B-r,r,function(c){var d,e,f,g;if(e=[],0===c.length)n=!0,k.topPadding(0),a.log("prepended: requested "+r+" records starting from "+(B-r)+" recieved: bof");else{for(s(),d=f=g=c.length-1;0>=g?0>=f:f>=0;d=0>=g?++f:--f)e.unshift(C(--B,c[d]));a.log("prepended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)})},M=function(){return c.$$phase||E?void 0:(l(!1),f.$apply())},T.bind("resize",M),N=function(){return c.$$phase||E?void 0:(l(!0),f.$apply())},T.bind("scroll",N),f.$watch(u.revision,function(){return K()}),y=u.scope?u.scope.$new():f.$new(),f.$on("$destroy",function(){return y.$destroy(),T.unbind("resize",M),T.unbind("scroll",N)}),y.$on("update.items",function(a,b,c){var d,e,f,g,h;if(angular.isFunction(b))for(e=function(a){return b(a.scope)},f=0,g=p.length;g>f;f++)d=p[f],e(d);else 0<=(h=b-B-1)&&hh;h++)d=p[h],e.unshift(d);for(g=function(a){return b(a.scope)?(L(e.length-1-c,e.length-c),I--):void 0},c=i=0,m=e.length;m>i;c=++i)f=e[c],g(f)}else 0<=(o=b-B-1)&&oj;c=++j)d=p[c],d.scope.$index=B+c;return l(!1)}),y.$on("insert.item",function(a,b,c){var d,e,f,g,h,i,j,k,m,n,o,q;if(e=[],angular.isFunction(b)){for(f=[],i=0,m=p.length;m>i;i++)c=p[i],f.unshift(c);for(h=function(a){var f,g,h,i,j;if(g=b(a.scope)){if(C=function(a,b){return C(a,b),I++},angular.isArray(g)){for(j=[],f=h=0,i=g.length;i>h;f=++h)c=g[f],j.push(e.push(C(d+f,c)));return j}return e.push(C(d,g))}},d=j=0,n=f.length;n>j;d=++j)g=f[d],h(g)}else 0<=(q=b-B-1)&&qk;d=++k)c=p[d],c.scope.$index=B+d;return l(!1,e)})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b")(i);j.appendChild(k[0]),i.count=f,void 0!==g&&k.eq(0).children().css("height",g),void 0!==h&&(k.eq(0).children().css("background-color",h),k.eq(0).children().css("color",h));var l,m=0;return{start:function(){this.show();var a=this;clearInterval(m),m=setInterval(function(){if(isNaN(f))clearInterval(m),f=0,a.hide();else{var b=100-f;f+=.15*Math.pow(1-Math.sqrt(b),2),a.updateCount(f)}},200)},updateCount:function(a){i.count=a,i.$$phase||i.$apply()},height:function(a){return void 0!==a&&(g=a,i.height=g,i.$$phase||i.$apply()),g},color:function(a){return void 0!==a&&(h=a,i.color=h,i.$$phase||i.$apply()),h},hide:function(){k.children().css("opacity","0");var a=this;a.animate(function(){k.children().css("width","0%"),a.animate(function(){a.show()},500)},500)},show:function(){var a=this;a.animate(function(){k.children().css("opacity","1")},100)},animate:function(a,b){l&&e.cancel(l),l=e(a,b)},status:function(){return f},stop:function(){clearInterval(m)},set:function(a){return this.show(),this.updateCount(a),f=a,clearInterval(m),f},css:function(a){return k.children().css(a)},reset:function(){return clearInterval(m),f=0,this.updateCount(f),0},complete:function(){f=100,this.updateCount(f);var a=this;return clearInterval(m),e(function(){a.hide(),e(function(){f=0,a.updateCount(f)},500)},1e3),f},setParent:function(a){if(null===a||void 0===a)throw new Error("Provide a valid parent of type HTMLElement");null!==j&&void 0!==j&&j.removeChild(k[0]),j=a,j.appendChild(k[0])},getDomElement:function(){return k}}}],this.setColor=function(a){return void 0!==a&&(this.color=a),this.color},this.setHeight=function(a){return void 0!==a&&(this.height=a),this.height}}),angular.module("ngProgress.directive",[]).directive("ngProgress",["$window","$rootScope",function(a,b){var c={replace:!0,restrict:"E",link:function(a,c){b.$watch("count",function(b){(void 0!==b||null!==b)&&(a.counter=b,c.eq(0).children().css("width",b+"%"))}),b.$watch("color",function(b){(void 0!==b||null!==b)&&(a.color=b,c.eq(0).children().css("background-color",b),c.eq(0).children().css("color",b))}),b.$watch("height",function(b){(void 0!==b||null!==b)&&(a.height=b,c.eq(0).children().css("height",b))})},template:'
      '};return c}]),angular.module("ngProgress",["ngProgress.directive","ngProgress.provider"]); -// Source: public/lib/angular-gettext/dist/angular-gettext.min.js -angular.module("gettext",[]),angular.module("gettext").constant("gettext",function(a){return a}),angular.module("gettext").factory("gettextCatalog",["gettextPlurals","$http","$cacheFactory","$interpolate","$rootScope",function(a,b,c,d,e){function f(){e.$broadcast("gettextLanguageChanged")}var g,h=function(a){return g.debug&&g.currentLanguage!==g.baseLanguage?g.debugPrefix+a:a},i=function(a){return g.showTranslatedMarkers?g.translatedMarkerPrefix+a+g.translatedMarkerSuffix:a};return g={debug:!1,debugPrefix:"[MISSING]: ",showTranslatedMarkers:!1,translatedMarkerPrefix:"[",translatedMarkerSuffix:"]",strings:{},baseLanguage:"en",currentLanguage:"en",cache:c("strings"),setCurrentLanguage:function(a){this.currentLanguage=a,f()},setStrings:function(a,b){this.strings[a]||(this.strings[a]={});for(var c in b){var d=b[c];this.strings[a][c]="string"==typeof d?[d]:d}f()},getStringForm:function(a,b){var c=this.strings[this.currentLanguage]||{},d=c[a]||[];return d[b]},getString:function(a,b){return a=this.getStringForm(a,0)||h(a),a=b?d(a)(b):a,i(a)},getPlural:function(b,c,e,f){var g=a(this.currentLanguage,b);return c=this.getStringForm(c,g)||h(1===b?c:e),c=f?d(c)(f):c,i(c)},loadRemote:function(a){return b({method:"GET",url:a,cache:g.cache}).success(function(a){for(var b in a)g.setStrings(b,a[b])})}}}]),angular.module("gettext").directive("translate",["gettextCatalog","$parse","$animate","$compile",function(a,b,c,d){function e(a,b,c){if(!a)throw new Error("You should add a "+b+" attribute whenever you add a "+c+" attribute.")}var f=function(){return String.prototype.trim?function(a){return"string"==typeof a?a.trim():a}:function(a){return"string"==typeof a?a.replace(/^\s*/,"").replace(/\s*$/,""):a}}();return{restrict:"A",terminal:!0,compile:function(g,h){e(!h.translatePlural||h.translateN,"translate-n","translate-plural"),e(!h.translateN||h.translatePlural,"translate-plural","translate-n");var i=f(g.html()),j=h.translatePlural;return{post:function(e,f,g){function h(){var b;j?(e=l||(l=e.$new()),e.$count=k(e),b=a.getPlural(e.$count,i,j)):b=a.getString(i);var g=angular.element(""+b+"");d(g.contents())(e);var h=f.contents(),m=g.contents();c.enter(m,f),c.leave(h)}var k=b(g.translateN),l=null;g.translateN&&e.$watch(g.translateN,h),e.$on("gettextLanguageChanged",h),h()}}}}}]),angular.module("gettext").filter("translate",["gettextCatalog",function(a){function b(b){return a.getString(b)}return b.$stateful=!0,b}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return b%10!=1||b%100==11?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||b%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return b%10==1&&b%100!=11?0:0!=b?1:2;case"lt":return b%10==1&&b%100!=11?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return b%10==1&&b%100!=11?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return b%100==1?1:b%100==2?2:b%100==3||b%100==4?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}); -// Source: public/lib/angular-moment/angular-moment.min.js -"format global";"deps angular";"deps moment";!function(){"use strict";function a(a,b){return a.module("angularMoment",[]).constant("angularMomentConfig",{preprocess:null,timezone:"",format:null}).constant("moment",b).constant("amTimeAgoConfig",{withoutSuffix:!1,serverTime:null,titleFormat:null}).directive("amTimeAgo",["$window","moment","amMoment","amTimeAgoConfig","angularMomentConfig",function(b,c,d,e,f){return function(g,h,i){function j(){var a;if(e.serverTime){var b=(new Date).getTime(),d=b-u+e.serverTime;a=c(d)}else a=c();return a}function k(){q&&(b.clearTimeout(q),q=null)}function l(a){if(h.text(a.from(j(),s)),t&&!h.attr("title")&&h.attr("title",a.local().format(t)),!x){var c=Math.abs(j().diff(a,"minute")),d=3600;1>c?d=1:60>c?d=30:180>c&&(d=300),q=b.setTimeout(function(){l(a)},1e3*d)}}function m(a){y&&h.attr("datetime",a)}function n(){if(k(),o){var a=d.preprocessDate(o,v,r);l(a),m(a.toISOString())}}var o,p,q=null,r=f.format,s=e.withoutSuffix,t=e.titleFormat,u=(new Date).getTime(),v=f.preprocess,w=i.amTimeAgo.replace(/^::/,""),x=0===i.amTimeAgo.indexOf("::"),y="TIME"===h[0].nodeName.toUpperCase();p=g.$watch(w,function(a){return"undefined"==typeof a||null===a||""===a?(k(),void(o&&(h.text(""),m(""),o=null))):(o=a,n(),void(void 0!==a&&x&&p()))}),a.isDefined(i.amWithoutSuffix)&&g.$watch(i.amWithoutSuffix,function(a){"boolean"==typeof a?(s=a,n()):s=e.withoutSuffix}),i.$observe("amFormat",function(a){"undefined"!=typeof a&&(r=a,n())}),i.$observe("amPreprocess",function(a){v=a,n()}),g.$on("$destroy",function(){k()}),g.$on("amMoment:localeChanged",function(){n()})}}]).service("amMoment",["moment","$rootScope","$log","angularMomentConfig",function(b,c,d,e){var f=this;this.preprocessors={utc:b.utc,unix:b.unix},this.changeLocale=function(d){var e=(b.locale||b.lang)(d);return a.isDefined(d)&&(c.$broadcast("amMoment:localeChanged"),c.$broadcast("amMoment:languageChange")),e},this.changeLanguage=function(a){return d.warn("angular-moment: Usage of amMoment.changeLanguage() is deprecated. Please use changeLocale()"),f.changeLocale(a)},this.preprocessDate=function(c,f,g){return a.isUndefined(f)&&(f=e.preprocess),this.preprocessors[f]?this.preprocessors[f](c,g):(f&&d.warn("angular-moment: Ignoring unsupported value for preprocess: "+f),!isNaN(parseFloat(c))&&isFinite(c)?b(parseInt(c,10)):b(c,g))},this.applyTimezone=function(a){var b=e.timezone;return a&&b&&(a.tz?a=a.tz(b):d.warn("angular-moment: timezone specified but moment.tz() is undefined. Did you forget to include moment-timezone.js?")),a}}]).filter("amCalendar",["moment","amMoment",function(a,b){return function(c,d){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var e=a(c);return e.isValid()?b.applyTimezone(e).calendar():""}}]).filter("amDateFormat",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,e);var f=a(c);return f.isValid()?b.applyTimezone(f).format(d):""}}]).filter("amDurationFormat",["moment",function(a){return function(b,c,d){return"undefined"==typeof b||null===b?"":a.duration(b,c).humanize(d)}}]).filter("amTimeAgo",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var f=a(c);return f.isValid()?b.applyTimezone(f).fromNow(e):""}}])}"function"==typeof define&&define.amd?define("angular-moment",["angular","moment"],a):"undefined"!=typeof module&&module&&module.exports?a(angular,require("moment")):a(angular,window.moment)}(); -//# sourceMappingURL=angular-moment.min.js.map \ No newline at end of file diff --git a/server/insight-ui/public/js/angularjs-all.min.js b/server/insight-ui/public/js/angularjs-all.min.js deleted file mode 100644 index 58e359f..0000000 --- a/server/insight-ui/public/js/angularjs-all.min.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! insight-ui 0.4.0 */ -!function(V,W,v){"use strict";function z(b){return function(){var c,a=arguments[0],a="["+(b?b+":":"")+a+"] http://errors.angularjs.org/1.2.32/"+(b?b+"/":"")+a;for(c=1;c0&&a-1 in b}function r(b,a,c){var d;if(b)if(O(b))for(d in b)"prototype"==d||"length"==d||"name"==d||b.hasOwnProperty&&!b.hasOwnProperty(d)||a.call(c,b[d],d);else if(M(b)||Ra(b))for(d=0;d=0&&b.splice(c,1),a}function Ia(b,a,c,d){if(Ha(b)||b&&b.$evalAsync&&b.$watch)throw Ua("cpws");if(a){if(b===a)throw Ua("cpi");if(c=c||[],d=d||[],T(b)){var e=Sa(c,b);if(-1!==e)return d[e];c.push(b),d.push(a)}if(M(b))for(var f=a.length=0;fd;d++)if(!Ba(b[d],a[d]))return!1;return!0}}return!1}function Ab(b,a){var c=2").append(b).html();try{return 3===b[0].nodeType?A(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/,function(a,b){return"<"+A(b)})}catch(d){return A(c)}}function ac(b){try{return decodeURIComponent(b)}catch(a){}}function bc(b){var c,d,a={};return r((b||"").split("&"),function(b){b&&(c=b.replace(/\+/g,"%20").split("="),d=ac(c[0]),G(d)&&(b=G(c[1])?ac(c[1]):!0,kb.call(a,d)?M(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))}),a}function Bb(b){var a=[];return r(b,function(b,d){M(b)?r(b,function(b){a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))}):a.push(Ca(d,!0)+(!0===b?"":"="+Ca(b,!0)))}),a.length?a.join("&"):""}function lb(b){return Ca(b,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function Ca(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Xc(b,a){function c(a){a&&d.push(a)}var e,f,d=[b],g=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;r(g,function(a){g[a]=!0,c(W.getElementById(a)),a=a.replace(":","\\:"),b.querySelectorAll&&(r(b.querySelectorAll("."+a),c),r(b.querySelectorAll("."+a+"\\:"),c),r(b.querySelectorAll("["+a+"]"),c))}),r(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):r(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}}),e&&a(e,f?[f]:[])}function cc(b,a){var c=function(){if(b=D(b),b.injector()){var c=b[0]===W?"document":ia(b);throw Ua("btstrpd",c.replace(//,">"))}return a=a||[],a.unshift(["$provide",function(a){a.value("$rootElement",b)}]),a.unshift("ng"),c=dc(a),c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate",function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d),c(b)(a)})}]),c},d=/^NG_DEFER_BOOTSTRAP!/;return V&&!d.test(V.name)?c():(V.name=V.name.replace(d,""),void(Wa.resumeBootstrap=function(b){r(b,function(b){a.push(b)}),c()}))}function mb(b,a){return a=a||"_",b.replace(Yc,function(b,d){return(d?a:"")+b.toLowerCase()})}function Cb(b,a,c){if(!b)throw Ua("areq",a||"?",c||"required");return b}function Xa(b,a,c){return c&&M(b)&&(b=b[b.length-1]),Cb(O(b),a,"not a function, got "+(b&&"object"==typeof b?b.constructor.name||"Object":typeof b)),b}function Da(b,a){if("hasOwnProperty"===b)throw Ua("badname",a)}function ec(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;f>g;g++)d=a[g],b&&(b=(e=b)[d]);return!c&&O(b)?Ab(e,b):b}function Db(b){var a=b[0];if(b=b[b.length-1],a===b)return D(a);var c=[a];do{if(a=a.nextSibling,!a)break;c.push(a)}while(a!==b);return D(c)}function Zc(b){var a=z("$injector"),c=z("ng");return b=b.angular||(b.angular={}),b.$$minErr=b.$$minErr||z,b.module||(b.module=function(){var b={};return function(e,f,g){if("hasOwnProperty"===e)throw c("badname","module");return f&&b.hasOwnProperty(e)&&(b[e]=null),b[e]||(b[e]=function(){function b(a,d,e){return function(){return c[e||"push"]([a,d,arguments]),n}}if(!f)throw a("nomod",e);var c=[],d=[],m=b("$injector","invoke"),n={_invokeQueue:c,_runBlocks:d,requires:f,name:e,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:b("$provide","value"),constant:b("$provide","constant","unshift"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),config:m,run:function(a){return d.push(a),this}};return g&&m(g),n}())}}())}function $c(b){F(b,{bootstrap:cc,copy:Ia,extend:F,equals:Ba,element:D,forEach:r,injector:dc,noop:B,bind:Ab,toJson:oa,fromJson:$b,identity:ga,isUndefined:H,isDefined:G,isString:E,isFunction:O,isObject:T,isNumber:ib,isElement:Uc,isArray:M,version:ad,isDate:ua,lowercase:A,uppercase:Ja,callbacks:{counter:0},$$minErr:z,$$csp:Ya}),Za=Zc(V);try{Za("ngLocale")}catch(a){Za("ngLocale",[]).provider("$locale",bd)}Za("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:cd}),a.provider("$compile",fc).directive({a:dd,input:gc,textarea:gc,form:ed,script:fd,select:gd,style:hd,option:id,ngBind:jd,ngBindHtml:kd,ngBindTemplate:ld,ngClass:md,ngClassEven:nd,ngClassOdd:od,ngCloak:pd,ngController:qd,ngForm:rd,ngHide:sd,ngIf:td,ngInclude:ud,ngInit:vd,ngNonBindable:wd,ngPluralize:xd,ngRepeat:yd,ngShow:zd,ngStyle:Ad,ngSwitch:Bd,ngSwitchWhen:Cd,ngSwitchDefault:Dd,ngOptions:Ed,ngTransclude:Fd,ngModel:Gd,ngList:Hd,ngChange:Id,required:hc,ngRequired:hc,ngValue:Jd}).directive({ngInclude:Kd}).directive(Eb).directive(ic),a.provider({$anchorScroll:Ld,$animate:Md,$browser:Nd,$cacheFactory:Od,$controller:Pd,$document:Qd,$exceptionHandler:Rd,$filter:jc,$interpolate:Sd,$interval:Td,$http:Ud,$httpBackend:Vd,$location:Wd,$log:Xd,$parse:Yd,$rootScope:Zd,$q:$d,$sce:ae,$sceDelegate:be,$sniffer:ce,$templateCache:de,$timeout:ee,$window:fe,$$rAF:ge,$$asyncCallback:he})}])}function $a(b){return b.replace(ie,function(a,b,d,e){return e?d.toUpperCase():d}).replace(je,"Moz$1")}function Fb(b,a,c,d){function e(b){var l,m,n,q,p,s,e=c&&b?[this.filter(b)]:[this],k=a;if(!d||null!=b)for(;e.length;)for(l=e.shift(),m=0,n=l.length;n>m;m++)for(q=D(l[m]),k?q.triggerHandler("$destroy"):k=!k,p=0,q=(s=q.children()).length;q>p;p++)e.push(Ea(s[p]));return f.apply(this,arguments)}var f=Ea.fn[b],f=f.$original||f;e.$original=f,Ea.fn[b]=e}function S(b){if(b instanceof S)return b;if(E(b)&&(b=$(b)),!(this instanceof S)){if(E(b)&&"<"!=b.charAt(0))throw Gb("nosel");return new S(b)}if(E(b)){var a=b;b=W;var c;if(c=ke.exec(a))b=[b.createElement(c[1])];else{var e,d=b;if(b=d.createDocumentFragment(),c=[],Hb.test(a)){for(d=b.appendChild(d.createElement("div")),e=(le.exec(a)||["",""])[1].toLowerCase(),e=ca[e]||ca._default,d.innerHTML="
       
      "+e[1]+a.replace(me,"<$1>")+e[2],d.removeChild(d.firstChild),a=e[0];a--;)d=d.lastChild;for(a=0,e=d.childNodes.length;e>a;++a)c.push(d.childNodes[a]);d=b.firstChild,d.textContent=""}else c.push(d.createTextNode(a));b.textContent="",b.innerHTML="",b=c}Ib(this,b),D(W.createDocumentFragment()).append(this)}else Ib(this,b)}function Jb(b){return b.cloneNode(!0)}function Ka(b){Kb(b);var a=0;for(b=b.childNodes||[];ad;d++)if((c=D.data(b,a[d]))!==v)return c;b=b.parentNode||11===b.nodeType&&b.host}}function mc(b){for(var a=0,c=b.childNodes;a=u?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};return c.elem=b,c}function La(b,a){var d,c=typeof b;return"function"==c||"object"==c&&null!==b?"function"==typeof(d=b.$$hashKey)?d=b.$$hashKey():d===v&&(d=b.$$hashKey=(a||hb)()):d=b,c+":"+d}function cb(b,a){if(a){var c=0;this.nextUid=function(){return++c}}r(b,this.put,this)}function pc(b){var a,c;return"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(pe,""),c=c.match(qe),r(c[1].split(re),function(b){b.replace(se,function(b,c,d){a.push(d)})})),b.$inject=a):M(b)?(c=b.length-1,Xa(b[c],"fn"),a=b.slice(0,c)):Xa(b,"fn",!0),a}function dc(b){function a(a){return function(b,c){return T(b)?void r(b,Xb(a)):a(b,c)}}function c(a,b){if(Da(a,"service"),(O(b)||M(b))&&(b=n.instantiate(b)),!b.$get)throw db("pget",a);return m[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var c,d,f,h,b=[];return r(a,function(a){if(!l.get(a)){l.put(a,!0);try{if(E(a))for(c=Za(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,f=0,h=d.length;h>f;f++){var g=d[f],k=n.get(g[0]);k[g[1]].apply(k,g[2])}else O(a)?b.push(n.invoke(a)):M(a)?b.push(n.invoke(a)):Xa(a,"module")}catch(p){throw M(a)&&(a=a[a.length-1]),p.message&&p.stack&&-1==p.stack.indexOf(p.message)&&(p=p.message+"\n"+p.stack),db("modulerr",a,p.stack||p.message||p)}}}),b}function f(a,b){function c(d){if(a.hasOwnProperty(d)){if(a[d]===g)throw db("cdep",d+" <- "+k.join(" <- "));return a[d]}try{return k.unshift(d),a[d]=g,a[d]=b(d)}catch(e){throw a[d]===g&&delete a[d],e}finally{k.shift()}}function d(a,b,e){var g,k,p,f=[],h=pc(a);for(k=0,g=h.length;g>k;k++){if(p=h[k],"string"!=typeof p)throw db("itkn",p);f.push(e&&e.hasOwnProperty(p)?e[p]:c(p))}return M(a)&&(a=a[g]),a.apply(b,f)}return{invoke:d,instantiate:function(a,b){var e,c=function(){};return c.prototype=(M(a)?a[a.length-1]:a).prototype,c=new c,e=d(a,c,b),T(e)||O(e)?e:c},get:c,annotate:pc,has:function(b){return m.hasOwnProperty(b+h)||a.hasOwnProperty(b)}}}var g={},h="Provider",k=[],l=new cb([],!0),m={$provide:{provider:a(c),factory:a(d),service:a(function(a,b){return d(a,["$injector",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,Z(b))}),constant:a(function(a,b){Da(a,"constant"),m[a]=b,q[a]=b}),decorator:function(a,b){var c=n.get(a+h),d=c.$get;c.$get=function(){var a=p.invoke(d,c);return p.invoke(b,null,{$delegate:a})}}}},n=m.$injector=f(m,function(){throw db("unpr",k.join(" <- "))}),q={},p=q.$injector=f(q,function(a){return a=n.get(a+h),p.invoke(a.$get,a)});return r(e(b),function(a){p.invoke(a||B)}),p}function Ld(){var b=!0;this.disableAutoScrolling=function(){b=!1},this.$get=["$window","$location","$rootScope",function(a,c,d){function e(a){var b=null;return r(a,function(a){b||"a"!==A(a.nodeName)||(b=a)}),b}function f(){var d,b=c.hash();b?(d=g.getElementById(b))?d.scrollIntoView():(d=e(g.getElementsByName(b)))?d.scrollIntoView():"top"===b&&a.scrollTo(0,0):a.scrollTo(0,0)}var g=a.document;return b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(f)}),f}]}function he(){this.$get=["$$rAF","$timeout",function(b,a){return b.supported?function(a){return b(a)}:function(b){return a(b,0,!1)}}]}function te(b,a,c,d){function e(a){try{a.apply(null,va.call(arguments,1))}finally{if(s--,0===s)for(;K.length;)try{K.pop()()}catch(b){c.error(b)}}}function f(a,b){!function da(){r(w,function(a){a()}),t=b(da,a)}()}function g(){x!=h.url()&&(x=h.url(),r(aa,function(a){a(h.url())}))}var h=this,k=a[0],l=b.location,m=b.history,n=b.setTimeout,q=b.clearTimeout,p={};h.isMock=!1;var s=0,K=[];h.$$completeOutstandingRequest=e,h.$$incOutstandingRequestCount=function(){s++},h.notifyWhenNoOutstandingRequests=function(a){r(w,function(a){a()}),0===s?a():K.push(a)};var t,w=[];h.addPollFn=function(a){return H(t)&&f(100,n),w.push(a),a};var x=l.href,L=a.find("base"),y=null;h.url=function(a,c){if(l!==b.location&&(l=b.location),m!==b.history&&(m=b.history),!a)return y||l.href.replace(/%27/g,"'");if(x!=a){var e=x&&Fa(x)===Fa(a);if(x=a,!e&&d.history)c?m.replaceState(null,"",a):(m.pushState(null,"",a),L.attr("href",L.attr("href")));else if(e||(y=a),c)l.replace(a);else if(e){var f,e=l;f=a.indexOf("#"),f=-1===f?"":a.substr(f+1),e.hash=f}else l.href=a;return h}};var aa=[],P=!1;h.onUrlChange=function(a){return P||(d.history&&D(b).on("popstate",g),d.hashchange?D(b).on("hashchange",g):h.addPollFn(g),P=!0),aa.push(a),a},h.$$checkUrlChange=g,h.baseHref=function(){var a=L.attr("href");return a?a.replace(/^(https?\:)?\/\/[^\/]*/,""):""};var N={},ba="",Q=h.baseHref();h.cookies=function(a,b){var d,e,f,h;if(!a){if(k.cookie!==ba)for(ba=k.cookie,d=ba.split("; "),N={},f=0;f0&&(a=unescape(e.substring(0,h)),N[a]===v&&(N[a]=unescape(e.substring(h+1))));return N}b===v?k.cookie=escape(a)+"=;path="+Q+";expires=Thu, 01 Jan 1970 00:00:00 GMT":E(b)&&(d=(k.cookie=escape(a)+"="+escape(b)+";path="+Q).length+1,d>4096&&c.warn("Cookie '"+a+"' possibly not set or overflowed because it was too large ("+d+" > 4096 bytes)!"))},h.defer=function(a,b){var c;return s++,c=n(function(){delete p[c],e(a)},b||0),p[c]=!0,c},h.defer.cancel=function(a){return p[a]?(delete p[a],q(a),e(B),!0):!1}}function Nd(){this.$get=["$window","$log","$sniffer","$document",function(b,a,c,d){return new te(b,d,a,c)}]}function Od(){this.$get=function(){function b(b,d){function e(a){a!=n&&(q?q==a&&(q=a.n):q=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!=b&&(a&&(a.p=b),b&&(b.n=a))}if(b in a)throw z("$cacheFactory")("iid",b);var g=0,h=F({},d,{id:b}),k={},l=d&&d.capacity||Number.MAX_VALUE,m={},n=null,q=null;return a[b]={put:function(a,b){if(ll&&this.remove(q.key),b)},get:function(a){if(l
      ").parent()[0])});var f=P(a,b,a,c,d,e);return aa(a,"ng-scope"),function(b,c,d,e){Cb(b,"scope");var g=c?Ma.clone.call(a):a;r(d,function(a,b){g.data("$"+b+"Controller",a)}),d=0;for(var k=g.length;k>d;d++){var p=g[d].nodeType;1!==p&&9!==p||g.eq(d).data("$scope",b)}return c&&c(g,b),f&&f(b,g,g,e),g}}function aa(a,b){try{a.addClass(b)}catch(c){}}function P(a,b,c,d,e,f){function g(a,c,d,e){var f,p,m,l,q,n,w;f=c.length;var s=Array(f);for(l=0;f>l;l++)s[l]=c[l];for(n=l=0,q=k.length;q>l;n++)p=s[n],c=k[l++],f=k[l++],c?(c.scope?(m=a.$new(),D.data(p,"$scope",m)):m=a,w=c.transcludeOnThisElement?N(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?N(a,b):null,c(f,m,p,d,w)):f&&f(a,p.childNodes,v,e)}for(var p,m,l,q,k=[],n=0;ns;s++){var K=!1,x=!1;if(l=w[s],!u||u>=8||l.specified){m=l.name,q=$(l.value),l=qa(m),(n=U.test(l))&&(m=mb(l.substr(6),"-"));var y=l.replace(/(Start|End)$/,"");l===y+"Start"&&(K=m,x=m.substr(0,m.length-5)+"end",m=m.substr(0,m.length-6)),l=qa(m.toLowerCase()),k[l]=m,(n||!c.hasOwnProperty(l))&&(c[l]=q,nc(a,l)&&(c[l]=!0)),S(a,b,q,l),da(b,l,"A",d,g,K,x)}}if("input"===p&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off"),a=a.className,E(a)&&""!==a)for(;p=f.exec(a);)l=qa(p[2]),da(b,l,"C",d,g)&&(c[l]=$(p[3])),a=a.substr(p.index+p[0].length);break;case 3:if(11===u)for(;a.parentNode&&a.nextSibling&&3===a.nextSibling.nodeType;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);A(b,a.nodeValue);break;case 8:try{(p=e.exec(a.nodeValue))&&(l=qa(p[1]),da(b,l,"M",d,g)&&(c[l]=$(p[2])))}catch(r){}}return b.sort(H),b}function Q(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ja("uterdir",b,c);1==a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--),d.push(a),a=a.nextSibling}while(e>0)}else d.push(a);return D(d)}function C(a,b,c){return function(d,e,f,g,k){return e=Q(e[0],b,c),a(d,e,f,g,k)}}function J(a,c,d,e,f,g,k,q,n){function w(a,b,c,d){a&&(c&&(a=C(a,c,d)),a.require=I.require,a.directiveName=z,(L===I||I.$$isolateScope)&&(a=qc(a,{isolateScope:!0})),k.push(a)),b&&(c&&(b=C(b,c,d)),b.require=I.require,b.directiveName=z,(L===I||I.$$isolateScope)&&(b=qc(b,{isolateScope:!0})),q.push(b))}function t(a,b,c,d){var e,f="data",g=!1;if(E(b)){for(;"^"==(e=b.charAt(0))||"?"==e;)b=b.substr(1),"^"==e&&(f="inheritedData"),g=g||"?"==e;if(e=null,d&&"data"===f&&(e=d[b]),e=e||c[f]("$"+b+"Controller"),!e&&!g)throw ja("ctreq",b,a)}else M(b)&&(e=[],r(b,function(b){e.push(t(a,b,c,d))}));return e}function K(a,e,f,g,n){function w(a,b){var c;return 2>arguments.length&&(b=a,a=v),Ga&&(c=ba),n(a,b,c)}var x,R,y,N,C,Q,ra,ba={};if(x=c===f?d:ha(d,new Nb(D(f),d.$attr)),R=x.$$element,L){var ve=/^\s*([@=&])(\??)\s*(\w*)\s*$/;Q=e.$new(!0),!J||J!==L&&J!==L.$$originalDirective?R.data("$isolateScopeNoTemplate",Q):R.data("$isolateScope",Q),aa(R,"ng-isolate-scope"),r(L.scope,function(a,c){var k,m,n,q,d=a.match(ve)||[],f=d[3]||c,g="?"==d[2],d=d[1];switch(Q.$$isolateBindings[c]=d+f,d){case"@":x.$observe(f,function(a){Q[c]=a}),x.$$observers[f].$$scope=e,x[f]&&(Q[c]=b(x[f])(e));break;case"=":if(g&&!x[f])break;m=p(x[f]),q=m.literal?Ba:function(a,b){return a===b||a!==a&&b!==b},n=m.assign||function(){throw k=Q[c]=m(e),ja("nonassign",x[f],L.name)},k=Q[c]=m(e),Q.$watch(function(){var a=m(e);return q(a,Q[c])||(q(a,k)?n(e,a=Q[c]):Q[c]=a),k=a},null,m.literal);break;case"&":m=p(x[f]),Q[c]=function(a){return m(e,a)};break;default:throw ja("iscp",L.name,c,a)}})}for(ra=n&&w,P&&r(P,function(a){var c,b={$scope:a===L||a.$$isolateScope?Q:e,$element:R,$attrs:x,$transclude:ra};C=a.controller,"@"==C&&(C=x[a.name]),c=s(C,b),ba[a.name]=c,Ga||R.data("$"+a.name+"Controller",c),a.controllerAs&&(b.$scope[a.controllerAs]=c)}),g=0,y=k.length;y>g;g++)try{(N=k[g])(N.isolateScope?Q:e,R,x,N.require&&t(N.directiveName,N.require,R,ba),ra)}catch(u){m(u,ia(R))}for(g=e,L&&(L.template||null===L.templateUrl)&&(g=Q),a&&a(g,f.childNodes,v,n),g=q.length-1;g>=0;g--)try{(N=q[g])(N.isolateScope?Q:e,R,x,N.require&&t(N.directiveName,N.require,R,ba),ra)}catch(I){m(I,ia(R))}}n=n||{};for(var N,I,z,u,Oa,x=-Number.MAX_VALUE,P=n.controllerDirectives,L=n.newIsolateScopeDirective,J=n.templateDirective,da=n.nonTlbTranscludeDirective,H=!1,F=!1,Ga=n.hasElementTranscludeDirective,A=d.$$element=D(c),S=e,ka=0,U=a.length;U>ka;ka++){I=a[ka];var X=I.$$start,Y=I.$$end;if(X&&(A=Q(c,X,Y)),u=v,x>I.priority)break;if((u=I.scope)&&(N=N||I,I.templateUrl||(eb("new/isolated scope",L,I,A),T(u)&&(L=I))),z=I.name,!I.templateUrl&&I.controller&&(u=I.controller,P=P||{},eb("'"+z+"' controller",P[z],I,A),P[z]=I),(u=I.transclude)&&(H=!0,I.$$tlb||(eb("transclusion",da,I,A),da=I),"element"==u?(Ga=!0,x=I.priority,u=A,A=d.$$element=D(W.createComment(" "+z+": "+d[z]+" ")),c=A[0],ra(f,va.call(u,0),c),S=y(u,e,x,g&&g.name,{nonTlbTranscludeDirective:da})):(u=D(Jb(c)).contents(),A.empty(),S=y(u,e))),I.template)if(F=!0,eb("template",J,I,A),J=I,u=O(I.template)?I.template(A,d):I.template,u=V(u),I.replace){if(g=I,u=Hb.test(u)?D($(u)):[],c=u[0],1!=u.length||1!==c.nodeType)throw ja("tplrt",z,"");ra(f,A,c),U={$attr:{}},u=ba(c,[],U);var we=a.splice(ka+1,a.length-(ka+1));L&&G(u),a=a.concat(u).concat(we),B(d,U),U=a.length}else A.html(u);if(I.templateUrl)F=!0,eb("template",J,I,A),J=I,I.replace&&(g=I),K=ue(a.splice(ka,a.length-ka),A,d,f,H&&S,k,q,{controllerDirectives:P,newIsolateScopeDirective:L,templateDirective:J,nonTlbTranscludeDirective:da}),U=a.length;else if(I.compile)try{Oa=I.compile(A,d,S),O(Oa)?w(null,Oa,X,Y):Oa&&w(Oa.pre,Oa.post,X,Y)}catch(Z){m(Z,ia(A))}I.terminal&&(K.terminal=!0,x=Math.max(x,I.priority))}return K.scope=N&&!0===N.scope,K.transcludeOnThisElement=H,K.templateOnThisElement=F,K.transclude=S,n.hasElementTranscludeDirective=Ga,K}function G(a){for(var b=0,c=a.length;c>b;b++)a[b]=Zb(a[b],{$$isolateScope:!0})}function da(b,e,f,g,p,l,n){if(e===p)return null;if(p=null,c.hasOwnProperty(e)){var q;e=a.get(e+d);for(var w=0,s=e.length;s>w;w++)try{q=e[w],(g===v||g>q.priority)&&-1!=q.restrict.indexOf(f)&&(l&&(q=Zb(q,{$$start:l,$$end:n})),b.push(q),p=q)}catch(x){m(x)}}return p}function B(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}),r(b,function(b,f){"class"==f?(aa(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function ue(a,b,c,d,e,f,g,k){var l,m,p=[],w=b[0],s=a.shift(),x=F({},s,{templateUrl:null,transclude:null,replace:null,$$originalDirective:s}),K=O(s.templateUrl)?s.templateUrl(b,c):s.templateUrl;return b.empty(),n.get(t.getTrustedResourceUrl(K),{cache:q}).success(function(q){var n,t;if(q=V(q),s.replace){if(q=Hb.test(q)?D($(q)):[],n=q[0],1!=q.length||1!==n.nodeType)throw ja("tplrt",s.name,K);q={$attr:{}},ra(d,b,n);var y=ba(n,[],q);T(s.scope)&&G(y),a=y.concat(a),B(c,q)}else n=w,b.html(q);for(a.unshift(x),l=J(a,n,c,e,b,s,f,g,k),r(d,function(a,c){a==n&&(d[c]=b[0])}),m=P(b[0].childNodes,e);p.length;){q=p.shift(),t=p.shift();var L=p.shift(),C=p.shift(),y=b[0];if(t!==w){var Q=t.className;k.hasElementTranscludeDirective&&s.replace||(y=Jb(n)),ra(L,D(t),y),aa(D(y),Q)}t=l.transcludeOnThisElement?N(q,l.transclude,C):C,l(m,q,y,d,t)}p=null}).error(function(a,b,c,d){throw ja("tpload",d.url)}),function(a,b,c,d,e){a=e,p?(p.push(b),p.push(c),p.push(d),p.push(a)):(l.transcludeOnThisElement&&(a=N(b,l.transclude,e)),l(m,b,c,d,a))}}function H(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.nameg;g++)if(a[g]==d){a[g++]=c,k=g+e-1;for(var p=a.length;p>g;g++,k++)p>k?a[g]=a[k]:delete a[g];a.length-=e-1;break}for(f&&f.replaceChild(c,d),a=W.createDocumentFragment(),a.appendChild(d),c[D.expando]=d[D.expando],d=1,e=b.length;e>d;d++)f=b[d],D(f).remove(),a.appendChild(f),delete b[d];b[0]=c,b.length=1}function qc(a,b){return F(function(){return a.apply(null,arguments)},a,b)}var Nb=function(a,b){this.$$element=a,this.$attr=b||{}};Nb.prototype={$normalize:qa,$addClass:function(a){a&&0a.status?d:n.reject(d)}var c={method:"get",transformRequest:e.transformRequest,transformResponse:e.transformResponse},d=function(a){var d,f,b=e.headers,c=F({},a.headers),b=F({},b.common,b[A(a.method)]);a:for(d in b){a=A(d);for(f in c)if(A(f)===a)continue a;c[d]=b[d]}return function(a){var b;r(a,function(c,d){O(c)&&(b=c(),null!=b?a[d]=b:delete a[d])})}(c),c}(a);F(c,a),c.headers=d,c.method=Ja(c.method);var f=[function(a){d=a.headers;var c=uc(a.data,tc(d),a.transformRequest);return H(c)&&r(d,function(a,b){"content-type"===A(b)&&delete d[b]}),H(a.withCredentials)&&!H(e.withCredentials)&&(a.withCredentials=e.withCredentials),s(a,c,d).then(b,b)},v],g=n.when(c);for(r(t,function(a){(a.request||a.requestError)&&f.unshift(a.request,a.requestError),(a.response||a.responseError)&&f.push(a.response,a.responseError)});f.length;){a=f.shift();var h=f.shift(),g=g.then(a,h)}return g.success=function(a){return g.then(function(b){a(b.data,b.status,b.headers,c)}),g},g.error=function(a){return g.then(null,function(b){a(b.data,b.status,b.headers,c)}),g},g}function s(c,f,g){function l(a,b,c,e){C&&(a>=200&&300>a?C.put(u,[a,b,sc(c),e]):C.remove(u)),q(b,a,c,e),d.$$phase||d.$apply()}function q(a,b,d,e){b=Math.max(b,0),(b>=200&&300>b?t.resolve:t.reject)({data:a,status:b,headers:tc(d),config:c,statusText:e})}function s(){var a=Sa(p.pendingRequests,c);-1!==a&&p.pendingRequests.splice(a,1)}var C,J,t=n.defer(),r=t.promise,u=K(c.url,c.params);if(p.pendingRequests.push(c),r.then(s,s),!c.cache&&!e.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(C=T(c.cache)?c.cache:T(e.cache)?e.cache:w),C)if(J=C.get(u),G(J)){if(J&&O(J.then))return J.then(s,s),J;M(J)?q(J[1],J[0],ha(J[2]),J[3]):q(J,200,{},"OK")}else C.put(u,r);return H(J)&&((J=Ob(c.url)?b.cookies()[c.xsrfCookieName||e.xsrfCookieName]:v)&&(g[c.xsrfHeaderName||e.xsrfHeaderName]=J),a(c.method,u,f,l,g,c.timeout,c.withCredentials,c.responseType)),r}function K(a,b){if(!b)return a;var c=[];return Tc(b,function(a,b){null===a||H(a)||(M(a)||(a=[a]),r(a,function(a){T(a)&&(a=ua(a)?a.toISOString():oa(a)),c.push(Ca(b)+"="+Ca(a))}))}),0=u&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!V.XMLHttpRequest))return new V.ActiveXObject("Microsoft.XMLHTTP");if(V.XMLHttpRequest)return new V.XMLHttpRequest;throw z("$httpBackend")("noxhr")}function Vd(){this.$get=["$browser","$window","$document",function(b,a,c){return ze(b,ye,b.defer,a.angular.callbacks,c[0])}]}function ze(b,a,c,d,e){function f(a,b,c){var f=e.createElement("script"),g=null;return f.type="text/javascript",f.src=a,f.async=!0,g=function(a){ab(f,"load",g),ab(f,"error",g),e.body.removeChild(f),f=null;var h=-1,s="unknown";a&&("load"!==a.type||d[b].called||(a={type:"error"}),s=a.type,h="error"===a.type?404:200),c&&c(h,s)},rb(f,"load",g),rb(f,"error",g),8>=u&&(f.onreadystatechange=function(){E(f.readyState)&&/loaded|complete/.test(f.readyState)&&(f.onreadystatechange=null,g({type:"load"}))}),e.body.appendChild(f),g}var g=-1;return function(e,k,l,m,n,q,p,s){function K(){t=g,L&&L(),y&&y.abort()}function w(a,d,e,f,g){P&&c.cancel(P),L=y=null,0===d&&(d=e?200:"file"==wa(k).protocol?404:0),a(1223===d?204:d,e,f,g||""),b.$$completeOutstandingRequest(B)}var t;if(b.$$incOutstandingRequestCount(),k=k||b.url(),"jsonp"==A(e)){var x="_"+(d.counter++).toString(36);d[x]=function(a){d[x].data=a,d[x].called=!0};var L=f(k.replace("JSON_CALLBACK","angular.callbacks."+x),x,function(a,b){w(m,a,d[x].data,"",b),d[x]=B})}else{var y=a(e);if(y.open(e,k,!0),r(n,function(a,b){G(a)&&y.setRequestHeader(b,a)}),y.onreadystatechange=function(){if(y&&4==y.readyState){var a=null,b=null,c="";t!==g&&(a=y.getAllResponseHeaders(),b="response"in y?y.response:y.responseText),t===g&&10>u||(c=y.statusText),w(m,t||y.status,b,a,c)}},p&&(y.withCredentials=!0),s)try{y.responseType=s}catch(aa){if("json"!==s)throw aa}y.send(l||null)}if(q>0)var P=c(K,q);else q&&O(q.then)&&q.then(K)}}function Sd(){var b="{{",a="}}";this.startSymbol=function(a){return a?(b=a,this):b},this.endSymbol=function(b){return b?(a=b,this):a},this.$get=["$parse","$exceptionHandler","$sce",function(c,d,e){function f(f,l,m){for(var n,q,p=0,s=[],K=f.length,w=!1,t=[];K>p;)-1!=(n=f.indexOf(b,p))&&-1!=(q=f.indexOf(a,n+g))?(p!=n&&s.push(f.substring(p,n)),s.push(p=c(w=f.substring(n+g,q))),p.exp=w,p=q+h,w=!0):(p!=K&&s.push(f.substring(p)),p=K);if((K=s.length)||(s.push(""),K=1),m&&1b;b++){if("function"==typeof(g=s[b]))if(g=g(a),g=m?e.getTrusted(m,g):e.valueOf(g),null==g)g="";else switch(typeof g){case"string":break;case"number":g=""+g;break;default:g=oa(g)}t[b]=g}return t.join("")}catch(h){a=vc("interr",f,h.toString()),d(a)}},p.exp=f,p.parts=s,p):void 0}var g=b.length,h=a.length;return f.startSymbol=function(){return b},f.endSymbol=function(){return a},f}]}function Td(){this.$get=["$rootScope","$window","$q",function(b,a,c){function d(d,g,h,k){var l=a.setInterval,m=a.clearInterval,n=c.defer(),q=n.promise,p=0,s=G(k)&&!k;return h=G(h)?h:0,q.then(null,null,d),q.$$intervalId=l(function(){n.notify(p++),h>0&&p>=h&&(n.resolve(p),m(q.$$intervalId),delete e[q.$$intervalId]),s||b.$apply()},g),e[q.$$intervalId]=n,q}var e={};return d.cancel=function(b){return b&&b.$$intervalId in e?(e[b.$$intervalId].reject("canceled"),a.clearInterval(b.$$intervalId),delete e[b.$$intervalId],!0):!1},d}]}function bd(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"¤",posSuf:"",negPre:"(¤",negSuf:")",gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy",mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function Pb(b){b=b.split("/");for(var a=b.length;a--;)b[a]=lb(b[a]);return b.join("/")}function wc(b,a,c){b=wa(b,c),a.$$protocol=b.protocol,a.$$host=b.hostname,a.$$port=U(b.port)||Ae[b.protocol]||null}function xc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b),b=wa(b,c),a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname),a.$$search=bc(b.search),a.$$hash=decodeURIComponent(b.hash),a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function sa(b,a){return 0===a.indexOf(b)?a.substr(b.length):void 0}function Fa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function yc(b){return b.replace(/(#.+)|#$/,"$1")}function Qb(b){return b.substr(0,Fa(b).lastIndexOf("/")+1)}function zc(b,a){this.$$html5=!0,a=a||"";var c=Qb(b);wc(b,this,b),this.$$parse=function(a){var e=sa(c,a);if(!E(e))throw Rb("ipthprfx",a,c);xc(e,this,b),this.$$path||(this.$$path="/"),this.$$compose()},this.$$compose=function(){var a=Bb(this.$$search),b=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(a?"?"+a:"")+b,this.$$absUrl=c+this.$$url.substr(1)},this.$$parseLinkUrl=function(d,e){var f,g;return(f=sa(b,d))!==v?(g=f,g=(f=sa(a,f))!==v?c+(sa("/",f)||f):b+g):(f=sa(c,d))!==v?g=c+f:c==d+"/"&&(g=c),g&&this.$$parse(g),!!g}}function Sb(b,a){var c=Qb(b);wc(b,this,b),this.$$parse=function(d){var e=sa(b,d)||sa(c,d),e="#"==e.charAt(0)?sa(a,e):this.$$html5?e:"";if(!E(e))throw Rb("ihshprfx",d,a);xc(e,this,b),d=this.$$path;var f=/^\/[A-Z]:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b,"")),f.exec(e)||(d=(e=f.exec(d))?e[1]:d),this.$$path=d,this.$$compose()},this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e,this.$$absUrl=b+(this.$$url?a+this.$$url:"")},this.$$parseLinkUrl=function(a,c){return Fa(b)==Fa(a)?(this.$$parse(a),!0):!1}}function Ac(b,a){this.$$html5=!0,Sb.apply(this,arguments);var c=Qb(b);this.$$parseLinkUrl=function(d,e){var f,g;return b==Fa(d)?f=d:(g=sa(c,d))?f=b+a+g:c===d+"/"&&(f=c),f&&this.$$parse(f),!!f},this.$$compose=function(){var c=Bb(this.$$search),e=this.$$hash?"#"+lb(this.$$hash):"";this.$$url=Pb(this.$$path)+(c?"?"+c:"")+e,this.$$absUrl=b+a+this.$$url}}function sb(b){return function(){return this[b]}}function Bc(b,a){return function(c){return H(c)?this[b]:(this[b]=a(c),this.$$compose(),this)}}function Wd(){var b="",a=!1;this.hashPrefix=function(a){return G(a)?(b=a,this):b},this.html5Mode=function(b){return G(b)?(a=b,this):a},this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,k=d.baseHref(),l=d.url();a?(k=l.substring(0,l.indexOf("/",l.indexOf("//")+2))+(k||"/"),e=e.history?zc:Ac):(k=Fa(l),e=Sb),h=new e(k,"#"+b),h.$$parseLinkUrl(l,l);var m=/^\s*(javascript|mailto):/i;f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=D(a.target);"a"!==A(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href"),g=b.attr("href")||b.attr("xlink:href");T(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=wa(e.animVal).href),m.test(e)||!e||b.attr("target")||a.isDefaultPrevented()||!h.$$parseLinkUrl(e,g)||(a.preventDefault(),h.absUrl()!=d.url()&&(c.$apply(),V.angular["ff-684208-preventDefault"]=!0))}}),h.absUrl()!=l&&d.url(h.absUrl(),!0),d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a),c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var n=0;return c.$watch(function(){var a=yc(d.url()),b=yc(h.absUrl()),e=h.$$replace;return n&&a==b||(n++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),e),g(a))})),h.$$replace=!1,n}),h}]}function Xd(){var b=!0,a=this;this.debugEnabled=function(a){return G(a)?(b=a,this):b},this.$get=["$window",function(c){function d(a){return a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line)),a}function e(a){var b=c.console||{},e=b[a]||b.log||B;a=!1;try{a=!!e.apply}catch(k){}return a?function(){var a=[];return r(arguments,function(b){a.push(d(b))}),e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function la(b,a){if("__defineGetter__"===b||"__defineSetter__"===b||"__lookupGetter__"===b||"__lookupSetter__"===b||"__proto__"===b)throw ea("isecfld",a);return b}function Cc(b,a){if(b+="",!E(b))throw ea("iseccst",a);return b}function ma(b,a){if(b){if(b.constructor===b)throw ea("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ea("isecwindow",a);if(b.children&&(b.nodeName||b.prop&&b.attr&&b.find))throw ea("isecdom",a);if(b===Object)throw ea("isecobj",a)}return b}function tb(b,a,c,d,e){ma(b,d),e=e||{},a=a.split(".");for(var f,g=0;1g?Dc(f[0],f[1],f[2],f[3],f[4],c,a):function(b,d){var h,e=0;do h=Dc(f[e++],f[e++],f[e++],f[e++],f[e++],c,a)(b,d),d=v,b=h;while(g>e);return h};else{var k="var p;\n";d&&(k+="s = eso(s, fe);\nl = eso(l, fe);\n");var l=d;r(f,function(b,e){la(b,c);var f=(e?"s":'((l&&l.hasOwnProperty("'+b+'"))?l:s)')+'["'+b+'"]',g=d||Pa(b);g&&(f="eso("+f+", fe)",l=!0),k+="if(s == null) return undefined;\ns="+f+";\n",a.unwrapPromises&&(k+='if (s && s.then) {\n pw("'+c.replace(/(["\r\n])/g,"\\$1")+'");\n if (!("$$v" in s)) {\n p=s;\n p.$$v = undefined;\n p.then(function(v) {p.$$v='+(g?"eso(v)":"v")+";});\n}\n s="+(g?"eso(s.$$v)":"s.$$v")+"\n}\n")}),k+="return s;",h=new Function("s","l","pw","eso","fe",k),h.toString=Z(k),(l||a.unwrapPromises)&&(h=Be(h,c))}return"hasOwnProperty"!==b&&(e[b]=h),h}function Yd(){var b={},a={},c={csp:!1,unwrapPromises:!1,logPromiseWarnings:!0,expensiveChecks:!1};this.unwrapPromises=function(a){return G(a)?(c.unwrapPromises=!!a,this):c.unwrapPromises},this.logPromiseWarnings=function(a){return G(a)?(c.logPromiseWarnings=a,this):c.logPromiseWarnings},this.$get=["$filter","$sniffer","$log",function(d,e,f){c.csp=e.csp;var g={csp:c.csp,unwrapPromises:c.unwrapPromises,logPromiseWarnings:c.logPromiseWarnings,expensiveChecks:!0};return xa=function(a){c.logPromiseWarnings&&!Fc.hasOwnProperty(a)&&(Fc[a]=!0,f.warn("[$parse] Promise found in the expression `"+a+"`. Automatic unwrapping of promises in Angular expressions is deprecated."))},function(e,f){var l;switch(typeof e){case"string":var m=f?a:b;if(m.hasOwnProperty(e))return m[e];l=f?g:c;var n=new Tb(l);return l=new fb(n,d,l).parse(e),"hasOwnProperty"!==e&&(m[e]=l),l;case"function":return e;default:return B}}}]}function $d(){this.$get=["$rootScope","$exceptionHandler",function(b,a){return Ee(function(a){b.$evalAsync(a)},a)}]}function Ee(b,a){function c(a){return a}function d(a){return g(a)}var e=function(){var l,m,g=[];return m={resolve:function(a){if(g){var c=g;g=v,l=f(a),c.length&&b(function(){for(var a,b=0,d=c.length;d>b;b++)a=c[b],l.then(a[0],a[1],a[2])})}},reject:function(a){m.resolve(h(a))},notify:function(a){if(g){var c=g;g.length&&b(function(){for(var b,d=0,e=c.length;e>d;d++)b=c[d],b[2](a)})}},promise:{then:function(b,f,h){var m=e(),K=function(d){try{m.resolve((O(b)?b:c)(d))}catch(e){m.reject(e),a(e)}},w=function(b){try{m.resolve((O(f)?f:d)(b))}catch(c){m.reject(c),a(c)}},t=function(b){try{m.notify((O(h)?h:c)(b))}catch(d){a(d)}};return g?g.push([K,w,t]):l.then(K,w,t),m.promise},"catch":function(a){return this.then(null,a)},"finally":function(a){function b(a,c){var d=e();return c?d.resolve(a):d.reject(a),d.promise}function d(e,f){var g=null;try{g=(a||c)()}catch(h){return b(h,!1)}return g&&O(g.then)?g.then(function(){return b(e,f)},function(a){return b(a,!1)}):b(e,f)}return this.then(function(a){return d(a,!0)},function(a){return d(a,!1)})}}}},f=function(a){return a&&O(a.then)?a:{then:function(c){var d=e();return b(function(){d.resolve(c(a))}),d.promise}}},g=function(a){var b=e();return b.reject(a),b.promise},h=function(c){return{then:function(f,g){var h=e();return b(function(){try{h.resolve((O(g)?g:d)(c))}catch(b){h.reject(b),a(b)}}),h.promise}}};return{defer:e,reject:g,when:function(h,l,m,n){var p,q=e(),s=function(b){try{return(O(l)?l:c)(b)}catch(d){return a(d),g(d)}},K=function(b){try{return(O(m)?m:d)(b)}catch(c){return a(c),g(c)}},w=function(b){try{return(O(n)?n:c)(b)}catch(d){a(d)}};return b(function(){f(h).then(function(a){p||(p=!0,q.resolve(f(a).then(s,K,w)))},function(a){p||(p=!0,q.resolve(K(a)))},function(a){p||q.notify(w(a))})}),q.promise},all:function(a){var b=e(),c=0,d=M(a)?[]:{};return r(a,function(a,e){c++,f(a).then(function(a){d.hasOwnProperty(e)||(d[e]=a,--c||b.resolve(d))},function(a){d.hasOwnProperty(e)||b.reject(a)})}),0===c&&b.resolve(d),b.promise}}}function ge(){this.$get=["$window","$timeout",function(b,a){var c=b.requestAnimationFrame||b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame,d=b.cancelAnimationFrame||b.webkitCancelAnimationFrame||b.mozCancelAnimationFrame||b.webkitCancelRequestAnimationFrame,e=!!c,f=e?function(a){var b=c(a);return function(){d(b)}}:function(b){var c=a(b,16.66,!1);return function(){a.cancel(c)}};return f.supported=e,f}]}function Zd(){var b=10,a=z("$rootScope"),c=null;this.digestTtl=function(a){return arguments.length&&(b=a),b},this.$get=["$injector","$exceptionHandler","$parse","$browser",function(d,e,f,g){function h(){this.$id=hb(),this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null,this["this"]=this.$root=this,this.$$destroyed=!1,this.$$asyncQueue=[],this.$$postDigestQueue=[],this.$$listeners={},this.$$listenerCount={},this.$$isolateBindings={}}function k(b){if(q.$$phase)throw a("inprog",q.$$phase);q.$$phase=b}function l(a,b){var c=f(a);return Xa(c,b),c}function m(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function n(){}h.prototype={constructor:h,$new:function(a){return a?(a=new h,a.$root=this.$root,a.$$asyncQueue=this.$$asyncQueue,a.$$postDigestQueue=this.$$postDigestQueue):(this.$$childScopeClass||(this.$$childScopeClass=function(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null,this.$$listeners={},this.$$listenerCount={},this.$id=hb(),this.$$childScopeClass=null},this.$$childScopeClass.prototype=this),a=new this.$$childScopeClass),a["this"]=a,a.$parent=this,a.$$prevSibling=this.$$childTail,this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a,a},$watch:function(a,b,d){var e=l(a,"watch"),f=this.$$watchers,g={fn:b,last:n,get:e,exp:a,eq:!!d};if(c=null,!O(b)){var h=l(b||B,"listener");g.fn=function(a,b,c){h(c)}}if("string"==typeof a&&e.constant){var k=g.fn;g.fn=function(a,b,c){k.call(this,a,b,c),Ta(f,g)}}return f||(f=this.$$watchers=[]),f.unshift(g),function(){Ta(f,g),c=null}},$watchCollection:function(a,b){var d,e,g,c=this,h=1b;b++)f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(k++,e[b]=d[b]);else{e!==n&&(e=n={},r=0,k++),a=0;for(b in d)d.hasOwnProperty(b)&&(a++,e.hasOwnProperty(b)?(f=e[b]!==e[b]&&d[b]!==d[b],f||e[b]===d[b]||(k++,e[b]=d[b])):(r++,e[b]=d[b],k++));if(r>a)for(b in k++,e)e.hasOwnProperty(b)&&!d.hasOwnProperty(b)&&(r--,delete e[b])}else e!==d&&(e=d,k++);return k},function(){if(q?(q=!1,b(d,d,c)):b(d,g,c),h)if(T(d))if(Ra(d)){g=Array(d.length);for(var a=0;av&&(u=4-v,N[u]||(N[u]=[]),Q=O(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,Q+="; newVal: "+oa(f)+"; oldVal: "+oa(h),N[u].push(Q))}catch(D){q.$$phase=null,e(D)}if(!(l=P.$$childHead||P!==this&&P.$$nextSibling))for(;P!==this&&!(l=P.$$nextSibling);)P=P.$parent}while(P=l);if((y||m.length)&&!v--)throw q.$$phase=null,a("infdig",b,oa(N))}while(y||m.length);for(q.$$phase=null;r.length;)try{r.shift()()}catch(G){e(G)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"),this.$$destroyed=!0,this!==q&&(r(this.$$listenerCount,Ab(null,m,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=this.$root=null,this.$$listeners={},this.$$watchers=this.$$asyncQueue=this.$$postDigestQueue=[],this.$destroy=this.$digest=this.$apply=B,this.$on=this.$watch=function(){return B})}},$eval:function(a,b){return f(a)(this,b)},$evalAsync:function(a){q.$$phase||q.$$asyncQueue.length||g.defer(function(){q.$$asyncQueue.length&&q.$digest()}),this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return k("$apply"),this.$eval(a)}catch(b){e(b)}finally{q.$$phase=null;try{q.$digest()}catch(c){throw e(c),c}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]),c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=Sa(c,b);-1!==d&&(c[d]=null,m(e,1,a))}},$emit:function(a,b){var d,l,m,c=[],f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=[h].concat(va.call(arguments,1));do{for(d=f.$$listeners[a]||c,h.currentScope=f,l=0,m=d.length;m>l;l++)if(d[l])try{d[l].apply(null,k)}catch(n){e(n)}else d.splice(l,1),l--,m--;if(g)break;f=f.$parent}while(f);return h},$broadcast:function(a,b){for(var h,k,c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(va.call(arguments,1));c=d;){for(f.currentScope=c,d=c.$$listeners[a]||[],h=0,k=d.length;k>h;h++)if(d[h])try{d[h].apply(null,g)}catch(l){e(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}return f}};var q=new h;return q}]}function cd(){var b=/^\s*(https?|ftp|mailto|tel|file):/,a=/^\s*((https?|ftp|file):|data:image\/)/;this.aHrefSanitizationWhitelist=function(a){return G(a)?(b=a,this):b},this.imgSrcSanitizationWhitelist=function(b){return G(b)?(a=b,this):a},this.$get=function(){return function(c,d){var f,e=d?a:b;return u&&!(u>=8)||(f=wa(c).href,""===f||f.match(e))?c:"unsafe:"+f}}}function Fe(b){if("self"===b)return b;if(E(b)){if(-1m;m++)if("self"===b[m]?Ob(f):b[m].exec(f.href)){q=!0;break}if(q)for(m=0,n=a.length;n>m;m++)if("self"===a[m]?Ob(f):a[m].exec(f.href)){q=!1;break}if(q)return d;throw ya("insecurl",d.toString())}if(c===fa.HTML)return e(d);throw ya("unsafe")},valueOf:function(a){return a instanceof f?a.$$unwrapTrustedValue():a}}}]}function ae(){var b=!0;this.enabled=function(a){return arguments.length&&(b=!!a),b},this.$get=["$parse","$sniffer","$sceDelegate",function(a,c,d){if(b&&c.msie&&8>c.msieDocumentMode)throw ya("iequirks");var e=ha(fa);e.isEnabled=function(){return b},e.trustAs=d.trustAs,e.getTrusted=d.getTrusted,e.valueOf=d.valueOf,b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=ga),e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var f=e.parseAs,g=e.getTrusted,h=e.trustAs;return r(fa,function(a,b){var c=A(b);e[$a("parse_as_"+c)]=function(b){return f(a,b)},e[$a("get_trusted_"+c)]=function(b){return g(a,b)},e[$a("trust_as_"+c)]=function(b){return h(a,b)}}),e}]}function ce(){this.$get=["$window","$document",function(b,a){var h,c={},d=U((/android (\d+)/.exec(A((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g=f.documentMode,k=/^(Moz|webkit|O|ms)(?=[A-Z])/,l=f.body&&f.body.style,m=!1,n=!1;if(l){for(var q in l)if(m=k.exec(q)){h=m[0],h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit"),m=!!("transition"in l||h+"Transition"in l),n=!!("animation"in l||h+"Animation"in l),!d||m&&n||(m=E(f.body.style.webkitTransition),n=E(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||g>7),hasEvent:function(a){if("input"==a&&9==u)return!1;if(H(c[a])){var b=f.createElement("div");c[a]="on"+a in b}return c[a]},csp:Ya(),vendorPrefix:h,transitions:m,animations:n,android:d,msie:u,msieDocumentMode:g}}]}function ee(){this.$get=["$rootScope","$browser","$q","$exceptionHandler",function(b,a,c,d){function e(e,h,k){var l=c.defer(),m=l.promise,n=G(k)&&!k;return h=a.defer(function(){try{l.resolve(e())}catch(a){l.reject(a),d(a)}finally{delete f[m.$$timeoutId]}n||b.$apply()},h),m.$$timeoutId=h,f[h]=l,m}var f={};return e.cancel=function(b){return b&&b.$$timeoutId in f?(f[b.$$timeoutId].reject("canceled"),delete f[b.$$timeoutId],a.defer.cancel(b.$$timeoutId)):!1},e}]}function wa(b,a){var c=b;return u&&(X.setAttribute("href",c),c=X.href),X.setAttribute("href",c),{href:X.href,protocol:X.protocol?X.protocol.replace(/:$/,""):"",host:X.host,search:X.search?X.search.replace(/^\?/,""):"",hash:X.hash?X.hash.replace(/^#/,""):"",hostname:X.hostname,port:X.port,pathname:"/"===X.pathname.charAt(0)?X.pathname:"/"+X.pathname}}function Ob(b){return b=E(b)?wa(b):b,b.protocol===Hc.protocol&&b.host===Hc.host}function fe(){this.$get=Z(V)}function jc(b){function a(d,e){if(T(d)){var f={};return r(d,function(b,c){f[c]=a(c,b)}),f}return b.factory(d+c,e)}var c="Filter";this.register=a,this.$get=["$injector",function(a){return function(b){return a.get(b+c)}}],a("currency",Ic),a("date",Jc),a("filter",Ge),a("json",He),a("limitTo",Ie),a("lowercase",Je),a("number",Kc),a("orderBy",Lc),a("uppercase",Ke)}function Ge(){return function(b,a,c){if(!M(b))return b;var d=typeof c,e=[];e.check=function(a){for(var b=0;bb;b=Math.abs(b);var g=b+"",h="",k=[],l=!1;if(-1!==g.indexOf("e")){var m=g.match(/([\d\.]+)e(-?)(\d+)/);m&&"-"==m[2]&&m[3]>e+1?(g="0",b=0):(h=g,l=!0)}if(l)e>0&&b>-1&&1>b&&(h=b.toFixed(e));else{g=(g.split(Nc)[1]||"").length,H(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac)),b=+(Math.round(+(b.toString()+"e"+e)).toString()+"e"+-e),0===b&&(f=!1),b=(""+b).split(Nc),g=b[0],b=b[1]||"";var m=0,n=a.lgSize,q=a.gSize;if(g.length>=n+q)for(m=g.length-n,l=0;m>l;l++)0===(m-l)%q&&0!==l&&(h+=c),h+=g.charAt(l);for(l=m;lb&&(d="-",b=-b),b=""+b;b.length0||e>-c)&&(e+=c),0===e&&-12==c&&(e=12),Ub(e,a,d)}}function ub(b,a){return function(c,d){var e=c["get"+b](),f=Ja(a?"SHORT"+b:b);return d[f][e]}}function Jc(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=U(b[9]+b[10]), -g=U(b[9]+b[11])),h.call(a,U(b[1]),U(b[2])-1,U(b[3])),f=U(b[4]||0)-f,g=U(b[5]||0)-g,h=U(b[6]||0),b=Math.round(1e3*parseFloat("0."+(b[7]||0))),k.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var h,k,f="",g=[];if(e=e||"mediumDate",e=b.DATETIME_FORMATS[e]||e,E(c)&&(c=Le.test(c)?U(c):a(c)),ib(c)&&(c=new Date(c)),!ua(c))return c;for(;e;)(k=Me.exec(e))?(g=g.concat(va.call(k,1)),e=g.pop()):(g.push(e),e=null);return r(g,function(a){h=Ne[a],f+=h?h(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),f}}function He(){return function(b){return oa(b,!0)}}function Ie(){return function(b,a){return M(b)||E(b)?(a=1/0===Math.abs(Number(a))?Number(a):U(a))?a>0?b.slice(0,a):b.slice(a):E(b)?"":[]:b}}function Lc(b){return function(a,c,d){function e(a,b){return Va(b)?function(b,c){return a(c,b)}:a}function f(a,b){var c=typeof a,d=typeof b;return c==d?(ua(a)&&ua(b)&&(a=a.valueOf(),b=b.valueOf()),"string"==c&&(a=a.toLowerCase(),b=b.toLowerCase()),a===b?0:b>a?-1:1):d>c?-1:1}return Ra(a)?(c=M(c)?c:[c],0===c.length&&(c=["+"]),c=Vc(c,function(a){var c=!1,d=a||ga;if(E(a)){if(("+"==a.charAt(0)||"-"==a.charAt(0))&&(c="-"==a.charAt(0),a=a.substring(1)),""===a)return e(function(a,b){return f(a,b)},c);if(d=b(a),d.constant){var l=d();return e(function(a,b){return f(a[l],b[l])},c)}}return e(function(a,b){return f(d(a),d(b))},c)}),va.call(a).sort(e(function(a,b){for(var d=0;d15&&19>a||a>=37&&40>=a||p()}),e.hasEvent("paste")&&a.on("paste cut",p)}a.on("change",n),d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var s=c.ngPattern;if(s&&((e=s.match(/^\/(.*)\/([gim]*)$/))?(s=RegExp(e[1],e[2]),e=function(a){return ta(d,"pattern",d.$isEmpty(a)||s.test(a),a)}):e=function(c){var e=b.$eval(s);if(!e||!e.test)throw z("ngPattern")("noregexp",s,e,ia(a));return ta(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e)),c.ngMinlength){var r=U(c.ngMinlength);e=function(a){return ta(d,"minlength",d.$isEmpty(a)||a.length>=r,a)},d.$parsers.push(e),d.$formatters.push(e)}if(c.ngMaxlength){var w=U(c.ngMaxlength);e=function(a){return ta(d,"maxlength",d.$isEmpty(a)||a.length<=w,a)},d.$parsers.push(e),d.$formatters.push(e)}}function Vb(b,a){return b="ngClass"+b,["$animate",function(c){function d(a,b){var c=[],d=0;a:for(;d0||c[a])&&(c[a]=(c[a]||0)+b,c[a]===+(b>0)&&d.push(a))}),g.data("$classCounts",c),d.join(" ")}function l(b){if(!0===a||f.$index%2===a){var l=e(b||[]);if(m){if(!Ba(b,m)){var s=e(m),p=d(l,s),l=d(s,l),l=k(l,-1),p=k(p,1);0===p.length?c.removeClass(g,l):0===l.length?c.addClass(g,p):c.setClass(g,p,l)}}else{var p=k(l,1);h.$addClass(p)}}m=ha(b)}var m;f.$watch(h[b],l,!0),h.$observe("class",function(a){l(f.$eval(h[b]))}),"ngClass"!==b&&f.$watch("$index",function(c,d){var g=1&c;if(g!==(1&d)){var l=e(f.$eval(h[b]));g===a?(g=k(l,1),h.$addClass(g)):(g=k(l,-1),h.$removeClass(g))}})}}}]}var u,D,Ea,Za,Na,Pe="validity",A=function(b){return E(b)?b.toLowerCase():b},kb=Object.prototype.hasOwnProperty,Ja=function(b){return E(b)?b.toUpperCase():b},va=[].slice,Qe=[].push,Aa=Object.prototype.toString,Ua=z("ng"),Wa=V.angular||(V.angular={}),na=["0","0","0"];u=U((/msie (\d+)/.exec(A(navigator.userAgent))||[])[1]),isNaN(u)&&(u=U((/trident\/.*; rv:(\d+)/.exec(A(navigator.userAgent))||[])[1])),B.$inject=[],ga.$inject=[];var M=function(){return O(Array.isArray)?Array.isArray:function(b){return"[object Array]"===Aa.call(b)}}(),$=function(){return String.prototype.trim?function(b){return E(b)?b.trim():b}:function(b){return E(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Na=9>u?function(b){return b=b.nodeName?b:b[0],b.scopeName&&"HTML"!=b.scopeName?Ja(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName?b.nodeName:b[0].nodeName};var Ya=function(){if(G(Ya.isActive_))return Ya.isActive_;var b=!(!W.querySelector("[ng-csp]")&&!W.querySelector("[data-ng-csp]"));if(!b)try{new Function("")}catch(a){b=!0}return Ya.isActive_=b},Yc=/[A-Z]/g,ad={full:"1.2.32",major:1,minor:2,dot:32,codeName:"alternation-intention"};S.expando="ng339";var bb=S.cache={},ne=1,rb=V.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},ab=V.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};S._data=function(b){return this.cache[b[this.expando]]||{}};var ie=/([\:\-\_]+(.))/g,je=/^moz([A-Z])/,Gb=z("jqLite"),ke=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Hb=/<|&#?\w+;/,le=/<([\w:]+)/,me=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ca={option:[1,'"],thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};ca.optgroup=ca.option,ca.tbody=ca.tfoot=ca.colgroup=ca.caption=ca.thead,ca.th=ca.td;var Ma=S.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===W.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),S(V).on("load",a))},toString:function(){var b=[];return r(this,function(a){b.push(""+a)}),"["+b.join(", ")+"]"},eq:function(b){return D(b>=0?this[b]:this[this.length+b])},length:0,push:Qe,sort:[].sort,splice:[].splice},qb={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){qb[A(b)]=b});var oc={};r("input select option textarea button form details".split(" "),function(b){oc[Ja(b)]=!0}),r({data:Lb,removeData:Kb},function(b,a){S[a]=b}),r({data:Lb,inheritedData:pb,scope:function(b){return D.data(b,"$scope")||pb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return D.data(b,"$isolateScope")||D.data(b,"$isolateScopeNoTemplate")},controller:lc,injector:function(b){return pb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Mb,css:function(b,a,c){if(a=$a(a),!G(c)){var d;return 8>=u&&(d=b.currentStyle&&b.currentStyle[a],""===d&&(d="auto")),d=d||b.style[a],8>=u&&(d=""===d?v:d),d}b.style[a]=c},attr:function(b,a,c){var d=A(a);if(qb[d]){if(!G(c))return b[a]||(b.attributes.getNamedItem(a)||B).specified?d:v;c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d))}else if(G(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?v:b},prop:function(b,a,c){return G(c)?void(b[a]=c):b[a]},text:function(){function b(b,d){var e=a[b.nodeType];return H(d)?e?b[e]:"":void(b[e]=d)}var a=[];return 9>u?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent",b.$dv="",b}(),val:function(b,a){if(H(a)){if("SELECT"===Na(b)&&b.multiple){var c=[];return r(b.options,function(a){a.selected&&c.push(a.value||a.text)}),0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(H(a))return b.innerHTML;for(var c=0,d=b.childNodes;ce;e++)if(b===Lb)b(this[e],a);else for(f in a)b(this[e],f,a[f]);return this}for(e=b.$dv,g=e===v?Math.min(g,1):g,f=0;g>f;f++){var h=b(this[f],a,d);e=e?e+h:h}return e}for(e=0;g>e;e++)b(this[e],a,d);return this}}),r({removeData:Kb,dealoc:Ka,on:function a(c,d,e,f){if(G(f))throw Gb("onargs");var g=pa(c,"events"),h=pa(c,"handle");g||pa(c,"events",g={}),h||pa(c,"handle",h=oe(c,g)),r(d.split(" "),function(d){var f=g[d];if(!f){if("mouseenter"==d||"mouseleave"==d){var m=W.body.contains||W.body.compareDocumentPosition?function(a,c){var d=9===a.nodeType?a.documentElement:a,e=c&&c.parentNode;return a===e||!(!e||1!==e.nodeType||!(d.contains?d.contains(e):a.compareDocumentPosition&&16&a.compareDocumentPosition(e)))}:function(a,c){if(c)for(;c=c.parentNode;)if(c===a)return!0;return!1};g[d]=[],a(c,{mouseleave:"mouseout",mouseenter:"mouseover"}[d],function(a){var c=a.relatedTarget;c&&(c===this||m(this,c))||h(a,d)})}else rb(c,d,h),g[d]=[];f=g[d]}f.push(e)})},off:kc,one:function(a,c,d){a=D(a),a.on(c,function f(){a.off(c,d),a.off(c,f)}),a.on(c,d)},replaceWith:function(a,c){var d,e=a.parentNode;Ka(a),r(new S(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a),d=c})},children:function(a){var c=[];return r(a.childNodes,function(a){1===a.nodeType&&c.push(a)}),c},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,c){r(new S(c),function(c){1!==a.nodeType&&11!==a.nodeType||a.appendChild(c)})},prepend:function(a,c){if(1===a.nodeType){var d=a.firstChild;r(new S(c),function(c){a.insertBefore(c,d)})}},wrap:function(a,c){c=D(c)[0];var d=a.parentNode;d&&d.replaceChild(c,a),c.appendChild(a)},remove:function(a){Ka(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;r(new S(c),function(a){e.insertBefore(a,d.nextSibling),d=a})},addClass:ob,removeClass:nb,toggleClass:function(a,c,d){c&&r(c.split(" "),function(c){var f=d;H(f)&&(f=!Mb(a,c)),(f?ob:nb)(a,c)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){if(a.nextElementSibling)return a.nextElementSibling;for(a=a.nextSibling;null!=a&&1!==a.nodeType;)a=a.nextSibling;return a},find:function(a,c){return a.getElementsByTagName?a.getElementsByTagName(c):[]},clone:Jb,triggerHandler:function(a,c,d){var e,f;e=c.type||c;var g=(pa(a,"events")||{})[e];g&&(e={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopPropagation:B,type:e,target:a},c.type&&(e=F(e,c)),c=ha(g),f=d?[e].concat(d):[e],r(c,function(c){c.apply(a,f)}))}},function(a,c){S.prototype[c]=function(c,e,f){for(var g,h=0;h":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a,c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Ve={n:"\n",f:"\f",r:"\r",t:" ",v:" ","'":"'",'"':'"'},Tb=function(a){this.options=a};Tb.prototype={constructor:Tb,lex:function(a){for(this.text=a,this.index=0,this.ch=v,this.lastCh=":",this.tokens=[];this.index="0"&&"9">=a},isWhitespace:function(a){return" "===a||"\r"===a||" "===a||"\n"===a||" "===a||" "===a},isIdent:function(a){return a>="a"&&"z">=a||a>="A"&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){throw d=d||this.index,c=G(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d,ea("lexerr",a,c,this.text)},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))&&(a=this.binaryFn(a,c.fn,this.relational())),a},additive:function(){for(var c,a=this.multiplicative();c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var c,a=this.unary();c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(fb.ZERO,a.fn,this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=Ec(d,this.options,this.text);return F(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){return(h=a(e,h))||a.assign(e,h={}),tb(h,d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();return this.consume("]"),F(function(e,f){var k,g=a(e,f),h=Cc(d(e,f),c.text);return la(h,c.text),g?((g=ma(g[h],c.text))&&g.then&&c.options.unwrapPromises&&(k=g,"$$v"in g||(k.$$v=v,k.then(function(a){k.$$v=a})),g=g.$$v),g):v},{assign:function(e,f,g){var h=la(Cc(d(e,g),c.text),c.text);return(g=ma(a(e,g),c.text))||a.assign(e,g={}),g[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text)do d.push(this.expression());while(this.expect(","));this.consume(")");var e=this;return function(f,g){for(var h=[],k=c?c(f,g):f,l=0;la.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){return a=-1*a.getTimezoneOffset(),a=(a>=0?"+":"")+(Ub(Math[a>0?"floor":"ceil"](a/60),2)+Ub(Math.abs(a%60),2))}},Me=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,Le=/^\-?\d+$/;Jc.$inject=["$locale"];var Je=Z(A),Ke=Z(Ja);Lc.$inject=["$parse"];var dd=Z({restrict:"E",compile:function(a,c){return 8>=u&&(c.href||c.name||c.$set("href",""),a.append(W.createComment("IE fix"))),c.href||c.xlinkHref||c.name?void 0:function(a,c){var f="[object SVGAnimatedString]"===Aa.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),Eb={};r(qb,function(a,c){if("multiple"!=a){var d=qa("ng-"+c);Eb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}}),r(["src","srcset","href"],function(a){var c=qa("ng-"+a);Eb[c]=function(){return{priority:99,link:function(d,e,f){var g=a,h=a;"href"===a&&"[object SVGAnimatedString]"===Aa.call(e.prop("href"))&&(h="xlinkHref",f.$attr[h]="xlink:href",g=null),f.$observe(c,function(c){c?(f.$set(h,c),u&&g&&e.prop(g,f[h])):"href"===a&&f.$set(h,null)})}}}});var xb={$addControl:B,$removeControl:B,$setValidity:B,$setDirty:B,$setPristine:B};Oc.$inject=["$element","$attrs","$scope","$animate"];var Rc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Oc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};rb(e[0],"submit",h),e.on("$destroy",function(){c(function(){ab(e[0],"submit",h)},0,!1)})}var k=e.parent().controller("form"),l=f.name||f.ngForm;l&&tb(a,l,g,l),k&&e.on("$destroy",function(){k.$removeControl(g),l&&tb(a,l,v,l),F(g,xb)})}}}}}]},ed=Rc(),rd=Rc(!0),We=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,Xe=/^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,Ye=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Sc={text:zb,number:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),e.$parsers.push(function(a){var c=e.$isEmpty(a);return c||Ye.test(a)?(e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a)):(e.$setValidity("number",!1),v)}),Oe(e,"number",Ze,null,e.$$validityState),e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a}),d.min&&(a=function(a){var c=parseFloat(d.min);return ta(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a)),d.max&&(a=function(a){var c=parseFloat(d.max);return ta(e,"max",e.$isEmpty(a)||c>=a,a)},e.$parsers.push(a),e.$formatters.push(a)),e.$formatters.push(function(a){return ta(e,"number",e.$isEmpty(a)||ib(a),a)})},url:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),a=function(a){return ta(e,"url",e.$isEmpty(a)||We.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},email:function(a,c,d,e,f,g){zb(a,c,d,e,f,g),a=function(a){return ta(e,"email",e.$isEmpty(a)||Xe.test(a),a)},e.$formatters.push(a),e.$parsers.push(a)},radio:function(a,c,d,e){H(d.name)&&c.attr("name",hb()),c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})}),e.$render=function(){c[0].checked=d.value==e.$viewValue},d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;E(f)||(f=!0),E(g)||(g=!1),c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})}),e.$render=function(){c[0].checked=e.$viewValue},e.$isEmpty=function(a){return a!==f},e.$formatters.push(function(a){return a===f}),e.$parsers.push(function(a){return a?f:g})},hidden:B,button:B,submit:B,reset:B,file:B},Ze=["badInput"],gc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel",link:function(d,e,f,g){g&&(Sc[A(f.type)]||Sc.text)(d,e,f,g,c,a)}}}],vb="ng-valid",wb="ng-invalid",Qa="ng-pristine",yb="ng-dirty",$e=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate",function(a,c,d,e,f,g){function h(a,c){c=c?"-"+mb(c,"-"):"",g.removeClass(e,(a?wb:vb)+c),g.addClass(e,(a?vb:wb)+c)}this.$modelValue=this.$viewValue=Number.NaN,this.$parsers=[],this.$formatters=[],this.$viewChangeListeners=[],this.$pristine=!0,this.$dirty=!1,this.$valid=!0,this.$invalid=!1,this.$name=d.name;var k=f(d.ngModel),l=k.assign;if(!l)throw z("ngModel")("nonassign",d.ngModel,ia(e));this.$render=B,this.$isEmpty=function(a){return H(a)||""===a||null===a||a!==a};var m=e.inheritedData("$formController")||xb,n=0,q=this.$error={};e.addClass(Qa),h(!0),this.$setValidity=function(a,c){q[a]!==!c&&(c?(q[a]&&n--,n||(h(!0),this.$valid=!0,this.$invalid=!1)):(h(!1),this.$invalid=!0,this.$valid=!1,n++),q[a]=!c,h(c,a),m.$setValidity(a,c,this))},this.$setPristine=function(){this.$dirty=!1,this.$pristine=!0,g.removeClass(e,yb),g.addClass(e,Qa)},this.$setViewValue=function(d){this.$viewValue=d,this.$pristine&&(this.$dirty=!0,this.$pristine=!1,g.removeClass(e,Qa),g.addClass(e,yb),m.$setDirty()),r(this.$parsers,function(a){d=a(d)}),this.$modelValue!==d&&(this.$modelValue=d,l(a,d),r(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var p=this;a.$watch(function(){var c=k(a);if(p.$modelValue!==c){var d=p.$formatters,e=d.length;for(p.$modelValue=c;e--;)c=d[e](c);p.$viewValue!==c&&(p.$viewValue=c,p.$render())}return c})}],Gd=function(){return{require:["ngModel","^?form"],controller:$e,link:function(a,c,d,e){var f=e[0],g=e[1]||xb;g.$addControl(f),a.$on("$destroy",function(){g.$removeControl(f)})}}},Id=Z({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),hc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){return d.required&&e.$isEmpty(a)?void e.$setValidity("required",!1):(e.$setValidity("required",!0),a)};e.$formatters.push(f),e.$parsers.unshift(f),d.$observe("required",function(){f(e.$viewValue)})}}}},Hd=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!H(a)){var c=[];return a&&r(a.split(f),function(a){a&&c.push($(a))}),c}}),e.$formatters.push(function(a){return M(a)?a.join(", "):v}),e.$isEmpty=function(a){return!a||!a.length}}}},af=/^(true|false|\d+)$/,Jd=function(){return{priority:100,compile:function(a,c){return af.test(c.ngValue)?function(a,c,f){f.$set("value",a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},jd=za({compile:function(a){return a.addClass("ng-binding"),function(a,d,e){d.data("$binding",e.ngBind),a.$watch(e.ngBind,function(a){d.text(a==v?"":a)})}}}),ld=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate)),d.addClass("ng-binding").data("$binding",c),e.$observe("ngBindTemplate",function(a){d.text(a)})}}],kd=["$sce","$parse",function(a,c){return{compile:function(d){return d.addClass("ng-binding"),function(d,f,g){f.data("$binding",g.ngBindHtml); -var h=c(g.ngBindHtml);d.$watch(function(){return(h(d)||"").toString()},function(c){f.html(a.getTrustedHtml(h(d))||"")})}}}}],md=Vb("",!0),od=Vb("Odd",0),nd=Vb("Even",1),pd=za({compile:function(a,c){c.$set("ngCloak",v),a.removeClass("ng-cloak")}}),qd=[function(){return{scope:!0,controller:"@",priority:500}}],ic={},bf={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=qa("ng-"+a);ic[c]=["$parse","$rootScope",function(d,e){return{compile:function(f,g){var h=d(g[c],!0);return function(c,d){d.on(a,function(d){var f=function(){h(c,{$event:d})};bf[a]&&e.$$phase?c.$evalAsync(f):c.$apply(f)})}}}}]});var td=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,k,l;c.$watch(e.ngIf,function(f){Va(f)?k||(k=c.$new(),g(k,function(c){c[c.length++]=W.createComment(" end ngIf: "+e.ngIf+" "),h={clone:c},a.enter(c,d.parent(),d)})):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=Db(h.clone),a.leave(l,function(){l=null}),h=null))})}}}],ud=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Wa.noop,compile:function(g,h){var k=h.ngInclude||h.src,l=h.onload||"",m=h.autoscroll;return function(g,h,p,r,K){var t,x,u,w=0,y=function(){x&&(x.remove(),x=null),t&&(t.$destroy(),t=null),u&&(e.leave(u,function(){x=null}),x=u,u=null)};g.$watch(f.parseAsResourceUrl(k),function(f){var k=function(){!G(m)||m&&!g.$eval(m)||d()},p=++w;f?(a.get(f,{cache:c}).success(function(a){if(p===w){var c=g.$new();r.template=a,a=K(c,function(a){y(),e.enter(a,null,h,k)}),t=c,u=a,t.$emit("$includeContentLoaded"),g.$eval(l)}}).error(function(){p===w&&y()}),g.$emit("$includeContentRequested")):(y(),r.template=null)})}}}}],Kd=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){d.html(f.template),a(d.contents())(c)}}}],vd=za({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),wd=za({terminal:!0,priority:1e3}),xd=["$locale","$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var h=g.count,k=g.$attr.when&&f.attr(g.$attr.when),l=g.offset||0,m=e.$eval(k)||{},n={},q=c.startSymbol(),p=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(m[A(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))}),r(m,function(a,e){n[e]=c(a.replace(d,q+h+"-"+l+p))}),e.$watch(function(){var c=parseFloat(e.$eval(h));return isNaN(c)?"":(c in m||(c=a.pluralCat(c-l)),n[c](e,f,!0))},function(a){f.text(a)})}}}],yd=["$parse","$animate",function(a,c){var d=z("ngRepeat");return{transclude:"element",priority:1e3,terminal:!0,$$tlb:!0,link:function(e,f,g,h,k){var n,q,p,s,u,v,l=g.ngRepeat,m=l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),t={$id:La};if(!m)throw d("iexp",l);if(g=m[1],h=m[2],(m=m[3])?(n=a(m),q=function(a,c,d){return v&&(t[v]=a),t[u]=c,t.$index=d,n(e,t)}):(p=function(a,c){return La(c)},s=function(a){return a}),m=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/),!m)throw d("iidexp",g);u=m[3]||m[1],v=m[2];var x={};e.$watchCollection(h,function(a){var g,h,n,G,C,J,A,E,B,z,m=f[0],t={},H=[];if(Ra(a))B=a,E=q||p;else{E=q||s,B=[];for(J in a)a.hasOwnProperty(J)&&"$"!=J.charAt(0)&&B.push(J);B.sort()}for(G=B.length,h=H.length=B.length,g=0;h>g;g++)if(J=a===B?g:B[g],A=a[J],n=E(J,A,g),Da(n,"`track by` id"),x.hasOwnProperty(n))z=x[n],delete x[n],t[n]=z,H[g]=z;else{if(t.hasOwnProperty(n))throw r(H,function(a){a&&a.scope&&(x[a.id]=a)}),d("dupes",l,n,oa(A));H[g]={id:n},t[n]=!1}for(J in x)x.hasOwnProperty(J)&&(z=x[J],g=Db(z.clone),c.leave(g),r(g,function(a){a.$$NG_REMOVED=!0}),z.scope.$destroy());for(g=0,h=B.length;h>g;g++){if(J=a===B?g:B[g],A=a[J],z=H[g],H[g-1]&&(m=H[g-1].clone[H[g-1].clone.length-1]),z.scope){C=z.scope,n=m;do n=n.nextSibling;while(n&&n.$$NG_REMOVED);z.clone[0]!=n&&c.move(Db(z.clone),null,D(m)),m=z.clone[z.clone.length-1]}else C=e.$new();C[u]=A,v&&(C[v]=J),C.$index=g,C.$first=0===g,C.$last=g===G-1,C.$middle=!(C.$first||C.$last),C.$odd=!(C.$even=0===(1&g)),z.scope||k(C,function(a){a[a.length++]=W.createComment(" end ngRepeat: "+l+" "),c.enter(a,null,D(m)),m=a,z.scope=C,z.clone=a,t[z.id]=z})}x=t})}}}],zd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngShow,function(c){a[Va(c)?"removeClass":"addClass"](d,"ng-hide")})}}],sd=["$animate",function(a){return function(c,d,e){c.$watch(e.ngHide,function(c){a[Va(c)?"addClass":"removeClass"](d,"ng-hide")})}}],Ad=za(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,d){c.css(d,"")}),a&&c.css(a)},!0)}),Bd=["$animate",function(a){return{restrict:"EA",require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(c,d,e,f){var g=[],h=[],k=[],l=[];c.$watch(e.ngSwitch||e.on,function(d){var n,q;for(n=0,q=k.length;q>n;++n)k[n].remove();for(n=k.length=0,q=l.length;q>n;++n){var p=h[n];l[n].$destroy(),k[n]=p,a.leave(p,function(){k.splice(n,1)})}h.length=0,l.length=0,(g=f.cases["!"+d]||f.cases["?"])&&(c.$eval(e.change),r(g,function(d){var e=c.$new();l.push(e),d.transclude(e,function(c){var e=d.element;h.push(c),a.enter(c,e.parent(),e)})}))})}}}],Cd=za({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["!"+d.ngSwitchWhen]=e.cases["!"+d.ngSwitchWhen]||[],e.cases["!"+d.ngSwitchWhen].push({transclude:f,element:c})}}),Dd=za({transclude:"element",priority:800,require:"^ngSwitch",link:function(a,c,d,e,f){e.cases["?"]=e.cases["?"]||[],e.cases["?"].push({transclude:f,element:c})}}),Fd=za({link:function(a,c,d,e,f){if(!f)throw z("ngTransclude")("orphan",ia(c));f(function(a){c.empty(),c.append(a)})}}),fd=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(c,d){"text/ng-template"==d.type&&a.put(d.id,c[0].text)}}}],cf=z("ngOptions"),Ed=Z({terminal:!0}),gd=["$compile","$parse",function(a,c){var d=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,e={$setViewValue:B};return{restrict:"E",require:["select","?ngModel"],controller:["$element","$scope","$attrs",function(a,c,d){var n,k=this,l={},m=e;k.databound=d.ngModel,k.init=function(a,c,d){m=a,n=d},k.addOption=function(c){Da(c,'"option value"'),l[c]=!0,m.$viewValue==c&&(a.val(c),n.parent()&&n.remove())},k.removeOption=function(a){this.hasOption(a)&&(delete l[a],m.$viewValue==a&&this.renderUnknownOption(a))},k.renderUnknownOption=function(c){c="? "+La(c)+" ?",n.val(c),a.prepend(n),a.val(c),n.prop("selected",!0)},k.hasOption=function(a){return l.hasOwnProperty(a)},c.$on("$destroy",function(){k.renderUnknownOption=B})}],link:function(e,g,h,k){function l(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(B.parent()&&B.remove(),c.val(a),""===a&&A.prop("selected",!0)):H(a)&&A?c.val(""):e.renderUnknownOption(a)},c.on("change",function(){a.$apply(function(){B.parent()&&B.remove(),d.$setViewValue(c.val())})})}function m(a,c,d){var e;d.$render=function(){var a=new cb(d.$viewValue);r(c.find("option"),function(c){c.selected=G(a.get(c.value))})},a.$watch(function(){Ba(e,d.$viewValue)||(e=ha(d.$viewValue),d.$render())}),c.on("change",function(){a.$apply(function(){var a=[];r(c.find("option"),function(c){c.selected&&a.push(c.value)}),d.$setViewValue(a)})})}function n(e,f,g){function h(){var d,k,s,v,w,a={"":[]},c=[""];s=g.$modelValue,v=B(e)||[];var H,R,C,E=n?Wb(v):v;if(R={},C=!1,p)if(k=g.$modelValue,y&&M(k))for(C=new cb([]),d={},w=0;wC;C++){if(k=C,n){if(k=E[C],"$"===k.charAt(0))continue;R[n]=k}R[m]=v[k],d=r(e,R)||"",(k=a[d])||(k=a[d]=[],c.push(d)),p?d=G(w.remove(y?y(e,R):A(e,R))):(y?(d={},d[m]=s,d=y(e,d)===y(e,R)):d=s===A(e,R),w=w||d),F=l(e,R),F=G(F)?F:"",k.push({id:y?y(e,R):n?E[C]:C,label:F,selected:d})}for(p||(z||null===s?a[""].unshift({id:"",label:"",selected:!w}):w||a[""].unshift({id:"?",label:"",selected:!0})),R=0,E=c.length;E>R;R++){for(d=c[R],k=a[d],D.length<=R?(s={element:x.clone().attr("label",d),label:k.label},v=[s],D.push(v),f.append(s.element)):(v=D[R],s=v[0],s.label!=d&&s.element.attr("label",s.label=d)),F=null,C=0,H=k.length;H>C;C++)d=k[C],(w=v[C+1])?(F=w.element,w.label!==d.label&&(F.text(w.label=d.label),F.prop("label",w.label)),w.id!==d.id&&F.val(w.id=d.id),F[0].selected!==d.selected&&(F.prop("selected",w.selected=d.selected),u&&F.prop("selected",w.selected))):(""===d.id&&z?L=z:(L=t.clone()).val(d.id).prop("selected",d.selected).attr("selected",d.selected).prop("label",d.label).text(d.label),v.push({element:L,label:d.label,id:d.id,selected:d.selected}),q.addOption(d.label,L),F?F.after(L):s.element.append(L),F=L);for(C++;v.length>C;)d=v.pop(),q.removeOption(d.label),d.element.remove()}for(;D.length>R;)D.pop()[0].element.remove()}var k;if(!(k=s.match(d)))throw cf("iexp",s,ia(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],r=c(k[3]||""),A=c(k[2]?k[1]:m),B=c(k[7]),y=k[8]?c(k[8]):null,D=[[{element:f,label:""}]];z&&(a(z)(e),z.removeClass("ng-scope"),z.remove()),f.empty(),f.on("change",function(){e.$apply(function(){var a,k,l,q,r,s,t,u,c=B(e)||[],d={};if(p){for(l=[],r=0,t=D.length;t>r;r++)for(a=D[r],q=1,s=a.length;s>q;q++)if((k=a[q].element)[0].selected){if(k=k.val(),n&&(d[n]=k),y)for(u=0;uf;f++)a[m]=c[f],d[f]=l(e,a);return d}},h),p&&e.$watchCollection(function(){return g.$modelValue},h)}if(k[1]){var q=k[0];k=k[1];var A,p=h.multiple,s=h.ngOptions,z=!1,t=D(W.createElement("option")),x=D(W.createElement("optgroup")),B=t.clone();h=0;for(var y=g.children(),E=y.length;E>h;h++)if(""===y[h].value){A=z=y.eq(h);break}q.init(k,z,B),p&&(k.$isEmpty=function(a){return!a||0===a.length}),s?n(e,g,k):p?m(e,g,k):l(e,g,k,q)}}}}],id=["$interpolate",function(a){var c={addOption:B,removeOption:B};return{restrict:"E",priority:100,compile:function(d,e){if(H(e.value)){var f=a(d.text(),!0);f||e.$set("value",d.text())}return function(a,d,e){var l=d.parent(),m=l.data("$selectController")||l.parent().data("$selectController");m&&m.databound?d.prop("selected",!1):m=c,f?a.$watch(f,function(a,c){e.$set("value",a),a!==c&&m.removeOption(c),m.addOption(a)}):m.addOption(e.value),d.on("$destroy",function(){m.removeOption(e.value)})}}}}],hd=Z({restrict:"E",terminal:!0});V.angular.bootstrap?console.log("WARNING: Tried to load angular more than once."):((Ea=V.jQuery)&&Ea.fn.on?(D=Ea,F(Ea.fn,{scope:Ma.scope,isolateScope:Ma.isolateScope,controller:Ma.controller,injector:Ma.injector,inheritedData:Ma.inheritedData}),Fb("remove",!0,!0,!1),Fb("empty",!1,!1,!1),Fb("html",!1,!1,!0)):D=S,Wa.element=D,$c(Wa),D(W).ready(function(){Xc(W,cc)}))}(window,document),!window.angular.$$csp()&&window.angular.element(document).find("head").prepend(''),function(H,a,A){"use strict";function D(p,g){g=g||{},a.forEach(g,function(a,c){delete g[c]});for(var c in p)!p.hasOwnProperty(c)||"$"===c.charAt(0)&&"$"===c.charAt(1)||(g[c]=p[c]);return g}var v=a.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;a.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(p,g){function c(a,c){this.template=a,this.defaults=c||{},this.urlParams={}}function t(n,w,l){function r(h,d){var e={};return d=x({},w,d),s(d,function(b,d){u(b)&&(b=b());var k;if(b&&b.charAt&&"@"==b.charAt(0)){k=h;var a=b.substr(1);if(null==a||""===a||"hasOwnProperty"===a||!C.test("."+a))throw v("badmember",a);for(var a=a.split("."),f=0,c=a.length;c>f&&k!==A;f++){var g=a[f];k=null!==k?k[g]:A}}else k=b;e[d]=k}),e}function e(a){return a.resource}function f(a){D(a||{},this)}var F=new c(n);return l=x({},B,l),s(l,function(h,d){var c=/^(POST|PUT|PATCH)$/i.test(h.method);f[d]=function(b,d,k,w){var n,l,y,q={};switch(arguments.length){case 4:y=w,l=k;case 3:case 2:if(!u(d)){q=b,n=d,l=k;break}if(u(b)){l=b,y=d;break}l=d,y=k;case 1:u(b)?l=b:c?n=b:q=b;break;case 0:break;default:throw v("badargs",arguments.length)}var t=this instanceof f,m=t?n:h.isArray?[]:new f(n),z={},B=h.interceptor&&h.interceptor.response||e,C=h.interceptor&&h.interceptor.responseError||A;return s(h,function(a,b){"params"!=b&&"isArray"!=b&&"interceptor"!=b&&(z[b]=G(a))}),c&&(z.data=n),F.setUrlParams(z,x({},r(n,h.params||{}),q),h.url),q=p(z).then(function(b){var d=b.data,k=m.$promise;if(d){if(a.isArray(d)!==!!h.isArray)throw v("badcfg",h.isArray?"array":"object",a.isArray(d)?"array":"object");h.isArray?(m.length=0,s(d,function(b){"object"==typeof b?m.push(new f(b)):m.push(b)})):(D(d,m),m.$promise=k)}return m.$resolved=!0,b.resource=m,b},function(b){return m.$resolved=!0,(y||E)(b),g.reject(b)}),q=q.then(function(b){var a=B(b);return(l||E)(a,b.headers),a},C),t?q:(m.$promise=q,m.$resolved=!1,m)},f.prototype["$"+d]=function(b,a,k){return u(b)&&(k=a,a=b,b={}),b=f[d].call(this,b,this,a,k),b.$promise||b}}),f.bind=function(a){return t(n,x({},w,a),l)},f}var B={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},E=a.noop,s=a.forEach,x=a.extend,G=a.copy,u=a.isFunction;return c.prototype={setUrlParams:function(c,g,l){var f,p,r=this,e=l||r.template,h=r.urlParams={};s(e.split(/\W/),function(a){if("hasOwnProperty"===a)throw v("badname");!/^\d+$/.test(a)&&a&&RegExp("(^|[^\\\\]):"+a+"(\\W|$)").test(e)&&(h[a]=!0)}),e=e.replace(/\\:/g,":"),g=g||{},s(r.urlParams,function(d,c){f=g.hasOwnProperty(c)?g[c]:r.defaults[c],a.isDefined(f)&&null!==f?(p=encodeURIComponent(f).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),e=e.replace(RegExp(":"+c+"(\\W|$)","g"),function(a,c){return p+c})):e=e.replace(RegExp("(/?):"+c+"(\\W|$)","g"),function(a,c,d){return"/"==d.charAt(0)?d:c+d})}),e=e.replace(/\/+$/,"")||"/",e=e.replace(/\/\.(?=\w+($|\?))/,"."),c.url=e.replace(/\/\\\./,"/."),s(g,function(a,e){r.urlParams[e]||(c.params=c.params||{},c.params[e]=a)})}},t}])}(window,window.angular),function(n,e,A){"use strict";function x(s,g,h){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,w){function y(){p&&(p.remove(),p=null),k&&(k.$destroy(),k=null),l&&(h.leave(l,function(){p=null}),p=l,l=null)}function v(){var b=s.current&&s.current.locals;if(e.isDefined(b&&b.$template)){var b=a.$new(),d=s.current;l=w(b,function(d){h.enter(d,null,l||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||g()}),y()}),k=d.scope=b,k.$emit("$viewContentLoaded"),k.$eval(u)}else y()}var k,l,p,t=b.autoscroll,u=b.onload||"";a.$on("$routeChangeSuccess",v),v()}}}function z(e,g,h){return{restrict:"ECA",priority:-400,link:function(a,c){var b=h.current,f=b.locals;c.html(f.$template);var w=e(c.contents());b.controller&&(f.$scope=a,f=g(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f)),w(a)}}}n=e.module("ngRoute",["ng"]).provider("$route",function(){function s(a,c){return e.extend(new(e.extend(function(){},{prototype:a})),c)}function g(a,e){var b=e.caseInsensitiveMatch,f={originalPath:a,regexp:a},h=f.keys=[];return a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?\*])?/g,function(a,e,b,c){return a="?"===c?c:null,c="*"===c?c:null,h.push({name:b,optional:!!a}),e=e||"",""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1"),f.regexp=RegExp("^"+a+"$",b?"i":""),f}var h={};this.when=function(a,c){if(h[a]=e.extend({reloadOnSearch:!0},c,a&&g(a,c)),a){var b="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";h[b]=e.extend({redirectTo:a},g(b,c))}return this},this.otherwise=function(a){return this.when(null,a),this},this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,g,n,v,k){function l(){var d=p(),m=r.current;d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!u?(m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m)):(d||m)&&(u=!1,a.$broadcast("$routeChangeStart",d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?c.path(t(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var c,b,a=e.extend({},d.resolve);return e.forEach(a,function(d,c){a[c]=e.isString(d)?g.get(d):g.invoke(d)}),e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=k.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=b,c=n.get(b,{cache:v}).then(function(a){return a.data}))),e.isDefined(c)&&(a.$template=c),f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)}))}function p(){var a,b;return e.forEach(h,function(f,h){var q;if(q=!b){var g=c.path();q=f.keys;var l={};if(f.regexp)if(g=f.regexp.exec(g)){for(var k=1,p=g.length;p>k;++k){var n=q[k-1],r=g[k];n&&r&&(l[n.name]=r)}q=l}else q=null;else q=null;q=a=q}q&&(b=s(f,{params:e.extend({},c.search(),a),pathParams:a}),b.$$route=f)}),b||h[null]&&s(h[null],{params:{},pathParams:{}})}function t(a,c){var b=[];return e.forEach((a||"").split(":"),function(a,d){if(0===d)b.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),f=e[1];b.push(c[f]),b.push(e[2]||""),delete c[f]}}),b.join("")}var u=!1,r={routes:h,reload:function(){u=!0,a.$evalAsync(l)}};return a.$on("$locationChangeSuccess",l),r}]}),n.provider("$routeParams",function(){this.$get=function(){return{}}}),n.directive("ngView",x),n.directive("ngView",z),x.$inject=["$route","$anchorScroll","$animate"],z.$inject=["$compile","$controller","$route"]}(window,window.angular),angular.module("monospaced.qrcode",[]).directive("qrcode",["$window",function($window){var canvas2D=!!$window.CanvasRenderingContext2D,levels={L:"Low",M:"Medium",Q:"Quartile",H:"High"},draw=function(context,qr,modules,tile){for(var row=0;modules>row;row++)for(var col=0;modules>col;col++){var w=Math.ceil((col+1)*tile)-Math.floor(col*tile),h=Math.ceil((row+1)*tile)-Math.floor(row*tile);context.fillStyle=qr.isDark(row,col)?"#000":"#fff",context.fillRect(Math.round(col*tile),Math.round(row*tile),w,h)}};return{restrict:"E",template:"",link:function(scope,element,attrs){var error,version,errorCorrectionLevel,data,size,modules,tile,qr,domElement=element[0],canvas=element.find("canvas")[0],context=canvas2D?canvas.getContext("2d"):null,trim=/^\s+|\s+$/g,setVersion=function(value){version=Math.max(1,Math.min(parseInt(value,10),10))||4},setErrorCorrectionLevel=function(value){errorCorrectionLevel=value in levels?value:"M"},setData=function(value){if(value){data=value.replace(trim,""),qr=qrcode(version,errorCorrectionLevel),qr.addData(data);try{qr.make()}catch(e){return void(error=e.message)}error=!1,modules=qr.getModuleCount()}},setSize=function(value){size=parseInt(value,10)||2*modules,tile=size/modules,canvas.width=canvas.height=size},render=function(){return qr?error?(canvas2D||(domElement.innerHTML=''),void scope.$emit("qrcode:error",error)):void(canvas2D?draw(context,qr,modules,tile):domElement.innerHTML=qr.createImgTag(tile,0)):void 0};setVersion(attrs.version),setErrorCorrectionLevel(attrs.errorCorrectionLevel),setSize(attrs.size),attrs.$observe("version",function(value){value&&(setVersion(value),setData(data),setSize(size),render())}),attrs.$observe("errorCorrectionLevel",function(value){value&&(setErrorCorrectionLevel(value),setData(data),setSize(size),render())}),attrs.$observe("data",function(value){value&&(setData(value),setSize(size),render())}),attrs.$observe("size",function(value){value&&(setSize(value),render())})}}}]),function(G,d,P){"use strict";d.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(H,k,e){e=e.ngAnimateChildren,d.isString(e)&&0===e.length?k.data("$$ngAnimateChildren",!0):H.$watch(e,function(d){k.data("$$ngAnimateChildren",!!d)})}}).factory("$$animateReflow",["$$rAF","$document",function(d,k){var e=k[0].body;return function(k){return d(function(){k(e.offsetWidth)})}}]).config(["$provide","$animateProvider",function(H,k){function e(d){for(var e=0;e0){if(C=[],m.isClassBased)"setClass"==B.event?(C.push(B),A(c,b)):e[b]&&(w=e[b],w.event==a?f=!0:(C.push(w),A(c,b)));else if("leave"==a&&e["ng-leave"])f=!0;else{for(var w in e)C.push(e[w]),A(c,w);e={},p=0}0=b||(k.cancel(ea),fa=b,ea=k(function(){R(X),X=[]},W,!1))}function R(a){x(a,function(a){(a=a.data(v))&&(a.closeAnimationFn||p)()})}function I(a,b){var c=b?t[b]:null;if(!c){var h,Y,Z,k,e=0,d=0,f=0,l=0;x(a,function(a){if(a.nodeType==aa){a=g.getComputedStyle(a)||{},Z=a[n+Q],e=Math.max(M(Z),e),k=a[n+u],h=a[n+y],d=Math.max(M(h),d),Y=a[r+y],l=Math.max(M(Y),l);var b=M(a[r+Q]);b>0&&(b*=parseInt(a[r+m],10)||1),f=Math.max(b,f)}}),c={total:0,transitionPropertyStyle:k,transitionDurationStyle:Z,transitionDelayStyle:h,transitionDelay:d,transitionDuration:e,animationDelayStyle:Y,animationDelay:l,animationDuration:f},b&&(t[b]=c)}return c}function M(a){var b=0;return a=d.isString(a)?a.split(/\s*,\s*/):[],x(a,function(a){b=Math.max(parseFloat(a)||0,b)}),b}function F(a){var b=a.parent(),c=b.data(z);return c||(b.data(z,++da),c=da),c+"-"+e(a).getAttribute("class")}function U(a,b,c,d){var f=F(b),g=f+" "+c,l=t[g]?++t[g].total:0,h={};if(l>0){var k=c+"-stagger",h=f+" "+k;(f=!t[h])&&b.addClass(k),h=I(b,h),f&&b.removeClass(k)}d=d||function(a){return a()},b.addClass(c);var k=b.data(v)||{},m=d(function(){return I(b,g)});return d=m.transitionDuration,f=m.animationDuration,0===d&&0===f?(b.removeClass(c),!1):(b.data(v,{running:k.running||0,itemIndex:l,stagger:h,timings:m,closeAnimationFn:p}),a=00&&A(b,c,a),f>0&&0=y&&b>=r&&d()}var k=e(b);if(a=b.data(v),-1!=k.getAttribute("class").indexOf(c)&&a){var l="";x(c.split(" "),function(a,b){l+=(b>0?" ":"")+a+"-active"});var m=a.stagger,n=a.timings,p=a.itemIndex,r=Math.max(n.transitionDuration,n.animationDuration),u=Math.max(n.transitionDelay,n.animationDelay),y=u*ba,z=Date.now(),w=E+" "+H,q="",t=[];if(00&&(00?",":"")+(c*b+parseInt(a,10))+"s"}),d}function a(a,b,c,d){return U(a,b,c,d)?function(a){a&&f(b,c)}:void 0}function b(a,b,c,d){return b.data(v)?V(a,b,c,d):(f(b,c),void d())}function c(c,d,e,f){var g=a(c,d,e);if(g){var h=g;return l(d,function(){N(d,e),O(d),h=b(c,d,e,f)}),function(a){(h||p)(a)}}K(),f()}function f(a,b){a.removeClass(b);var c=a.data(v);c&&(c.running&&c.running--,c.running&&0!==c.running||a.removeData(v))}function q(a,b){var c="";return a=d.isArray(a)?a:a.split(/\s+/),x(a,function(a,d){a&&00?" ":"")+a+b)}),c}var n,H,r,E,s="";G.ontransitionend===P&&G.onwebkittransitionend!==P?(s="-webkit-",n="WebkitTransition",H="webkitTransitionEnd transitionend"):(n="transition",H="transitionend"),G.onanimationend===P&&G.onwebkitanimationend!==P?(s="-webkit-",r="WebkitAnimation",E="webkitAnimationEnd animationend"):(r="animation",E="animationend");var L,Q="Duration",u="Property",y="Delay",m="IterationCount",z="$$ngAnimateKey",v="$$ngAnimateCSS3Data",ca="ng-animate-block-transitions",B=3,C=1.5,ba=1e3,t={},da=0,S=[],ea=null,fa=0,X=[];return{enter:function(a,b){return c("enter",a,"ng-enter",b)},leave:function(a,b){return c("leave",a,"ng-leave",b)},move:function(a,b){return c("move",a,"ng-move",b)},beforeSetClass:function(b,c,d,e){var f=q(d,"-remove")+" "+q(c,"-add"),g=a("setClass",b,f,function(a){var e=b.attr("class");return b.removeClass(d),b.addClass(c),a=a(),b.attr("class",e),a});return g?(l(b,function(){N(b,f),O(b),e()}),g):(K(),void e())},beforeAddClass:function(b,c,d){var e=a("addClass",b,q(c,"-add"),function(a){return b.addClass(c),a=a(),b.removeClass(c),a});return e?(l(b,function(){N(b,c),O(b),d()}),e):(K(),void d())},setClass:function(a,c,d,e){return d=q(d,"-remove"),c=q(c,"-add"),b("setClass",a,d+" "+c,e)},addClass:function(a,c,d){return b("addClass",a,q(c,"-add"),d)},beforeRemoveClass:function(b,c,d){var e=a("removeClass",b,q(c,"-remove"),function(a){var d=b.attr("class");return b.removeClass(c),a=a(),b.attr("class",d),a});return e?(l(b,function(){N(b,c),O(b),d()}),e):void d()},removeClass:function(a,c,d){return b("removeClass",a,q(c,"-remove"),d)}}}])}])}(window,window.angular),angular.module("ui.bootstrap",["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]), -angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function($q,$timeout,$rootScope){function findEndEventName(endEventNames){for(var name in endEventNames)if(void 0!==transElement.style[name])return endEventNames[name]}var $transition=function(element,trigger,options){options=options||{};var deferred=$q.defer(),endEventName=$transition[options.animation?"animationEndEventName":"transitionEndEventName"],transitionEndHandler=function(event){$rootScope.$apply(function(){element.unbind(endEventName,transitionEndHandler),deferred.resolve(element)})};return endEventName&&element.bind(endEventName,transitionEndHandler),$timeout(function(){angular.isString(trigger)?element.addClass(trigger):angular.isFunction(trigger)?trigger(element):angular.isObject(trigger)&&element.css(trigger),endEventName||deferred.resolve(element)}),deferred.promise.cancel=function(){endEventName&&element.unbind(endEventName,transitionEndHandler),deferred.reject("Transition cancelled")},deferred.promise},transElement=document.createElement("trans"),transitionEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},animationEndEventNames={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return $transition.transitionEndEventName=findEndEventName(transitionEndEventNames),$transition.animationEndEventName=findEndEventName(animationEndEventNames),$transition}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function($transition,$timeout){return{link:function(scope,element,attrs){function doTransition(change){function newTransitionDone(){currentTransition===newTransition&&(currentTransition=void 0)}var newTransition=$transition(element,change);return currentTransition&¤tTransition.cancel(),currentTransition=newTransition,newTransition.then(newTransitionDone,newTransitionDone),newTransition}function expand(){initialAnimSkip?(initialAnimSkip=!1,expandDone()):(element.removeClass("collapse").addClass("collapsing"),doTransition({height:element[0].scrollHeight+"px"}).then(expandDone))}function expandDone(){element.removeClass("collapsing"),element.addClass("collapse in"),element.css({height:"auto"})}function collapse(){if(initialAnimSkip)initialAnimSkip=!1,collapseDone(),element.css({height:0});else{element.css({height:element[0].scrollHeight+"px"});element[0].offsetWidth;element.removeClass("collapse in").addClass("collapsing"),doTransition({height:0}).then(collapseDone)}}function collapseDone(){element.removeClass("collapsing"),element.addClass("collapse")}var currentTransition,initialAnimSkip=!0;scope.$watch(attrs.collapse,function(shouldCollapse){shouldCollapse?collapse():expand()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function($scope,$attrs,accordionConfig){this.groups=[],this.closeOthers=function(openGroup){var closeOthers=angular.isDefined($attrs.closeOthers)?$scope.$eval($attrs.closeOthers):accordionConfig.closeOthers;closeOthers&&angular.forEach(this.groups,function(group){group!==openGroup&&(group.isOpen=!1)})},this.addGroup=function(groupScope){var that=this;this.groups.push(groupScope),groupScope.$on("$destroy",function(event){that.removeGroup(groupScope)})},this.removeGroup=function(group){var index=this.groups.indexOf(group);-1!==index&&this.groups.splice(this.groups.indexOf(group),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function($parse){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(element){this.heading=element}},link:function(scope,element,attrs,accordionCtrl){var getIsOpen,setIsOpen;accordionCtrl.addGroup(scope),scope.isOpen=!1,attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,scope.$parent.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.$watch("isOpen",function(value){value&&accordionCtrl.closeOthers(scope),setIsOpen&&setIsOpen(scope.$parent,value)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(element,attr,transclude){return function(scope,element,attr,accordionGroupCtrl){accordionGroupCtrl.setHeading(transclude(scope,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(scope,element,attr,controller){scope.$watch(function(){return controller[attr.accordionTransclude]},function(heading){heading&&(element.html(""),element.append(heading))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function($scope,$attrs){$scope.closeable="close"in $attrs}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(scope,element,attr){element.addClass("ng-binding").data("$binding",attr.bindHtmlUnsafe),scope.$watch(attr.bindHtmlUnsafe,function(value){element.html(value||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(buttonConfig){this.activeClass=buttonConfig.activeClass||"active",this.toggleEvent=buttonConfig.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,scope.$eval(attrs.btnRadio)))},element.bind(buttonsCtrl.toggleEvent,function(){element.hasClass(buttonsCtrl.activeClass)||scope.$apply(function(){ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)),ngModelCtrl.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){function getTrueValue(){return getCheckboxValue(attrs.btnCheckboxTrue,!0)}function getFalseValue(){return getCheckboxValue(attrs.btnCheckboxFalse,!1)}function getCheckboxValue(attributeValue,defaultValue){var val=scope.$eval(attributeValue);return angular.isDefined(val)?val:defaultValue}var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,getTrueValue()))},element.bind(buttonsCtrl.toggleEvent,function(){scope.$apply(function(){ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass)?getFalseValue():getTrueValue()),ngModelCtrl.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function($scope,$timeout,$transition,$q){function restartTimer(){resetTimer();var interval=+$scope.interval;!isNaN(interval)&&interval>=0&&(currentTimeout=$timeout(timerFn,interval))}function resetTimer(){currentTimeout&&($timeout.cancel(currentTimeout),currentTimeout=null)}function timerFn(){isPlaying?($scope.next(),restartTimer()):$scope.pause()}var currentTimeout,isPlaying,self=this,slides=self.slides=[],currentIndex=-1;self.currentSlide=null;var destroyed=!1;self.select=function(nextSlide,direction){function goNext(){if(!destroyed){if(self.currentSlide&&angular.isString(direction)&&!$scope.noTransition&&nextSlide.$element){nextSlide.$element.addClass(direction);nextSlide.$element[0].offsetWidth;angular.forEach(slides,function(slide){angular.extend(slide,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(nextSlide,{direction:direction,active:!0,entering:!0}),angular.extend(self.currentSlide||{},{direction:direction,leaving:!0}),$scope.$currentTransition=$transition(nextSlide.$element,{}),function(next,current){$scope.$currentTransition.then(function(){transitionDone(next,current)},function(){transitionDone(next,current)})}(nextSlide,self.currentSlide)}else transitionDone(nextSlide,self.currentSlide);self.currentSlide=nextSlide,currentIndex=nextIndex,restartTimer()}}function transitionDone(next,current){angular.extend(next,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(current||{},{direction:"",active:!1,leaving:!1,entering:!1}),$scope.$currentTransition=null}var nextIndex=slides.indexOf(nextSlide);void 0===direction&&(direction=nextIndex>currentIndex?"next":"prev"),nextSlide&&nextSlide!==self.currentSlide&&($scope.$currentTransition?($scope.$currentTransition.cancel(),$timeout(goNext)):goNext())},$scope.$on("$destroy",function(){destroyed=!0}),self.indexOfSlide=function(slide){return slides.indexOf(slide)},$scope.next=function(){var newIndex=(currentIndex+1)%slides.length;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"next")},$scope.prev=function(){var newIndex=0>currentIndex-1?slides.length-1:currentIndex-1;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"prev")},$scope.select=function(slide){self.select(slide)},$scope.isActive=function(slide){return self.currentSlide===slide},$scope.slides=function(){return slides},$scope.$watch("interval",restartTimer),$scope.$on("$destroy",resetTimer),$scope.play=function(){isPlaying||(isPlaying=!0,restartTimer())},$scope.pause=function(){$scope.noPause||(isPlaying=!1,resetTimer())},self.addSlide=function(slide,element){slide.$element=element,slides.push(slide),1===slides.length||slide.active?(self.select(slides[slides.length-1]),1==slides.length&&$scope.play()):slide.active=!1},self.removeSlide=function(slide){var index=slides.indexOf(slide);slides.splice(index,1),slides.length>0&&slide.active?index>=slides.length?self.select(slides[index-1]):self.select(slides[index]):currentIndex>index&¤tIndex--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function($parse){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(scope,element,attrs,carouselCtrl){if(attrs.active){var getActive=$parse(attrs.active),setActive=getActive.assign,lastValue=scope.active=getActive(scope.$parent);scope.$watch(function(){var parentActive=getActive(scope.$parent);return parentActive!==scope.active&&(parentActive!==lastValue?lastValue=scope.active=parentActive:setActive(scope.$parent,parentActive=lastValue=scope.active)),parentActive})}carouselCtrl.addSlide(scope,element),scope.$on("$destroy",function(){carouselCtrl.removeSlide(scope)}),scope.$watch("active",function(active){active&&carouselCtrl.select(scope)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function($document,$window){function getStyle(el,cssprop){return el.currentStyle?el.currentStyle[cssprop]:$window.getComputedStyle?$window.getComputedStyle(el)[cssprop]:el.style[cssprop]}function isStaticPositioned(element){return"static"===(getStyle(element,"position")||"static")}var parentOffsetEl=function(element){for(var docDomEl=$document[0],offsetParent=element.offsetParent||docDomEl;offsetParent&&offsetParent!==docDomEl&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||docDomEl};return{position:function(element){var elBCR=this.offset(element),offsetParentBCR={top:0,left:0},offsetParentEl=parentOffsetEl(element[0]);offsetParentEl!=$document[0]&&(offsetParentBCR=this.offset(angular.element(offsetParentEl)),offsetParentBCR.top+=offsetParentEl.clientTop-offsetParentEl.scrollTop,offsetParentBCR.left+=offsetParentEl.clientLeft-offsetParentEl.scrollLeft);var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:elBCR.top-offsetParentBCR.top,left:elBCR.left-offsetParentBCR.left}},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].body.scrollTop||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].body.scrollLeft||$document[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function($scope,$attrs,dateFilter,dtConfig){function getValue(value,defaultValue){return angular.isDefined(value)?$scope.$parent.$eval(value):defaultValue}function getDaysInMonth(year,month){return new Date(year,month,0).getDate()}function getDates(startDate,n){for(var dates=new Array(n),current=startDate,i=0;n>i;)dates[i++]=new Date(current),current.setDate(current.getDate()+1);return dates}function makeDate(date,format,isSelected,isSecondary){return{date:date,label:dateFilter(date,format),selected:!!isSelected,secondary:!!isSecondary}}var format={day:getValue($attrs.dayFormat,dtConfig.dayFormat),month:getValue($attrs.monthFormat,dtConfig.monthFormat),year:getValue($attrs.yearFormat,dtConfig.yearFormat),dayHeader:getValue($attrs.dayHeaderFormat,dtConfig.dayHeaderFormat),dayTitle:getValue($attrs.dayTitleFormat,dtConfig.dayTitleFormat),monthTitle:getValue($attrs.monthTitleFormat,dtConfig.monthTitleFormat)},startingDay=getValue($attrs.startingDay,dtConfig.startingDay),yearRange=getValue($attrs.yearRange,dtConfig.yearRange);this.minDate=dtConfig.minDate?new Date(dtConfig.minDate):null,this.maxDate=dtConfig.maxDate?new Date(dtConfig.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(date,selected){var year=date.getFullYear(),month=date.getMonth(),firstDayOfMonth=new Date(year,month,1),difference=startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth),numDates=0;numDisplayedFromPreviousMonth>0&&(firstDate.setDate(-numDisplayedFromPreviousMonth+1),numDates+=numDisplayedFromPreviousMonth),numDates+=getDaysInMonth(year,month+1),numDates+=(7-numDates%7)%7;for(var days=getDates(firstDate,numDates),labels=new Array(7),i=0;numDates>i;i++){var dt=new Date(days[i]);days[i]=makeDate(dt,format.day,selected&&selected.getDate()===dt.getDate()&&selected.getMonth()===dt.getMonth()&&selected.getFullYear()===dt.getFullYear(),dt.getMonth()!==month)}for(var j=0;7>j;j++)labels[j]=dateFilter(days[j].date,format.dayHeader);return{objects:days,title:dateFilter(date,format.dayTitle),labels:labels}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth(),date1.getDate())-new Date(date2.getFullYear(),date2.getMonth(),date2.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(date,selected){for(var months=new Array(12),year=date.getFullYear(),i=0;12>i;i++){var dt=new Date(year,i,1);months[i]=makeDate(dt,format.month,selected&&selected.getMonth()===i&&selected.getFullYear()===year)}return{objects:months,title:dateFilter(date,format.monthTitle)}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth())-new Date(date2.getFullYear(),date2.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(date,selected){for(var years=new Array(yearRange),year=date.getFullYear(),startYear=parseInt((year-1)/yearRange,10)*yearRange+1,i=0;yearRange>i;i++){var dt=new Date(startYear+i,0,1);years[i]=makeDate(dt,format.year,selected&&selected.getFullYear()===dt.getFullYear())}return{objects:years,title:[years[0].label,years[yearRange-1].label].join(" - ")}},compare:function(date1,date2){return date1.getFullYear()-date2.getFullYear()},split:5,step:{years:yearRange}}],this.isDisabled=function(date,mode){var currentMode=this.modes[mode||0];return this.minDate&¤tMode.compare(date,this.minDate)<0||this.maxDate&¤tMode.compare(date,this.maxDate)>0||$scope.dateDisabled&&$scope.dateDisabled({date:date,mode:currentMode.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(dateFilter,$parse,datepickerConfig,$log){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(scope,element,attrs,ctrls){function updateShowWeekNumbers(){scope.showWeekNumbers=0===mode&&showWeeks}function split(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays}function refill(updateSelected){var date=null,valid=!0;ngModel.$modelValue&&(date=new Date(ngModel.$modelValue),isNaN(date)?(valid=!1,$log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):updateSelected&&(selected=date)),ngModel.$setValidity("date",valid);var currentMode=datepickerCtrl.modes[mode],data=currentMode.getVisibleDates(selected,date);angular.forEach(data.objects,function(obj){obj.disabled=datepickerCtrl.isDisabled(obj.date,mode)}),ngModel.$setValidity("date-disabled",!date||!datepickerCtrl.isDisabled(date)),scope.rows=split(data.objects,currentMode.split),scope.labels=data.labels||[],scope.title=data.title}function setMode(value){mode=value,updateShowWeekNumbers(),refill()}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}var datepickerCtrl=ctrls[0],ngModel=ctrls[1];if(ngModel){var mode=0,selected=new Date,showWeeks=datepickerConfig.showWeeks;attrs.showWeeks?scope.$parent.$watch($parse(attrs.showWeeks),function(value){showWeeks=!!value,updateShowWeekNumbers()}):updateShowWeekNumbers(),attrs.min&&scope.$parent.$watch($parse(attrs.min),function(value){datepickerCtrl.minDate=value?new Date(value):null,refill()}),attrs.max&&scope.$parent.$watch($parse(attrs.max),function(value){datepickerCtrl.maxDate=value?new Date(value):null,refill()}),ngModel.$render=function(){refill(!0)},scope.select=function(date){if(0===mode){var dt=ngModel.$modelValue?new Date(ngModel.$modelValue):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),ngModel.$setViewValue(dt),refill(!0)}else selected=date,setMode(mode-1)},scope.move=function(direction){var step=datepickerCtrl.modes[mode].step;selected.setMonth(selected.getMonth()+direction*(step.months||0)),selected.setFullYear(selected.getFullYear()+direction*(step.years||0)),refill()},scope.toggleMode=function(){setMode((mode+1)%datepickerCtrl.modes.length)},scope.getWeekNumber=function(row){return 0===mode&&scope.showWeekNumbers&&7===row.length?getISO8601WeekNumber(row[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function($compile,$parse,$document,$position,dateFilter,datepickerPopupConfig,datepickerConfig){return{restrict:"EA",require:"ngModel",link:function(originalScope,element,attrs,ngModel){function setOpen(value){setIsOpen?setIsOpen(originalScope,!!value):scope.isOpen=!!value}function parseDate(viewValue){if(viewValue){if(angular.isDate(viewValue))return ngModel.$setValidity("date",!0),viewValue;if(angular.isString(viewValue)){var date=new Date(viewValue);return isNaN(date)?void ngModel.$setValidity("date",!1):(ngModel.$setValidity("date",!0),date)}return void ngModel.$setValidity("date",!1)}return ngModel.$setValidity("date",!0),null}function addWatchableAttribute(attribute,scopeProperty,datepickerAttribute){attribute&&(originalScope.$watch($parse(attribute),function(value){scope[scopeProperty]=value}),datepickerEl.attr(datepickerAttribute||scopeProperty,scopeProperty))}function updatePosition(){scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top=scope.position.top+element.prop("offsetHeight")}var dateFormat,scope=originalScope.$new(),closeOnDateSelection=angular.isDefined(attrs.closeOnDateSelection)?originalScope.$eval(attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined(attrs.datepickerAppendToBody)?originalScope.$eval(attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody;attrs.$observe("datepickerPopup",function(value){dateFormat=value||datepickerPopupConfig.dateFormat,ngModel.$render()}),scope.showButtonBar=angular.isDefined(attrs.showButtonBar)?originalScope.$eval(attrs.showButtonBar):datepickerPopupConfig.showButtonBar,originalScope.$on("$destroy",function(){$popup.remove(),scope.$destroy()}),attrs.$observe("currentText",function(text){scope.currentText=angular.isDefined(text)?text:datepickerPopupConfig.currentText}),attrs.$observe("toggleWeeksText",function(text){scope.toggleWeeksText=angular.isDefined(text)?text:datepickerPopupConfig.toggleWeeksText}),attrs.$observe("clearText",function(text){scope.clearText=angular.isDefined(text)?text:datepickerPopupConfig.clearText}),attrs.$observe("closeText",function(text){scope.closeText=angular.isDefined(text)?text:datepickerPopupConfig.closeText});var getIsOpen,setIsOpen;attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,originalScope.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.isOpen=getIsOpen?getIsOpen(originalScope):!1;var documentClickBind=function(event){scope.isOpen&&event.target!==element[0]&&scope.$apply(function(){setOpen(!1)})},elementFocusBind=function(){scope.$apply(function(){setOpen(!0)})},popupEl=angular.element("
      ");popupEl.attr({"ng-model":"date","ng-change":"dateSelection()"});var datepickerEl=angular.element(popupEl.children()[0]),datepickerOptions={};attrs.datepickerOptions&&(datepickerOptions=originalScope.$eval(attrs.datepickerOptions),datepickerEl.attr(angular.extend({},datepickerOptions))),ngModel.$parsers.unshift(parseDate),scope.dateSelection=function(dt){angular.isDefined(dt)&&(scope.date=dt),ngModel.$setViewValue(scope.date),ngModel.$render(),closeOnDateSelection&&setOpen(!1)},element.bind("input change keyup",function(){scope.$apply(function(){scope.date=ngModel.$modelValue})}),ngModel.$render=function(){var date=ngModel.$viewValue?dateFilter(ngModel.$viewValue,dateFormat):"";element.val(date),scope.date=ngModel.$modelValue},addWatchableAttribute(attrs.min,"min"),addWatchableAttribute(attrs.max,"max"),attrs.showWeeks?addWatchableAttribute(attrs.showWeeks,"showWeeks","show-weeks"):(scope.showWeeks="show-weeks"in datepickerOptions?datepickerOptions["show-weeks"]:datepickerConfig.showWeeks,datepickerEl.attr("show-weeks","showWeeks")),attrs.dateDisabled&&datepickerEl.attr("date-disabled",attrs.dateDisabled);var documentBindingInitialized=!1,elementFocusInitialized=!1;scope.$watch("isOpen",function(value){value?(updatePosition(),$document.bind("click",documentClickBind),elementFocusInitialized&&element.unbind("focus",elementFocusBind),element[0].focus(),documentBindingInitialized=!0):(documentBindingInitialized&&$document.unbind("click",documentClickBind),element.bind("focus",elementFocusBind),elementFocusInitialized=!0),setIsOpen&&setIsOpen(originalScope,value)}),scope.today=function(){scope.dateSelection(new Date)},scope.clear=function(){scope.dateSelection(null)};var $popup=$compile(popupEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(scope,element,attrs){element.bind("click",function(event){event.preventDefault(),event.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function($document,$location){var openElement=null,closeMenu=angular.noop;return{restrict:"CA",link:function(scope,element,attrs){scope.$watch("$location.path",function(){closeMenu()}),element.parent().bind("click",function(){closeMenu()}),element.bind("click",function(event){var elementWasOpen=element===openElement;event.preventDefault(),event.stopPropagation(),openElement&&closeMenu(),elementWasOpen||element.hasClass("disabled")||element.prop("disabled")||(element.parent().addClass("open"),openElement=element,closeMenu=function(event){event&&(event.preventDefault(),event.stopPropagation()),$document.unbind("click",closeMenu),element.parent().removeClass("open"),closeMenu=angular.noop,openElement=null},$document.bind("click",closeMenu))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var stack=[];return{add:function(key,value){stack.push({key:key,value:value})},get:function(key){for(var i=0;i0)}function checkRemoveBackdrop(){if(backdropDomEl&&-1==backdropIndex()){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,150,function(){backdropScopeRef.$destroy(),backdropScopeRef=null}),backdropDomEl=void 0,backdropScope=void 0}}function removeAfterAnimate(domEl,scope,emulateTime,done){function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,domEl.remove(),done&&done())}scope.animate=!1;var transitionEndEventName=$transition.transitionEndEventName;if(transitionEndEventName){var timeout=$timeout(afterAnimating,emulateTime);domEl.bind(transitionEndEventName,function(){$timeout.cancel(timeout),afterAnimating(),scope.$apply()})}else $timeout(afterAnimating,0)}var backdropDomEl,backdropScope,OPENED_MODAL_CLASS="modal-open",openedWindows=$$stackedMap.createNew(),$modalStack={};return $rootScope.$watch(backdropIndex,function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)}),$document.bind("keydown",function(evt){var modal;27===evt.which&&(modal=openedWindows.top(),modal&&modal.value.keyboard&&$rootScope.$apply(function(){$modalStack.dismiss(modal.key)}))}),$modalStack.open=function(modalInstance,modal){openedWindows.add(modalInstance,{deferred:modal.deferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard});var body=$document.find("body").eq(0),currBackdropIndex=backdropIndex();currBackdropIndex>=0&&!backdropDomEl&&(backdropScope=$rootScope.$new(!0),backdropScope.index=currBackdropIndex,backdropDomEl=$compile("
      ")(backdropScope),body.append(backdropDomEl));var angularDomEl=angular.element("
      ");angularDomEl.attr("window-class",modal.windowClass),angularDomEl.attr("index",openedWindows.length()-1),angularDomEl.attr("animate","animate"),angularDomEl.html(modal.content);var modalDomEl=$compile(angularDomEl)(modal.scope);openedWindows.top().value.modalDomEl=modalDomEl,body.append(modalDomEl),body.addClass(OPENED_MODAL_CLASS)},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.resolve(result),removeModalWindow(modalInstance))},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.reject(reason),removeModalWindow(modalInstance))},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal;)this.dismiss(topModal.key,reason),topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack}]).provider("$modal",function(){var $modalProvider={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function($injector,$rootScope,$q,$http,$templateCache,$controller,$modalStack){function getTemplatePromise(options){return options.template?$q.when(options.template):$http.get(options.templateUrl,{cache:$templateCache}).then(function(result){return result.data})}function getResolvePromises(resolves){var promisesArr=[];return angular.forEach(resolves,function(value,key){(angular.isFunction(value)||angular.isArray(value))&&promisesArr.push($q.when($injector.invoke(value)))}),promisesArr}var $modal={};return $modal.open=function(modalOptions){var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,close:function(result){$modalStack.close(modalInstance,result)},dismiss:function(reason){$modalStack.dismiss(modalInstance,reason)}};if(modalOptions=angular.extend({},$modalProvider.options,modalOptions),modalOptions.resolve=modalOptions.resolve||{},!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of template or templateUrl options is required.");var templateAndResolvePromise=$q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));return templateAndResolvePromise.then(function(tplAndVars){var modalScope=(modalOptions.scope||$rootScope).$new();modalScope.$close=modalInstance.close, -modalScope.$dismiss=modalInstance.dismiss;var ctrlInstance,ctrlLocals={},resolveIter=1;modalOptions.controller&&(ctrlLocals.$scope=modalScope,ctrlLocals.$modalInstance=modalInstance,angular.forEach(modalOptions.resolve,function(value,key){ctrlLocals[key]=tplAndVars[resolveIter++]}),ctrlInstance=$controller(modalOptions.controller,ctrlLocals)),$modalStack.open(modalInstance,{scope:modalScope,deferred:modalResultDeferred,content:tplAndVars[0],backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,windowClass:modalOptions.windowClass})},function(reason){modalResultDeferred.reject(reason)}),templateAndResolvePromise.then(function(){modalOpenedDeferred.resolve(!0)},function(){modalOpenedDeferred.reject(!1)}),modalInstance},$modal}]};return $modalProvider}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function($scope,$attrs,$parse,$interpolate){var self=this,setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop;this.init=function(defaultItemsPerPage){$attrs.itemsPerPage?$scope.$parent.$watch($parse($attrs.itemsPerPage),function(value){self.itemsPerPage=parseInt(value,10),$scope.totalPages=self.calculateTotalPages()}):this.itemsPerPage=defaultItemsPerPage},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===$scope.totalPages},this.isActive=function(page){return this.page===page},this.calculateTotalPages=function(){var totalPages=this.itemsPerPage<1?1:Math.ceil($scope.totalItems/this.itemsPerPage);return Math.max(totalPages||0,1)},this.getAttributeValue=function(attribute,defaultValue,interpolate){return angular.isDefined(attribute)?interpolate?$interpolate(attribute)($scope.$parent):$scope.$parent.$eval(attribute):defaultValue},this.render=function(){this.page=parseInt($scope.page,10)||1,this.page>0&&this.page<=$scope.totalPages&&($scope.pages=this.getPages(this.page,$scope.totalPages))},$scope.selectPage=function(page){!self.isActive(page)&&page>0&&page<=$scope.totalPages&&($scope.page=page,$scope.onSelectPage({page:page}))},$scope.$watch("page",function(){self.render()}),$scope.$watch("totalItems",function(){$scope.totalPages=self.calculateTotalPages()}),$scope.$watch("totalPages",function(value){setNumPages($scope.$parent,value),self.page>value?$scope.selectPage(value):self.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function($parse,config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isActive,isDisabled){return{number:number,text:text,active:isActive,disabled:isDisabled}}var maxSize,boundaryLinks=paginationCtrl.getAttributeValue(attrs.boundaryLinks,config.boundaryLinks),directionLinks=paginationCtrl.getAttributeValue(attrs.directionLinks,config.directionLinks),firstText=paginationCtrl.getAttributeValue(attrs.firstText,config.firstText,!0),previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),lastText=paginationCtrl.getAttributeValue(attrs.lastText,config.lastText,!0),rotate=paginationCtrl.getAttributeValue(attrs.rotate,config.rotate);paginationCtrl.init(config.itemsPerPage),attrs.maxSize&&scope.$parent.$watch($parse(attrs.maxSize),function(value){maxSize=parseInt(value,10),paginationCtrl.render()}),paginationCtrl.getPages=function(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&totalPages>maxSize;isMaxSized&&(rotate?(startPage=Math.max(currentPage-Math.floor(maxSize/2),1),endPage=startPage+maxSize-1,endPage>totalPages&&(endPage=totalPages,startPage=endPage-maxSize+1)):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;endPage>=number;number++){var page=makePage(number,number,paginationCtrl.isActive(number),!1);pages.push(page)}if(isMaxSized&&!rotate){if(startPage>1){var previousPageSet=makePage(startPage-1,"...",!1,!1);pages.unshift(previousPageSet)}if(totalPages>endPage){var nextPageSet=makePage(endPage+1,"...",!1,!1);pages.push(nextPageSet)}}if(directionLinks){var previousPage=makePage(currentPage-1,previousText,!1,paginationCtrl.noPrevious());pages.unshift(previousPage);var nextPage=makePage(currentPage+1,nextText,!1,paginationCtrl.noNext());pages.push(nextPage)}if(boundaryLinks){var firstPage=makePage(1,firstText,!1,paginationCtrl.noPrevious());pages.unshift(firstPage);var lastPage=makePage(totalPages,lastText,!1,paginationCtrl.noNext());pages.push(lastPage)}return pages}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isDisabled,isPrevious,isNext){return{number:number,text:text,disabled:isDisabled,previous:align&&isPrevious,next:align&&isNext}}var previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),align=paginationCtrl.getAttributeValue(attrs.align,config.align);paginationCtrl.init(config.itemsPerPage),paginationCtrl.getPages=function(currentPage){return[makePage(currentPage-1,previousText,paginationCtrl.noPrevious(),!0,!1),makePage(currentPage+1,nextText,paginationCtrl.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function snake_case(name){var regexp=/[A-Z]/g,separator="-";return name.replace(regexp,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}var defaultOptions={placement:"top",animation:!0,popupDelay:0},triggerMap={mouseenter:"mouseleave",click:"click",focus:"blur"},globalOptions={};this.options=function(value){angular.extend(globalOptions,value)},this.setTriggers=function(triggers){angular.extend(triggerMap,triggers)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function($window,$compile,$timeout,$parse,$document,$position,$interpolate){return function(type,prefix,defaultTriggerShow){function getTriggers(trigger){var show=trigger||options.trigger||defaultTriggerShow,hide=triggerMap[show]||show;return{show:show,hide:hide}}var options=angular.extend({},defaultOptions,globalOptions),directiveName=snake_case(type),startSym=$interpolate.startSymbol(),endSym=$interpolate.endSymbol(),template="
      ';return{restrict:"EA",scope:!0,compile:function(tElem,tAttrs){var tooltipLinker=$compile(template);return function(scope,element,attrs){function toggleTooltipBind(){scope.tt_isOpen?hideTooltipBind():showTooltipBind()}function showTooltipBind(){(!hasEnableExp||scope.$eval(attrs[prefix+"Enable"]))&&(scope.tt_popupDelay?(popupTimeout=$timeout(show,scope.tt_popupDelay,!1),popupTimeout.then(function(reposition){reposition()})):show()())}function hideTooltipBind(){scope.$apply(function(){hide()})}function show(){return scope.tt_content?(createTooltip(),transitionTimeout&&$timeout.cancel(transitionTimeout),tooltip.css({top:0,left:0,display:"block"}),appendToBody?$document.find("body").append(tooltip):element.after(tooltip),positionTooltip(),scope.tt_isOpen=!0,scope.$digest(),positionTooltip):angular.noop}function hide(){scope.tt_isOpen=!1,$timeout.cancel(popupTimeout),scope.tt_animation?transitionTimeout=$timeout(removeTooltip,500):removeTooltip()}function createTooltip(){tooltip&&removeTooltip(),tooltip=tooltipLinker(scope,function(){}),scope.$digest()}function removeTooltip(){tooltip&&(tooltip.remove(),tooltip=null)}var tooltip,transitionTimeout,popupTimeout,appendToBody=angular.isDefined(options.appendToBody)?options.appendToBody:!1,triggers=getTriggers(void 0),hasRegisteredTriggers=!1,hasEnableExp=angular.isDefined(attrs[prefix+"Enable"]),positionTooltip=function(){var position,ttWidth,ttHeight,ttPosition;switch(position=appendToBody?$position.offset(element):$position.position(element),ttWidth=tooltip.prop("offsetWidth"),ttHeight=tooltip.prop("offsetHeight"),scope.tt_placement){case"right":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left+position.width};break;case"bottom":ttPosition={top:position.top+position.height,left:position.left+position.width/2-ttWidth/2};break;case"left":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left-ttWidth};break;default:ttPosition={top:position.top-ttHeight,left:position.left+position.width/2-ttWidth/2}}ttPosition.top+="px",ttPosition.left+="px",tooltip.css(ttPosition)};scope.tt_isOpen=!1,attrs.$observe(type,function(val){scope.tt_content=val,!val&&scope.tt_isOpen&&hide()}),attrs.$observe(prefix+"Title",function(val){scope.tt_title=val}),attrs.$observe(prefix+"Placement",function(val){scope.tt_placement=angular.isDefined(val)?val:options.placement}),attrs.$observe(prefix+"PopupDelay",function(val){var delay=parseInt(val,10);scope.tt_popupDelay=isNaN(delay)?options.popupDelay:delay});var unregisterTriggers=function(){hasRegisteredTriggers&&(element.unbind(triggers.show,showTooltipBind),element.unbind(triggers.hide,hideTooltipBind))};attrs.$observe(prefix+"Trigger",function(val){unregisterTriggers(),triggers=getTriggers(val),triggers.show===triggers.hide?element.bind(triggers.show,toggleTooltipBind):(element.bind(triggers.show,showTooltipBind),element.bind(triggers.hide,hideTooltipBind)),hasRegisteredTriggers=!0});var animation=scope.$eval(attrs[prefix+"Animation"]);scope.tt_animation=angular.isDefined(animation)?!!animation:options.animation,attrs.$observe(prefix+"AppendToBody",function(val){appendToBody=angular.isDefined(val)?$parse(val)(scope):appendToBody}),appendToBody&&scope.$on("$locationChangeSuccess",function(){scope.tt_isOpen&&hide()}),scope.$on("$destroy",function(){$timeout.cancel(transitionTimeout),$timeout.cancel(popupTimeout),unregisterTriggers(),removeTooltip()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function($tooltip){return $tooltip("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function($tooltip){return $tooltip("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function($tooltip){return $tooltip("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function($scope,$attrs,progressConfig,$transition){var self=this,bars=[],max=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):progressConfig.max,animate=angular.isDefined($attrs.animate)?$scope.$parent.$eval($attrs.animate):progressConfig.animate;this.addBar=function(bar,element){var oldValue=0,index=bar.$parent.$index;angular.isDefined(index)&&bars[index]&&(oldValue=bars[index].value),bars.push(bar),this.update(element,bar.value,oldValue),bar.$watch("value",function(value,oldValue){value!==oldValue&&self.update(element,value,oldValue)}),bar.$on("$destroy",function(){self.removeBar(bar)})},this.update=function(element,newValue,oldValue){var percent=this.getPercentage(newValue);animate?(element.css("width",this.getPercentage(oldValue)+"%"),$transition(element,{width:percent+"%"})):element.css({transition:"none",width:percent+"%"})},this.removeBar=function(bar){bars.splice(bars.indexOf(bar),1)},this.getPercentage=function(value){return Math.round(100*value/max)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
      '}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,element)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,angular.element(element.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function($scope,$attrs,$parse,ratingConfig){this.maxRange=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):ratingConfig.max,this.stateOn=angular.isDefined($attrs.stateOn)?$scope.$parent.$eval($attrs.stateOn):ratingConfig.stateOn,this.stateOff=angular.isDefined($attrs.stateOff)?$scope.$parent.$eval($attrs.stateOff):ratingConfig.stateOff,this.createRateObjects=function(states){for(var defaultOptions={stateOn:this.stateOn,stateOff:this.stateOff},i=0,n=states.length;n>i;i++)states[i]=angular.extend({index:i},defaultOptions,states[i]);return states},$scope.range=angular.isDefined($attrs.ratingStates)?this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))):this.createRateObjects(new Array(this.maxRange)),$scope.rate=function(value){$scope.value===value||$scope.readonly||($scope.value=value)},$scope.enter=function(value){$scope.readonly||($scope.val=value),$scope.onHover({value:value})},$scope.reset=function(){$scope.val=angular.copy($scope.value),$scope.onLeave()},$scope.$watch("value",function(value){$scope.val=value}),$scope.readonly=!1,$attrs.readonly&&$scope.$parent.$watch($parse($attrs.readonly),function(value){$scope.readonly=!!value})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function($scope){var ctrl=this,tabs=ctrl.tabs=$scope.tabs=[];ctrl.select=function(tab){angular.forEach(tabs,function(tab){tab.active=!1}),tab.active=!0},ctrl.addTab=function(tab){tabs.push(tab),(1===tabs.length||tab.active)&&ctrl.select(tab)},ctrl.removeTab=function(tab){var index=tabs.indexOf(tab);if(tab.active&&tabs.length>1){var newActiveIndex=index==tabs.length-1?index-1:index+1;ctrl.select(tabs[newActiveIndex])}tabs.splice(index,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(scope,element,attrs){scope.vertical=angular.isDefined(attrs.vertical)?scope.$parent.$eval(attrs.vertical):!1,scope.justified=angular.isDefined(attrs.justified)?scope.$parent.$eval(attrs.justified):!1,scope.type=angular.isDefined(attrs.type)?scope.$parent.$eval(attrs.type):"tabs"}}}).directive("tab",["$parse",function($parse){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(elm,attrs,transclude){return function(scope,elm,attrs,tabsetCtrl){var getActive,setActive;attrs.active?(getActive=$parse(attrs.active),setActive=getActive.assign,scope.$parent.$watch(getActive,function(value,oldVal){value!==oldVal&&(scope.active=!!value)}),scope.active=getActive(scope.$parent)):setActive=getActive=angular.noop,scope.$watch("active",function(active){setActive(scope.$parent,active),active?(tabsetCtrl.select(scope),scope.onSelect()):scope.onDeselect()}),scope.disabled=!1,attrs.disabled&&scope.$parent.$watch($parse(attrs.disabled),function(value){scope.disabled=!!value}),scope.select=function(){scope.disabled||(scope.active=!0)},tabsetCtrl.addTab(scope),scope.$on("$destroy",function(){tabsetCtrl.removeTab(scope)}),scope.$transcludeFn=transclude}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(scope,elm,attrs,tabCtrl){scope.$watch("headingElement",function(heading){heading&&(elm.html(""),elm.append(heading))})}}}]).directive("tabContentTransclude",function(){function isTabHeading(node){return node.tagName&&(node.hasAttribute("tab-heading")||node.hasAttribute("data-tab-heading")||"tab-heading"===node.tagName.toLowerCase()||"data-tab-heading"===node.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(scope,elm,attrs){var tab=scope.$eval(attrs.tabContentTransclude);tab.$transcludeFn(tab.$parent,function(contents){angular.forEach(contents,function(node){isTabHeading(node)?tab.headingElement=node:elm.append(node)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function($parse,$log,timepickerConfig,$locale){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(scope,element,attrs,ngModel){function getHoursFromTemplate(){var hours=parseInt(scope.hours,10),valid=scope.showMeridian?hours>0&&13>hours:hours>=0&&24>hours;return valid?(scope.showMeridian&&(12===hours&&(hours=0),scope.meridian===meridians[1]&&(hours+=12)),hours):void 0}function getMinutesFromTemplate(){var minutes=parseInt(scope.minutes,10);return minutes>=0&&60>minutes?minutes:void 0}function pad(value){return angular.isDefined(value)&&value.toString().length<2?"0"+value:value}function refresh(keyboardChange){makeValid(),ngModel.$setViewValue(new Date(selected)),updateTemplate(keyboardChange)}function makeValid(){ngModel.$setValidity("time",!0),scope.invalidHours=!1,scope.invalidMinutes=!1}function updateTemplate(keyboardChange){var hours=selected.getHours(),minutes=selected.getMinutes();scope.showMeridian&&(hours=0===hours||12===hours?12:hours%12),scope.hours="h"===keyboardChange?hours:pad(hours),scope.minutes="m"===keyboardChange?minutes:pad(minutes),scope.meridian=selected.getHours()<12?meridians[0]:meridians[1]}function addMinutes(minutes){var dt=new Date(selected.getTime()+6e4*minutes);selected.setHours(dt.getHours(),dt.getMinutes()),refresh()}if(ngModel){var selected=new Date,meridians=angular.isDefined(attrs.meridians)?scope.$parent.$eval(attrs.meridians):timepickerConfig.meridians||$locale.DATETIME_FORMATS.AMPMS,hourStep=timepickerConfig.hourStep;attrs.hourStep&&scope.$parent.$watch($parse(attrs.hourStep),function(value){hourStep=parseInt(value,10)});var minuteStep=timepickerConfig.minuteStep;attrs.minuteStep&&scope.$parent.$watch($parse(attrs.minuteStep),function(value){minuteStep=parseInt(value,10)}),scope.showMeridian=timepickerConfig.showMeridian,attrs.showMeridian&&scope.$parent.$watch($parse(attrs.showMeridian),function(value){if(scope.showMeridian=!!value,ngModel.$error.time){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();angular.isDefined(hours)&&angular.isDefined(minutes)&&(selected.setHours(hours),refresh())}else updateTemplate()});var inputs=element.find("input"),hoursInputEl=inputs.eq(0),minutesInputEl=inputs.eq(1),mousewheel=angular.isDefined(attrs.mousewheel)?scope.$eval(attrs.mousewheel):timepickerConfig.mousewheel;if(mousewheel){var isScrollingUp=function(e){e.originalEvent&&(e=e.originalEvent);var delta=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||delta>0};hoursInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementHours():scope.decrementHours()),e.preventDefault()}),minutesInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementMinutes():scope.decrementMinutes()),e.preventDefault()})}if(scope.readonlyInput=angular.isDefined(attrs.readonlyInput)?scope.$eval(attrs.readonlyInput):timepickerConfig.readonlyInput,scope.readonlyInput)scope.updateHours=angular.noop,scope.updateMinutes=angular.noop;else{var invalidate=function(invalidHours,invalidMinutes){ngModel.$setViewValue(null),ngModel.$setValidity("time",!1),angular.isDefined(invalidHours)&&(scope.invalidHours=invalidHours),angular.isDefined(invalidMinutes)&&(scope.invalidMinutes=invalidMinutes)};scope.updateHours=function(){var hours=getHoursFromTemplate();angular.isDefined(hours)?(selected.setHours(hours),refresh("h")):invalidate(!0)},hoursInputEl.bind("blur",function(e){!scope.validHours&&scope.hours<10&&scope.$apply(function(){scope.hours=pad(scope.hours)})}),scope.updateMinutes=function(){var minutes=getMinutesFromTemplate();angular.isDefined(minutes)?(selected.setMinutes(minutes),refresh("m")):invalidate(void 0,!0)},minutesInputEl.bind("blur",function(e){!scope.invalidMinutes&&scope.minutes<10&&scope.$apply(function(){scope.minutes=pad(scope.minutes)})})}ngModel.$render=function(){var date=ngModel.$modelValue?new Date(ngModel.$modelValue):null;isNaN(date)?(ngModel.$setValidity("time",!1),$log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(date&&(selected=date),makeValid(),updateTemplate())},scope.incrementHours=function(){addMinutes(60*hourStep)},scope.decrementHours=function(){addMinutes(60*-hourStep)},scope.incrementMinutes=function(){addMinutes(minuteStep)},scope.decrementMinutes=function(){addMinutes(-minuteStep)},scope.toggleMeridian=function(){addMinutes(720*(selected.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function($parse){var TYPEAHEAD_REGEXP=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(input){var match=input.match(TYPEAHEAD_REGEXP);if(!match)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+input+"'.");return{itemName:match[3],source:$parse(match[4]),viewMapper:$parse(match[2]||match[1]),modelMapper:$parse(match[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function($compile,$parse,$q,$timeout,$document,$position,typeaheadParser){var HOT_KEYS=[9,13,27,38,40];return{require:"ngModel",link:function(originalScope,element,attrs,modelCtrl){var hasFocus,minSearch=originalScope.$eval(attrs.typeaheadMinLength)||1,waitTime=originalScope.$eval(attrs.typeaheadWaitMs)||0,isEditable=originalScope.$eval(attrs.typeaheadEditable)!==!1,isLoadingSetter=$parse(attrs.typeaheadLoading).assign||angular.noop,onSelectCallback=$parse(attrs.typeaheadOnSelect),inputFormatter=attrs.typeaheadInputFormatter?$parse(attrs.typeaheadInputFormatter):void 0,appendToBody=attrs.typeaheadAppendToBody?$parse(attrs.typeaheadAppendToBody):!1,$setModelValue=$parse(attrs.ngModel).assign,parserResult=typeaheadParser.parse(attrs.typeahead),popUpEl=angular.element("
      ");popUpEl.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(attrs.typeaheadTemplateUrl)&&popUpEl.attr("template-url",attrs.typeaheadTemplateUrl);var scope=originalScope.$new();originalScope.$on("$destroy",function(){scope.$destroy()});var resetMatches=function(){scope.matches=[],scope.activeIdx=-1},getMatchesAsync=function(inputValue){var locals={$viewValue:inputValue};isLoadingSetter(originalScope,!0),$q.when(parserResult.source(originalScope,locals)).then(function(matches){if(inputValue===modelCtrl.$viewValue&&hasFocus){if(matches.length>0){scope.activeIdx=0,scope.matches.length=0;for(var i=0;i=minSearch?waitTime>0?(timeoutPromise&&$timeout.cancel(timeoutPromise),timeoutPromise=$timeout(function(){getMatchesAsync(inputValue)},waitTime)):getMatchesAsync(inputValue):(isLoadingSetter(originalScope,!1),resetMatches()),isEditable?inputValue:inputValue?void modelCtrl.$setValidity("editable",!1):(modelCtrl.$setValidity("editable",!0),inputValue)}),modelCtrl.$formatters.push(function(modelValue){var candidateViewValue,emptyViewValue,locals={};return inputFormatter?(locals.$model=modelValue,inputFormatter(originalScope,locals)):(locals[parserResult.itemName]=modelValue,candidateViewValue=parserResult.viewMapper(originalScope,locals),locals[parserResult.itemName]=void 0,emptyViewValue=parserResult.viewMapper(originalScope,locals),candidateViewValue!==emptyViewValue?candidateViewValue:modelValue)}),scope.select=function(activeIdx){var model,item,locals={};locals[parserResult.itemName]=item=scope.matches[activeIdx].model,model=parserResult.modelMapper(originalScope,locals),$setModelValue(originalScope,model),modelCtrl.$setValidity("editable",!0),onSelectCallback(originalScope,{$item:item,$model:model,$label:parserResult.viewMapper(originalScope,locals)}),resetMatches(),element[0].focus()},element.bind("keydown",function(evt){0!==scope.matches.length&&-1!==HOT_KEYS.indexOf(evt.which)&&(evt.preventDefault(),40===evt.which?(scope.activeIdx=(scope.activeIdx+1)%scope.matches.length,scope.$digest()):38===evt.which?(scope.activeIdx=(scope.activeIdx?scope.activeIdx:scope.matches.length)-1,scope.$digest()):13===evt.which||9===evt.which?scope.$apply(function(){scope.select(scope.activeIdx)}):27===evt.which&&(evt.stopPropagation(),resetMatches(),scope.$digest()))}),element.bind("blur",function(evt){hasFocus=!1});var dismissClickHandler=function(evt){element[0]!==evt.target&&(resetMatches(),scope.$digest())};$document.bind("click",dismissClickHandler),originalScope.$on("$destroy",function(){$document.unbind("click",dismissClickHandler)});var $popup=$compile(popUpEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(scope,element,attrs){scope.templateUrl=attrs.templateUrl,scope.isOpen=function(){return scope.matches.length>0},scope.isActive=function(matchIdx){return scope.active==matchIdx},scope.selectActive=function(matchIdx){scope.active=matchIdx},scope.selectMatch=function(activeIdx){scope.select({activeIdx:activeIdx})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function($http,$templateCache,$compile,$parse){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(scope,element,attrs){var tplUrl=$parse(attrs.templateUrl)(scope.$parent)||"template/typeahead/typeahead-match.html";$http.get(tplUrl,{cache:$templateCache}).success(function(tplContent){element.replaceWith($compile(tplContent.trim())(scope))})}}}]).filter("typeaheadHighlight",function(){function escapeRegexp(queryToEscape){return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(matchItem,query){return query?matchItem.replace(new RegExp(escapeRegexp(query),"gi"),"$&"):matchItem}}),angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function($q,$timeout,$rootScope){function findEndEventName(endEventNames){for(var name in endEventNames)if(void 0!==transElement.style[name])return endEventNames[name]}var $transition=function(element,trigger,options){options=options||{};var deferred=$q.defer(),endEventName=$transition[options.animation?"animationEndEventName":"transitionEndEventName"],transitionEndHandler=function(event){$rootScope.$apply(function(){element.unbind(endEventName,transitionEndHandler),deferred.resolve(element)})};return endEventName&&element.bind(endEventName,transitionEndHandler),$timeout(function(){angular.isString(trigger)?element.addClass(trigger):angular.isFunction(trigger)?trigger(element):angular.isObject(trigger)&&element.css(trigger),endEventName||deferred.resolve(element)}),deferred.promise.cancel=function(){endEventName&&element.unbind(endEventName,transitionEndHandler),deferred.reject("Transition cancelled")},deferred.promise},transElement=document.createElement("trans"),transitionEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},animationEndEventNames={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return $transition.transitionEndEventName=findEndEventName(transitionEndEventNames),$transition.animationEndEventName=findEndEventName(animationEndEventNames),$transition}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function($transition,$timeout){return{link:function(scope,element,attrs){function doTransition(change){function newTransitionDone(){currentTransition===newTransition&&(currentTransition=void 0)}var newTransition=$transition(element,change);return currentTransition&¤tTransition.cancel(),currentTransition=newTransition, -newTransition.then(newTransitionDone,newTransitionDone),newTransition}function expand(){initialAnimSkip?(initialAnimSkip=!1,expandDone()):(element.removeClass("collapse").addClass("collapsing"),doTransition({height:element[0].scrollHeight+"px"}).then(expandDone))}function expandDone(){element.removeClass("collapsing"),element.addClass("collapse in"),element.css({height:"auto"})}function collapse(){if(initialAnimSkip)initialAnimSkip=!1,collapseDone(),element.css({height:0});else{element.css({height:element[0].scrollHeight+"px"});element[0].offsetWidth;element.removeClass("collapse in").addClass("collapsing"),doTransition({height:0}).then(collapseDone)}}function collapseDone(){element.removeClass("collapsing"),element.addClass("collapse")}var currentTransition,initialAnimSkip=!0;scope.$watch(attrs.collapse,function(shouldCollapse){shouldCollapse?collapse():expand()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function($scope,$attrs,accordionConfig){this.groups=[],this.closeOthers=function(openGroup){var closeOthers=angular.isDefined($attrs.closeOthers)?$scope.$eval($attrs.closeOthers):accordionConfig.closeOthers;closeOthers&&angular.forEach(this.groups,function(group){group!==openGroup&&(group.isOpen=!1)})},this.addGroup=function(groupScope){var that=this;this.groups.push(groupScope),groupScope.$on("$destroy",function(event){that.removeGroup(groupScope)})},this.removeGroup=function(group){var index=this.groups.indexOf(group);-1!==index&&this.groups.splice(this.groups.indexOf(group),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function($parse){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(element){this.heading=element}},link:function(scope,element,attrs,accordionCtrl){var getIsOpen,setIsOpen;accordionCtrl.addGroup(scope),scope.isOpen=!1,attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,scope.$parent.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.$watch("isOpen",function(value){value&&accordionCtrl.closeOthers(scope),setIsOpen&&setIsOpen(scope.$parent,value)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(element,attr,transclude){return function(scope,element,attr,accordionGroupCtrl){accordionGroupCtrl.setHeading(transclude(scope,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(scope,element,attr,controller){scope.$watch(function(){return controller[attr.accordionTransclude]},function(heading){heading&&(element.html(""),element.append(heading))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function($scope,$attrs){$scope.closeable="close"in $attrs}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(scope,element,attr){element.addClass("ng-binding").data("$binding",attr.bindHtmlUnsafe),scope.$watch(attr.bindHtmlUnsafe,function(value){element.html(value||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(buttonConfig){this.activeClass=buttonConfig.activeClass||"active",this.toggleEvent=buttonConfig.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,scope.$eval(attrs.btnRadio)))},element.bind(buttonsCtrl.toggleEvent,function(){element.hasClass(buttonsCtrl.activeClass)||scope.$apply(function(){ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)),ngModelCtrl.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(scope,element,attrs,ctrls){function getTrueValue(){return getCheckboxValue(attrs.btnCheckboxTrue,!0)}function getFalseValue(){return getCheckboxValue(attrs.btnCheckboxFalse,!1)}function getCheckboxValue(attributeValue,defaultValue){var val=scope.$eval(attributeValue);return angular.isDefined(val)?val:defaultValue}var buttonsCtrl=ctrls[0],ngModelCtrl=ctrls[1];ngModelCtrl.$render=function(){element.toggleClass(buttonsCtrl.activeClass,angular.equals(ngModelCtrl.$modelValue,getTrueValue()))},element.bind(buttonsCtrl.toggleEvent,function(){scope.$apply(function(){ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass)?getFalseValue():getTrueValue()),ngModelCtrl.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function($scope,$timeout,$transition,$q){function restartTimer(){resetTimer();var interval=+$scope.interval;!isNaN(interval)&&interval>=0&&(currentTimeout=$timeout(timerFn,interval))}function resetTimer(){currentTimeout&&($timeout.cancel(currentTimeout),currentTimeout=null)}function timerFn(){isPlaying?($scope.next(),restartTimer()):$scope.pause()}var currentTimeout,isPlaying,self=this,slides=self.slides=[],currentIndex=-1;self.currentSlide=null;var destroyed=!1;self.select=function(nextSlide,direction){function goNext(){if(!destroyed){if(self.currentSlide&&angular.isString(direction)&&!$scope.noTransition&&nextSlide.$element){nextSlide.$element.addClass(direction);nextSlide.$element[0].offsetWidth;angular.forEach(slides,function(slide){angular.extend(slide,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(nextSlide,{direction:direction,active:!0,entering:!0}),angular.extend(self.currentSlide||{},{direction:direction,leaving:!0}),$scope.$currentTransition=$transition(nextSlide.$element,{}),function(next,current){$scope.$currentTransition.then(function(){transitionDone(next,current)},function(){transitionDone(next,current)})}(nextSlide,self.currentSlide)}else transitionDone(nextSlide,self.currentSlide);self.currentSlide=nextSlide,currentIndex=nextIndex,restartTimer()}}function transitionDone(next,current){angular.extend(next,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(current||{},{direction:"",active:!1,leaving:!1,entering:!1}),$scope.$currentTransition=null}var nextIndex=slides.indexOf(nextSlide);void 0===direction&&(direction=nextIndex>currentIndex?"next":"prev"),nextSlide&&nextSlide!==self.currentSlide&&($scope.$currentTransition?($scope.$currentTransition.cancel(),$timeout(goNext)):goNext())},$scope.$on("$destroy",function(){destroyed=!0}),self.indexOfSlide=function(slide){return slides.indexOf(slide)},$scope.next=function(){var newIndex=(currentIndex+1)%slides.length;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"next")},$scope.prev=function(){var newIndex=0>currentIndex-1?slides.length-1:currentIndex-1;return $scope.$currentTransition?void 0:self.select(slides[newIndex],"prev")},$scope.select=function(slide){self.select(slide)},$scope.isActive=function(slide){return self.currentSlide===slide},$scope.slides=function(){return slides},$scope.$watch("interval",restartTimer),$scope.$on("$destroy",resetTimer),$scope.play=function(){isPlaying||(isPlaying=!0,restartTimer())},$scope.pause=function(){$scope.noPause||(isPlaying=!1,resetTimer())},self.addSlide=function(slide,element){slide.$element=element,slides.push(slide),1===slides.length||slide.active?(self.select(slides[slides.length-1]),1==slides.length&&$scope.play()):slide.active=!1},self.removeSlide=function(slide){var index=slides.indexOf(slide);slides.splice(index,1),slides.length>0&&slide.active?index>=slides.length?self.select(slides[index-1]):self.select(slides[index]):currentIndex>index&¤tIndex--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function($parse){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(scope,element,attrs,carouselCtrl){if(attrs.active){var getActive=$parse(attrs.active),setActive=getActive.assign,lastValue=scope.active=getActive(scope.$parent);scope.$watch(function(){var parentActive=getActive(scope.$parent);return parentActive!==scope.active&&(parentActive!==lastValue?lastValue=scope.active=parentActive:setActive(scope.$parent,parentActive=lastValue=scope.active)),parentActive})}carouselCtrl.addSlide(scope,element),scope.$on("$destroy",function(){carouselCtrl.removeSlide(scope)}),scope.$watch("active",function(active){active&&carouselCtrl.select(scope)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function($document,$window){function getStyle(el,cssprop){return el.currentStyle?el.currentStyle[cssprop]:$window.getComputedStyle?$window.getComputedStyle(el)[cssprop]:el.style[cssprop]}function isStaticPositioned(element){return"static"===(getStyle(element,"position")||"static")}var parentOffsetEl=function(element){for(var docDomEl=$document[0],offsetParent=element.offsetParent||docDomEl;offsetParent&&offsetParent!==docDomEl&&isStaticPositioned(offsetParent);)offsetParent=offsetParent.offsetParent;return offsetParent||docDomEl};return{position:function(element){var elBCR=this.offset(element),offsetParentBCR={top:0,left:0},offsetParentEl=parentOffsetEl(element[0]);offsetParentEl!=$document[0]&&(offsetParentBCR=this.offset(angular.element(offsetParentEl)),offsetParentBCR.top+=offsetParentEl.clientTop-offsetParentEl.scrollTop,offsetParentBCR.left+=offsetParentEl.clientLeft-offsetParentEl.scrollLeft);var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:elBCR.top-offsetParentBCR.top,left:elBCR.left-offsetParentBCR.left}},offset:function(element){var boundingClientRect=element[0].getBoundingClientRect();return{width:boundingClientRect.width||element.prop("offsetWidth"),height:boundingClientRect.height||element.prop("offsetHeight"),top:boundingClientRect.top+($window.pageYOffset||$document[0].body.scrollTop||$document[0].documentElement.scrollTop),left:boundingClientRect.left+($window.pageXOffset||$document[0].body.scrollLeft||$document[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function($scope,$attrs,dateFilter,dtConfig){function getValue(value,defaultValue){return angular.isDefined(value)?$scope.$parent.$eval(value):defaultValue}function getDaysInMonth(year,month){return new Date(year,month,0).getDate()}function getDates(startDate,n){for(var dates=new Array(n),current=startDate,i=0;n>i;)dates[i++]=new Date(current),current.setDate(current.getDate()+1);return dates}function makeDate(date,format,isSelected,isSecondary){return{date:date,label:dateFilter(date,format),selected:!!isSelected,secondary:!!isSecondary}}var format={day:getValue($attrs.dayFormat,dtConfig.dayFormat),month:getValue($attrs.monthFormat,dtConfig.monthFormat),year:getValue($attrs.yearFormat,dtConfig.yearFormat),dayHeader:getValue($attrs.dayHeaderFormat,dtConfig.dayHeaderFormat),dayTitle:getValue($attrs.dayTitleFormat,dtConfig.dayTitleFormat),monthTitle:getValue($attrs.monthTitleFormat,dtConfig.monthTitleFormat)},startingDay=getValue($attrs.startingDay,dtConfig.startingDay),yearRange=getValue($attrs.yearRange,dtConfig.yearRange);this.minDate=dtConfig.minDate?new Date(dtConfig.minDate):null,this.maxDate=dtConfig.maxDate?new Date(dtConfig.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(date,selected){var year=date.getFullYear(),month=date.getMonth(),firstDayOfMonth=new Date(year,month,1),difference=startingDay-firstDayOfMonth.getDay(),numDisplayedFromPreviousMonth=difference>0?7-difference:-difference,firstDate=new Date(firstDayOfMonth),numDates=0;numDisplayedFromPreviousMonth>0&&(firstDate.setDate(-numDisplayedFromPreviousMonth+1),numDates+=numDisplayedFromPreviousMonth),numDates+=getDaysInMonth(year,month+1),numDates+=(7-numDates%7)%7;for(var days=getDates(firstDate,numDates),labels=new Array(7),i=0;numDates>i;i++){var dt=new Date(days[i]);days[i]=makeDate(dt,format.day,selected&&selected.getDate()===dt.getDate()&&selected.getMonth()===dt.getMonth()&&selected.getFullYear()===dt.getFullYear(),dt.getMonth()!==month)}for(var j=0;7>j;j++)labels[j]=dateFilter(days[j].date,format.dayHeader);return{objects:days,title:dateFilter(date,format.dayTitle),labels:labels}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth(),date1.getDate())-new Date(date2.getFullYear(),date2.getMonth(),date2.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(date,selected){for(var months=new Array(12),year=date.getFullYear(),i=0;12>i;i++){var dt=new Date(year,i,1);months[i]=makeDate(dt,format.month,selected&&selected.getMonth()===i&&selected.getFullYear()===year)}return{objects:months,title:dateFilter(date,format.monthTitle)}},compare:function(date1,date2){return new Date(date1.getFullYear(),date1.getMonth())-new Date(date2.getFullYear(),date2.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(date,selected){for(var years=new Array(yearRange),year=date.getFullYear(),startYear=parseInt((year-1)/yearRange,10)*yearRange+1,i=0;yearRange>i;i++){var dt=new Date(startYear+i,0,1);years[i]=makeDate(dt,format.year,selected&&selected.getFullYear()===dt.getFullYear())}return{objects:years,title:[years[0].label,years[yearRange-1].label].join(" - ")}},compare:function(date1,date2){return date1.getFullYear()-date2.getFullYear()},split:5,step:{years:yearRange}}],this.isDisabled=function(date,mode){var currentMode=this.modes[mode||0];return this.minDate&¤tMode.compare(date,this.minDate)<0||this.maxDate&¤tMode.compare(date,this.maxDate)>0||$scope.dateDisabled&&$scope.dateDisabled({date:date,mode:currentMode.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(dateFilter,$parse,datepickerConfig,$log){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(scope,element,attrs,ctrls){function updateShowWeekNumbers(){scope.showWeekNumbers=0===mode&&showWeeks}function split(arr,size){for(var arrays=[];arr.length>0;)arrays.push(arr.splice(0,size));return arrays}function refill(updateSelected){var date=null,valid=!0;ngModel.$modelValue&&(date=new Date(ngModel.$modelValue),isNaN(date)?(valid=!1,$log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):updateSelected&&(selected=date)),ngModel.$setValidity("date",valid);var currentMode=datepickerCtrl.modes[mode],data=currentMode.getVisibleDates(selected,date);angular.forEach(data.objects,function(obj){obj.disabled=datepickerCtrl.isDisabled(obj.date,mode)}),ngModel.$setValidity("date-disabled",!date||!datepickerCtrl.isDisabled(date)),scope.rows=split(data.objects,currentMode.split),scope.labels=data.labels||[],scope.title=data.title}function setMode(value){mode=value,updateShowWeekNumbers(),refill()}function getISO8601WeekNumber(date){var checkDate=new Date(date);checkDate.setDate(checkDate.getDate()+4-(checkDate.getDay()||7));var time=checkDate.getTime();return checkDate.setMonth(0),checkDate.setDate(1),Math.floor(Math.round((time-checkDate)/864e5)/7)+1}var datepickerCtrl=ctrls[0],ngModel=ctrls[1];if(ngModel){var mode=0,selected=new Date,showWeeks=datepickerConfig.showWeeks;attrs.showWeeks?scope.$parent.$watch($parse(attrs.showWeeks),function(value){showWeeks=!!value,updateShowWeekNumbers()}):updateShowWeekNumbers(),attrs.min&&scope.$parent.$watch($parse(attrs.min),function(value){datepickerCtrl.minDate=value?new Date(value):null,refill()}),attrs.max&&scope.$parent.$watch($parse(attrs.max),function(value){datepickerCtrl.maxDate=value?new Date(value):null,refill()}),ngModel.$render=function(){refill(!0)},scope.select=function(date){if(0===mode){var dt=ngModel.$modelValue?new Date(ngModel.$modelValue):new Date(0,0,0,0,0,0,0);dt.setFullYear(date.getFullYear(),date.getMonth(),date.getDate()),ngModel.$setViewValue(dt),refill(!0)}else selected=date,setMode(mode-1)},scope.move=function(direction){var step=datepickerCtrl.modes[mode].step;selected.setMonth(selected.getMonth()+direction*(step.months||0)),selected.setFullYear(selected.getFullYear()+direction*(step.years||0)),refill()},scope.toggleMode=function(){setMode((mode+1)%datepickerCtrl.modes.length)},scope.getWeekNumber=function(row){return 0===mode&&scope.showWeekNumbers&&7===row.length?getISO8601WeekNumber(row[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function($compile,$parse,$document,$position,dateFilter,datepickerPopupConfig,datepickerConfig){return{restrict:"EA",require:"ngModel",link:function(originalScope,element,attrs,ngModel){function setOpen(value){setIsOpen?setIsOpen(originalScope,!!value):scope.isOpen=!!value}function parseDate(viewValue){if(viewValue){if(angular.isDate(viewValue))return ngModel.$setValidity("date",!0),viewValue;if(angular.isString(viewValue)){var date=new Date(viewValue);return isNaN(date)?void ngModel.$setValidity("date",!1):(ngModel.$setValidity("date",!0),date)}return void ngModel.$setValidity("date",!1)}return ngModel.$setValidity("date",!0),null}function addWatchableAttribute(attribute,scopeProperty,datepickerAttribute){attribute&&(originalScope.$watch($parse(attribute),function(value){scope[scopeProperty]=value}),datepickerEl.attr(datepickerAttribute||scopeProperty,scopeProperty))}function updatePosition(){scope.position=appendToBody?$position.offset(element):$position.position(element),scope.position.top=scope.position.top+element.prop("offsetHeight")}var dateFormat,scope=originalScope.$new(),closeOnDateSelection=angular.isDefined(attrs.closeOnDateSelection)?originalScope.$eval(attrs.closeOnDateSelection):datepickerPopupConfig.closeOnDateSelection,appendToBody=angular.isDefined(attrs.datepickerAppendToBody)?originalScope.$eval(attrs.datepickerAppendToBody):datepickerPopupConfig.appendToBody;attrs.$observe("datepickerPopup",function(value){dateFormat=value||datepickerPopupConfig.dateFormat,ngModel.$render()}),scope.showButtonBar=angular.isDefined(attrs.showButtonBar)?originalScope.$eval(attrs.showButtonBar):datepickerPopupConfig.showButtonBar,originalScope.$on("$destroy",function(){$popup.remove(),scope.$destroy()}),attrs.$observe("currentText",function(text){scope.currentText=angular.isDefined(text)?text:datepickerPopupConfig.currentText}),attrs.$observe("toggleWeeksText",function(text){scope.toggleWeeksText=angular.isDefined(text)?text:datepickerPopupConfig.toggleWeeksText}),attrs.$observe("clearText",function(text){scope.clearText=angular.isDefined(text)?text:datepickerPopupConfig.clearText}),attrs.$observe("closeText",function(text){scope.closeText=angular.isDefined(text)?text:datepickerPopupConfig.closeText});var getIsOpen,setIsOpen;attrs.isOpen&&(getIsOpen=$parse(attrs.isOpen),setIsOpen=getIsOpen.assign,originalScope.$watch(getIsOpen,function(value){scope.isOpen=!!value})),scope.isOpen=getIsOpen?getIsOpen(originalScope):!1;var documentClickBind=function(event){scope.isOpen&&event.target!==element[0]&&scope.$apply(function(){setOpen(!1)})},elementFocusBind=function(){scope.$apply(function(){setOpen(!0)})},popupEl=angular.element("
      ");popupEl.attr({"ng-model":"date","ng-change":"dateSelection()"});var datepickerEl=angular.element(popupEl.children()[0]),datepickerOptions={};attrs.datepickerOptions&&(datepickerOptions=originalScope.$eval(attrs.datepickerOptions),datepickerEl.attr(angular.extend({},datepickerOptions))),ngModel.$parsers.unshift(parseDate),scope.dateSelection=function(dt){angular.isDefined(dt)&&(scope.date=dt),ngModel.$setViewValue(scope.date),ngModel.$render(),closeOnDateSelection&&setOpen(!1)},element.bind("input change keyup",function(){scope.$apply(function(){scope.date=ngModel.$modelValue})}),ngModel.$render=function(){var date=ngModel.$viewValue?dateFilter(ngModel.$viewValue,dateFormat):"";element.val(date),scope.date=ngModel.$modelValue},addWatchableAttribute(attrs.min,"min"),addWatchableAttribute(attrs.max,"max"),attrs.showWeeks?addWatchableAttribute(attrs.showWeeks,"showWeeks","show-weeks"):(scope.showWeeks="show-weeks"in datepickerOptions?datepickerOptions["show-weeks"]:datepickerConfig.showWeeks,datepickerEl.attr("show-weeks","showWeeks")),attrs.dateDisabled&&datepickerEl.attr("date-disabled",attrs.dateDisabled);var documentBindingInitialized=!1,elementFocusInitialized=!1;scope.$watch("isOpen",function(value){value?(updatePosition(),$document.bind("click",documentClickBind),elementFocusInitialized&&element.unbind("focus",elementFocusBind),element[0].focus(),documentBindingInitialized=!0):(documentBindingInitialized&&$document.unbind("click",documentClickBind),element.bind("focus",elementFocusBind),elementFocusInitialized=!0),setIsOpen&&setIsOpen(originalScope,value)}),scope.today=function(){scope.dateSelection(new Date)},scope.clear=function(){scope.dateSelection(null)};var $popup=$compile(popupEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(scope,element,attrs){element.bind("click",function(event){event.preventDefault(),event.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function($document,$location){var openElement=null,closeMenu=angular.noop;return{restrict:"CA",link:function(scope,element,attrs){scope.$watch("$location.path",function(){closeMenu()}),element.parent().bind("click",function(){closeMenu()}),element.bind("click",function(event){var elementWasOpen=element===openElement;event.preventDefault(),event.stopPropagation(),openElement&&closeMenu(),elementWasOpen||element.hasClass("disabled")||element.prop("disabled")||(element.parent().addClass("open"),openElement=element,closeMenu=function(event){event&&(event.preventDefault(),event.stopPropagation()),$document.unbind("click",closeMenu),element.parent().removeClass("open"),closeMenu=angular.noop,openElement=null},$document.bind("click",closeMenu))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var stack=[];return{add:function(key,value){stack.push({key:key,value:value})},get:function(key){for(var i=0;i0)}function checkRemoveBackdrop(){if(backdropDomEl&&-1==backdropIndex()){var backdropScopeRef=backdropScope;removeAfterAnimate(backdropDomEl,backdropScope,150,function(){backdropScopeRef.$destroy(),backdropScopeRef=null}),backdropDomEl=void 0,backdropScope=void 0}}function removeAfterAnimate(domEl,scope,emulateTime,done){function afterAnimating(){afterAnimating.done||(afterAnimating.done=!0,domEl.remove(),done&&done())}scope.animate=!1;var transitionEndEventName=$transition.transitionEndEventName;if(transitionEndEventName){var timeout=$timeout(afterAnimating,emulateTime);domEl.bind(transitionEndEventName,function(){$timeout.cancel(timeout),afterAnimating(),scope.$apply()})}else $timeout(afterAnimating,0)}var backdropDomEl,backdropScope,OPENED_MODAL_CLASS="modal-open",openedWindows=$$stackedMap.createNew(),$modalStack={};return $rootScope.$watch(backdropIndex,function(newBackdropIndex){backdropScope&&(backdropScope.index=newBackdropIndex)}),$document.bind("keydown",function(evt){var modal;27===evt.which&&(modal=openedWindows.top(),modal&&modal.value.keyboard&&$rootScope.$apply(function(){$modalStack.dismiss(modal.key)}))}),$modalStack.open=function(modalInstance,modal){openedWindows.add(modalInstance,{deferred:modal.deferred,modalScope:modal.scope,backdrop:modal.backdrop,keyboard:modal.keyboard});var body=$document.find("body").eq(0),currBackdropIndex=backdropIndex();currBackdropIndex>=0&&!backdropDomEl&&(backdropScope=$rootScope.$new(!0),backdropScope.index=currBackdropIndex,backdropDomEl=$compile("
      ")(backdropScope),body.append(backdropDomEl));var angularDomEl=angular.element("
      ");angularDomEl.attr("window-class",modal.windowClass),angularDomEl.attr("index",openedWindows.length()-1),angularDomEl.attr("animate","animate"),angularDomEl.html(modal.content);var modalDomEl=$compile(angularDomEl)(modal.scope);openedWindows.top().value.modalDomEl=modalDomEl,body.append(modalDomEl),body.addClass(OPENED_MODAL_CLASS)},$modalStack.close=function(modalInstance,result){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.resolve(result),removeModalWindow(modalInstance))},$modalStack.dismiss=function(modalInstance,reason){var modalWindow=openedWindows.get(modalInstance).value;modalWindow&&(modalWindow.deferred.reject(reason),removeModalWindow(modalInstance))},$modalStack.dismissAll=function(reason){for(var topModal=this.getTop();topModal;)this.dismiss(topModal.key,reason),topModal=this.getTop()},$modalStack.getTop=function(){return openedWindows.top()},$modalStack}]).provider("$modal",function(){var $modalProvider={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function($injector,$rootScope,$q,$http,$templateCache,$controller,$modalStack){function getTemplatePromise(options){return options.template?$q.when(options.template):$http.get(options.templateUrl,{cache:$templateCache}).then(function(result){return result.data})}function getResolvePromises(resolves){var promisesArr=[];return angular.forEach(resolves,function(value,key){(angular.isFunction(value)||angular.isArray(value))&&promisesArr.push($q.when($injector.invoke(value)))}),promisesArr}var $modal={};return $modal.open=function(modalOptions){var modalResultDeferred=$q.defer(),modalOpenedDeferred=$q.defer(),modalInstance={result:modalResultDeferred.promise,opened:modalOpenedDeferred.promise,close:function(result){$modalStack.close(modalInstance,result)},dismiss:function(reason){$modalStack.dismiss(modalInstance,reason)}};if(modalOptions=angular.extend({},$modalProvider.options,modalOptions),modalOptions.resolve=modalOptions.resolve||{},!modalOptions.template&&!modalOptions.templateUrl)throw new Error("One of template or templateUrl options is required.");var templateAndResolvePromise=$q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));return templateAndResolvePromise.then(function(tplAndVars){var modalScope=(modalOptions.scope||$rootScope).$new();modalScope.$close=modalInstance.close,modalScope.$dismiss=modalInstance.dismiss;var ctrlInstance,ctrlLocals={},resolveIter=1;modalOptions.controller&&(ctrlLocals.$scope=modalScope,ctrlLocals.$modalInstance=modalInstance,angular.forEach(modalOptions.resolve,function(value,key){ctrlLocals[key]=tplAndVars[resolveIter++]}),ctrlInstance=$controller(modalOptions.controller,ctrlLocals)),$modalStack.open(modalInstance,{scope:modalScope,deferred:modalResultDeferred,content:tplAndVars[0],backdrop:modalOptions.backdrop,keyboard:modalOptions.keyboard,windowClass:modalOptions.windowClass})},function(reason){modalResultDeferred.reject(reason)}),templateAndResolvePromise.then(function(){modalOpenedDeferred.resolve(!0)},function(){modalOpenedDeferred.reject(!1)}),modalInstance},$modal}]};return $modalProvider}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function($scope,$attrs,$parse,$interpolate){var self=this,setNumPages=$attrs.numPages?$parse($attrs.numPages).assign:angular.noop;this.init=function(defaultItemsPerPage){$attrs.itemsPerPage?$scope.$parent.$watch($parse($attrs.itemsPerPage),function(value){self.itemsPerPage=parseInt(value,10),$scope.totalPages=self.calculateTotalPages()}):this.itemsPerPage=defaultItemsPerPage},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===$scope.totalPages},this.isActive=function(page){return this.page===page},this.calculateTotalPages=function(){var totalPages=this.itemsPerPage<1?1:Math.ceil($scope.totalItems/this.itemsPerPage);return Math.max(totalPages||0,1)},this.getAttributeValue=function(attribute,defaultValue,interpolate){return angular.isDefined(attribute)?interpolate?$interpolate(attribute)($scope.$parent):$scope.$parent.$eval(attribute):defaultValue},this.render=function(){this.page=parseInt($scope.page,10)||1,this.page>0&&this.page<=$scope.totalPages&&($scope.pages=this.getPages(this.page,$scope.totalPages))},$scope.selectPage=function(page){ -!self.isActive(page)&&page>0&&page<=$scope.totalPages&&($scope.page=page,$scope.onSelectPage({page:page}))},$scope.$watch("page",function(){self.render()}),$scope.$watch("totalItems",function(){$scope.totalPages=self.calculateTotalPages()}),$scope.$watch("totalPages",function(value){setNumPages($scope.$parent,value),self.page>value?$scope.selectPage(value):self.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function($parse,config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isActive,isDisabled){return{number:number,text:text,active:isActive,disabled:isDisabled}}var maxSize,boundaryLinks=paginationCtrl.getAttributeValue(attrs.boundaryLinks,config.boundaryLinks),directionLinks=paginationCtrl.getAttributeValue(attrs.directionLinks,config.directionLinks),firstText=paginationCtrl.getAttributeValue(attrs.firstText,config.firstText,!0),previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),lastText=paginationCtrl.getAttributeValue(attrs.lastText,config.lastText,!0),rotate=paginationCtrl.getAttributeValue(attrs.rotate,config.rotate);paginationCtrl.init(config.itemsPerPage),attrs.maxSize&&scope.$parent.$watch($parse(attrs.maxSize),function(value){maxSize=parseInt(value,10),paginationCtrl.render()}),paginationCtrl.getPages=function(currentPage,totalPages){var pages=[],startPage=1,endPage=totalPages,isMaxSized=angular.isDefined(maxSize)&&totalPages>maxSize;isMaxSized&&(rotate?(startPage=Math.max(currentPage-Math.floor(maxSize/2),1),endPage=startPage+maxSize-1,endPage>totalPages&&(endPage=totalPages,startPage=endPage-maxSize+1)):(startPage=(Math.ceil(currentPage/maxSize)-1)*maxSize+1,endPage=Math.min(startPage+maxSize-1,totalPages)));for(var number=startPage;endPage>=number;number++){var page=makePage(number,number,paginationCtrl.isActive(number),!1);pages.push(page)}if(isMaxSized&&!rotate){if(startPage>1){var previousPageSet=makePage(startPage-1,"...",!1,!1);pages.unshift(previousPageSet)}if(totalPages>endPage){var nextPageSet=makePage(endPage+1,"...",!1,!1);pages.push(nextPageSet)}}if(directionLinks){var previousPage=makePage(currentPage-1,previousText,!1,paginationCtrl.noPrevious());pages.unshift(previousPage);var nextPage=makePage(currentPage+1,nextText,!1,paginationCtrl.noNext());pages.push(nextPage)}if(boundaryLinks){var firstPage=makePage(1,firstText,!1,paginationCtrl.noPrevious());pages.unshift(firstPage);var lastPage=makePage(totalPages,lastText,!1,paginationCtrl.noNext());pages.push(lastPage)}return pages}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(config){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(scope,element,attrs,paginationCtrl){function makePage(number,text,isDisabled,isPrevious,isNext){return{number:number,text:text,disabled:isDisabled,previous:align&&isPrevious,next:align&&isNext}}var previousText=paginationCtrl.getAttributeValue(attrs.previousText,config.previousText,!0),nextText=paginationCtrl.getAttributeValue(attrs.nextText,config.nextText,!0),align=paginationCtrl.getAttributeValue(attrs.align,config.align);paginationCtrl.init(config.itemsPerPage),paginationCtrl.getPages=function(currentPage){return[makePage(currentPage-1,previousText,paginationCtrl.noPrevious(),!0,!1),makePage(currentPage+1,nextText,paginationCtrl.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function snake_case(name){var regexp=/[A-Z]/g,separator="-";return name.replace(regexp,function(letter,pos){return(pos?separator:"")+letter.toLowerCase()})}var defaultOptions={placement:"top",animation:!0,popupDelay:0},triggerMap={mouseenter:"mouseleave",click:"click",focus:"blur"},globalOptions={};this.options=function(value){angular.extend(globalOptions,value)},this.setTriggers=function(triggers){angular.extend(triggerMap,triggers)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function($window,$compile,$timeout,$parse,$document,$position,$interpolate){return function(type,prefix,defaultTriggerShow){function getTriggers(trigger){var show=trigger||options.trigger||defaultTriggerShow,hide=triggerMap[show]||show;return{show:show,hide:hide}}var options=angular.extend({},defaultOptions,globalOptions),directiveName=snake_case(type),startSym=$interpolate.startSymbol(),endSym=$interpolate.endSymbol(),template="
      ';return{restrict:"EA",scope:!0,compile:function(tElem,tAttrs){var tooltipLinker=$compile(template);return function(scope,element,attrs){function toggleTooltipBind(){scope.tt_isOpen?hideTooltipBind():showTooltipBind()}function showTooltipBind(){(!hasEnableExp||scope.$eval(attrs[prefix+"Enable"]))&&(scope.tt_popupDelay?(popupTimeout=$timeout(show,scope.tt_popupDelay,!1),popupTimeout.then(function(reposition){reposition()})):show()())}function hideTooltipBind(){scope.$apply(function(){hide()})}function show(){return scope.tt_content?(createTooltip(),transitionTimeout&&$timeout.cancel(transitionTimeout),tooltip.css({top:0,left:0,display:"block"}),appendToBody?$document.find("body").append(tooltip):element.after(tooltip),positionTooltip(),scope.tt_isOpen=!0,scope.$digest(),positionTooltip):angular.noop}function hide(){scope.tt_isOpen=!1,$timeout.cancel(popupTimeout),scope.tt_animation?transitionTimeout=$timeout(removeTooltip,500):removeTooltip()}function createTooltip(){tooltip&&removeTooltip(),tooltip=tooltipLinker(scope,function(){}),scope.$digest()}function removeTooltip(){tooltip&&(tooltip.remove(),tooltip=null)}var tooltip,transitionTimeout,popupTimeout,appendToBody=angular.isDefined(options.appendToBody)?options.appendToBody:!1,triggers=getTriggers(void 0),hasRegisteredTriggers=!1,hasEnableExp=angular.isDefined(attrs[prefix+"Enable"]),positionTooltip=function(){var position,ttWidth,ttHeight,ttPosition;switch(position=appendToBody?$position.offset(element):$position.position(element),ttWidth=tooltip.prop("offsetWidth"),ttHeight=tooltip.prop("offsetHeight"),scope.tt_placement){case"right":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left+position.width};break;case"bottom":ttPosition={top:position.top+position.height,left:position.left+position.width/2-ttWidth/2};break;case"left":ttPosition={top:position.top+position.height/2-ttHeight/2,left:position.left-ttWidth};break;default:ttPosition={top:position.top-ttHeight,left:position.left+position.width/2-ttWidth/2}}ttPosition.top+="px",ttPosition.left+="px",tooltip.css(ttPosition)};scope.tt_isOpen=!1,attrs.$observe(type,function(val){scope.tt_content=val,!val&&scope.tt_isOpen&&hide()}),attrs.$observe(prefix+"Title",function(val){scope.tt_title=val}),attrs.$observe(prefix+"Placement",function(val){scope.tt_placement=angular.isDefined(val)?val:options.placement}),attrs.$observe(prefix+"PopupDelay",function(val){var delay=parseInt(val,10);scope.tt_popupDelay=isNaN(delay)?options.popupDelay:delay});var unregisterTriggers=function(){hasRegisteredTriggers&&(element.unbind(triggers.show,showTooltipBind),element.unbind(triggers.hide,hideTooltipBind))};attrs.$observe(prefix+"Trigger",function(val){unregisterTriggers(),triggers=getTriggers(val),triggers.show===triggers.hide?element.bind(triggers.show,toggleTooltipBind):(element.bind(triggers.show,showTooltipBind),element.bind(triggers.hide,hideTooltipBind)),hasRegisteredTriggers=!0});var animation=scope.$eval(attrs[prefix+"Animation"]);scope.tt_animation=angular.isDefined(animation)?!!animation:options.animation,attrs.$observe(prefix+"AppendToBody",function(val){appendToBody=angular.isDefined(val)?$parse(val)(scope):appendToBody}),appendToBody&&scope.$on("$locationChangeSuccess",function(){scope.tt_isOpen&&hide()}),scope.$on("$destroy",function(){$timeout.cancel(transitionTimeout),$timeout.cancel(popupTimeout),unregisterTriggers(),removeTooltip()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function($tooltip){return $tooltip("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function($tooltip){return $tooltip("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function($tooltip){return $tooltip("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function($scope,$attrs,progressConfig,$transition){var self=this,bars=[],max=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):progressConfig.max,animate=angular.isDefined($attrs.animate)?$scope.$parent.$eval($attrs.animate):progressConfig.animate;this.addBar=function(bar,element){var oldValue=0,index=bar.$parent.$index;angular.isDefined(index)&&bars[index]&&(oldValue=bars[index].value),bars.push(bar),this.update(element,bar.value,oldValue),bar.$watch("value",function(value,oldValue){value!==oldValue&&self.update(element,value,oldValue)}),bar.$on("$destroy",function(){self.removeBar(bar)})},this.update=function(element,newValue,oldValue){var percent=this.getPercentage(newValue);animate?(element.css("width",this.getPercentage(oldValue)+"%"),$transition(element,{width:percent+"%"})):element.css({transition:"none",width:percent+"%"})},this.removeBar=function(bar){bars.splice(bars.indexOf(bar),1)},this.getPercentage=function(value){return Math.round(100*value/max)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
      '}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,element)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(scope,element,attrs,progressCtrl){progressCtrl.addBar(scope,angular.element(element.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function($scope,$attrs,$parse,ratingConfig){this.maxRange=angular.isDefined($attrs.max)?$scope.$parent.$eval($attrs.max):ratingConfig.max,this.stateOn=angular.isDefined($attrs.stateOn)?$scope.$parent.$eval($attrs.stateOn):ratingConfig.stateOn,this.stateOff=angular.isDefined($attrs.stateOff)?$scope.$parent.$eval($attrs.stateOff):ratingConfig.stateOff,this.createRateObjects=function(states){for(var defaultOptions={stateOn:this.stateOn,stateOff:this.stateOff},i=0,n=states.length;n>i;i++)states[i]=angular.extend({index:i},defaultOptions,states[i]);return states},$scope.range=angular.isDefined($attrs.ratingStates)?this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))):this.createRateObjects(new Array(this.maxRange)),$scope.rate=function(value){$scope.value===value||$scope.readonly||($scope.value=value)},$scope.enter=function(value){$scope.readonly||($scope.val=value),$scope.onHover({value:value})},$scope.reset=function(){$scope.val=angular.copy($scope.value),$scope.onLeave()},$scope.$watch("value",function(value){$scope.val=value}),$scope.readonly=!1,$attrs.readonly&&$scope.$parent.$watch($parse($attrs.readonly),function(value){$scope.readonly=!!value})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function($scope){var ctrl=this,tabs=ctrl.tabs=$scope.tabs=[];ctrl.select=function(tab){angular.forEach(tabs,function(tab){tab.active=!1}),tab.active=!0},ctrl.addTab=function(tab){tabs.push(tab),(1===tabs.length||tab.active)&&ctrl.select(tab)},ctrl.removeTab=function(tab){var index=tabs.indexOf(tab);if(tab.active&&tabs.length>1){var newActiveIndex=index==tabs.length-1?index-1:index+1;ctrl.select(tabs[newActiveIndex])}tabs.splice(index,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(scope,element,attrs){scope.vertical=angular.isDefined(attrs.vertical)?scope.$parent.$eval(attrs.vertical):!1,scope.justified=angular.isDefined(attrs.justified)?scope.$parent.$eval(attrs.justified):!1,scope.type=angular.isDefined(attrs.type)?scope.$parent.$eval(attrs.type):"tabs"}}}).directive("tab",["$parse",function($parse){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(elm,attrs,transclude){return function(scope,elm,attrs,tabsetCtrl){var getActive,setActive;attrs.active?(getActive=$parse(attrs.active),setActive=getActive.assign,scope.$parent.$watch(getActive,function(value,oldVal){value!==oldVal&&(scope.active=!!value)}),scope.active=getActive(scope.$parent)):setActive=getActive=angular.noop,scope.$watch("active",function(active){setActive(scope.$parent,active),active?(tabsetCtrl.select(scope),scope.onSelect()):scope.onDeselect()}),scope.disabled=!1,attrs.disabled&&scope.$parent.$watch($parse(attrs.disabled),function(value){scope.disabled=!!value}),scope.select=function(){scope.disabled||(scope.active=!0)},tabsetCtrl.addTab(scope),scope.$on("$destroy",function(){tabsetCtrl.removeTab(scope)}),scope.$transcludeFn=transclude}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(scope,elm,attrs,tabCtrl){scope.$watch("headingElement",function(heading){heading&&(elm.html(""),elm.append(heading))})}}}]).directive("tabContentTransclude",function(){function isTabHeading(node){return node.tagName&&(node.hasAttribute("tab-heading")||node.hasAttribute("data-tab-heading")||"tab-heading"===node.tagName.toLowerCase()||"data-tab-heading"===node.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(scope,elm,attrs){var tab=scope.$eval(attrs.tabContentTransclude);tab.$transcludeFn(tab.$parent,function(contents){angular.forEach(contents,function(node){isTabHeading(node)?tab.headingElement=node:elm.append(node)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function($parse,$log,timepickerConfig,$locale){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(scope,element,attrs,ngModel){function getHoursFromTemplate(){var hours=parseInt(scope.hours,10),valid=scope.showMeridian?hours>0&&13>hours:hours>=0&&24>hours;return valid?(scope.showMeridian&&(12===hours&&(hours=0),scope.meridian===meridians[1]&&(hours+=12)),hours):void 0}function getMinutesFromTemplate(){var minutes=parseInt(scope.minutes,10);return minutes>=0&&60>minutes?minutes:void 0}function pad(value){return angular.isDefined(value)&&value.toString().length<2?"0"+value:value}function refresh(keyboardChange){makeValid(),ngModel.$setViewValue(new Date(selected)),updateTemplate(keyboardChange)}function makeValid(){ngModel.$setValidity("time",!0),scope.invalidHours=!1,scope.invalidMinutes=!1}function updateTemplate(keyboardChange){var hours=selected.getHours(),minutes=selected.getMinutes();scope.showMeridian&&(hours=0===hours||12===hours?12:hours%12),scope.hours="h"===keyboardChange?hours:pad(hours),scope.minutes="m"===keyboardChange?minutes:pad(minutes),scope.meridian=selected.getHours()<12?meridians[0]:meridians[1]}function addMinutes(minutes){var dt=new Date(selected.getTime()+6e4*minutes);selected.setHours(dt.getHours(),dt.getMinutes()),refresh()}if(ngModel){var selected=new Date,meridians=angular.isDefined(attrs.meridians)?scope.$parent.$eval(attrs.meridians):timepickerConfig.meridians||$locale.DATETIME_FORMATS.AMPMS,hourStep=timepickerConfig.hourStep;attrs.hourStep&&scope.$parent.$watch($parse(attrs.hourStep),function(value){hourStep=parseInt(value,10)});var minuteStep=timepickerConfig.minuteStep;attrs.minuteStep&&scope.$parent.$watch($parse(attrs.minuteStep),function(value){minuteStep=parseInt(value,10)}),scope.showMeridian=timepickerConfig.showMeridian,attrs.showMeridian&&scope.$parent.$watch($parse(attrs.showMeridian),function(value){if(scope.showMeridian=!!value,ngModel.$error.time){var hours=getHoursFromTemplate(),minutes=getMinutesFromTemplate();angular.isDefined(hours)&&angular.isDefined(minutes)&&(selected.setHours(hours),refresh())}else updateTemplate()});var inputs=element.find("input"),hoursInputEl=inputs.eq(0),minutesInputEl=inputs.eq(1),mousewheel=angular.isDefined(attrs.mousewheel)?scope.$eval(attrs.mousewheel):timepickerConfig.mousewheel;if(mousewheel){var isScrollingUp=function(e){e.originalEvent&&(e=e.originalEvent);var delta=e.wheelDelta?e.wheelDelta:-e.deltaY;return e.detail||delta>0};hoursInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementHours():scope.decrementHours()),e.preventDefault()}),minutesInputEl.bind("mousewheel wheel",function(e){scope.$apply(isScrollingUp(e)?scope.incrementMinutes():scope.decrementMinutes()),e.preventDefault()})}if(scope.readonlyInput=angular.isDefined(attrs.readonlyInput)?scope.$eval(attrs.readonlyInput):timepickerConfig.readonlyInput,scope.readonlyInput)scope.updateHours=angular.noop,scope.updateMinutes=angular.noop;else{var invalidate=function(invalidHours,invalidMinutes){ngModel.$setViewValue(null),ngModel.$setValidity("time",!1),angular.isDefined(invalidHours)&&(scope.invalidHours=invalidHours),angular.isDefined(invalidMinutes)&&(scope.invalidMinutes=invalidMinutes)};scope.updateHours=function(){var hours=getHoursFromTemplate();angular.isDefined(hours)?(selected.setHours(hours),refresh("h")):invalidate(!0)},hoursInputEl.bind("blur",function(e){!scope.validHours&&scope.hours<10&&scope.$apply(function(){scope.hours=pad(scope.hours)})}),scope.updateMinutes=function(){var minutes=getMinutesFromTemplate();angular.isDefined(minutes)?(selected.setMinutes(minutes),refresh("m")):invalidate(void 0,!0)},minutesInputEl.bind("blur",function(e){!scope.invalidMinutes&&scope.minutes<10&&scope.$apply(function(){scope.minutes=pad(scope.minutes)})})}ngModel.$render=function(){var date=ngModel.$modelValue?new Date(ngModel.$modelValue):null;isNaN(date)?(ngModel.$setValidity("time",!1),$log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(date&&(selected=date),makeValid(),updateTemplate())},scope.incrementHours=function(){addMinutes(60*hourStep)},scope.decrementHours=function(){addMinutes(60*-hourStep)},scope.incrementMinutes=function(){addMinutes(minuteStep)},scope.decrementMinutes=function(){addMinutes(-minuteStep)},scope.toggleMeridian=function(){addMinutes(720*(selected.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function($parse){var TYPEAHEAD_REGEXP=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(input){var match=input.match(TYPEAHEAD_REGEXP);if(!match)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+input+"'.");return{itemName:match[3],source:$parse(match[4]),viewMapper:$parse(match[2]||match[1]),modelMapper:$parse(match[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function($compile,$parse,$q,$timeout,$document,$position,typeaheadParser){var HOT_KEYS=[9,13,27,38,40];return{require:"ngModel",link:function(originalScope,element,attrs,modelCtrl){var hasFocus,minSearch=originalScope.$eval(attrs.typeaheadMinLength)||1,waitTime=originalScope.$eval(attrs.typeaheadWaitMs)||0,isEditable=originalScope.$eval(attrs.typeaheadEditable)!==!1,isLoadingSetter=$parse(attrs.typeaheadLoading).assign||angular.noop,onSelectCallback=$parse(attrs.typeaheadOnSelect),inputFormatter=attrs.typeaheadInputFormatter?$parse(attrs.typeaheadInputFormatter):void 0,appendToBody=attrs.typeaheadAppendToBody?$parse(attrs.typeaheadAppendToBody):!1,$setModelValue=$parse(attrs.ngModel).assign,parserResult=typeaheadParser.parse(attrs.typeahead),popUpEl=angular.element("
      ");popUpEl.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(attrs.typeaheadTemplateUrl)&&popUpEl.attr("template-url",attrs.typeaheadTemplateUrl);var scope=originalScope.$new();originalScope.$on("$destroy",function(){scope.$destroy()});var resetMatches=function(){scope.matches=[],scope.activeIdx=-1},getMatchesAsync=function(inputValue){var locals={$viewValue:inputValue};isLoadingSetter(originalScope,!0),$q.when(parserResult.source(originalScope,locals)).then(function(matches){if(inputValue===modelCtrl.$viewValue&&hasFocus){if(matches.length>0){scope.activeIdx=0,scope.matches.length=0;for(var i=0;i=minSearch?waitTime>0?(timeoutPromise&&$timeout.cancel(timeoutPromise),timeoutPromise=$timeout(function(){getMatchesAsync(inputValue)},waitTime)):getMatchesAsync(inputValue):(isLoadingSetter(originalScope,!1),resetMatches()),isEditable?inputValue:inputValue?void modelCtrl.$setValidity("editable",!1):(modelCtrl.$setValidity("editable",!0),inputValue)}),modelCtrl.$formatters.push(function(modelValue){var candidateViewValue,emptyViewValue,locals={};return inputFormatter?(locals.$model=modelValue,inputFormatter(originalScope,locals)):(locals[parserResult.itemName]=modelValue,candidateViewValue=parserResult.viewMapper(originalScope,locals),locals[parserResult.itemName]=void 0,emptyViewValue=parserResult.viewMapper(originalScope,locals),candidateViewValue!==emptyViewValue?candidateViewValue:modelValue)}),scope.select=function(activeIdx){var model,item,locals={};locals[parserResult.itemName]=item=scope.matches[activeIdx].model,model=parserResult.modelMapper(originalScope,locals),$setModelValue(originalScope,model),modelCtrl.$setValidity("editable",!0),onSelectCallback(originalScope,{$item:item,$model:model,$label:parserResult.viewMapper(originalScope,locals)}),resetMatches(),element[0].focus()},element.bind("keydown",function(evt){0!==scope.matches.length&&-1!==HOT_KEYS.indexOf(evt.which)&&(evt.preventDefault(),40===evt.which?(scope.activeIdx=(scope.activeIdx+1)%scope.matches.length,scope.$digest()):38===evt.which?(scope.activeIdx=(scope.activeIdx?scope.activeIdx:scope.matches.length)-1,scope.$digest()):13===evt.which||9===evt.which?scope.$apply(function(){scope.select(scope.activeIdx)}):27===evt.which&&(evt.stopPropagation(),resetMatches(),scope.$digest()))}),element.bind("blur",function(evt){hasFocus=!1});var dismissClickHandler=function(evt){element[0]!==evt.target&&(resetMatches(),scope.$digest())};$document.bind("click",dismissClickHandler),originalScope.$on("$destroy",function(){$document.unbind("click",dismissClickHandler)});var $popup=$compile(popUpEl)(scope);appendToBody?$document.find("body").append($popup):element.after($popup)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(scope,element,attrs){scope.templateUrl=attrs.templateUrl,scope.isOpen=function(){return scope.matches.length>0},scope.isActive=function(matchIdx){return scope.active==matchIdx},scope.selectActive=function(matchIdx){scope.active=matchIdx},scope.selectMatch=function(activeIdx){scope.select({activeIdx:activeIdx})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function($http,$templateCache,$compile,$parse){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(scope,element,attrs){var tplUrl=$parse(attrs.templateUrl)(scope.$parent)||"template/typeahead/typeahead-match.html";$http.get(tplUrl,{cache:$templateCache}).success(function(tplContent){element.replaceWith($compile(tplContent.trim())(scope))})}}}]).filter("typeaheadHighlight",function(){function escapeRegexp(queryToEscape){return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(matchItem,query){return query?matchItem.replace(new RegExp(escapeRegexp(query),"gi"),"$&"):matchItem}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/accordion/accordion-group.html",'
      \n \n
      \n
      \n
      \n
      ')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/accordion/accordion.html",'
      ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/alert/alert.html","
      \n \n
      \n
      \n")}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/carousel/slide.html","
      \n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/datepicker/datepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      #{{label}}
      {{ getWeekNumber(row) }}\n \n
      \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/datepicker/popup.html","
        \n
      • \n"+'
      • \n \n \n \n \n \n \n
      • \n
      \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/modal/backdrop.html",'')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function($templateCache){ -$templateCache.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tooltip/tooltip-popup.html",'
      \n
      \n
      \n
      \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/popover/popover.html",'
      \n
      \n\n
      \n

      \n
      \n
      \n
      \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/bar.html",'
      ')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progress.html",'
      ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/progressbar/progressbar.html",'
      ')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/rating/rating.html",'\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tab.html",'
    • \n {{heading}}\n
    • \n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset-titles.html","
        \n
      \n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/tabs/tabset.html",'\n
      \n \n
      \n
      \n
      \n
      \n
      \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
       
      \n \n :\n \n
       
      \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function($templateCache){$templateCache.put("template/typeahead/typeahead-popup.html","
        \n"+'
      • \n
        \n
      • \n
      ')}]),angular.module("ui.alias",[]).config(["$compileProvider","uiAliasConfig",function(a,b){b=b||{},angular.forEach(b,function(b,c){angular.isString(b)&&(b={replace:!0,template:b}),a.directive(c,function(){return b})})}]),angular.module("ui.event",[]).directive("uiEvent",["$parse",function(a){return function(b,c,d){var e=b.$eval(d.uiEvent);angular.forEach(e,function(d,e){var f=a(d);c.bind(e,function(a){var c=Array.prototype.slice.call(arguments);c=c.splice(1),f(b,{$event:a,$params:c}),b.$$phase||b.$apply()})})}}]),angular.module("ui.format",[]).filter("format",function(){return function(a,b){var c=a;if(angular.isString(c)&&void 0!==b)if(angular.isArray(b)||angular.isObject(b)||(b=[b]),angular.isArray(b)){var d=b.length,e=function(a,c){return c=parseInt(c,10),c>=0&&d>c?b[c]:a};c=c.replace(/\$([0-9]+)/g,e)}else angular.forEach(b,function(a,b){c=c.split(":"+b).join(a)});return c}}),angular.module("ui.highlight",[]).filter("highlight",function(){return function(a,b,c){return b||angular.isNumber(b)?(a=a.toString(),b=b.toString(),c?a.split(b).join(''+b+""):a.replace(new RegExp(b,"gi"),'$&')):a}}),angular.module("ui.include",[]).directive("uiInclude",["$http","$templateCache","$anchorScroll","$compile",function(a,b,c,d){return{restrict:"ECA",terminal:!0,compile:function(e,f){var g=f.uiInclude||f.src,h=f.fragment||"",i=f.onload||"",j=f.autoscroll;return function(e,f){function k(){var k=++m,o=e.$eval(g),p=e.$eval(h);o?a.get(o,{cache:b}).success(function(a){if(k===m){l&&l.$destroy(),l=e.$new();var b;b=p?angular.element("
      ").html(a).find(p):angular.element("
      ").html(a).contents(),f.html(b),d(b)(l),!angular.isDefined(j)||j&&!e.$eval(j)||c(),l.$emit("$includeContentLoaded"),e.$eval(i)}}).error(function(){k===m&&n()}):n()}var l,m=0,n=function(){l&&(l.$destroy(),l=null),f.html("")};e.$watch(h,k),e.$watch(g,k)}}}}]),angular.module("ui.indeterminate",[]).directive("uiIndeterminate",[function(){return{compile:function(a,b){return b.type&&"checkbox"===b.type.toLowerCase()?function(a,b,c){a.$watch(c.uiIndeterminate,function(a){b[0].indeterminate=!!a})}:angular.noop}}}]),angular.module("ui.inflector",[]).filter("inflector",function(){function a(a){return a.replace(/^([a-z])|\s+([a-z])/g,function(a){return a.toUpperCase()})}function b(a,b){return a.replace(/[A-Z]/g,function(a){return b+a})}var c={humanize:function(c){return a(b(c," ").split("_").join(" "))},underscore:function(a){return a.substr(0,1).toLowerCase()+b(a.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(b){return b=b.substr(0,1).toLowerCase()+a(b.split("_").join(" ")).substr(1).split(" ").join("")}};return function(a,b){return b!==!1&&angular.isString(a)?(b=b||"humanize",c[b](a)):a}}),angular.module("ui.jq",[]).value("uiJqConfig",{}).directive("uiJq",["uiJqConfig","$timeout",function(a,b){return{restrict:"A",compile:function(c,d){if(!angular.isFunction(c[d.uiJq]))throw new Error('ui-jq: The "'+d.uiJq+'" function does not exist');var e=a&&a[d.uiJq];return function(a,c,d){function f(){b(function(){c[d.uiJq].apply(c,g)},0,!1)}var g=[];d.uiOptions?(g=a.$eval("["+d.uiOptions+"]"),angular.isObject(e)&&angular.isObject(g[0])&&(g[0]=angular.extend({},e,g[0]))):e&&(g=[e]),d.ngModel&&c.is("select,input,textarea")&&c.bind("change",function(){c.trigger("input")}),d.uiRefresh&&a.$watch(d.uiRefresh,function(){f()}),f()}}}}]),angular.module("ui.keypress",[]).factory("keypressHelper",["$parse",function(a){var b={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"},c=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};return function(d,e,f,g){var h,i=[];h=e.$eval(g["ui"+c(d)]),angular.forEach(h,function(b,c){var d,e;e=a(b),angular.forEach(c.split(" "),function(a){d={expression:e,keys:{}},angular.forEach(a.split("-"),function(a){d.keys[a]=!0}),i.push(d)})}),f.bind(d,function(a){var c=!(!a.metaKey||a.ctrlKey),f=!!a.altKey,g=!!a.ctrlKey,h=!!a.shiftKey,j=a.keyCode;"keypress"===d&&!h&&j>=97&&122>=j&&(j-=32),angular.forEach(i,function(d){var i=d.keys[b[j]]||d.keys[j.toString()],k=!!d.keys.meta,l=!!d.keys.alt,m=!!d.keys.ctrl,n=!!d.keys.shift;i&&k===c&&l===f&&m===g&&n===h&&e.$apply(function(){d.expression(e,{$event:a})})})})}}]),angular.module("ui.keypress").directive("uiKeydown",["keypressHelper",function(a){return{link:function(b,c,d){a("keydown",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeypress",["keypressHelper",function(a){return{link:function(b,c,d){a("keypress",b,c,d)}}}]),angular.module("ui.keypress").directive("uiKeyup",["keypressHelper",function(a){return{link:function(b,c,d){a("keyup",b,c,d)}}}]),angular.module("ui.mask",[]).value("uiMaskConfig",{maskDefinitions:{9:/\d/,A:/[a-zA-Z]/,"*":/[a-zA-Z0-9]/}}).directive("uiMask",["uiMaskConfig",function(a){return{priority:100,require:"ngModel",restrict:"A",compile:function(){var b=a;return function(a,c,d,e){function f(a){return angular.isDefined(a)?(s(a),N?(k(),l(),!0):j()):j()}function g(a){angular.isDefined(a)&&(D=a,N&&w())}function h(a){return N?(G=o(a||""),I=n(G),e.$setValidity("mask",I),I&&G.length?p(G):void 0):a}function i(a){return N?(G=o(a||""),I=n(G),e.$viewValue=G.length?p(G):"",e.$setValidity("mask",I),""===G&&void 0!==e.$error.required&&e.$setValidity("required",!1),I?G:void 0):a}function j(){return N=!1,m(),angular.isDefined(P)?c.attr("placeholder",P):c.removeAttr("placeholder"),angular.isDefined(Q)?c.attr("maxlength",Q):c.removeAttr("maxlength"),c.val(e.$modelValue),e.$viewValue=e.$modelValue,!1}function k(){G=K=o(e.$modelValue||""),H=J=p(G),I=n(G);var a=I&&G.length?H:"";d.maxlength&&c.attr("maxlength",2*B[B.length-1]),c.attr("placeholder",D),c.val(a),e.$viewValue=a}function l(){O||(c.bind("blur",t),c.bind("mousedown mouseup",u),c.bind("input keyup click focus",w),O=!0)}function m(){O&&(c.unbind("blur",t),c.unbind("mousedown",u),c.unbind("mouseup",u),c.unbind("input",w),c.unbind("keyup",w),c.unbind("click",w),c.unbind("focus",w),O=!1)}function n(a){return a.length?a.length>=F:!0}function o(a){var b="",c=C.slice();return a=a.toString(),angular.forEach(E,function(b){a=a.replace(b,"")}),angular.forEach(a.split(""),function(a){c.length&&c[0].test(a)&&(b+=a,c.shift())}),b}function p(a){var b="",c=B.slice();return angular.forEach(D.split(""),function(d,e){a.length&&e===c[0]?(b+=a.charAt(0)||"_",a=a.substr(1),c.shift()):b+=d}),b}function q(a){var b=d.placeholder;return"undefined"!=typeof b&&b[a]?b[a]:"_"}function r(){return D.replace(/[_]+/g,"_").replace(/([^_]+)([a-zA-Z0-9])([^_])/g,"$1$2_$3").split("_")}function s(a){var b=0;if(B=[],C=[],D="","string"==typeof a){F=0;var c=!1,d=a.split("");angular.forEach(d,function(a,d){R.maskDefinitions[a]?(B.push(b),D+=q(d),C.push(R.maskDefinitions[a]),b++,c||F++):"?"===a?c=!0:(D+=a,b++)})}B.push(B.slice().pop()+1),E=r(),N=B.length>1?!0:!1}function t(){L=0,M=0,I&&0!==G.length||(H="",c.val(""),a.$apply(function(){e.$setViewValue("")}))}function u(a){"mousedown"===a.type?c.bind("mouseout",v):c.unbind("mouseout",v)}function v(){M=A(this),c.unbind("mouseout",v)}function w(b){b=b||{};var d=b.which,f=b.type;if(16!==d&&91!==d){var g,h=c.val(),i=J,j=o(h),k=K,l=!1,m=y(this)||0,n=L||0,q=m-n,r=B[0],s=B[j.length]||B.slice().shift(),t=M||0,u=A(this)>0,v=t>0,w=h.length>i.length||t&&h.length>i.length-t,C=h.length=37&&40>=d&&b.shiftKey,E=37===d,F=8===d||"keyup"!==f&&C&&-1===q,G=46===d||"keyup"!==f&&C&&0===q&&!v,H=(E||F||"click"===f)&&m>r;if(M=A(this),!D&&(!u||"click"!==f&&"keyup"!==f)){if("input"===f&&C&&!v&&j===k){for(;F&&m>r&&!x(m);)m--;for(;G&&s>m&&-1===B.indexOf(m);)m++;var I=B.indexOf(m);j=j.substring(0,I)+j.substring(I+1),l=!0}for(g=p(j),J=g,K=j,c.val(g),l&&a.$apply(function(){e.$setViewValue(j)}),w&&r>=m&&(m=r+1),H&&m--,m=m>s?s:r>m?r:m;!x(m)&&m>r&&s>m;)m+=H?-1:1;(H&&s>m||w&&!x(n))&&m++,L=m,z(this,m)}}}function x(a){return B.indexOf(a)>-1}function y(a){if(!a)return 0;if(void 0!==a.selectionStart)return a.selectionStart;if(document.selection){a.focus();var b=document.selection.createRange();return b.moveStart("character",-a.value.length),b.text.length}return 0}function z(a,b){if(!a)return 0;if(0!==a.offsetWidth&&0!==a.offsetHeight)if(a.setSelectionRange)a.focus(),a.setSelectionRange(b,b);else if(a.createTextRange){var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}}function A(a){return a?void 0!==a.selectionStart?a.selectionEnd-a.selectionStart:document.selection?document.selection.createRange().text.length:0:0}var B,C,D,E,F,G,H,I,J,K,L,M,N=!1,O=!1,P=d.placeholder,Q=d.maxlength,R={};d.uiOptions?(R=a.$eval("["+d.uiOptions+"]"),angular.isObject(R[0])&&(R=function(a,b){for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]?angular.extend(b[c],a[c]):b[c]=angular.copy(a[c]));return b}(b,R[0]))):R=b,d.$observe("uiMask",f),d.$observe("placeholder",g),e.$formatters.push(h),e.$parsers.push(i),c.bind("mousedown mouseup",u),Array.prototype.indexOf||(Array.prototype.indexOf=function(a){if(null===this)throw new TypeError;var b=Object(this),c=b.length>>>0;if(0===c)return-1;var d=0;if(arguments.length>1&&(d=Number(arguments[1]),d!==d?d=0:0!==d&&1/0!==d&&d!==-1/0&&(d=(d>0||-1)*Math.floor(Math.abs(d)))),d>=c)return-1;for(var e=d>=0?d:Math.max(c-Math.abs(d),0);c>e;e++)if(e in b&&b[e]===a)return e;return-1})}}}}]),angular.module("ui.reset",[]).value("uiResetConfig",null).directive("uiReset",["uiResetConfig",function(a){var b=null;return void 0!==a&&(b=a),{require:"ngModel",link:function(a,c,d,e){var f;f=angular.element(''),c.wrap('').after(f),f.bind("click",function(c){c.preventDefault(),a.$apply(function(){e.$setViewValue(d.uiReset?a.$eval(d.uiReset):b),e.$render()})})}}}]),angular.module("ui.route",[]).directive("uiRoute",["$location","$parse",function(a,b){return{restrict:"AC",scope:!0,compile:function(c,d){var e;if(d.uiRoute)e="uiRoute";else if(d.ngHref)e="ngHref";else{if(!d.href)throw new Error("uiRoute missing a route or href property on "+c[0]);e="href"}return function(c,d,f){function g(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){i(c,a.path().indexOf(b)>-1)})()}function h(b){var d=b.indexOf("#");d>-1&&(b=b.substr(d+1)),(j=function(){var d=new RegExp("^"+b+"$",["i"]);i(c,d.test(a.path()))})()}var i=b(f.ngModel||f.routeModel||"$uiRoute").assign,j=angular.noop;switch(e){case"uiRoute":f.uiRoute?h(f.uiRoute):f.$observe("uiRoute",h);break;case"ngHref":f.ngHref?g(f.ngHref):f.$observe("ngHref",g);break;case"href":g(f.href)}c.$on("$routeChangeSuccess",function(){j()}),c.$on("$stateChangeSuccess",function(){j()})}}}}]),angular.module("ui.scroll.jqlite",["ui.scroll"]).service("jqLiteExtras",["$log","$window",function(a,b){return{registerFor:function(a){var c,d,e,f,g,h,i;return d=angular.element.prototype.css,a.prototype.css=function(a,b){var c,e;return e=this,c=e[0],c&&3!==c.nodeType&&8!==c.nodeType&&c.style?d.call(e,a,b):void 0},h=function(a){return a&&a.document&&a.location&&a.alert&&a.setInterval},i=function(a,b,c){var d,e,f,g,i;return d=a[0],i={top:["scrollTop","pageYOffset","scrollLeft"],left:["scrollLeft","pageXOffset","scrollTop"]}[b],e=i[0],g=i[1],f=i[2],h(d)?angular.isDefined(c)?d.scrollTo(a[f].call(a),c):g in d?d[g]:d.document.documentElement[e]:angular.isDefined(c)?d[e]=c:d[e]},b.getComputedStyle?(f=function(a){return b.getComputedStyle(a,null)},c=function(a,b){return parseFloat(b)}):(f=function(a){return a.currentStyle},c=function(a,b){var c,d,e,f,g,h,i;return c=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,f=new RegExp("^("+c+")(?!px)[a-z%]+$","i"),f.test(b)?(i=a.style,d=i.left,g=a.runtimeStyle,h=g&&g.left,g&&(g.left=i.left),i.left=b,e=i.pixelLeft,i.left=d,h&&(g.left=h),e):parseFloat(b)}),e=function(a,b){var d,e,g,i,j,k,l,m,n,o,p,q,r;return h(a)?(d=document.documentElement[{height:"clientHeight",width:"clientWidth"}[b]],{base:d,padding:0,border:0,margin:0}):(r={width:[a.offsetWidth,"Left","Right"],height:[a.offsetHeight,"Top","Bottom"]}[b],d=r[0],l=r[1],m=r[2],k=f(a),p=c(a,k["padding"+l])||0,q=c(a,k["padding"+m])||0,e=c(a,k["border"+l+"Width"])||0,g=c(a,k["border"+m+"Width"])||0,i=k["margin"+l],j=k["margin"+m],n=c(a,i)||0,o=c(a,j)||0,{base:d,padding:p+q,border:e+g,margin:n+o})},g=function(a,b,c){var d,g,h;return g=e(a,b),g.base>0?{base:g.base-g.padding-g.border,outer:g.base,outerfull:g.base+g.margin}[c]:(d=f(a),h=d[b],(0>h||null===h)&&(h=a.style[b]||0),h=parseFloat(h)||0,{base:h-g.padding-g.border,outer:h,outerfull:h+g.padding+g.border+g.margin}[c])},angular.forEach({before:function(a){var b,c,d,e,f,g,h;if(f=this,c=f[0],e=f.parent(),b=e.contents(),b[0]===c)return e.prepend(a);for(d=g=1,h=b.length-1;h>=1?h>=g:g>=h;d=h>=1?++g:--g)if(b[d]===c)return void angular.element(b[d-1]).after(a);throw new Error("invalid DOM structure "+c.outerHTML)},height:function(a){var b;return b=this,angular.isDefined(a)?(angular.isNumber(a)&&(a+="px"),d.call(b,"height",a)):g(this[0],"height","base")},outerHeight:function(a){return g(this[0],"height",a?"outerfull":"outer")},offset:function(a){var b,c,d,e,f,g;return f=this,arguments.length?void 0===a?f:a:(b={top:0,left:0},e=f[0],(c=e&&e.ownerDocument)?(d=c.documentElement,e.getBoundingClientRect&&(b=e.getBoundingClientRect()),g=c.defaultView||c.parentWindow,{top:b.top+(g.pageYOffset||d.scrollTop)-(d.clientTop||0),left:b.left+(g.pageXOffset||d.scrollLeft)-(d.clientLeft||0)}):void 0)},scrollTop:function(a){return i(this,"top",a)},scrollLeft:function(a){return i(this,"left",a)}},function(b,c){return a.prototype[c]?void 0:a.prototype[c]=b})}}}]).run(["$log","$window","jqLiteExtras",function(a,b,c){return b.jQuery?void 0:c.registerFor(angular.element)}]),angular.module("ui.scroll",[]).directive("ngScrollViewport",["$log",function(){return{controller:["$scope","$element",function(a,b){return b}]}}]).directive("ngScroll",["$log","$injector","$rootScope","$timeout",function(a,b,c,d){return{require:["?^ngScrollViewport"],transclude:"element",priority:1e3,terminal:!0,compile:function(e,f,g){return function(f,h,i,j){var k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T;if(H=i.ngScroll.match(/^\s*(\w+)\s+in\s+(\w+)\s*$/),!H)throw new Error('Expected ngScroll in form of "item_ in _datasource_" but got "'+i.ngScroll+'"');if(F=H[1],v=H[2],D=function(a){return angular.isObject(a)&&a.get&&angular.isFunction(a.get)},u=f[v],!D(u)&&(u=b.get(v),!D(u)))throw new Error(v+" is not a valid datasource");return r=Math.max(3,+i.bufferSize||10),q=function(){return T.height()*Math.max(.1,+i.padding||.1)},O=function(a){return a[0].scrollHeight||a[0].document.documentElement.scrollHeight},k=null,g(R=f.$new(),function(a){var b,c,d,f,g,h;if(f=a[0].localName,"dl"===f)throw new Error("ng-scroll directive does not support <"+a[0].localName+"> as a repeating tag: "+a[0].outerHTML);return"li"!==f&&"tr"!==f&&(f="div"),h=j[0]||angular.element(window),h.css({"overflow-y":"auto",display:"block"}),d=function(a){var b,c,d;switch(a){case"tr":return d=angular.element("
      "),b=d.find("div"),c=d.find("tr"),c.paddingHeight=function(){return b.height.apply(b,arguments)},c;default:return c=angular.element("<"+a+">"),c.paddingHeight=c.height,c}},c=function(a,b,c){return b[{top:"before",bottom:"after"}[c]](a),{paddingHeight:function(){return a.paddingHeight.apply(a,arguments)},insert:function(b){return a[{top:"after",bottom:"before"}[c]](b)}}},g=c(d(f),e,"top"),b=c(d(f),e,"bottom"),R.$destroy(),k={viewport:h,topPadding:g.paddingHeight,bottomPadding:b.paddingHeight,append:b.insert,prepend:g.insert,bottomDataPos:function(){return O(h)-b.paddingHeight()},topDataPos:function(){return g.paddingHeight()}}}),T=k.viewport,B=1,I=1,p=[],J=[],x=!1,n=!1,G=u.loading||function(){},E=!1,L=function(a,b){var c,d;for(c=d=a;b>=a?b>d:d>b;c=b>=a?++d:--d)p[c].scope.$destroy(),p[c].element.remove();return p.splice(a,b-a)},K=function(){return B=1,I=1,L(0,p.length),k.topPadding(0),k.bottomPadding(0),J=[],x=!1,n=!1,l(!1)},o=function(){return T.scrollTop()+T.height()},S=function(){return T.scrollTop()},P=function(){return!x&&k.bottomDataPos()=g?0>=f:f>=0)&&(d=p[c].element.outerHeight(!0),k.bottomDataPos()-b-d>o()+q());c=0>=g?++f:--f)b+=d,e++,x=!1;return e>0?(k.bottomPadding(k.bottomPadding()+b),L(p.length-e,p.length),I-=e,a.log("clipped off bottom "+e+" bottom padding "+k.bottomPadding())):void 0},Q=function(){return!n&&k.topDataPos()>S()-q()},t=function(){var b,c,d,e,f,g;for(e=0,d=0,f=0,g=p.length;g>f&&(b=p[f],c=b.element.outerHeight(!0),k.topDataPos()+e+c0?(k.topPadding(k.topPadding()+e),L(0,d),B+=d,a.log("clipped off top "+d+" top padding "+k.topPadding())):void 0},w=function(a,b){return E||(E=!0,G(!0)),1===J.push(a)?z(b):void 0},C=function(a,b){var c,d,e;return c=f.$new(),c[F]=b,d=a>B,c.$index=a,d&&c.$index--,e={scope:c},g(c,function(b){return e.element=b,d?a===I?(k.append(b),p.push(e)):(p[a-B].element.after(b),p.splice(a-B+1,0,e)):(k.prepend(b),p.unshift(e))}),{appended:d,wrapper:e}},m=function(a,b){var c;return a?k.bottomPadding(Math.max(0,k.bottomPadding()-b.element.outerHeight(!0))):(c=k.topPadding()-b.element.outerHeight(!0),c>=0?k.topPadding(c):T.scrollTop(T.scrollTop()+b.element.outerHeight(!0)))},l=function(b,c,e){var f;return f=function(){return a.log("top {actual="+k.topDataPos()+" visible from="+S()+" bottom {visible through="+o()+" actual="+k.bottomDataPos()+"}"),P()?w(!0,b):Q()&&w(!1,b),e?e():void 0},c?d(function(){var a,b,d;for(b=0,d=c.length;d>b;b++)a=c[b],m(a.appended,a.wrapper);return f()}):f()},A=function(a,b){return l(a,b,function(){return J.shift(),0===J.length?(E=!1,G(!1)):z(a)})},z=function(b){var c;return c=J[0],c?p.length&&!P()?A(b):u.get(I,r,function(c){var d,e,f,g;if(e=[],0===c.length)x=!0,k.bottomPadding(0),a.log("appended: requested "+r+" records starting from "+I+" recieved: eof");else{for(t(),f=0,g=c.length;g>f;f++)d=c[f],e.push(C(++I,d));a.log("appended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)}):p.length&&!Q()?A(b):u.get(B-r,r,function(c){var d,e,f,g;if(e=[],0===c.length)n=!0,k.topPadding(0),a.log("prepended: requested "+r+" records starting from "+(B-r)+" recieved: bof");else{for(s(),d=f=g=c.length-1;0>=g?0>=f:f>=0;d=0>=g?++f:--f)e.unshift(C(--B,c[d]));a.log("prepended: requested "+r+" received "+c.length+" buffer size "+p.length+" first "+B+" next "+I)}return A(b,e)})},M=function(){return c.$$phase||E?void 0:(l(!1),f.$apply())},T.bind("resize",M),N=function(){return c.$$phase||E?void 0:(l(!0),f.$apply())},T.bind("scroll",N),f.$watch(u.revision,function(){return K()}),y=u.scope?u.scope.$new():f.$new(),f.$on("$destroy",function(){return y.$destroy(),T.unbind("resize",M),T.unbind("scroll",N)}),y.$on("update.items",function(a,b,c){var d,e,f,g,h;if(angular.isFunction(b))for(e=function(a){return b(a.scope)},f=0,g=p.length;g>f;f++)d=p[f],e(d);else 0<=(h=b-B-1)&&hh;h++)d=p[h],e.unshift(d);for(g=function(a){return b(a.scope)?(L(e.length-1-c,e.length-c),I--):void 0},c=i=0,m=e.length;m>i;c=++i)f=e[c],g(f)}else 0<=(o=b-B-1)&&oj;c=++j)d=p[c],d.scope.$index=B+c;return l(!1)}),y.$on("insert.item",function(a,b,c){var d,e,f,g,h,i,j,k,m,n,o,q;if(e=[],angular.isFunction(b)){for(f=[],i=0,m=p.length;m>i;i++)c=p[i],f.unshift(c);for(h=function(a){var f,g,h,i,j;if(g=b(a.scope)){if(C=function(a,b){return C(a,b),I++},angular.isArray(g)){for(j=[],f=h=0,i=g.length;i>h;f=++h)c=g[f],j.push(e.push(C(d+f,c)));return j}return e.push(C(d,g))}},d=j=0,n=f.length;n>j;d=++j)g=f[d],h(g)}else 0<=(q=b-B-1)&&qk;d=++k)c=p[d],c.scope.$index=B+d;return l(!1,e)})}}}}]),angular.module("ui.scrollfix",[]).directive("uiScrollfix",["$window",function(a){return{require:"^?uiScrollfixTarget",link:function(b,c,d,e){function f(){var b;if(angular.isDefined(a.pageYOffset))b=a.pageYOffset;else{var e=document.compatMode&&"BackCompat"!==document.compatMode?document.documentElement:document.body;b=e.scrollTop}!c.hasClass("ui-scrollfix")&&b>d.uiScrollfix?c.addClass("ui-scrollfix"):c.hasClass("ui-scrollfix")&&b")(i);j.appendChild(k[0]),i.count=f,void 0!==g&&k.eq(0).children().css("height",g),void 0!==h&&(k.eq(0).children().css("background-color",h),k.eq(0).children().css("color",h));var l,m=0;return{start:function(){this.show();var a=this;clearInterval(m),m=setInterval(function(){if(isNaN(f))clearInterval(m),f=0,a.hide();else{var b=100-f;f+=.15*Math.pow(1-Math.sqrt(b),2),a.updateCount(f)}},200)},updateCount:function(a){i.count=a,i.$$phase||i.$apply()},height:function(a){return void 0!==a&&(g=a,i.height=g,i.$$phase||i.$apply()),g},color:function(a){return void 0!==a&&(h=a,i.color=h,i.$$phase||i.$apply()),h},hide:function(){k.children().css("opacity","0");var a=this;a.animate(function(){k.children().css("width","0%"),a.animate(function(){a.show()},500)},500)},show:function(){var a=this;a.animate(function(){k.children().css("opacity","1")},100)},animate:function(a,b){l&&e.cancel(l),l=e(a,b)},status:function(){return f},stop:function(){clearInterval(m)},set:function(a){return this.show(),this.updateCount(a),f=a,clearInterval(m),f},css:function(a){return k.children().css(a)},reset:function(){return clearInterval(m),f=0,this.updateCount(f),0},complete:function(){f=100,this.updateCount(f);var a=this;return clearInterval(m),e(function(){a.hide(),e(function(){f=0,a.updateCount(f)},500)},1e3),f},setParent:function(a){if(null===a||void 0===a)throw new Error("Provide a valid parent of type HTMLElement");null!==j&&void 0!==j&&j.removeChild(k[0]),j=a,j.appendChild(k[0])},getDomElement:function(){return k}}}],this.setColor=function(a){return void 0!==a&&(this.color=a),this.color},this.setHeight=function(a){return void 0!==a&&(this.height=a),this.height}}),angular.module("ngProgress.directive",[]).directive("ngProgress",["$window","$rootScope",function(a,b){var c={replace:!0,restrict:"E",link:function(a,c){b.$watch("count",function(b){(void 0!==b||null!==b)&&(a.counter=b,c.eq(0).children().css("width",b+"%"))}),b.$watch("color",function(b){(void 0!==b||null!==b)&&(a.color=b,c.eq(0).children().css("background-color",b),c.eq(0).children().css("color",b))}),b.$watch("height",function(b){(void 0!==b||null!==b)&&(a.height=b, -c.eq(0).children().css("height",b))})},template:'
      '};return c}]),angular.module("ngProgress",["ngProgress.directive","ngProgress.provider"]),angular.module("gettext",[]),angular.module("gettext").constant("gettext",function(a){return a}),angular.module("gettext").factory("gettextCatalog",["gettextPlurals","$http","$cacheFactory","$interpolate","$rootScope",function(a,b,c,d,e){function f(){e.$broadcast("gettextLanguageChanged")}var g,h=function(a){return g.debug&&g.currentLanguage!==g.baseLanguage?g.debugPrefix+a:a},i=function(a){return g.showTranslatedMarkers?g.translatedMarkerPrefix+a+g.translatedMarkerSuffix:a};return g={debug:!1,debugPrefix:"[MISSING]: ",showTranslatedMarkers:!1,translatedMarkerPrefix:"[",translatedMarkerSuffix:"]",strings:{},baseLanguage:"en",currentLanguage:"en",cache:c("strings"),setCurrentLanguage:function(a){this.currentLanguage=a,f()},setStrings:function(a,b){this.strings[a]||(this.strings[a]={});for(var c in b){var d=b[c];this.strings[a][c]="string"==typeof d?[d]:d}f()},getStringForm:function(a,b){var c=this.strings[this.currentLanguage]||{},d=c[a]||[];return d[b]},getString:function(a,b){return a=this.getStringForm(a,0)||h(a),a=b?d(a)(b):a,i(a)},getPlural:function(b,c,e,f){var g=a(this.currentLanguage,b);return c=this.getStringForm(c,g)||h(1===b?c:e),c=f?d(c)(f):c,i(c)},loadRemote:function(a){return b({method:"GET",url:a,cache:g.cache}).success(function(a){for(var b in a)g.setStrings(b,a[b])})}}}]),angular.module("gettext").directive("translate",["gettextCatalog","$parse","$animate","$compile",function(a,b,c,d){function e(a,b,c){if(!a)throw new Error("You should add a "+b+" attribute whenever you add a "+c+" attribute.")}var f=function(){return String.prototype.trim?function(a){return"string"==typeof a?a.trim():a}:function(a){return"string"==typeof a?a.replace(/^\s*/,"").replace(/\s*$/,""):a}}();return{restrict:"A",terminal:!0,compile:function(g,h){e(!h.translatePlural||h.translateN,"translate-n","translate-plural"),e(!h.translateN||h.translatePlural,"translate-plural","translate-n");var i=f(g.html()),j=h.translatePlural;return{post:function(e,f,g){function h(){var b;j?(e=l||(l=e.$new()),e.$count=k(e),b=a.getPlural(e.$count,i,j)):b=a.getString(i);var g=angular.element(""+b+"");d(g.contents())(e);var h=f.contents(),m=g.contents();c.enter(m,f),c.leave(h)}var k=b(g.translateN),l=null;g.translateN&&e.$watch(g.translateN,h),e.$on("gettextLanguageChanged",h),h()}}}}}]),angular.module("gettext").filter("translate",["gettextCatalog",function(a){function b(b){return a.getString(b)}return b.$stateful=!0,b}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return b%10!=1||b%100==11?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||b%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return b%10==1&&b%100!=11?0:0!=b?1:2;case"lt":return b%10==1&&b%100!=11?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return b%10==1&&b%100!=11?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return b%100==1?1:b%100==2?2:b%100==3||b%100==4?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}),!function(){"use strict";function a(a,b){return a.module("angularMoment",[]).constant("angularMomentConfig",{preprocess:null,timezone:"",format:null}).constant("moment",b).constant("amTimeAgoConfig",{withoutSuffix:!1,serverTime:null,titleFormat:null}).directive("amTimeAgo",["$window","moment","amMoment","amTimeAgoConfig","angularMomentConfig",function(b,c,d,e,f){return function(g,h,i){function j(){var a;if(e.serverTime){var b=(new Date).getTime(),d=b-u+e.serverTime;a=c(d)}else a=c();return a}function k(){q&&(b.clearTimeout(q),q=null)}function l(a){if(h.text(a.from(j(),s)),t&&!h.attr("title")&&h.attr("title",a.local().format(t)),!x){var c=Math.abs(j().diff(a,"minute")),d=3600;1>c?d=1:60>c?d=30:180>c&&(d=300),q=b.setTimeout(function(){l(a)},1e3*d)}}function m(a){y&&h.attr("datetime",a)}function n(){if(k(),o){var a=d.preprocessDate(o,v,r);l(a),m(a.toISOString())}}var o,p,q=null,r=f.format,s=e.withoutSuffix,t=e.titleFormat,u=(new Date).getTime(),v=f.preprocess,w=i.amTimeAgo.replace(/^::/,""),x=0===i.amTimeAgo.indexOf("::"),y="TIME"===h[0].nodeName.toUpperCase();p=g.$watch(w,function(a){return"undefined"==typeof a||null===a||""===a?(k(),void(o&&(h.text(""),m(""),o=null))):(o=a,n(),void(void 0!==a&&x&&p()))}),a.isDefined(i.amWithoutSuffix)&&g.$watch(i.amWithoutSuffix,function(a){"boolean"==typeof a?(s=a,n()):s=e.withoutSuffix}),i.$observe("amFormat",function(a){"undefined"!=typeof a&&(r=a,n())}),i.$observe("amPreprocess",function(a){v=a,n()}),g.$on("$destroy",function(){k()}),g.$on("amMoment:localeChanged",function(){n()})}}]).service("amMoment",["moment","$rootScope","$log","angularMomentConfig",function(b,c,d,e){var f=this;this.preprocessors={utc:b.utc,unix:b.unix},this.changeLocale=function(d){var e=(b.locale||b.lang)(d);return a.isDefined(d)&&(c.$broadcast("amMoment:localeChanged"),c.$broadcast("amMoment:languageChange")),e},this.changeLanguage=function(a){return d.warn("angular-moment: Usage of amMoment.changeLanguage() is deprecated. Please use changeLocale()"),f.changeLocale(a)},this.preprocessDate=function(c,f,g){return a.isUndefined(f)&&(f=e.preprocess),this.preprocessors[f]?this.preprocessors[f](c,g):(f&&d.warn("angular-moment: Ignoring unsupported value for preprocess: "+f),!isNaN(parseFloat(c))&&isFinite(c)?b(parseInt(c,10)):b(c,g))},this.applyTimezone=function(a){var b=e.timezone;return a&&b&&(a.tz?a=a.tz(b):d.warn("angular-moment: timezone specified but moment.tz() is undefined. Did you forget to include moment-timezone.js?")),a}}]).filter("amCalendar",["moment","amMoment",function(a,b){return function(c,d){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var e=a(c);return e.isValid()?b.applyTimezone(e).calendar():""}}]).filter("amDateFormat",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,e);var f=a(c);return f.isValid()?b.applyTimezone(f).format(d):""}}]).filter("amDurationFormat",["moment",function(a){return function(b,c,d){return"undefined"==typeof b||null===b?"":a.duration(b,c).humanize(d)}}]).filter("amTimeAgo",["moment","amMoment",function(a,b){return function(c,d,e){if("undefined"==typeof c||null===c)return"";c=b.preprocessDate(c,d);var f=a(c);return f.isValid()?b.applyTimezone(f).fromNow(e):""}}])}"function"==typeof define&&define.amd?define("angular-moment",["angular","moment"],a):"undefined"!=typeof module&&module&&module.exports?a(angular,require("moment")):a(angular,window.moment)}(); \ No newline at end of file diff --git a/server/insight-ui/public/js/main.js b/server/insight-ui/public/js/main.js deleted file mode 100644 index c07a895..0000000 --- a/server/insight-ui/public/js/main.js +++ /dev/null @@ -1,1397 +0,0 @@ -// Source: public/src/js/app.js -var defaultLanguage = localStorage.getItem('insight-language') || 'en'; -var defaultCurrency = localStorage.getItem('insight-currency') || 'BTC'; - -angular.module('insight',[ - 'ngAnimate', - 'ngResource', - 'ngRoute', - 'ngProgress', - 'ui.bootstrap', - 'ui.route', - 'monospaced.qrcode', - 'gettext', - 'angularMoment', - 'insight.system', - 'insight.socket', - 'insight.api', - 'insight.blocks', - 'insight.transactions', - 'insight.address', - 'insight.search', - 'insight.status', - 'insight.connection', - 'insight.currency', - 'insight.messages' -]); - -angular.module('insight.system', []); -angular.module('insight.socket', []); -angular.module('insight.api', []); -angular.module('insight.blocks', []); -angular.module('insight.transactions', []); -angular.module('insight.address', []); -angular.module('insight.search', []); -angular.module('insight.status', []); -angular.module('insight.connection', []); -angular.module('insight.currency', []); -angular.module('insight.messages', []); - -// Source: public/src/js/controllers/address.js -angular.module('insight.address').controller('AddressController', - function($scope, $rootScope, $routeParams, $location, Global, Address, getSocket) { - $scope.global = Global; - - var socket = getSocket($scope); - var addrStr = $routeParams.addrStr; - - var _startSocket = function() { - socket.on('bitcoind/addresstxid', function(data) { - if (data.address === addrStr) { - $rootScope.$broadcast('tx', data.txid); - var base = document.querySelector('base'); - var beep = new Audio(base.href + '/sound/transaction.mp3'); - beep.play(); - } - }); - socket.emit('subscribe', 'bitcoind/addresstxid', [addrStr]); - }; - - var _stopSocket = function () { - socket.emit('unsubscribe', 'bitcoind/addresstxid', [addrStr]); - }; - - socket.on('connect', function() { - _startSocket(); - }); - - $scope.$on('$destroy', function(){ - _stopSocket(); - }); - - $scope.params = $routeParams; - - $scope.findOne = function() { - $rootScope.currentAddr = $routeParams.addrStr; - _startSocket(); - - Address.get({ - addrStr: $routeParams.addrStr - }, - function(address) { - $rootScope.titleDetail = address.addrStr.substring(0, 7) + '...'; - $rootScope.flashMessage = null; - $scope.address = address; - }, - function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Address: ' + $routeParams.addrStr; - } else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } else { - $rootScope.flashMessage = 'Address Not Found'; - } - $location.path('/'); - }); - }; - - }); - -// Source: public/src/js/controllers/blocks.js -angular.module('insight.blocks').controller('BlocksController', - function($scope, $rootScope, $routeParams, $location, Global, Block, Blocks, BlockByHeight) { - $scope.global = Global; - $scope.loading = false; - - if ($routeParams.blockHeight) { - BlockByHeight.get({ - blockHeight: $routeParams.blockHeight - }, function(hash) { - $location.path('/block/' + hash.blockHash); - }, function() { - $rootScope.flashMessage = 'Bad Request'; - $location.path('/'); - }); - } - - //Datepicker - var _formatTimestamp = function (date) { - var yyyy = date.getUTCFullYear().toString(); - var mm = (date.getUTCMonth() + 1).toString(); // getMonth() is zero-based - var dd = date.getUTCDate().toString(); - - return yyyy + '-' + (mm[1] ? mm : '0' + mm[0]) + '-' + (dd[1] ? dd : '0' + dd[0]); //padding - }; - - $scope.$watch('dt', function(newValue, oldValue) { - if (newValue !== oldValue) { - $location.path('/blocks-date/' + _formatTimestamp(newValue)); - } - }); - - $scope.openCalendar = function($event) { - $event.preventDefault(); - $event.stopPropagation(); - - $scope.opened = true; - }; - - $scope.humanSince = function(time) { - var m = moment.unix(time).startOf('day'); - var b = moment().startOf('day'); - return m.max().from(b); - }; - - - $scope.list = function() { - $scope.loading = true; - - if ($routeParams.blockDate) { - $scope.detail = 'On ' + $routeParams.blockDate; - } - - if ($routeParams.startTimestamp) { - var d=new Date($routeParams.startTimestamp*1000); - var m=d.getMinutes(); - if (m<10) m = '0' + m; - $scope.before = ' before ' + d.getHours() + ':' + m; - } - - $rootScope.titleDetail = $scope.detail; - - Blocks.get({ - blockDate: $routeParams.blockDate, - startTimestamp: $routeParams.startTimestamp - }, function(res) { - $scope.loading = false; - $scope.blocks = res.blocks; - $scope.pagination = res.pagination; - }); - }; - - $scope.findOne = function() { - $scope.loading = true; - - Block.get({ - blockHash: $routeParams.blockHash - }, function(block) { - $rootScope.titleDetail = block.height; - $rootScope.flashMessage = null; - $scope.loading = false; - $scope.block = block; - }, function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Transaction ID: ' + $routeParams.txId; - } - else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } - else { - $rootScope.flashMessage = 'Block Not Found'; - } - $location.path('/'); - }); - }; - - $scope.params = $routeParams; - -}); - -// Source: public/src/js/controllers/connection.js -angular.module('insight.connection').controller('ConnectionController', - function($scope, $window, Status, getSocket, PeerSync) { - - // Set initial values - $scope.apiOnline = true; - $scope.serverOnline = true; - $scope.clienteOnline = true; - - var socket = getSocket($scope); - - // Check for the node server connection - socket.on('connect', function() { - $scope.serverOnline = true; - socket.on('disconnect', function() { - $scope.serverOnline = false; - }); - }); - - // Check for the api connection - $scope.getConnStatus = function() { - PeerSync.get({}, - function(peer) { - $scope.apiOnline = peer.connected; - $scope.host = peer.host; - $scope.port = peer.port; - }, - function() { - $scope.apiOnline = false; - }); - }; - - socket.emit('subscribe', 'sync'); - socket.on('status', function(sync) { - $scope.sync = sync; - $scope.apiOnline = (sync.status !== 'aborted' && sync.status !== 'error'); - }); - - // Check for the client conneciton - $window.addEventListener('offline', function() { - $scope.$apply(function() { - $scope.clienteOnline = false; - }); - }, true); - - $window.addEventListener('online', function() { - $scope.$apply(function() { - $scope.clienteOnline = true; - }); - }, true); - - }); - -// Source: public/src/js/controllers/currency.js -angular.module('insight.currency').controller('CurrencyController', - function($scope, $rootScope, Currency) { - $rootScope.currency.symbol = defaultCurrency; - - var _roundFloat = function(x, n) { - if(!parseInt(n, 10) || !parseFloat(x)) n = 0; - - return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); - }; - - $rootScope.currency.getConvertion = function(value) { - value = value * 1; // Convert to number - - if (!isNaN(value) && typeof value !== 'undefined' && value !== null) { - if (value === 0.00000000) return '0 ' + this.symbol; // fix value to show - - var response; - - if (this.symbol === 'USD') { - response = _roundFloat((value * this.factor), 2); - } else if (this.symbol === 'mBTC') { - this.factor = 1000; - response = _roundFloat((value * this.factor), 5); - } else if (this.symbol === 'bits') { - this.factor = 1000000; - response = _roundFloat((value * this.factor), 2); - } else { // assumes symbol is BTC - this.factor = 1; - response = _roundFloat((value * this.factor), 8); - } - // prevent sci notation - if (response < 1e-7) response=response.toFixed(8); - - return response + ' ' + this.symbol; - } - - return 'value error'; - }; - - $scope.setCurrency = function(currency) { - $rootScope.currency.symbol = currency; - localStorage.setItem('insight-currency', currency); - - if (currency === 'USD') { - Currency.get({}, function(res) { - $rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp; - }); - } else if (currency === 'mBTC') { - $rootScope.currency.factor = 1000; - } else if (currency === 'bits') { - $rootScope.currency.factor = 1000000; - } else { - $rootScope.currency.factor = 1; - } - }; - - // Get initial value - Currency.get({}, function(res) { - $rootScope.currency.factor = $rootScope.currency.bitstamp = res.data.bitstamp; - }); - - }); - -// Source: public/src/js/controllers/footer.js -angular.module('insight.system').controller('FooterController', - function($scope, $route, $templateCache, gettextCatalog, amMoment, Version) { - - $scope.defaultLanguage = defaultLanguage; - - var _getVersion = function() { - Version.get({}, - function(res) { - $scope.version = res.version; - }); - }; - - $scope.version = _getVersion(); - - $scope.availableLanguages = [{ - name: 'Deutsch', - isoCode: 'de_DE', - }, { - name: 'English', - isoCode: 'en', - }, { - name: 'Spanish', - isoCode: 'es', - }, { - name: 'Japanese', - isoCode: 'ja', - }]; - - $scope.setLanguage = function(isoCode) { - gettextCatalog.currentLanguage = $scope.defaultLanguage = defaultLanguage = isoCode; - amMoment.changeLocale(isoCode); - localStorage.setItem('insight-language', isoCode); - var currentPageTemplate = $route.current.templateUrl; - $templateCache.remove(currentPageTemplate); - $route.reload(); - }; - - }); - -// Source: public/src/js/controllers/header.js -angular.module('insight.system').controller('HeaderController', - function($scope, $rootScope, $modal, getSocket, Global, Block) { - $scope.global = Global; - - $rootScope.currency = { - factor: 1, - bitstamp: 0, - symbol: 'BTC' - }; - - $scope.menu = [{ - 'title': 'Blocks', - 'link': 'blocks' - }, { - 'title': 'Status', - 'link': 'status' - }]; - - $scope.openScannerModal = function() { - var modalInstance = $modal.open({ - templateUrl: 'scannerModal.html', - controller: 'ScannerController' - }); - }; - - var _getBlock = function(hash) { - Block.get({ - blockHash: hash - }, function(res) { - $scope.totalBlocks = res.height; - }); - }; - - var socket = getSocket($scope); - socket.on('connect', function() { - socket.emit('subscribe', 'inv'); - - socket.on('block', function(block) { - var blockHash = block.toString(); - _getBlock(blockHash); - }); - }); - - $rootScope.isCollapsed = true; - }); - -// Source: public/src/js/controllers/index.js -var TRANSACTION_DISPLAYED = 10; -var BLOCKS_DISPLAYED = 5; - -angular.module('insight.system').controller('IndexController', - function($scope, Global, getSocket, Blocks) { - $scope.global = Global; - - var _getBlocks = function() { - Blocks.get({ - limit: BLOCKS_DISPLAYED - }, function(res) { - $scope.blocks = res.blocks; - $scope.blocksLength = res.length; - }); - }; - - var socket = getSocket($scope); - - var _startSocket = function() { - socket.emit('subscribe', 'inv'); - socket.on('tx', function(tx) { - $scope.txs.unshift(tx); - if (parseInt($scope.txs.length, 10) >= parseInt(TRANSACTION_DISPLAYED, 10)) { - $scope.txs = $scope.txs.splice(0, TRANSACTION_DISPLAYED); - } - }); - - socket.on('block', function() { - _getBlocks(); - }); - }; - - socket.on('connect', function() { - _startSocket(); - }); - - - - $scope.humanSince = function(time) { - var m = moment.unix(time); - return m.max().fromNow(); - }; - - $scope.index = function() { - _getBlocks(); - _startSocket(); - }; - - $scope.txs = []; - $scope.blocks = []; - }); - -// Source: public/src/js/controllers/messages.js -angular.module('insight.messages').controller('VerifyMessageController', - function($scope, $http, Api) { - $scope.message = { - address: '', - signature: '', - message: '' - }; - $scope.verification = { - status: 'unverified', // ready|loading|verified|error - result: null, - error: null, - address: '' - }; - - $scope.verifiable = function() { - return ($scope.message.address - && $scope.message.signature - && $scope.message.message); - }; - $scope.verify = function() { - $scope.verification.status = 'loading'; - $scope.verification.address = $scope.message.address; - $http.post(Api.apiPrefix + '/messages/verify', $scope.message) - .success(function(data, status, headers, config) { - if(typeof(data.result) != 'boolean') { - // API returned 200 but result was not true or false - $scope.verification.status = 'error'; - $scope.verification.error = null; - return; - } - - $scope.verification.status = 'verified'; - $scope.verification.result = data.result; - }) - .error(function(data, status, headers, config) { - $scope.verification.status = 'error'; - $scope.verification.error = data; - }); - }; - - // Hide the verify status message on form change - var unverify = function() { - $scope.verification.status = 'unverified'; - }; - $scope.$watch('message.address', unverify); - $scope.$watch('message.signature', unverify); - $scope.$watch('message.message', unverify); -}); - -// Source: public/src/js/controllers/scanner.js -angular.module('insight.system').controller('ScannerController', - function($scope, $rootScope, $modalInstance, Global) { - $scope.global = Global; - - // Detect mobile devices - var isMobile = { - Android: function() { - return navigator.userAgent.match(/Android/i); - }, - BlackBerry: function() { - return navigator.userAgent.match(/BlackBerry/i); - }, - iOS: function() { - return navigator.userAgent.match(/iPhone|iPad|iPod/i); - }, - Opera: function() { - return navigator.userAgent.match(/Opera Mini/i); - }, - Windows: function() { - return navigator.userAgent.match(/IEMobile/i); - }, - any: function() { - return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows()); - } - }; - - navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; - window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL; - - $scope.isMobile = isMobile.any(); - $scope.scannerLoading = false; - - var $searchInput = angular.element(document.getElementById('search')), - cameraInput, - video, - canvas, - $video, - context, - localMediaStream; - - var _scan = function(evt) { - if ($scope.isMobile) { - $scope.scannerLoading = true; - var files = evt.target.files; - - if (files.length === 1 && files[0].type.indexOf('image/') === 0) { - var file = files[0]; - - var reader = new FileReader(); - reader.onload = (function(theFile) { - return function(e) { - var mpImg = new MegaPixImage(file); - mpImg.render(canvas, { maxWidth: 200, maxHeight: 200, orientation: 6 }); - - setTimeout(function() { - qrcode.width = canvas.width; - qrcode.height = canvas.height; - qrcode.imagedata = context.getImageData(0, 0, qrcode.width, qrcode.height); - - try { - //alert(JSON.stringify(qrcode.process(context))); - qrcode.decode(); - } catch (e) { - alert(e); - } - }, 1500); - }; - })(file); - - // Read in the file as a data URL - reader.readAsDataURL(file); - } - } else { - if (localMediaStream) { - context.drawImage(video, 0, 0, 300, 225); - - try { - qrcode.decode(); - } catch(e) { - //qrcodeError(e); - } - } - - setTimeout(_scan, 500); - } - }; - - var _successCallback = function(stream) { - video.src = (window.URL && window.URL.createObjectURL(stream)) || stream; - localMediaStream = stream; - video.play(); - setTimeout(_scan, 1000); - }; - - var _scanStop = function() { - $scope.scannerLoading = false; - $modalInstance.close(); - if (!$scope.isMobile) { - if (localMediaStream.stop) localMediaStream.stop(); - localMediaStream = null; - video.src = ''; - } - }; - - var _videoError = function(err) { - console.log('Video Error: ' + JSON.stringify(err)); - _scanStop(); - }; - - qrcode.callback = function(data) { - _scanStop(); - - var str = (data.indexOf('bitcoin:') === 0) ? data.substring(8) : data; - console.log('QR code detected: ' + str); - $searchInput - .val(str) - .triggerHandler('change') - .triggerHandler('submit'); - }; - - $scope.cancel = function() { - _scanStop(); - }; - - $modalInstance.opened.then(function() { - $rootScope.isCollapsed = true; - - // Start the scanner - setTimeout(function() { - canvas = document.getElementById('qr-canvas'); - context = canvas.getContext('2d'); - - if ($scope.isMobile) { - cameraInput = document.getElementById('qrcode-camera'); - cameraInput.addEventListener('change', _scan, false); - } else { - video = document.getElementById('qrcode-scanner-video'); - $video = angular.element(video); - canvas.width = 300; - canvas.height = 225; - context.clearRect(0, 0, 300, 225); - - navigator.getUserMedia({video: true}, _successCallback, _videoError); - } - }, 500); - }); -}); - -// Source: public/src/js/controllers/search.js -angular.module('insight.search').controller('SearchController', - function($scope, $routeParams, $location, $timeout, Global, Block, Transaction, Address, BlockByHeight) { - $scope.global = Global; - $scope.loading = false; - - var _badQuery = function() { - $scope.badQuery = true; - - $timeout(function() { - $scope.badQuery = false; - }, 2000); - }; - - var _resetSearch = function() { - $scope.q = ''; - $scope.loading = false; - }; - - $scope.search = function() { - var q = $scope.q; - $scope.badQuery = false; - $scope.loading = true; - - Block.get({ - blockHash: q - }, function() { - _resetSearch(); - $location.path('block/' + q); - }, function() { //block not found, search on TX - Transaction.get({ - txId: q - }, function() { - _resetSearch(); - $location.path('tx/' + q); - }, function() { //tx not found, search on Address - Address.get({ - addrStr: q - }, function() { - _resetSearch(); - $location.path('address/' + q); - }, function() { // block by height not found - if (isFinite(q)) { // ensure that q is a finite number. A logical height value. - BlockByHeight.get({ - blockHeight: q - }, function(hash) { - _resetSearch(); - $location.path('/block/' + hash.blockHash); - }, function() { //not found, fail :( - $scope.loading = false; - _badQuery(); - }); - } - else { - $scope.loading = false; - _badQuery(); - } - }); - }); - }); - }; - -}); - -// Source: public/src/js/controllers/status.js -angular.module('insight.status').controller('StatusController', - function($scope, $routeParams, $location, Global, Status, Sync, getSocket) { - $scope.global = Global; - - $scope.getStatus = function(q) { - Status.get({ - q: 'get' + q - }, - function(d) { - $scope.loaded = 1; - angular.extend($scope, d); - }, - function(e) { - $scope.error = 'API ERROR: ' + e.data; - }); - }; - - $scope.humanSince = function(time) { - var m = moment.unix(time / 1000); - return m.max().fromNow(); - }; - - var _onSyncUpdate = function(sync) { - $scope.sync = sync; - }; - - var _startSocket = function () { - socket.emit('subscribe', 'sync'); - socket.on('status', function(sync) { - _onSyncUpdate(sync); - }); - }; - - var socket = getSocket($scope); - socket.on('connect', function() { - _startSocket(); - }); - - - $scope.getSync = function() { - _startSocket(); - Sync.get({}, - function(sync) { - _onSyncUpdate(sync); - }, - function(e) { - var err = 'Could not get sync information' + e.toString(); - $scope.sync = { - error: err - }; - }); - }; - }); - -// Source: public/src/js/controllers/transactions.js -angular.module('insight.transactions').controller('transactionsController', -function($scope, $rootScope, $routeParams, $location, Global, Transaction, TransactionsByBlock, TransactionsByAddress) { - $scope.global = Global; - $scope.loading = false; - $scope.loadedBy = null; - - var pageNum = 0; - var pagesTotal = 1; - var COIN = 100000000; - - var _aggregateItems = function(items) { - if (!items) return []; - - var l = items.length; - - var ret = []; - var tmp = {}; - var u = 0; - - for(var i=0; i < l; i++) { - - var notAddr = false; - // non standard input - if (items[i].scriptSig && !items[i].addr) { - items[i].addr = 'Unparsed address [' + u++ + ']'; - items[i].notAddr = true; - notAddr = true; - } - - // non standard output - if (items[i].scriptPubKey && !items[i].scriptPubKey.addresses) { - items[i].scriptPubKey.addresses = ['Unparsed address [' + u++ + ']']; - items[i].notAddr = true; - notAddr = true; - } - - // multiple addr at output - if (items[i].scriptPubKey && items[i].scriptPubKey.addresses.length > 1) { - items[i].addr = items[i].scriptPubKey.addresses.join(','); - ret.push(items[i]); - continue; - } - - var addr = items[i].addr || (items[i].scriptPubKey && items[i].scriptPubKey.addresses[0]); - - if (!tmp[addr]) { - tmp[addr] = {}; - tmp[addr].valueSat = 0; - tmp[addr].count = 0; - tmp[addr].addr = addr; - tmp[addr].items = []; - } - tmp[addr].isSpent = items[i].spentTxId; - - tmp[addr].doubleSpentTxID = tmp[addr].doubleSpentTxID || items[i].doubleSpentTxID; - tmp[addr].doubleSpentIndex = tmp[addr].doubleSpentIndex || items[i].doubleSpentIndex; - tmp[addr].dbError = tmp[addr].dbError || items[i].dbError; - tmp[addr].valueSat += Math.round(items[i].value * COIN); - tmp[addr].items.push(items[i]); - tmp[addr].notAddr = notAddr; - - if (items[i].unconfirmedInput) - tmp[addr].unconfirmedInput = true; - - tmp[addr].count++; - } - - angular.forEach(tmp, function(v) { - v.value = v.value || parseInt(v.valueSat) / COIN; - ret.push(v); - }); - return ret; - }; - - var _processTX = function(tx) { - tx.vinSimple = _aggregateItems(tx.vin); - tx.voutSimple = _aggregateItems(tx.vout); - }; - - var _paginate = function(data) { - $scope.loading = false; - - pagesTotal = data.pagesTotal; - pageNum += 1; - - data.txs.forEach(function(tx) { - _processTX(tx); - $scope.txs.push(tx); - }); - }; - - var _byBlock = function() { - TransactionsByBlock.get({ - block: $routeParams.blockHash, - pageNum: pageNum - }, function(data) { - _paginate(data); - }); - }; - - var _byAddress = function () { - TransactionsByAddress.get({ - address: $routeParams.addrStr, - pageNum: pageNum - }, function(data) { - _paginate(data); - }); - }; - - var _findTx = function(txid) { - Transaction.get({ - txId: txid - }, function(tx) { - $rootScope.titleDetail = tx.txid.substring(0,7) + '...'; - $rootScope.flashMessage = null; - $scope.tx = tx; - _processTX(tx); - $scope.txs.unshift(tx); - }, function(e) { - if (e.status === 400) { - $rootScope.flashMessage = 'Invalid Transaction ID: ' + $routeParams.txId; - } - else if (e.status === 503) { - $rootScope.flashMessage = 'Backend Error. ' + e.data; - } - else { - $rootScope.flashMessage = 'Transaction Not Found'; - } - - $location.path('/'); - }); - }; - - $scope.findThis = function() { - _findTx($routeParams.txId); - }; - - //Initial load - $scope.load = function(from) { - $scope.loadedBy = from; - $scope.loadMore(); - }; - - //Load more transactions for pagination - $scope.loadMore = function() { - if (pageNum < pagesTotal && !$scope.loading) { - $scope.loading = true; - - if ($scope.loadedBy === 'address') { - _byAddress(); - } - else { - _byBlock(); - } - } - }; - - // Highlighted txout - if ($routeParams.v_type == '>' || $routeParams.v_type == '<') { - $scope.from_vin = $routeParams.v_type == '<' ? true : false; - $scope.from_vout = $routeParams.v_type == '>' ? true : false; - $scope.v_index = parseInt($routeParams.v_index); - $scope.itemsExpanded = true; - } - - //Init without txs - $scope.txs = []; - - $scope.$on('tx', function(event, txid) { - _findTx(txid); - }); - -}); - -angular.module('insight.transactions').controller('SendRawTransactionController', - function($scope, $http, Api) { - $scope.transaction = ''; - $scope.status = 'ready'; // ready|loading|sent|error - $scope.txid = ''; - $scope.error = null; - - $scope.formValid = function() { - return !!$scope.transaction; - }; - $scope.send = function() { - var postData = { - rawtx: $scope.transaction - }; - $scope.status = 'loading'; - $http.post(Api.apiPrefix + '/tx/send', postData) - .success(function(data, status, headers, config) { - if(typeof(data.txid) != 'string') { - // API returned 200 but the format is not known - $scope.status = 'error'; - $scope.error = 'The transaction was sent but no transaction id was got back'; - return; - } - - $scope.status = 'sent'; - $scope.txid = data.txid; - }) - .error(function(data, status, headers, config) { - $scope.status = 'error'; - if(data) { - $scope.error = data; - } else { - $scope.error = "No error message given (connection error?)" - } - }); - }; -}); - -// Source: public/src/js/services/address.js -angular.module('insight.address').factory('Address', - function($resource, Api) { - return $resource(Api.apiPrefix + '/addr/:addrStr/?noTxList=1', { - addrStr: '@addStr' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); -}); - - - -// Source: public/src/js/services/api.js -angular.module('insight.api') - .factory('Api', - function() { - return { - apiPrefix: '/insight-api' - } - }); - -// Source: public/src/js/services/blocks.js -angular.module('insight.blocks') - .factory('Block', - function($resource, Api) { - return $resource(Api.apiPrefix + '/block/:blockHash', { - blockHash: '@blockHash' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); - }) - .factory('Blocks', - function($resource, Api) { - return $resource(Api.apiPrefix + '/blocks'); - }) - .factory('BlockByHeight', - function($resource, Api) { - return $resource(Api.apiPrefix + '/block-index/:blockHeight'); - }); - -// Source: public/src/js/services/currency.js -angular.module('insight.currency').factory('Currency', - function($resource, Api) { - return $resource(Api.apiPrefix + '/currency'); -}); - -// Source: public/src/js/services/global.js -//Global service for global variables -angular.module('insight.system') - .factory('Global',[ - function() { - } - ]) - .factory('Version', - function($resource, Api) { - return $resource(Api.apiPrefix + '/version'); - }); - -// Source: public/src/js/services/socket.js -var ScopedSocket = function(socket, $rootScope) { - this.socket = socket; - this.$rootScope = $rootScope; - this.listeners = []; -}; - -ScopedSocket.prototype.removeAllListeners = function(opts) { - if (!opts) opts = {}; - for (var i = 0; i < this.listeners.length; i++) { - var details = this.listeners[i]; - if (opts.skipConnect && details.event === 'connect') { - continue; - } - this.socket.removeListener(details.event, details.fn); - } - this.listeners = []; -}; - -ScopedSocket.prototype.on = function(event, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; - - var wrapped_callback = function() { - var args = arguments; - $rootScope.$apply(function() { - callback.apply(socket, args); - }); - }; - socket.on(event, wrapped_callback); - - this.listeners.push({ - event: event, - fn: wrapped_callback - }); -}; - -ScopedSocket.prototype.emit = function(event, data, callback) { - var socket = this.socket; - var $rootScope = this.$rootScope; - var args = Array.prototype.slice.call(arguments); - - args.push(function() { - var args = arguments; - $rootScope.$apply(function() { - if (callback) { - callback.apply(socket, args); - } - }); - }); - - socket.emit.apply(socket, args); -}; - -angular.module('insight.socket').factory('getSocket', - function($rootScope) { - console.log('init my socket'); - var socket = io.connect(null, { - 'reconnect': true, - 'reconnection delay': 500, - }); - return function(scope) { - var scopedSocket = new ScopedSocket(socket, $rootScope); - scope.$on('$destroy', function() { - scopedSocket.removeAllListeners(); - }); - socket.on('connect', function() { - scopedSocket.removeAllListeners({ - skipConnect: true - }); - }); - return scopedSocket; - }; - }); - -// Source: public/src/js/services/status.js -angular.module('insight.status') - .factory('Status', - function($resource, Api) { - return $resource(Api.apiPrefix + '/status', { - q: '@q' - }); - }) - .factory('Sync', - function($resource, Api) { - return $resource(Api.apiPrefix + '/sync'); - }) - .factory('PeerSync', - function($resource, Api) { - return $resource(Api.apiPrefix + '/peer'); - }); - -// Source: public/src/js/services/transactions.js -angular.module('insight.transactions') - .factory('Transaction', - function($resource, Api) { - return $resource(Api.apiPrefix + '/tx/:txId', { - txId: '@txId' - }, { - get: { - method: 'GET', - interceptor: { - response: function (res) { - return res.data; - }, - responseError: function (res) { - if (res.status === 404) { - return res; - } - } - } - } - }); - }) - .factory('TransactionsByBlock', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs', { - block: '@block' - }); - }) - .factory('TransactionsByAddress', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs', { - address: '@address' - }); - }) - .factory('Transactions', - function($resource, Api) { - return $resource(Api.apiPrefix + '/txs'); - }); - -// Source: public/src/js/directives.js -var ZeroClipboard = window.ZeroClipboard; - -angular.module('insight') - .directive('scroll', function ($window) { - return function(scope, element, attrs) { - angular.element($window).bind('scroll', function() { - if (this.pageYOffset >= 200) { - scope.secondaryNavbar = true; - } else { - scope.secondaryNavbar = false; - } - scope.$apply(); - }); - }; - }) - .directive('whenScrolled', function($window) { - return { - restric: 'A', - link: function(scope, elm, attr) { - var pageHeight, clientHeight, scrollPos; - $window = angular.element($window); - - var handler = function() { - pageHeight = window.document.documentElement.scrollHeight; - clientHeight = window.document.documentElement.clientHeight; - scrollPos = window.pageYOffset; - - if (pageHeight - (scrollPos + clientHeight) === 0) { - scope.$apply(attr.whenScrolled); - } - }; - - $window.on('scroll', handler); - - scope.$on('$destroy', function() { - return $window.off('scroll', handler); - }); - } - }; - }) - .directive('clipCopy', function() { - ZeroClipboard.config({ - moviePath: '/lib/zeroclipboard/ZeroClipboard.swf', - trustedDomains: ['*'], - allowScriptAccess: 'always', - forceHandCursor: true - }); - - return { - restric: 'A', - scope: { clipCopy: '=clipCopy' }, - template: '
      Copied!
      ', - link: function(scope, elm) { - var clip = new ZeroClipboard(elm); - - clip.on('load', function(client) { - var onMousedown = function(client) { - client.setText(scope.clipCopy); - }; - - client.on('mousedown', onMousedown); - - scope.$on('$destroy', function() { - client.off('mousedown', onMousedown); - }); - }); - - clip.on('noFlash wrongflash', function() { - return elm.remove(); - }); - } - }; - }) - .directive('focus', function ($timeout) { - return { - scope: { - trigger: '@focus' - }, - link: function (scope, element) { - scope.$watch('trigger', function (value) { - if (value === "true") { - $timeout(function () { - element[0].focus(); - }); - } - }); - } - }; - }); - -// Source: public/src/js/filters.js -angular.module('insight') - .filter('startFrom', function() { - return function(input, start) { - start = +start; //parse to int - return input.slice(start); - } - }) - .filter('split', function() { - return function(input, delimiter) { - var delimiter = delimiter || ','; - return input.split(delimiter); - } - }); - -// Source: public/src/js/config.js -//Setting up route -angular.module('insight').config(function($routeProvider) { - $routeProvider. - when('/block/:blockHash', { - templateUrl: 'views/block.html', - title: 'Bitcoin Block ' - }). - when('/block-index/:blockHeight', { - controller: 'BlocksController', - templateUrl: 'views/redirect.html' - }). - when('/tx/send', { - templateUrl: 'views/transaction_sendraw.html', - title: 'Broadcast Raw Transaction' - }). - when('/tx/:txId/:v_type?/:v_index?', { - templateUrl: 'views/transaction.html', - title: 'Bitcoin Transaction ' - }). - when('/', { - templateUrl: 'views/index.html', - title: 'Home' - }). - when('/blocks', { - templateUrl: 'views/block_list.html', - title: 'Bitcoin Blocks solved Today' - }). - when('/blocks-date/:blockDate/:startTimestamp?', { - templateUrl: 'views/block_list.html', - title: 'Bitcoin Blocks solved ' - }). - when('/address/:addrStr', { - templateUrl: 'views/address.html', - title: 'Bitcoin Address ' - }). - when('/status', { - templateUrl: 'views/status.html', - title: 'Status' - }). - when('/messages/verify', { - templateUrl: 'views/messages_verify.html', - title: 'Verify Message' - }) - .otherwise({ - templateUrl: 'views/404.html', - title: 'Error' - }); -}); - -//Setting HTML5 Location Mode -angular.module('insight') - .config(function($locationProvider) { - $locationProvider.html5Mode(true); - $locationProvider.hashPrefix('!'); - }) - .run(function($rootScope, $route, $location, $routeParams, $anchorScroll, ngProgress, gettextCatalog, amMoment) { - gettextCatalog.currentLanguage = defaultLanguage; - amMoment.changeLocale(defaultLanguage); - $rootScope.$on('$routeChangeStart', function() { - ngProgress.start(); - }); - - $rootScope.$on('$routeChangeSuccess', function() { - ngProgress.complete(); - - //Change page title, based on Route information - $rootScope.titleDetail = ''; - $rootScope.title = $route.current.title; - $rootScope.isCollapsed = true; - $rootScope.currentAddr = null; - - $location.hash($routeParams.scrollTo); - $anchorScroll(); - }); - }); - -// Source: public/src/js/init.js -angular.element(document).ready(function() { - // Init the app - // angular.bootstrap(document, ['insight']); -}); - -// Source: public/src/js/translations.js -angular.module('insight').run(['gettextCatalog', function (gettextCatalog) { -/* jshint -W100 */ - gettextCatalog.setStrings('de_DE', {"(Input unconfirmed)":"(Eingabe unbestätigt)","404 Page not found :(":"404 Seite nicht gefunden :(","insight is an
      open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen REST und Websocket APIs um eigene Wallets oder Applikationen zu implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der aktuelle Quellcode ist auf Github zu finden.","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insight befindet sich aktuell noch in der Entwicklung. Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren Verbesserung an unseren Github Issue Tracker.","About":"Über insight","Address":"Adresse","Age":"Alter","Application Status":"Programmstatus","Best Block":"Bester Block","Bitcoin node information":"Bitcoin-Node Info","Block":"Block","Block Reward":"Belohnung","Blocks":"Blöcke","Bytes Serialized":"Serialisierte Bytes","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:{{port}} ist fehlgeschlagen.)","Can't connect to insight server. Attempting to reconnect...":"Keine Verbindung zum insight-Server möglich. Es wird versucht die Verbindung neu aufzubauen...","Can't connect to internet. Please, check your connection.":"Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen.","Complete":"Vollständig","Confirmations":"Bestätigungen","Conn":"Verbindungen","Connections to other nodes":"Verbindungen zu Nodes","Current Blockchain Tip (insight)":"Aktueller Blockchain Tip (insight)","Current Sync Status":"Aktueller Status","Details":"Details","Difficulty":"Schwierigkeit","Double spent attempt detected. From tx:":"Es wurde ein \"double Spend\" Versuch erkannt.Von tx:","Error!":"Fehler!","Fee":"Gebühr","Final Balance":"Schlussbilanz","Finish Date":"Fertigstellung","Go to home":"Zur Startseite","Hash Serialized":"Hash Serialisiert","Height":"Höhe","Included in Block":"Eingefügt in Block","Incoherence in levelDB detected:":"Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:","Info Errors":"Fehlerbeschreibung","Initial Block Chain Height":"Ursprüngliche Blockchain Höhe","Input":"Eingänge","Last Block":"Letzter Block","Last Block Hash (Bitcoind)":"Letzter Hash (Bitcoind)","Latest Blocks":"Letzte Blöcke","Latest Transactions":"Letzte Transaktionen","Loading Address Information":"Lade Adressinformationen","Loading Block Information":"Lade Blockinformation","Loading Selected Date...":"Lade gewähltes Datum...","Loading Transaction Details":"Lade Transaktionsdetails","Loading Transactions...":"Lade Transaktionen...","Loading...":"Lade...","Mined Time":"Block gefunden (Mining)","Mined by":"Gefunden von","Mining Difficulty":"Schwierigkeitgrad","Next Block":"Nächster Block","No Inputs (Newly Generated Coins)":"Keine Eingänge (Neu generierte Coins)","No blocks yet.":"Keine Blöcke bisher.","No matching records found!":"Keine passenden Einträge gefunden!","No. Transactions":"Anzahl Transaktionen","Number Of Transactions":"Anzahl der Transaktionen","Output":"Ausgänge","Powered by":"Powered by","Previous Block":"Letzter Block","Protocol version":"Protokollversion","Proxy setting":"Proxyeinstellung","Received Time":"Eingangszeitpunkt","Redirecting...":"Umleitung...","Search for block, transaction or address":"Suche Block, Transaktion oder Adresse","See all blocks":"Alle Blöcke anzeigen","Show Transaction Output data":"Zeige Abgänge","Show all":"Zeige Alles","Show input":"Zeige Eingänge","Show less":"Weniger anzeigen","Show more":"Mehr anzeigen","Size":"Größe","Size (bytes)":"Größe (bytes)","Skipped Blocks (previously synced)":"Verworfene Blöcke (bereits syncronisiert)","Start Date":"Startdatum","Status":"Status","Summary":"Zusammenfassung","Summary confirmed":"Zusammenfassung bestätigt","Sync Progress":"Fortschritt","Sync Status":"Syncronisation","Sync Type":"Art der Syncronisation","Synced Blocks":"Syncronisierte Blöcke","Testnet":"Testnet aktiv","There are no transactions involving this address.":"Es gibt keine Transaktionen zu dieser Adressse","Time Offset":"Zeitoffset zu UTC","Timestamp":"Zeitstempel","Today":"Heute","Total Amount":"Gesamtsumme","Total Received":"Insgesamt empfangen","Total Sent":"Insgesamt gesendet","Transaction":"Transaktion","Transaction Output Set Information":"Transaktions Abgänge","Transaction Outputs":"Abgänge","Transactions":"Transaktionen","Type":"Typ","Unconfirmed":"Unbestätigt","Unconfirmed Transaction!":"Unbestätigte Transaktion!","Unconfirmed Txs Balance":"Unbestätigtes Guthaben","Value Out":"Wert","Version":"Version","Waiting for blocks...":"Warte auf Blöcke...","Waiting for transactions...":"Warte auf Transaktionen...","by date.":"nach Datum.","first seen at":"zuerst gesehen am","mined":"gefunden","mined on:":"vom:","Waiting for blocks":"Warte auf Blöcke"}); - gettextCatalog.setStrings('es', {"(Input unconfirmed)":"(Entrada sin confirmar)","404 Page not found :(":"404 Página no encontrada :(","insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insight es un explorador de bloques de Bitcoin open-source con un completo conjunto de REST y APIs de websockets que pueden ser usadas para escribir monederos de Bitcoins y otras aplicaciones que requieran consultar un explorador de bloques. Obtén el código en el repositorio abierto de Github.","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insight esta en desarrollo aún, por ello agradecemos que nos reporten errores o sugerencias para mejorar el software. Github issue tracker.","About":"Acerca de","Address":"Dirección","Age":"Edad","Application Status":"Estado de la Aplicación","Best Block":"Mejor Bloque","Bitcoin node information":"Información del nodo Bitcoin","Block":"Bloque","Block Reward":"Bloque Recompensa","Blocks":"Bloques","Bytes Serialized":"Bytes Serializados","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)","Can't connect to insight server. Attempting to reconnect...":"No se pudo conectar al servidor insight. Intentando re-conectar...","Can't connect to internet. Please, check your connection.":"No se pudo conectar a Internet. Por favor, verifique su conexión.","Complete":"Completado","Confirmations":"Confirmaciones","Conn":"Con","Connections to other nodes":"Conexiones a otros nodos","Current Blockchain Tip (insight)":"Actual Blockchain Tip (insight)","Current Sync Status":"Actual Estado de Sincronización","Details":"Detalles","Difficulty":"Dificultad","Double spent attempt detected. From tx:":"Intento de doble gasto detectado. De la transacción:","Error!":"¡Error!","Fee":"Tasa","Final Balance":"Balance Final","Finish Date":"Fecha Final","Go to home":"Volver al Inicio","Hash Serialized":"Hash Serializado","Height":"Altura","Included in Block":"Incluido en el Bloque","Incoherence in levelDB detected:":"Detectada una incoherencia en levelDB:","Info Errors":"Errores de Información","Initial Block Chain Height":"Altura de la Cadena en Bloque Inicial","Input":"Entrada","Last Block":"Último Bloque","Last Block Hash (Bitcoind)":"Último Bloque Hash (Bitcoind)","Latest Blocks":"Últimos Bloques","Latest Transactions":"Últimas Transacciones","Loading Address Information":"Cargando Información de la Dirección","Loading Block Information":"Cargando Información del Bloque","Loading Selected Date...":"Cargando Fecha Seleccionada...","Loading Transaction Details":"Cargando Detalles de la Transacción","Loading Transactions...":"Cargando Transacciones...","Loading...":"Cargando...","Mined Time":"Hora de Minado","Mined by":"Minado por","Mining Difficulty":"Dificultad de Minado","Next Block":"Próximo Bloque","No Inputs (Newly Generated Coins)":"Sin Entradas (Monedas Recién Generadas)","No blocks yet.":"No hay bloques aún.","No matching records found!":"¡No se encontraron registros coincidentes!","No. Transactions":"Nro. de Transacciones","Number Of Transactions":"Número de Transacciones","Output":"Salida","Powered by":"Funciona con","Previous Block":"Bloque Anterior","Protocol version":"Versión del protocolo","Proxy setting":"Opción de proxy","Received Time":"Hora de Recibido","Redirecting...":"Redireccionando...","Search for block, transaction or address":"Buscar bloques, transacciones o direcciones","See all blocks":"Ver todos los bloques","Show Transaction Output data":"Mostrar dato de Salida de la Transacción","Show all":"Mostrar todos","Show input":"Mostrar entrada","Show less":"Ver menos","Show more":"Ver más","Size":"Tamaño","Size (bytes)":"Tamaño (bytes)","Skipped Blocks (previously synced)":"Bloques Saltados (previamente sincronizado)","Start Date":"Fecha de Inicio","Status":"Estado","Summary":"Resumen","Summary confirmed":"Resumen confirmados","Sync Progress":"Proceso de Sincronización","Sync Status":"Estado de Sincronización","Sync Type":"Tipo de Sincronización","Synced Blocks":"Bloques Sincornizados","Testnet":"Red de prueba","There are no transactions involving this address.":"No hay transacciones para esta dirección","Time Offset":"Desplazamiento de hora","Timestamp":"Fecha y hora","Today":"Hoy","Total Amount":"Cantidad Total","Total Received":"Total Recibido","Total Sent":"Total Enviado","Transaction":"Transacción","Transaction Output Set Information":"Información del Conjunto de Salida de la Transacción","Transaction Outputs":"Salidas de la Transacción","Transactions":"Transacciones","Type":"Tipo","Unconfirmed":"Sin confirmar","Unconfirmed Transaction!":"¡Transacción sin confirmar!","Unconfirmed Txs Balance":"Balance sin confirmar","Value Out":"Valor de Salida","Version":"Versión","Waiting for blocks...":"Esperando bloques...","Waiting for transactions...":"Esperando transacciones...","by date.":"por fecha.","first seen at":"Visto a","mined":"minado","mined on:":"minado el:","Waiting for blocks":"Esperando bloques"}); - gettextCatalog.setStrings('ja', {"(Input unconfirmed)":"(入力は未検証です)","404 Page not found :(":"404 ページがみつかりません (´・ω・`)","insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.":"insightは、bitcoind RPCの提供するものよりも詳細なブロックチェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソースコードを確認","insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.":"insightは現在開発中です。githubのissueトラッカにてバグの報告や改善案の提案をお願いします。","About":"はじめに","Address":"アドレス","Age":"生成後経過時間","An error occured in the verification process.":"検証過程でエラーが発生しました。","An error occured:
      {{error}}":"エラーが発生しました:
      {{error}}","Application Status":"アプリケーションの状態","Best Block":"最良ブロック","Bitcoin comes with a way of signing arbitrary messages.":"Bitcoinには任意のメッセージを署名する昨日が備わっています。","Bitcoin node information":"Bitcoinノード情報","Block":"ブロック","Block Reward":"ブロック報酬","Blocks":"ブロック","Broadcast Raw Transaction":"生のトランザクションを配信","Bytes Serialized":"シリアライズ後の容量 (バイト)","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませんでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)","Can't connect to insight server. Attempting to reconnect...":"insight サーバに接続できません。再接続しています...","Can't connect to internet. Please, check your connection.":"インターネットに接続できません。コネクションを確認してください。","Complete":"完了","Confirmations":"検証数","Conn":"接続数","Connections to other nodes":"他ノードへの接続","Current Blockchain Tip (insight)":"現在のブロックチェインのTip (insight)","Current Sync Status":"現在の同期状況","Details":"詳細","Difficulty":"難易度","Double spent attempt detected. From tx:":"二重支払い攻撃をこのトランザクションから検知しました:","Error message:":"エラーメッセージ:","Error!":"エラー!","Fee":"手数料","Final Balance":"最終残高","Finish Date":"終了日時","Go to home":"ホームへ","Hash Serialized":"シリアライズデータのハッシュ値","Height":"ブロック高","Included in Block":"取り込まれたブロック","Incoherence in levelDB detected:":"levelDBの破損を検知しました:","Info Errors":"エラー情報","Initial Block Chain Height":"起動時のブロック高","Input":"入力","Last Block":"直前のブロック","Last Block Hash (Bitcoind)":"直前のブロックのハッシュ値 (Bitcoind)","Latest Blocks":"最新のブロック","Latest Transactions":"最新のトランザクション","Loading Address Information":"アドレス情報を読み込んでいます","Loading Block Information":"ブロック情報を読み込んでいます","Loading Selected Date...":"選択されたデータを読み込んでいます...","Loading Transaction Details":"トランザクションの詳細を読み込んでいます","Loading Transactions...":"トランザクションを読み込んでいます...","Loading...":"ロード中...","Message":"メッセージ","Mined Time":"採掘時刻","Mined by":"採掘者","Mining Difficulty":"採掘難易度","Next Block":"次のブロック","No Inputs (Newly Generated Coins)":"入力なし (新しく生成されたコイン)","No blocks yet.":"ブロックはありません。","No matching records found!":"一致するレコードはありません!","No. Transactions":"トランザクション数","Number Of Transactions":"トランザクション数","Output":"出力","Powered by":"Powered by","Previous Block":"前のブロック","Protocol version":"プロトコルバージョン","Proxy setting":"プロキシ設定","Raw transaction data":"トランザクションの生データ","Raw transaction data must be a valid hexadecimal string.":"生のトランザクションデータは有効な16進数でなければいけません。","Received Time":"受信時刻","Redirecting...":"リダイレクトしています...","Search for block, transaction or address":"ブロック、トランザクション、アドレスを検索","See all blocks":"すべてのブロックをみる","Send transaction":"トランザクションを送信","Show Transaction Output data":"トランザクションの出力データをみる","Show all":"すべて表示","Show input":"入力を表示","Show less":"隠す","Show more":"表示する","Signature":"署名","Size":"サイズ","Size (bytes)":"サイズ (バイト)","Skipped Blocks (previously synced)":"スキップされたブロック (同期済み)","Start Date":"開始日時","Status":"ステータス","Summary":"概要","Summary confirmed":"サマリ 検証済み","Sync Progress":"同期の進捗状況","Sync Status":"同期ステータス","Sync Type":"同期タイプ","Synced Blocks":"同期されたブロック数","Testnet":"テストネット","The message failed to verify.":"メッセージの検証に失敗しました。","The message is verifiably from {{verification.address}}.":"メッセージは{{verification.address}}により検証されました。","There are no transactions involving this address.":"このアドレスに対するトランザクションはありません。","This form can be used to broadcast a raw transaction in hex format over\n the Bitcoin network.":"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワーク上に配信することができます。","This form can be used to verify that a message comes from\n a specific Bitcoin address.":"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証することができます。","Time Offset":"時間オフセット","Timestamp":"タイムスタンプ","Today":"今日","Total Amount":"Bitcoin総量","Total Received":"総入金額","Total Sent":"総送金額","Transaction":"トランザクション","Transaction Output Set Information":"トランザクションの出力セット情報","Transaction Outputs":"トランザクションの出力","Transaction succesfully broadcast.
      Transaction id: {{txid}}":"トランザクションの配信に成功しました。
      トランザクションID: {{txid}}","Transactions":"トランザクション","Type":"タイプ","Unconfirmed":"未検証","Unconfirmed Transaction!":"未検証のトランザクションです!","Unconfirmed Txs Balance":"未検証トランザクションの残高","Value Out":"出力値","Verify":"検証","Verify signed message":"署名済みメッセージを検証","Version":"バージョン","Waiting for blocks...":"ブロックを待っています...","Waiting for transactions...":"トランザクションを待っています...","by date.":"日毎。","first seen at":"最初に発見された日時","mined":"採掘された","mined on:":"採掘日時:","(Mainchain)":"(メインチェーン)","(Orphaned)":"(孤立したブロック)","Bits":"Bits","Block #{{block.height}}":"ブロック #{{block.height}}","BlockHash":"ブロックのハッシュ値","Blocks
      mined on:":"ブロック
      採掘日","Coinbase":"コインベース","Hash":"ハッシュ値","LockTime":"ロック時間","Merkle Root":"Merkleルート","Nonce":"Nonce","Ooops!":"おぉっと!","Output is spent":"出力は使用済みです","Output is unspent":"出力は未使用です","Scan":"スキャン","Show/Hide items details":"アイテムの詳細を表示または隠す","Waiting for blocks":"ブロックを待っています","by date. {{detail}} {{before}}":"日時順 {{detail}} {{before}}","scriptSig":"scriptSig","{{tx.confirmations}} Confirmations":"{{tx.confirmations}} 検証"," (Orphaned)":" (孤立したブロック)"," Incoherence in levelDB detected: {{vin.dbError}}":" Incoherence in levelDB detected: {{vin.dbError}}","Waiting for blocks ":"ブロックを待っています "}); -/* jshint +W100 */ -}]); \ No newline at end of file diff --git a/server/insight-ui/public/js/main.min.js b/server/insight-ui/public/js/main.min.js deleted file mode 100644 index 187c53d..0000000 --- a/server/insight-ui/public/js/main.min.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! insight-ui 0.4.0 */ -var defaultLanguage=localStorage.getItem("insight-language")||"en",defaultCurrency=localStorage.getItem("insight-currency")||"BTC";angular.module("insight",["ngAnimate","ngResource","ngRoute","ngProgress","ui.bootstrap","ui.route","monospaced.qrcode","gettext","angularMoment","insight.system","insight.socket","insight.api","insight.blocks","insight.transactions","insight.address","insight.search","insight.status","insight.connection","insight.currency","insight.messages"]),angular.module("insight.system",[]),angular.module("insight.socket",[]),angular.module("insight.api",[]),angular.module("insight.blocks",[]),angular.module("insight.transactions",[]),angular.module("insight.address",[]),angular.module("insight.search",[]),angular.module("insight.status",[]),angular.module("insight.connection",[]),angular.module("insight.currency",[]),angular.module("insight.messages",[]),angular.module("insight.address").controller("AddressController",function($scope,$rootScope,$routeParams,$location,Global,Address,getSocket){$scope.global=Global;var socket=getSocket($scope),addrStr=$routeParams.addrStr,_startSocket=function(){socket.on("bitcoind/addresstxid",function(data){if(data.address===addrStr){$rootScope.$broadcast("tx",data.txid);var base=document.querySelector("base"),beep=new Audio(base.href+"/sound/transaction.mp3");beep.play()}}),socket.emit("subscribe","bitcoind/addresstxid",[addrStr])},_stopSocket=function(){socket.emit("unsubscribe","bitcoind/addresstxid",[addrStr])};socket.on("connect",function(){_startSocket()}),$scope.$on("$destroy",function(){_stopSocket()}),$scope.params=$routeParams,$scope.findOne=function(){$rootScope.currentAddr=$routeParams.addrStr,_startSocket(),Address.get({addrStr:$routeParams.addrStr},function(address){$rootScope.titleDetail=address.addrStr.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.address=address},function(e){400===e.status?$rootScope.flashMessage="Invalid Address: "+$routeParams.addrStr:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Address Not Found",$location.path("/")})}}),angular.module("insight.blocks").controller("BlocksController",function($scope,$rootScope,$routeParams,$location,Global,Block,Blocks,BlockByHeight){$scope.global=Global,$scope.loading=!1,$routeParams.blockHeight&&BlockByHeight.get({blockHeight:$routeParams.blockHeight},function(hash){$location.path("/block/"+hash.blockHash)},function(){$rootScope.flashMessage="Bad Request",$location.path("/")});var _formatTimestamp=function(date){var yyyy=date.getUTCFullYear().toString(),mm=(date.getUTCMonth()+1).toString(),dd=date.getUTCDate().toString();return yyyy+"-"+(mm[1]?mm:"0"+mm[0])+"-"+(dd[1]?dd:"0"+dd[0])};$scope.$watch("dt",function(newValue,oldValue){newValue!==oldValue&&$location.path("/blocks-date/"+_formatTimestamp(newValue))}),$scope.openCalendar=function($event){$event.preventDefault(),$event.stopPropagation(),$scope.opened=!0},$scope.humanSince=function(time){var m=moment.unix(time).startOf("day"),b=moment().startOf("day");return m.max().from(b)},$scope.list=function(){if($scope.loading=!0,$routeParams.blockDate&&($scope.detail="On "+$routeParams.blockDate),$routeParams.startTimestamp){var d=new Date(1e3*$routeParams.startTimestamp),m=d.getMinutes();10>m&&(m="0"+m),$scope.before=" before "+d.getHours()+":"+m}$rootScope.titleDetail=$scope.detail,Blocks.get({blockDate:$routeParams.blockDate,startTimestamp:$routeParams.startTimestamp},function(res){$scope.loading=!1,$scope.blocks=res.blocks,$scope.pagination=res.pagination})},$scope.findOne=function(){$scope.loading=!0,Block.get({blockHash:$routeParams.blockHash},function(block){$rootScope.titleDetail=block.height,$rootScope.flashMessage=null,$scope.loading=!1,$scope.block=block},function(e){400===e.status?$rootScope.flashMessage="Invalid Transaction ID: "+$routeParams.txId:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Block Not Found",$location.path("/")})},$scope.params=$routeParams}),angular.module("insight.connection").controller("ConnectionController",function($scope,$window,Status,getSocket,PeerSync){$scope.apiOnline=!0,$scope.serverOnline=!0,$scope.clienteOnline=!0;var socket=getSocket($scope);socket.on("connect",function(){$scope.serverOnline=!0,socket.on("disconnect",function(){$scope.serverOnline=!1})}),$scope.getConnStatus=function(){PeerSync.get({},function(peer){$scope.apiOnline=peer.connected,$scope.host=peer.host,$scope.port=peer.port},function(){$scope.apiOnline=!1})},socket.emit("subscribe","sync"),socket.on("status",function(sync){$scope.sync=sync,$scope.apiOnline="aborted"!==sync.status&&"error"!==sync.status}),$window.addEventListener("offline",function(){$scope.$apply(function(){$scope.clienteOnline=!1})},!0),$window.addEventListener("online",function(){$scope.$apply(function(){$scope.clienteOnline=!0})},!0)}),angular.module("insight.currency").controller("CurrencyController",function($scope,$rootScope,Currency){$rootScope.currency.symbol=defaultCurrency;var _roundFloat=function(x,n){return parseInt(n,10)&&parseFloat(x)||(n=0),Math.round(x*Math.pow(10,n))/Math.pow(10,n)};$rootScope.currency.getConvertion=function(value){if(value=1*value,!isNaN(value)&&"undefined"!=typeof value&&null!==value){if(0===value)return"0 "+this.symbol;var response;return"USD"===this.symbol?response=_roundFloat(value*this.factor,2):"mBTC"===this.symbol?(this.factor=1e3,response=_roundFloat(value*this.factor,5)):"bits"===this.symbol?(this.factor=1e6,response=_roundFloat(value*this.factor,2)):(this.factor=1,response=_roundFloat(value*this.factor,8)),1e-7>response&&(response=response.toFixed(8)),response+" "+this.symbol}return"value error"},$scope.setCurrency=function(currency){$rootScope.currency.symbol=currency,localStorage.setItem("insight-currency",currency),"USD"===currency?Currency.get({},function(res){$rootScope.currency.factor=$rootScope.currency.bitstamp=res.data.bitstamp}):"mBTC"===currency?$rootScope.currency.factor=1e3:"bits"===currency?$rootScope.currency.factor=1e6:$rootScope.currency.factor=1},Currency.get({},function(res){$rootScope.currency.factor=$rootScope.currency.bitstamp=res.data.bitstamp})}),angular.module("insight.system").controller("FooterController",function($scope,$route,$templateCache,gettextCatalog,amMoment,Version){$scope.defaultLanguage=defaultLanguage;var _getVersion=function(){Version.get({},function(res){$scope.version=res.version})};$scope.version=_getVersion(),$scope.availableLanguages=[{name:"Deutsch",isoCode:"de_DE"},{name:"English",isoCode:"en"},{name:"Spanish",isoCode:"es"},{name:"Japanese",isoCode:"ja"}],$scope.setLanguage=function(isoCode){gettextCatalog.currentLanguage=$scope.defaultLanguage=defaultLanguage=isoCode,amMoment.changeLocale(isoCode),localStorage.setItem("insight-language",isoCode);var currentPageTemplate=$route.current.templateUrl;$templateCache.remove(currentPageTemplate),$route.reload()}}),angular.module("insight.system").controller("HeaderController",function($scope,$rootScope,$modal,getSocket,Global,Block){$scope.global=Global,$rootScope.currency={factor:1,bitstamp:0,symbol:"BTC"},$scope.menu=[{title:"Blocks",link:"blocks"},{title:"Status",link:"status"}],$scope.openScannerModal=function(){$modal.open({templateUrl:"scannerModal.html",controller:"ScannerController"})};var _getBlock=function(hash){Block.get({blockHash:hash},function(res){$scope.totalBlocks=res.height})},socket=getSocket($scope);socket.on("connect",function(){socket.emit("subscribe","inv"),socket.on("block",function(block){var blockHash=block.toString();_getBlock(blockHash)})}),$rootScope.isCollapsed=!0});var TRANSACTION_DISPLAYED=10,BLOCKS_DISPLAYED=5;angular.module("insight.system").controller("IndexController",function($scope,Global,getSocket,Blocks){$scope.global=Global;var _getBlocks=function(){Blocks.get({limit:BLOCKS_DISPLAYED},function(res){$scope.blocks=res.blocks,$scope.blocksLength=res.length})},socket=getSocket($scope),_startSocket=function(){socket.emit("subscribe","inv"),socket.on("tx",function(tx){$scope.txs.unshift(tx),parseInt($scope.txs.length,10)>=parseInt(TRANSACTION_DISPLAYED,10)&&($scope.txs=$scope.txs.splice(0,TRANSACTION_DISPLAYED))}),socket.on("block",function(){_getBlocks()})};socket.on("connect",function(){_startSocket()}),$scope.humanSince=function(time){var m=moment.unix(time);return m.max().fromNow()},$scope.index=function(){_getBlocks(),_startSocket()},$scope.txs=[],$scope.blocks=[]}),angular.module("insight.messages").controller("VerifyMessageController",function($scope,$http,Api){$scope.message={address:"",signature:"",message:""},$scope.verification={status:"unverified",result:null,error:null,address:""},$scope.verifiable=function(){return $scope.message.address&&$scope.message.signature&&$scope.message.message},$scope.verify=function(){$scope.verification.status="loading",$scope.verification.address=$scope.message.address,$http.post(Api.apiPrefix+"/messages/verify",$scope.message).success(function(data,status,headers,config){return"boolean"!=typeof data.result?($scope.verification.status="error",void($scope.verification.error=null)):($scope.verification.status="verified",void($scope.verification.result=data.result))}).error(function(data,status,headers,config){$scope.verification.status="error",$scope.verification.error=data})};var unverify=function(){$scope.verification.status="unverified"};$scope.$watch("message.address",unverify),$scope.$watch("message.signature",unverify),$scope.$watch("message.message",unverify)}),angular.module("insight.system").controller("ScannerController",function($scope,$rootScope,$modalInstance,Global){$scope.global=Global;var isMobile={Android:function(){return navigator.userAgent.match(/Android/i)},BlackBerry:function(){return navigator.userAgent.match(/BlackBerry/i)},iOS:function(){return navigator.userAgent.match(/iPhone|iPad|iPod/i)},Opera:function(){return navigator.userAgent.match(/Opera Mini/i)},Windows:function(){return navigator.userAgent.match(/IEMobile/i)},any:function(){return isMobile.Android()||isMobile.BlackBerry()||isMobile.iOS()||isMobile.Opera()||isMobile.Windows()}};navigator.getUserMedia=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia||navigator.msGetUserMedia,window.URL=window.URL||window.webkitURL||window.mozURL||window.msURL,$scope.isMobile=isMobile.any(),$scope.scannerLoading=!1;var cameraInput,video,canvas,$video,context,localMediaStream,$searchInput=angular.element(document.getElementById("search")),_scan=function(evt){if($scope.isMobile){$scope.scannerLoading=!0;var files=evt.target.files;if(1===files.length&&0===files[0].type.indexOf("image/")){var file=files[0],reader=new FileReader;reader.onload=function(theFile){return function(e){var mpImg=new MegaPixImage(file);mpImg.render(canvas,{maxWidth:200,maxHeight:200,orientation:6}),setTimeout(function(){qrcode.width=canvas.width,qrcode.height=canvas.height,qrcode.imagedata=context.getImageData(0,0,qrcode.width,qrcode.height);try{qrcode.decode()}catch(e){alert(e)}},1500)}}(file),reader.readAsDataURL(file)}}else{if(localMediaStream){context.drawImage(video,0,0,300,225);try{qrcode.decode()}catch(e){}}setTimeout(_scan,500)}},_successCallback=function(stream){video.src=window.URL&&window.URL.createObjectURL(stream)||stream,localMediaStream=stream,video.play(),setTimeout(_scan,1e3)},_scanStop=function(){$scope.scannerLoading=!1,$modalInstance.close(),$scope.isMobile||(localMediaStream.stop&&localMediaStream.stop(),localMediaStream=null,video.src="")},_videoError=function(err){console.log("Video Error: "+JSON.stringify(err)),_scanStop()};qrcode.callback=function(data){_scanStop();var str=0===data.indexOf("bitcoin:")?data.substring(8):data;console.log("QR code detected: "+str),$searchInput.val(str).triggerHandler("change").triggerHandler("submit")},$scope.cancel=function(){_scanStop()},$modalInstance.opened.then(function(){$rootScope.isCollapsed=!0,setTimeout(function(){canvas=document.getElementById("qr-canvas"),context=canvas.getContext("2d"),$scope.isMobile?(cameraInput=document.getElementById("qrcode-camera"),cameraInput.addEventListener("change",_scan,!1)):(video=document.getElementById("qrcode-scanner-video"),$video=angular.element(video),canvas.width=300,canvas.height=225,context.clearRect(0,0,300,225),navigator.getUserMedia({video:!0},_successCallback,_videoError))},500)})}),angular.module("insight.search").controller("SearchController",function($scope,$routeParams,$location,$timeout,Global,Block,Transaction,Address,BlockByHeight){$scope.global=Global,$scope.loading=!1;var _badQuery=function(){$scope.badQuery=!0,$timeout(function(){$scope.badQuery=!1},2e3)},_resetSearch=function(){$scope.q="",$scope.loading=!1};$scope.search=function(){var q=$scope.q;$scope.badQuery=!1,$scope.loading=!0,Block.get({blockHash:q},function(){_resetSearch(),$location.path("block/"+q)},function(){Transaction.get({txId:q},function(){_resetSearch(),$location.path("tx/"+q)},function(){Address.get({addrStr:q},function(){_resetSearch(),$location.path("address/"+q)},function(){isFinite(q)?BlockByHeight.get({blockHeight:q},function(hash){_resetSearch(),$location.path("/block/"+hash.blockHash)},function(){$scope.loading=!1,_badQuery()}):($scope.loading=!1,_badQuery())})})})}}),angular.module("insight.status").controller("StatusController",function($scope,$routeParams,$location,Global,Status,Sync,getSocket){$scope.global=Global,$scope.getStatus=function(q){Status.get({q:"get"+q},function(d){$scope.loaded=1,angular.extend($scope,d)},function(e){$scope.error="API ERROR: "+e.data})},$scope.humanSince=function(time){var m=moment.unix(time/1e3);return m.max().fromNow()};var _onSyncUpdate=function(sync){$scope.sync=sync},_startSocket=function(){socket.emit("subscribe","sync"),socket.on("status",function(sync){_onSyncUpdate(sync)})},socket=getSocket($scope);socket.on("connect",function(){_startSocket()}),$scope.getSync=function(){_startSocket(),Sync.get({},function(sync){_onSyncUpdate(sync)},function(e){var err="Could not get sync information"+e.toString();$scope.sync={error:err}})}}),angular.module("insight.transactions").controller("transactionsController",function($scope,$rootScope,$routeParams,$location,Global,Transaction,TransactionsByBlock,TransactionsByAddress){$scope.global=Global,$scope.loading=!1,$scope.loadedBy=null;var pageNum=0,pagesTotal=1,COIN=1e8,_aggregateItems=function(items){if(!items)return[];for(var l=items.length,ret=[],tmp={},u=0,i=0;l>i;i++){var notAddr=!1;if(items[i].scriptSig&&!items[i].addr&&(items[i].addr="Unparsed address ["+u++ +"]",items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&!items[i].scriptPubKey.addresses&&(items[i].scriptPubKey.addresses=["Unparsed address ["+u++ +"]"],items[i].notAddr=!0,notAddr=!0),items[i].scriptPubKey&&items[i].scriptPubKey.addresses.length>1)items[i].addr=items[i].scriptPubKey.addresses.join(","),ret.push(items[i]);else{var addr=items[i].addr||items[i].scriptPubKey&&items[i].scriptPubKey.addresses[0];tmp[addr]||(tmp[addr]={},tmp[addr].valueSat=0,tmp[addr].count=0,tmp[addr].addr=addr,tmp[addr].items=[]),tmp[addr].isSpent=items[i].spentTxId,tmp[addr].doubleSpentTxID=tmp[addr].doubleSpentTxID||items[i].doubleSpentTxID,tmp[addr].doubleSpentIndex=tmp[addr].doubleSpentIndex||items[i].doubleSpentIndex,tmp[addr].dbError=tmp[addr].dbError||items[i].dbError,tmp[addr].valueSat+=Math.round(items[i].value*COIN),tmp[addr].items.push(items[i]),tmp[addr].notAddr=notAddr,items[i].unconfirmedInput&&(tmp[addr].unconfirmedInput=!0),tmp[addr].count++}}return angular.forEach(tmp,function(v){v.value=v.value||parseInt(v.valueSat)/COIN,ret.push(v)}),ret},_processTX=function(tx){tx.vinSimple=_aggregateItems(tx.vin),tx.voutSimple=_aggregateItems(tx.vout)},_paginate=function(data){$scope.loading=!1,pagesTotal=data.pagesTotal,pageNum+=1,data.txs.forEach(function(tx){_processTX(tx),$scope.txs.push(tx)})},_byBlock=function(){TransactionsByBlock.get({block:$routeParams.blockHash,pageNum:pageNum},function(data){_paginate(data)})},_byAddress=function(){TransactionsByAddress.get({address:$routeParams.addrStr,pageNum:pageNum},function(data){_paginate(data)})},_findTx=function(txid){Transaction.get({txId:txid},function(tx){$rootScope.titleDetail=tx.txid.substring(0,7)+"...",$rootScope.flashMessage=null,$scope.tx=tx,_processTX(tx),$scope.txs.unshift(tx)},function(e){400===e.status?$rootScope.flashMessage="Invalid Transaction ID: "+$routeParams.txId:503===e.status?$rootScope.flashMessage="Backend Error. "+e.data:$rootScope.flashMessage="Transaction Not Found",$location.path("/")})};$scope.findThis=function(){_findTx($routeParams.txId)},$scope.load=function(from){$scope.loadedBy=from,$scope.loadMore()},$scope.loadMore=function(){pagesTotal>pageNum&&!$scope.loading&&($scope.loading=!0,"address"===$scope.loadedBy?_byAddress():_byBlock())},(">"==$routeParams.v_type||"<"==$routeParams.v_type)&&($scope.from_vin="<"==$routeParams.v_type?!0:!1,$scope.from_vout=">"==$routeParams.v_type?!0:!1,$scope.v_index=parseInt($routeParams.v_index),$scope.itemsExpanded=!0),$scope.txs=[],$scope.$on("tx",function(event,txid){_findTx(txid)})}),angular.module("insight.transactions").controller("SendRawTransactionController",function($scope,$http,Api){$scope.transaction="",$scope.status="ready",$scope.txid="",$scope.error=null,$scope.formValid=function(){return!!$scope.transaction},$scope.send=function(){var postData={rawtx:$scope.transaction};$scope.status="loading",$http.post(Api.apiPrefix+"/tx/send",postData).success(function(data,status,headers,config){return"string"!=typeof data.txid?($scope.status="error",void($scope.error="The transaction was sent but no transaction id was got back")):($scope.status="sent",void($scope.txid=data.txid))}).error(function(data,status,headers,config){$scope.status="error",data?$scope.error=data:$scope.error="No error message given (connection error?)"})}}),angular.module("insight.address").factory("Address",function($resource,Api){return $resource(Api.apiPrefix+"/addr/:addrStr/?noTxList=1",{addrStr:"@addStr"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}),angular.module("insight.api").factory("Api",function(){return{apiPrefix:"/insight-api"}}),angular.module("insight.blocks").factory("Block",function($resource,Api){return $resource(Api.apiPrefix+"/block/:blockHash",{blockHash:"@blockHash"},{get:{method:"GET",interceptor:{response:function(res){return res.data},responseError:function(res){return 404===res.status?res:void 0}}}})}).factory("Blocks",function($resource,Api){return $resource(Api.apiPrefix+"/blocks")}).factory("BlockByHeight",function($resource,Api){return $resource(Api.apiPrefix+"/block-index/:blockHeight")}),angular.module("insight.currency").factory("Currency",function($resource,Api){return $resource(Api.apiPrefix+"/currency")}),angular.module("insight.system").factory("Global",[function(){}]).factory("Version",function($resource,Api){return $resource(Api.apiPrefix+"/version")});var ScopedSocket=function(socket,$rootScope){this.socket=socket,this.$rootScope=$rootScope,this.listeners=[]};ScopedSocket.prototype.removeAllListeners=function(opts){opts||(opts={});for(var i=0;i=200?scope.secondaryNavbar=!0:scope.secondaryNavbar=!1,scope.$apply()})}}).directive("whenScrolled",function($window){return{restric:"A",link:function(scope,elm,attr){var pageHeight,clientHeight,scrollPos;$window=angular.element($window);var handler=function(){pageHeight=window.document.documentElement.scrollHeight,clientHeight=window.document.documentElement.clientHeight,scrollPos=window.pageYOffset,pageHeight-(scrollPos+clientHeight)===0&&scope.$apply(attr.whenScrolled)};$window.on("scroll",handler),scope.$on("$destroy",function(){return $window.off("scroll",handler)})}}}).directive("clipCopy",function(){return ZeroClipboard.config({moviePath:"/lib/zeroclipboard/ZeroClipboard.swf",trustedDomains:["*"],allowScriptAccess:"always",forceHandCursor:!0}),{restric:"A",scope:{clipCopy:"=clipCopy"},template:'
      Copied!
      ',link:function(scope,elm){var clip=new ZeroClipboard(elm);clip.on("load",function(client){var onMousedown=function(client){client.setText(scope.clipCopy)};client.on("mousedown",onMousedown),scope.$on("$destroy",function(){client.off("mousedown",onMousedown)})}),clip.on("noFlash wrongflash",function(){return elm.remove()})}}}).directive("focus",function($timeout){return{scope:{trigger:"@focus"},link:function(scope,element){scope.$watch("trigger",function(value){"true"===value&&$timeout(function(){element[0].focus()})})}}}),angular.module("insight").filter("startFrom",function(){return function(input,start){return start=+start,input.slice(start)}}).filter("split",function(){return function(input,delimiter){var delimiter=delimiter||",";return input.split(delimiter)}}),angular.module("insight").config(function($routeProvider){$routeProvider.when("/block/:blockHash",{templateUrl:"views/block.html",title:"Bitcoin Block "}).when("/block-index/:blockHeight",{controller:"BlocksController",templateUrl:"views/redirect.html"}).when("/tx/send",{templateUrl:"views/transaction_sendraw.html",title:"Broadcast Raw Transaction"}).when("/tx/:txId/:v_type?/:v_index?",{templateUrl:"views/transaction.html",title:"Bitcoin Transaction "}).when("/",{templateUrl:"views/index.html",title:"Home"}).when("/blocks",{templateUrl:"views/block_list.html",title:"Bitcoin Blocks solved Today"}).when("/blocks-date/:blockDate/:startTimestamp?",{templateUrl:"views/block_list.html",title:"Bitcoin Blocks solved "}).when("/address/:addrStr",{templateUrl:"views/address.html",title:"Bitcoin Address "}).when("/status",{templateUrl:"views/status.html",title:"Status"}).when("/messages/verify",{templateUrl:"views/messages_verify.html",title:"Verify Message"}).otherwise({templateUrl:"views/404.html",title:"Error"})}),angular.module("insight").config(function($locationProvider){$locationProvider.html5Mode(!0),$locationProvider.hashPrefix("!")}).run(function($rootScope,$route,$location,$routeParams,$anchorScroll,ngProgress,gettextCatalog,amMoment){gettextCatalog.currentLanguage=defaultLanguage,amMoment.changeLocale(defaultLanguage),$rootScope.$on("$routeChangeStart",function(){ngProgress.start()}),$rootScope.$on("$routeChangeSuccess",function(){ngProgress.complete(),$rootScope.titleDetail="",$rootScope.title=$route.current.title,$rootScope.isCollapsed=!0,$rootScope.currentAddr=null,$location.hash($routeParams.scrollTo),$anchorScroll()})}),angular.element(document).ready(function(){}),angular.module("insight").run(["gettextCatalog",function(gettextCatalog){gettextCatalog.setStrings("de_DE",{"(Input unconfirmed)":"(Eingabe unbestätigt)","404 Page not found :(":"404 Seite nicht gefunden :(",'insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insight ist ein Open Source Bitcoin Blockchain Explorer mit vollständigen REST und Websocket APIs um eigene Wallets oder Applikationen zu implementieren. Hierbei werden fortschrittlichere Abfragen der Blockchain ermöglicht, bei denen die RPC des Bitcoind nicht mehr ausreichen. Der aktuelle Quellcode ist auf Github zu finden.','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insight befindet sich aktuell noch in der Entwicklung. Bitte sende alle gefundenen Fehler (Bugs) und Feedback zur weiteren Verbesserung an unseren Github Issue Tracker.',About:"Über insight",Address:"Adresse",Age:"Alter","Application Status":"Programmstatus","Best Block":"Bester Block","Bitcoin node information":"Bitcoin-Node Info",Block:"Block","Block Reward":"Belohnung",Blocks:"Blöcke","Bytes Serialized":"Serialisierte Bytes","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"Es ist nicht möglich mit Bitcoind zu verbinden um live Aktualisierungen vom P2P Netzwerk zu erhalten. (Verbindungsversuch zu bitcoind an {{host}}:{{port}} ist fehlgeschlagen.)","Can't connect to insight server. Attempting to reconnect...":"Keine Verbindung zum insight-Server möglich. Es wird versucht die Verbindung neu aufzubauen...","Can't connect to internet. Please, check your connection.":"Keine Verbindung zum Internet möglich, bitte Zugangsdaten prüfen.",Complete:"Vollständig",Confirmations:"Bestätigungen",Conn:"Verbindungen","Connections to other nodes":"Verbindungen zu Nodes","Current Blockchain Tip (insight)":"Aktueller Blockchain Tip (insight)","Current Sync Status":"Aktueller Status",Details:"Details",Difficulty:"Schwierigkeit","Double spent attempt detected. From tx:":'Es wurde ein "double Spend" Versuch erkannt.Von tx:',"Error!":"Fehler!",Fee:"Gebühr","Final Balance":"Schlussbilanz","Finish Date":"Fertigstellung","Go to home":"Zur Startseite","Hash Serialized":"Hash Serialisiert",Height:"Höhe","Included in Block":"Eingefügt in Block","Incoherence in levelDB detected:":"Es wurde eine Zusammenhangslosigkeit in der LevelDB festgestellt:","Info Errors":"Fehlerbeschreibung","Initial Block Chain Height":"Ursprüngliche Blockchain Höhe",Input:"Eingänge","Last Block":"Letzter Block","Last Block Hash (Bitcoind)":"Letzter Hash (Bitcoind)","Latest Blocks":"Letzte Blöcke","Latest Transactions":"Letzte Transaktionen","Loading Address Information":"Lade Adressinformationen","Loading Block Information":"Lade Blockinformation","Loading Selected Date...":"Lade gewähltes Datum...","Loading Transaction Details":"Lade Transaktionsdetails","Loading Transactions...":"Lade Transaktionen...","Loading...":"Lade...","Mined Time":"Block gefunden (Mining)","Mined by":"Gefunden von","Mining Difficulty":"Schwierigkeitgrad","Next Block":"Nächster Block","No Inputs (Newly Generated Coins)":"Keine Eingänge (Neu generierte Coins)","No blocks yet.":"Keine Blöcke bisher.","No matching records found!":"Keine passenden Einträge gefunden!","No. Transactions":"Anzahl Transaktionen","Number Of Transactions":"Anzahl der Transaktionen",Output:"Ausgänge","Powered by":"Powered by","Previous Block":"Letzter Block","Protocol version":"Protokollversion","Proxy setting":"Proxyeinstellung","Received Time":"Eingangszeitpunkt","Redirecting...":"Umleitung...","Search for block, transaction or address":"Suche Block, Transaktion oder Adresse","See all blocks":"Alle Blöcke anzeigen","Show Transaction Output data":"Zeige Abgänge","Show all":"Zeige Alles","Show input":"Zeige Eingänge","Show less":"Weniger anzeigen","Show more":"Mehr anzeigen",Size:"Größe","Size (bytes)":"Größe (bytes)","Skipped Blocks (previously synced)":"Verworfene Blöcke (bereits syncronisiert)","Start Date":"Startdatum",Status:"Status",Summary:"Zusammenfassung","Summary confirmed":"Zusammenfassung bestätigt","Sync Progress":"Fortschritt","Sync Status":"Syncronisation","Sync Type":"Art der Syncronisation","Synced Blocks":"Syncronisierte Blöcke",Testnet:"Testnet aktiv","There are no transactions involving this address.":"Es gibt keine Transaktionen zu dieser Adressse","Time Offset":"Zeitoffset zu UTC",Timestamp:"Zeitstempel",Today:"Heute","Total Amount":"Gesamtsumme","Total Received":"Insgesamt empfangen","Total Sent":"Insgesamt gesendet",Transaction:"Transaktion","Transaction Output Set Information":"Transaktions Abgänge","Transaction Outputs":"Abgänge",Transactions:"Transaktionen",Type:"Typ",Unconfirmed:"Unbestätigt","Unconfirmed Transaction!":"Unbestätigte Transaktion!","Unconfirmed Txs Balance":"Unbestätigtes Guthaben","Value Out":"Wert",Version:"Version","Waiting for blocks...":"Warte auf Blöcke...","Waiting for transactions...":"Warte auf Transaktionen...","by date.":"nach Datum.","first seen at":"zuerst gesehen am",mined:"gefunden","mined on:":"vom:","Waiting for blocks":"Warte auf Blöcke"}),gettextCatalog.setStrings("es",{"(Input unconfirmed)":"(Entrada sin confirmar)","404 Page not found :(":"404 Página no encontrada :(",'insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insight es un explorador de bloques de Bitcoin open-source con un completo conjunto de REST y APIs de websockets que pueden ser usadas para escribir monederos de Bitcoins y otras aplicaciones que requieran consultar un explorador de bloques. Obtén el código en el repositorio abierto de Github.','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insight esta en desarrollo aún, por ello agradecemos que nos reporten errores o sugerencias para mejorar el software. Github issue tracker.', -About:"Acerca de",Address:"Dirección",Age:"Edad","Application Status":"Estado de la Aplicación","Best Block":"Mejor Bloque","Bitcoin node information":"Información del nodo Bitcoin",Block:"Bloque","Block Reward":"Bloque Recompensa",Blocks:"Bloques","Bytes Serialized":"Bytes Serializados","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"No se pudo conectar a bitcoind para obtener actualizaciones en vivo de la red p2p. (Se intentó conectar a bitcoind de {{host}}:{{port}} y falló.)","Can't connect to insight server. Attempting to reconnect...":"No se pudo conectar al servidor insight. Intentando re-conectar...","Can't connect to internet. Please, check your connection.":"No se pudo conectar a Internet. Por favor, verifique su conexión.",Complete:"Completado",Confirmations:"Confirmaciones",Conn:"Con","Connections to other nodes":"Conexiones a otros nodos","Current Blockchain Tip (insight)":"Actual Blockchain Tip (insight)","Current Sync Status":"Actual Estado de Sincronización",Details:"Detalles",Difficulty:"Dificultad","Double spent attempt detected. From tx:":"Intento de doble gasto detectado. De la transacción:","Error!":"¡Error!",Fee:"Tasa","Final Balance":"Balance Final","Finish Date":"Fecha Final","Go to home":"Volver al Inicio","Hash Serialized":"Hash Serializado",Height:"Altura","Included in Block":"Incluido en el Bloque","Incoherence in levelDB detected:":"Detectada una incoherencia en levelDB:","Info Errors":"Errores de Información","Initial Block Chain Height":"Altura de la Cadena en Bloque Inicial",Input:"Entrada","Last Block":"Último Bloque","Last Block Hash (Bitcoind)":"Último Bloque Hash (Bitcoind)","Latest Blocks":"Últimos Bloques","Latest Transactions":"Últimas Transacciones","Loading Address Information":"Cargando Información de la Dirección","Loading Block Information":"Cargando Información del Bloque","Loading Selected Date...":"Cargando Fecha Seleccionada...","Loading Transaction Details":"Cargando Detalles de la Transacción","Loading Transactions...":"Cargando Transacciones...","Loading...":"Cargando...","Mined Time":"Hora de Minado","Mined by":"Minado por","Mining Difficulty":"Dificultad de Minado","Next Block":"Próximo Bloque","No Inputs (Newly Generated Coins)":"Sin Entradas (Monedas Recién Generadas)","No blocks yet.":"No hay bloques aún.","No matching records found!":"¡No se encontraron registros coincidentes!","No. Transactions":"Nro. de Transacciones","Number Of Transactions":"Número de Transacciones",Output:"Salida","Powered by":"Funciona con","Previous Block":"Bloque Anterior","Protocol version":"Versión del protocolo","Proxy setting":"Opción de proxy","Received Time":"Hora de Recibido","Redirecting...":"Redireccionando...","Search for block, transaction or address":"Buscar bloques, transacciones o direcciones","See all blocks":"Ver todos los bloques","Show Transaction Output data":"Mostrar dato de Salida de la Transacción","Show all":"Mostrar todos","Show input":"Mostrar entrada","Show less":"Ver menos","Show more":"Ver más",Size:"Tamaño","Size (bytes)":"Tamaño (bytes)","Skipped Blocks (previously synced)":"Bloques Saltados (previamente sincronizado)","Start Date":"Fecha de Inicio",Status:"Estado",Summary:"Resumen","Summary confirmed":"Resumen confirmados","Sync Progress":"Proceso de Sincronización","Sync Status":"Estado de Sincronización","Sync Type":"Tipo de Sincronización","Synced Blocks":"Bloques Sincornizados",Testnet:"Red de prueba","There are no transactions involving this address.":"No hay transacciones para esta dirección","Time Offset":"Desplazamiento de hora",Timestamp:"Fecha y hora",Today:"Hoy","Total Amount":"Cantidad Total","Total Received":"Total Recibido","Total Sent":"Total Enviado",Transaction:"Transacción","Transaction Output Set Information":"Información del Conjunto de Salida de la Transacción","Transaction Outputs":"Salidas de la Transacción",Transactions:"Transacciones",Type:"Tipo",Unconfirmed:"Sin confirmar","Unconfirmed Transaction!":"¡Transacción sin confirmar!","Unconfirmed Txs Balance":"Balance sin confirmar","Value Out":"Valor de Salida",Version:"Versión","Waiting for blocks...":"Esperando bloques...","Waiting for transactions...":"Esperando transacciones...","by date.":"por fecha.","first seen at":"Visto a",mined:"minado","mined on:":"minado el:","Waiting for blocks":"Esperando bloques"}),gettextCatalog.setStrings("ja",{"(Input unconfirmed)":"(入力は未検証です)","404 Page not found :(":"404 ページがみつかりません (´・ω・`)",'insight is an open-source Bitcoin blockchain explorer with complete REST and websocket APIs that can be used for writing web wallets and other apps that need more advanced blockchain queries than provided by bitcoind RPC. Check out the source code.':'insightは、bitcoind RPCの提供するものよりも詳細なブロックチェインへの問い合わせを必要とするウェブウォレットやその他のアプリを書くのに使える、完全なRESTおよびwebsocket APIを備えたオープンソースのビットコインブロックエクスプローラです。ソースコードを確認','insight is still in development, so be sure to report any bugs and provide feedback for improvement at our github issue tracker.':'insightは現在開発中です。githubのissueトラッカにてバグの報告や改善案の提案をお願いします。',About:"はじめに",Address:"アドレス",Age:"生成後経過時間","An error occured in the verification process.":"検証過程でエラーが発生しました。","An error occured:
      {{error}}":"エラーが発生しました:
      {{error}}","Application Status":"アプリケーションの状態","Best Block":"最良ブロック","Bitcoin comes with a way of signing arbitrary messages.":"Bitcoinには任意のメッセージを署名する昨日が備わっています。","Bitcoin node information":"Bitcoinノード情報",Block:"ブロック","Block Reward":"ブロック報酬",Blocks:"ブロック","Broadcast Raw Transaction":"生のトランザクションを配信","Bytes Serialized":"シリアライズ後の容量 (バイト)","Can't connect to bitcoind to get live updates from the p2p network. (Tried connecting to bitcoind at {{host}}:{{port}} and failed.)":"P2Pネットワークからライブ情報を取得するためにbitcoindへ接続することができませんでした。({{host}}:{{port}} への接続を試みましたが、失敗しました。)","Can't connect to insight server. Attempting to reconnect...":"insight サーバに接続できません。再接続しています...","Can't connect to internet. Please, check your connection.":"インターネットに接続できません。コネクションを確認してください。",Complete:"完了",Confirmations:"検証数",Conn:"接続数","Connections to other nodes":"他ノードへの接続","Current Blockchain Tip (insight)":"現在のブロックチェインのTip (insight)","Current Sync Status":"現在の同期状況",Details:"詳細",Difficulty:"難易度","Double spent attempt detected. From tx:":"二重支払い攻撃をこのトランザクションから検知しました:","Error message:":"エラーメッセージ:","Error!":"エラー!",Fee:"手数料","Final Balance":"最終残高","Finish Date":"終了日時","Go to home":"ホームへ","Hash Serialized":"シリアライズデータのハッシュ値",Height:"ブロック高","Included in Block":"取り込まれたブロック","Incoherence in levelDB detected:":"levelDBの破損を検知しました:","Info Errors":"エラー情報","Initial Block Chain Height":"起動時のブロック高",Input:"入力","Last Block":"直前のブロック","Last Block Hash (Bitcoind)":"直前のブロックのハッシュ値 (Bitcoind)","Latest Blocks":"最新のブロック","Latest Transactions":"最新のトランザクション","Loading Address Information":"アドレス情報を読み込んでいます","Loading Block Information":"ブロック情報を読み込んでいます","Loading Selected Date...":"選択されたデータを読み込んでいます...","Loading Transaction Details":"トランザクションの詳細を読み込んでいます","Loading Transactions...":"トランザクションを読み込んでいます...","Loading...":"ロード中...",Message:"メッセージ","Mined Time":"採掘時刻","Mined by":"採掘者","Mining Difficulty":"採掘難易度","Next Block":"次のブロック","No Inputs (Newly Generated Coins)":"入力なし (新しく生成されたコイン)","No blocks yet.":"ブロックはありません。","No matching records found!":"一致するレコードはありません!","No. Transactions":"トランザクション数","Number Of Transactions":"トランザクション数",Output:"出力","Powered by":"Powered by","Previous Block":"前のブロック","Protocol version":"プロトコルバージョン","Proxy setting":"プロキシ設定","Raw transaction data":"トランザクションの生データ","Raw transaction data must be a valid hexadecimal string.":"生のトランザクションデータは有効な16進数でなければいけません。","Received Time":"受信時刻","Redirecting...":"リダイレクトしています...","Search for block, transaction or address":"ブロック、トランザクション、アドレスを検索","See all blocks":"すべてのブロックをみる","Send transaction":"トランザクションを送信","Show Transaction Output data":"トランザクションの出力データをみる","Show all":"すべて表示","Show input":"入力を表示","Show less":"隠す","Show more":"表示する",Signature:"署名",Size:"サイズ","Size (bytes)":"サイズ (バイト)","Skipped Blocks (previously synced)":"スキップされたブロック (同期済み)","Start Date":"開始日時",Status:"ステータス",Summary:"概要","Summary confirmed":"サマリ 検証済み","Sync Progress":"同期の進捗状況","Sync Status":"同期ステータス","Sync Type":"同期タイプ","Synced Blocks":"同期されたブロック数",Testnet:"テストネット","The message failed to verify.":"メッセージの検証に失敗しました。","The message is verifiably from {{verification.address}}.":"メッセージは{{verification.address}}により検証されました。","There are no transactions involving this address.":"このアドレスに対するトランザクションはありません。","This form can be used to broadcast a raw transaction in hex format over\n the Bitcoin network.":"このフォームでは、16進数フォーマットの生のトランザクションをBitcoinネットワーク上に配信することができます。","This form can be used to verify that a message comes from\n a specific Bitcoin address.":"このフォームでは、メッセージが特定のBitcoinアドレスから来たかどうかを検証することができます。","Time Offset":"時間オフセット",Timestamp:"タイムスタンプ",Today:"今日","Total Amount":"Bitcoin総量","Total Received":"総入金額","Total Sent":"総送金額",Transaction:"トランザクション","Transaction Output Set Information":"トランザクションの出力セット情報","Transaction Outputs":"トランザクションの出力","Transaction succesfully broadcast.
      Transaction id: {{txid}}":"トランザクションの配信に成功しました。
      トランザクションID: {{txid}}",Transactions:"トランザクション",Type:"タイプ",Unconfirmed:"未検証","Unconfirmed Transaction!":"未検証のトランザクションです!","Unconfirmed Txs Balance":"未検証トランザクションの残高","Value Out":"出力値",Verify:"検証","Verify signed message":"署名済みメッセージを検証",Version:"バージョン","Waiting for blocks...":"ブロックを待っています...","Waiting for transactions...":"トランザクションを待っています...","by date.":"日毎。","first seen at":"最初に発見された日時",mined:"採掘された","mined on:":"採掘日時:","(Mainchain)":"(メインチェーン)","(Orphaned)":"(孤立したブロック)",Bits:"Bits","Block #{{block.height}}":"ブロック #{{block.height}}",BlockHash:"ブロックのハッシュ値","Blocks
      mined on:":"ブロック
      採掘日",Coinbase:"コインベース",Hash:"ハッシュ値",LockTime:"ロック時間","Merkle Root":"Merkleルート",Nonce:"Nonce","Ooops!":"おぉっと!","Output is spent":"出力は使用済みです","Output is unspent":"出力は未使用です",Scan:"スキャン","Show/Hide items details":"アイテムの詳細を表示または隠す","Waiting for blocks":"ブロックを待っています","by date. {{detail}} {{before}}":"日時順 {{detail}} {{before}}",scriptSig:"scriptSig","{{tx.confirmations}} Confirmations":"{{tx.confirmations}} 検証",' (Orphaned)':' (孤立したブロック)',' Incoherence in levelDB detected: {{vin.dbError}}':' Incoherence in levelDB detected: {{vin.dbError}}','Waiting for blocks ':'ブロックを待っています '})}]); \ No newline at end of file diff --git a/server/insight-ui/public/js/vendors.js b/server/insight-ui/public/js/vendors.js deleted file mode 100644 index 6e7f2de..0000000 --- a/server/insight-ui/public/js/vendors.js +++ /dev/null @@ -1,5742 +0,0 @@ -// Source: public/src/js/ios-imagefile-megapixel/megapix-image.js -/** - * Mega pixel image rendering library for iOS6 Safari - * - * Fixes iOS6 Safari's image file rendering issue for large size image (over mega-pixel), - * which causes unexpected subsampling when drawing it in canvas. - * By using this library, you can safely render the image with proper stretching. - * - * Copyright (c) 2012 Shinichi Tomita - * Released under the MIT license - */ -(function() { - - /** - * Detect subsampling in loaded image. - * In iOS, larger images than 2M pixels may be subsampled in rendering. - */ - function detectSubsampling(img) { - var iw = img.naturalWidth, ih = img.naturalHeight; - if (iw * ih > 1024 * 1024) { // subsampling may happen over megapixel image - var canvas = document.createElement('canvas'); - canvas.width = canvas.height = 1; - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, -iw + 1, 0); - // subsampled image becomes half smaller in rendering size. - // check alpha channel value to confirm image is covering edge pixel or not. - // if alpha value is 0 image is not covering, hence subsampled. - return ctx.getImageData(0, 0, 1, 1).data[3] === 0; - } else { - return false; - } - } - - /** - * Detecting vertical squash in loaded image. - * Fixes a bug which squash image vertically while drawing into canvas for some images. - */ - function detectVerticalSquash(img, iw, ih) { - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = ih; - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, 0, 0); - var data = ctx.getImageData(0, 0, 1, ih).data; - // search image edge pixel position in case it is squashed vertically. - var sy = 0; - var ey = ih; - var py = ih; - while (py > sy) { - var alpha = data[(py - 1) * 4 + 3]; - if (alpha === 0) { - ey = py; - } else { - sy = py; - } - py = (ey + sy) >> 1; - } - var ratio = (py / ih); - return (ratio===0)?1:ratio; - } - - /** - * Rendering image element (with resizing) and get its data URL - */ - function renderImageToDataURL(img, options, doSquash) { - var canvas = document.createElement('canvas'); - renderImageToCanvas(img, canvas, options, doSquash); - return canvas.toDataURL("image/jpeg", options.quality || 0.8); - } - - /** - * Rendering image element (with resizing) into the canvas element - */ - function renderImageToCanvas(img, canvas, options, doSquash) { - var iw = img.naturalWidth, ih = img.naturalHeight; - var width = options.width, height = options.height; - var ctx = canvas.getContext('2d'); - ctx.save(); - transformCoordinate(canvas, width, height, options.orientation); - var subsampled = detectSubsampling(img); - if (subsampled) { - iw /= 2; - ih /= 2; - } - var d = 1024; // size of tiling canvas - var tmpCanvas = document.createElement('canvas'); - tmpCanvas.width = tmpCanvas.height = d; - var tmpCtx = tmpCanvas.getContext('2d'); - var vertSquashRatio = doSquash ? detectVerticalSquash(img, iw, ih) : 1; - var dw = Math.ceil(d * width / iw); - var dh = Math.ceil(d * height / ih / vertSquashRatio); - var sy = 0; - var dy = 0; - while (sy < ih) { - var sx = 0; - var dx = 0; - while (sx < iw) { - tmpCtx.clearRect(0, 0, d, d); - tmpCtx.drawImage(img, -sx, -sy); - ctx.drawImage(tmpCanvas, 0, 0, d, d, dx, dy, dw, dh); - sx += d; - dx += dw; - } - sy += d; - dy += dh; - } - ctx.restore(); - tmpCanvas = tmpCtx = null; - } - - /** - * Transform canvas coordination according to specified frame size and orientation - * Orientation value is from EXIF tag - */ - function transformCoordinate(canvas, width, height, orientation) { - switch (orientation) { - case 5: - case 6: - case 7: - case 8: - canvas.width = height; - canvas.height = width; - break; - default: - canvas.width = width; - canvas.height = height; - } - var ctx = canvas.getContext('2d'); - switch (orientation) { - case 2: - // horizontal flip - ctx.translate(width, 0); - ctx.scale(-1, 1); - break; - case 3: - // 180 rotate left - ctx.translate(width, height); - ctx.rotate(Math.PI); - break; - case 4: - // vertical flip - ctx.translate(0, height); - ctx.scale(1, -1); - break; - case 5: - // vertical flip + 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.scale(1, -1); - break; - case 6: - // 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.translate(0, -height); - break; - case 7: - // horizontal flip + 90 rotate right - ctx.rotate(0.5 * Math.PI); - ctx.translate(width, -height); - ctx.scale(-1, 1); - break; - case 8: - // 90 rotate left - ctx.rotate(-0.5 * Math.PI); - ctx.translate(-width, 0); - break; - default: - break; - } - } - - - /** - * MegaPixImage class - */ - function MegaPixImage(srcImage) { - if (window.Blob && srcImage instanceof Blob) { - var img = new Image(); - var URL = window.URL && window.URL.createObjectURL ? window.URL : - window.webkitURL && window.webkitURL.createObjectURL ? window.webkitURL : - null; - if (!URL) { throw Error("No createObjectURL function found to create blob url"); } - img.src = URL.createObjectURL(srcImage); - this.blob = srcImage; - srcImage = img; - } - if (!srcImage.naturalWidth && !srcImage.naturalHeight) { - var _this = this; - srcImage.onload = function() { - var listeners = _this.imageLoadListeners; - if (listeners) { - _this.imageLoadListeners = null; - for (var i=0, len=listeners.length; i maxWidth) { - width = maxWidth; - height = (imgHeight * width / imgWidth) << 0; - } - if (maxHeight && height > maxHeight) { - height = maxHeight; - width = (imgWidth * height / imgHeight) << 0; - } - var opt = { width : width, height : height }; - for (var k in options) opt[k] = options[k]; - - var tagName = target.tagName.toLowerCase(); - if (tagName === 'img') { - target.src = renderImageToDataURL(this.srcImage, opt, doSquash); - } else if (tagName === 'canvas') { - renderImageToCanvas(this.srcImage, target, opt, doSquash); - } - if (typeof this.onrender === 'function') { - this.onrender(target); - } - }; - - /** - * Export class to global - */ - if (typeof define === 'function' && define.amd) { - define([], function() { return MegaPixImage; }); // for AMD loader - } else { - this.MegaPixImage = MegaPixImage; - } - -})(); - -// Source: public/lib/qrcode-generator/js/qrcode.js -//--------------------------------------------------------------------- -// -// QR Code Generator for JavaScript -// -// Copyright (c) 2009 Kazuhiko Arase -// -// URL: http://www.d-project.com/ -// -// Licensed under the MIT license: -// http://www.opensource.org/licenses/mit-license.php -// -// The word 'QR Code' is registered trademark of -// DENSO WAVE INCORPORATED -// http://www.denso-wave.com/qrcode/faqpatent-e.html -// -//--------------------------------------------------------------------- - -var qrcode = function() { - - //--------------------------------------------------------------------- - // qrcode - //--------------------------------------------------------------------- - - /** - * qrcode - * @param typeNumber 1 to 10 - * @param errorCorrectLevel 'L','M','Q','H' - */ - var qrcode = function(typeNumber, errorCorrectLevel) { - - var PAD0 = 0xEC; - var PAD1 = 0x11; - - var _typeNumber = typeNumber; - var _errorCorrectLevel = QRErrorCorrectLevel[errorCorrectLevel]; - var _modules = null; - var _moduleCount = 0; - var _dataCache = null; - var _dataList = new Array(); - - var _this = {}; - - var makeImpl = function(test, maskPattern) { - - _moduleCount = _typeNumber * 4 + 17; - _modules = function(moduleCount) { - var modules = new Array(moduleCount); - for (var row = 0; row < moduleCount; row += 1) { - modules[row] = new Array(moduleCount); - for (var col = 0; col < moduleCount; col += 1) { - modules[row][col] = null; - } - } - return modules; - }(_moduleCount); - - setupPositionProbePattern(0, 0); - setupPositionProbePattern(_moduleCount - 7, 0); - setupPositionProbePattern(0, _moduleCount - 7); - setupPositionAdjustPattern(); - setupTimingPattern(); - setupTypeInfo(test, maskPattern); - - if (_typeNumber >= 7) { - setupTypeNumber(test); - } - - if (_dataCache == null) { - _dataCache = createData(_typeNumber, _errorCorrectLevel, _dataList); - } - - mapData(_dataCache, maskPattern); - }; - - var setupPositionProbePattern = function(row, col) { - - for (var r = -1; r <= 7; r += 1) { - - if (row + r <= -1 || _moduleCount <= row + r) continue; - - for (var c = -1; c <= 7; c += 1) { - - if (col + c <= -1 || _moduleCount <= col + c) continue; - - if ( (0 <= r && r <= 6 && (c == 0 || c == 6) ) - || (0 <= c && c <= 6 && (r == 0 || r == 6) ) - || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { - _modules[row + r][col + c] = true; - } else { - _modules[row + r][col + c] = false; - } - } - } - }; - - var getBestMaskPattern = function() { - - var minLostPoint = 0; - var pattern = 0; - - for (var i = 0; i < 8; i += 1) { - - makeImpl(true, i); - - var lostPoint = QRUtil.getLostPoint(_this); - - if (i == 0 || minLostPoint > lostPoint) { - minLostPoint = lostPoint; - pattern = i; - } - } - - return pattern; - }; - - var setupTimingPattern = function() { - - for (var r = 8; r < _moduleCount - 8; r += 1) { - if (_modules[r][6] != null) { - continue; - } - _modules[r][6] = (r % 2 == 0); - } - - for (var c = 8; c < _moduleCount - 8; c += 1) { - if (_modules[6][c] != null) { - continue; - } - _modules[6][c] = (c % 2 == 0); - } - }; - - var setupPositionAdjustPattern = function() { - - var pos = QRUtil.getPatternPosition(_typeNumber); - - for (var i = 0; i < pos.length; i += 1) { - - for (var j = 0; j < pos.length; j += 1) { - - var row = pos[i]; - var col = pos[j]; - - if (_modules[row][col] != null) { - continue; - } - - for (var r = -2; r <= 2; r += 1) { - - for (var c = -2; c <= 2; c += 1) { - - if (r == -2 || r == 2 || c == -2 || c == 2 - || (r == 0 && c == 0) ) { - _modules[row + r][col + c] = true; - } else { - _modules[row + r][col + c] = false; - } - } - } - } - } - }; - - var setupTypeNumber = function(test) { - - var bits = QRUtil.getBCHTypeNumber(_typeNumber); - - for (var i = 0; i < 18; i += 1) { - var mod = (!test && ( (bits >> i) & 1) == 1); - _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod; - } - - for (var i = 0; i < 18; i += 1) { - var mod = (!test && ( (bits >> i) & 1) == 1); - _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod; - } - }; - - var setupTypeInfo = function(test, maskPattern) { - - var data = (_errorCorrectLevel << 3) | maskPattern; - var bits = QRUtil.getBCHTypeInfo(data); - - // vertical - for (var i = 0; i < 15; i += 1) { - - var mod = (!test && ( (bits >> i) & 1) == 1); - - if (i < 6) { - _modules[i][8] = mod; - } else if (i < 8) { - _modules[i + 1][8] = mod; - } else { - _modules[_moduleCount - 15 + i][8] = mod; - } - } - - // horizontal - for (var i = 0; i < 15; i += 1) { - - var mod = (!test && ( (bits >> i) & 1) == 1); - - if (i < 8) { - _modules[8][_moduleCount - i - 1] = mod; - } else if (i < 9) { - _modules[8][15 - i - 1 + 1] = mod; - } else { - _modules[8][15 - i - 1] = mod; - } - } - - // fixed module - _modules[_moduleCount - 8][8] = (!test); - }; - - var mapData = function(data, maskPattern) { - - var inc = -1; - var row = _moduleCount - 1; - var bitIndex = 7; - var byteIndex = 0; - var maskFunc = QRUtil.getMaskFunction(maskPattern); - - for (var col = _moduleCount - 1; col > 0; col -= 2) { - - if (col == 6) col -= 1; - - while (true) { - - for (var c = 0; c < 2; c += 1) { - - if (_modules[row][col - c] == null) { - - var dark = false; - - if (byteIndex < data.length) { - dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); - } - - var mask = maskFunc(row, col - c); - - if (mask) { - dark = !dark; - } - - _modules[row][col - c] = dark; - bitIndex -= 1; - - if (bitIndex == -1) { - byteIndex += 1; - bitIndex = 7; - } - } - } - - row += inc; - - if (row < 0 || _moduleCount <= row) { - row -= inc; - inc = -inc; - break; - } - } - } - }; - - var createBytes = function(buffer, rsBlocks) { - - var offset = 0; - - var maxDcCount = 0; - var maxEcCount = 0; - - var dcdata = new Array(rsBlocks.length); - var ecdata = new Array(rsBlocks.length); - - for (var r = 0; r < rsBlocks.length; r += 1) { - - var dcCount = rsBlocks[r].dataCount; - var ecCount = rsBlocks[r].totalCount - dcCount; - - maxDcCount = Math.max(maxDcCount, dcCount); - maxEcCount = Math.max(maxEcCount, ecCount); - - dcdata[r] = new Array(dcCount); - - for (var i = 0; i < dcdata[r].length; i += 1) { - dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; - } - offset += dcCount; - - var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); - var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1); - - var modPoly = rawPoly.mod(rsPoly); - ecdata[r] = new Array(rsPoly.getLength() - 1); - for (var i = 0; i < ecdata[r].length; i += 1) { - var modIndex = i + modPoly.getLength() - ecdata[r].length; - ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0; - } - } - - var totalCodeCount = 0; - for (var i = 0; i < rsBlocks.length; i += 1) { - totalCodeCount += rsBlocks[i].totalCount; - } - - var data = new Array(totalCodeCount); - var index = 0; - - for (var i = 0; i < maxDcCount; i += 1) { - for (var r = 0; r < rsBlocks.length; r += 1) { - if (i < dcdata[r].length) { - data[index] = dcdata[r][i]; - index += 1; - } - } - } - - for (var i = 0; i < maxEcCount; i += 1) { - for (var r = 0; r < rsBlocks.length; r += 1) { - if (i < ecdata[r].length) { - data[index] = ecdata[r][i]; - index += 1; - } - } - } - - return data; - }; - - var createData = function(typeNumber, errorCorrectLevel, dataList) { - - var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); - - var buffer = qrBitBuffer(); - - for (var i = 0; i < dataList.length; i += 1) { - var data = dataList[i]; - buffer.put(data.getMode(), 4); - buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) ); - data.write(buffer); - } - - // calc num max data. - var totalDataCount = 0; - for (var i = 0; i < rsBlocks.length; i += 1) { - totalDataCount += rsBlocks[i].dataCount; - } - - if (buffer.getLengthInBits() > totalDataCount * 8) { - throw new Error('code length overflow. (' - + buffer.getLengthInBits() - + '>' - + totalDataCount * 8 - + ')'); - } - - // end code - if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { - buffer.put(0, 4); - } - - // padding - while (buffer.getLengthInBits() % 8 != 0) { - buffer.putBit(false); - } - - // padding - while (true) { - - if (buffer.getLengthInBits() >= totalDataCount * 8) { - break; - } - buffer.put(PAD0, 8); - - if (buffer.getLengthInBits() >= totalDataCount * 8) { - break; - } - buffer.put(PAD1, 8); - } - - return createBytes(buffer, rsBlocks); - }; - - _this.addData = function(data) { - var newData = qr8BitByte(data); - _dataList.push(newData); - _dataCache = null; - }; - - _this.isDark = function(row, col) { - if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { - throw new Error(row + ',' + col); - } - return _modules[row][col]; - }; - - _this.getModuleCount = function() { - return _moduleCount; - }; - - _this.make = function() { - makeImpl(false, getBestMaskPattern() ); - }; - - _this.createTableTag = function(cellSize, margin) { - - cellSize = cellSize || 2; - margin = (typeof margin == 'undefined')? cellSize * 4 : margin; - - var qrHtml = ''; - - qrHtml += ''; - qrHtml += ''; - - for (var r = 0; r < _this.getModuleCount(); r += 1) { - - qrHtml += ''; - - for (var c = 0; c < _this.getModuleCount(); c += 1) { - qrHtml += ''; - } - - qrHtml += ''; - qrHtml += '
      '; - } - - qrHtml += '
      '; - - return qrHtml; - }; - - _this.createImgTag = function(cellSize, margin) { - - cellSize = cellSize || 2; - margin = (typeof margin == 'undefined')? cellSize * 4 : margin; - - var size = _this.getModuleCount() * cellSize + margin * 2; - var min = margin; - var max = size - margin; - - return createImgTag(size, size, function(x, y) { - if (min <= x && x < max && min <= y && y < max) { - var c = Math.floor( (x - min) / cellSize); - var r = Math.floor( (y - min) / cellSize); - return _this.isDark(r, c)? 0 : 1; - } else { - return 1; - } - } ); - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // qrcode.stringToBytes - //--------------------------------------------------------------------- - - qrcode.stringToBytes = function(s) { - var bytes = new Array(); - for (var i = 0; i < s.length; i += 1) { - var c = s.charCodeAt(i); - bytes.push(c & 0xff); - } - return bytes; - }; - - //--------------------------------------------------------------------- - // qrcode.createStringToBytes - //--------------------------------------------------------------------- - - /** - * @param unicodeData base64 string of byte array. - * [16bit Unicode],[16bit Bytes], ... - * @param numChars - */ - qrcode.createStringToBytes = function(unicodeData, numChars) { - - // create conversion map. - - var unicodeMap = function() { - - var bin = base64DecodeInputStream(unicodeData); - var read = function() { - var b = bin.read(); - if (b == -1) throw new Error(); - return b; - }; - - var count = 0; - var unicodeMap = {}; - while (true) { - var b0 = bin.read(); - if (b0 == -1) break; - var b1 = read(); - var b2 = read(); - var b3 = read(); - var k = String.fromCharCode( (b0 << 8) | b1); - var v = (b2 << 8) | b3; - unicodeMap[k] = v; - count += 1; - } - if (count != numChars) { - throw new Error(count + ' != ' + numChars); - } - - return unicodeMap; - }(); - - var unknownChar = '?'.charCodeAt(0); - - return function(s) { - var bytes = new Array(); - for (var i = 0; i < s.length; i += 1) { - var c = s.charCodeAt(i); - if (c < 128) { - bytes.push(c); - } else { - var b = unicodeMap[s.charAt(i)]; - if (typeof b == 'number') { - if ( (b & 0xff) == b) { - // 1byte - bytes.push(b); - } else { - // 2bytes - bytes.push(b >>> 8); - bytes.push(b & 0xff); - } - } else { - bytes.push(unknownChar); - } - } - } - return bytes; - }; - }; - - //--------------------------------------------------------------------- - // QRMode - //--------------------------------------------------------------------- - - var QRMode = { - MODE_NUMBER : 1 << 0, - MODE_ALPHA_NUM : 1 << 1, - MODE_8BIT_BYTE : 1 << 2, - MODE_KANJI : 1 << 3 - }; - - //--------------------------------------------------------------------- - // QRErrorCorrectLevel - //--------------------------------------------------------------------- - - var QRErrorCorrectLevel = { - L : 1, - M : 0, - Q : 3, - H : 2 - }; - - //--------------------------------------------------------------------- - // QRMaskPattern - //--------------------------------------------------------------------- - - var QRMaskPattern = { - PATTERN000 : 0, - PATTERN001 : 1, - PATTERN010 : 2, - PATTERN011 : 3, - PATTERN100 : 4, - PATTERN101 : 5, - PATTERN110 : 6, - PATTERN111 : 7 - }; - - //--------------------------------------------------------------------- - // QRUtil - //--------------------------------------------------------------------- - - var QRUtil = function() { - - var PATTERN_POSITION_TABLE = [ - [], - [6, 18], - [6, 22], - [6, 26], - [6, 30], - [6, 34], - [6, 22, 38], - [6, 24, 42], - [6, 26, 46], - [6, 28, 50], - [6, 30, 54], - [6, 32, 58], - [6, 34, 62], - [6, 26, 46, 66], - [6, 26, 48, 70], - [6, 26, 50, 74], - [6, 30, 54, 78], - [6, 30, 56, 82], - [6, 30, 58, 86], - [6, 34, 62, 90], - [6, 28, 50, 72, 94], - [6, 26, 50, 74, 98], - [6, 30, 54, 78, 102], - [6, 28, 54, 80, 106], - [6, 32, 58, 84, 110], - [6, 30, 58, 86, 114], - [6, 34, 62, 90, 118], - [6, 26, 50, 74, 98, 122], - [6, 30, 54, 78, 102, 126], - [6, 26, 52, 78, 104, 130], - [6, 30, 56, 82, 108, 134], - [6, 34, 60, 86, 112, 138], - [6, 30, 58, 86, 114, 142], - [6, 34, 62, 90, 118, 146], - [6, 30, 54, 78, 102, 126, 150], - [6, 24, 50, 76, 102, 128, 154], - [6, 28, 54, 80, 106, 132, 158], - [6, 32, 58, 84, 110, 136, 162], - [6, 26, 54, 82, 110, 138, 166], - [6, 30, 58, 86, 114, 142, 170] - ]; - var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); - var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0); - var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); - - var _this = {}; - - var getBCHDigit = function(data) { - var digit = 0; - while (data != 0) { - digit += 1; - data >>>= 1; - } - return digit; - }; - - _this.getBCHTypeInfo = function(data) { - var d = data << 10; - while (getBCHDigit(d) - getBCHDigit(G15) >= 0) { - d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) ); - } - return ( (data << 10) | d) ^ G15_MASK; - }; - - _this.getBCHTypeNumber = function(data) { - var d = data << 12; - while (getBCHDigit(d) - getBCHDigit(G18) >= 0) { - d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) ); - } - return (data << 12) | d; - }; - - _this.getPatternPosition = function(typeNumber) { - return PATTERN_POSITION_TABLE[typeNumber - 1]; - }; - - _this.getMaskFunction = function(maskPattern) { - - switch (maskPattern) { - - case QRMaskPattern.PATTERN000 : - return function(i, j) { return (i + j) % 2 == 0; }; - case QRMaskPattern.PATTERN001 : - return function(i, j) { return i % 2 == 0; }; - case QRMaskPattern.PATTERN010 : - return function(i, j) { return j % 3 == 0; }; - case QRMaskPattern.PATTERN011 : - return function(i, j) { return (i + j) % 3 == 0; }; - case QRMaskPattern.PATTERN100 : - return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; }; - case QRMaskPattern.PATTERN101 : - return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; }; - case QRMaskPattern.PATTERN110 : - return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; }; - case QRMaskPattern.PATTERN111 : - return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; }; - - default : - throw new Error('bad maskPattern:' + maskPattern); - } - }; - - _this.getErrorCorrectPolynomial = function(errorCorrectLength) { - var a = qrPolynomial([1], 0); - for (var i = 0; i < errorCorrectLength; i += 1) { - a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) ); - } - return a; - }; - - _this.getLengthInBits = function(mode, type) { - - if (1 <= type && type < 10) { - - // 1 - 9 - - switch(mode) { - case QRMode.MODE_NUMBER : return 10; - case QRMode.MODE_ALPHA_NUM : return 9; - case QRMode.MODE_8BIT_BYTE : return 8; - case QRMode.MODE_KANJI : return 8; - default : - throw new Error('mode:' + mode); - } - - } else if (type < 27) { - - // 10 - 26 - - switch(mode) { - case QRMode.MODE_NUMBER : return 12; - case QRMode.MODE_ALPHA_NUM : return 11; - case QRMode.MODE_8BIT_BYTE : return 16; - case QRMode.MODE_KANJI : return 10; - default : - throw new Error('mode:' + mode); - } - - } else if (type < 41) { - - // 27 - 40 - - switch(mode) { - case QRMode.MODE_NUMBER : return 14; - case QRMode.MODE_ALPHA_NUM : return 13; - case QRMode.MODE_8BIT_BYTE : return 16; - case QRMode.MODE_KANJI : return 12; - default : - throw new Error('mode:' + mode); - } - - } else { - throw new Error('type:' + type); - } - }; - - _this.getLostPoint = function(qrcode) { - - var moduleCount = qrcode.getModuleCount(); - - var lostPoint = 0; - - // LEVEL1 - - for (var row = 0; row < moduleCount; row += 1) { - for (var col = 0; col < moduleCount; col += 1) { - - var sameCount = 0; - var dark = qrcode.isDark(row, col); - - for (var r = -1; r <= 1; r += 1) { - - if (row + r < 0 || moduleCount <= row + r) { - continue; - } - - for (var c = -1; c <= 1; c += 1) { - - if (col + c < 0 || moduleCount <= col + c) { - continue; - } - - if (r == 0 && c == 0) { - continue; - } - - if (dark == qrcode.isDark(row + r, col + c) ) { - sameCount += 1; - } - } - } - - if (sameCount > 5) { - lostPoint += (3 + sameCount - 5); - } - } - }; - - // LEVEL2 - - for (var row = 0; row < moduleCount - 1; row += 1) { - for (var col = 0; col < moduleCount - 1; col += 1) { - var count = 0; - if (qrcode.isDark(row, col) ) count += 1; - if (qrcode.isDark(row + 1, col) ) count += 1; - if (qrcode.isDark(row, col + 1) ) count += 1; - if (qrcode.isDark(row + 1, col + 1) ) count += 1; - if (count == 0 || count == 4) { - lostPoint += 3; - } - } - } - - // LEVEL3 - - for (var row = 0; row < moduleCount; row += 1) { - for (var col = 0; col < moduleCount - 6; col += 1) { - if (qrcode.isDark(row, col) - && !qrcode.isDark(row, col + 1) - && qrcode.isDark(row, col + 2) - && qrcode.isDark(row, col + 3) - && qrcode.isDark(row, col + 4) - && !qrcode.isDark(row, col + 5) - && qrcode.isDark(row, col + 6) ) { - lostPoint += 40; - } - } - } - - for (var col = 0; col < moduleCount; col += 1) { - for (var row = 0; row < moduleCount - 6; row += 1) { - if (qrcode.isDark(row, col) - && !qrcode.isDark(row + 1, col) - && qrcode.isDark(row + 2, col) - && qrcode.isDark(row + 3, col) - && qrcode.isDark(row + 4, col) - && !qrcode.isDark(row + 5, col) - && qrcode.isDark(row + 6, col) ) { - lostPoint += 40; - } - } - } - - // LEVEL4 - - var darkCount = 0; - - for (var col = 0; col < moduleCount; col += 1) { - for (var row = 0; row < moduleCount; row += 1) { - if (qrcode.isDark(row, col) ) { - darkCount += 1; - } - } - } - - var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; - lostPoint += ratio * 10; - - return lostPoint; - }; - - return _this; - }(); - - //--------------------------------------------------------------------- - // QRMath - //--------------------------------------------------------------------- - - var QRMath = function() { - - var EXP_TABLE = new Array(256); - var LOG_TABLE = new Array(256); - - // initialize tables - for (var i = 0; i < 8; i += 1) { - EXP_TABLE[i] = 1 << i; - } - for (var i = 8; i < 256; i += 1) { - EXP_TABLE[i] = EXP_TABLE[i - 4] - ^ EXP_TABLE[i - 5] - ^ EXP_TABLE[i - 6] - ^ EXP_TABLE[i - 8]; - } - for (var i = 0; i < 255; i += 1) { - LOG_TABLE[EXP_TABLE[i] ] = i; - } - - var _this = {}; - - _this.glog = function(n) { - - if (n < 1) { - throw new Error('glog(' + n + ')'); - } - - return LOG_TABLE[n]; - }; - - _this.gexp = function(n) { - - while (n < 0) { - n += 255; - } - - while (n >= 256) { - n -= 255; - } - - return EXP_TABLE[n]; - }; - - return _this; - }(); - - //--------------------------------------------------------------------- - // qrPolynomial - //--------------------------------------------------------------------- - - function qrPolynomial(num, shift) { - - if (typeof num.length == 'undefined') { - throw new Error(num.length + '/' + shift); - } - - var _num = function() { - var offset = 0; - while (offset < num.length && num[offset] == 0) { - offset += 1; - } - var _num = new Array(num.length - offset + shift); - for (var i = 0; i < num.length - offset; i += 1) { - _num[i] = num[i + offset]; - } - return _num; - }(); - - var _this = {}; - - _this.getAt = function(index) { - return _num[index]; - }; - - _this.getLength = function() { - return _num.length; - }; - - _this.multiply = function(e) { - - var num = new Array(_this.getLength() + e.getLength() - 1); - - for (var i = 0; i < _this.getLength(); i += 1) { - for (var j = 0; j < e.getLength(); j += 1) { - num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) ); - } - } - - return qrPolynomial(num, 0); - }; - - _this.mod = function(e) { - - if (_this.getLength() - e.getLength() < 0) { - return _this; - } - - var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) ); - - var num = new Array(_this.getLength() ); - for (var i = 0; i < _this.getLength(); i += 1) { - num[i] = _this.getAt(i); - } - - for (var i = 0; i < e.getLength(); i += 1) { - num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio); - } - - // recursive call - return qrPolynomial(num, 0).mod(e); - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // QRRSBlock - //--------------------------------------------------------------------- - - var QRRSBlock = function() { - - var RS_BLOCK_TABLE = [ - - // L - // M - // Q - // H - - // 1 - [1, 26, 19], - [1, 26, 16], - [1, 26, 13], - [1, 26, 9], - - // 2 - [1, 44, 34], - [1, 44, 28], - [1, 44, 22], - [1, 44, 16], - - // 3 - [1, 70, 55], - [1, 70, 44], - [2, 35, 17], - [2, 35, 13], - - // 4 - [1, 100, 80], - [2, 50, 32], - [2, 50, 24], - [4, 25, 9], - - // 5 - [1, 134, 108], - [2, 67, 43], - [2, 33, 15, 2, 34, 16], - [2, 33, 11, 2, 34, 12], - - // 6 - [2, 86, 68], - [4, 43, 27], - [4, 43, 19], - [4, 43, 15], - - // 7 - [2, 98, 78], - [4, 49, 31], - [2, 32, 14, 4, 33, 15], - [4, 39, 13, 1, 40, 14], - - // 8 - [2, 121, 97], - [2, 60, 38, 2, 61, 39], - [4, 40, 18, 2, 41, 19], - [4, 40, 14, 2, 41, 15], - - // 9 - [2, 146, 116], - [3, 58, 36, 2, 59, 37], - [4, 36, 16, 4, 37, 17], - [4, 36, 12, 4, 37, 13], - - // 10 - [2, 86, 68, 2, 87, 69], - [4, 69, 43, 1, 70, 44], - [6, 43, 19, 2, 44, 20], - [6, 43, 15, 2, 44, 16] - ]; - - var qrRSBlock = function(totalCount, dataCount) { - var _this = {}; - _this.totalCount = totalCount; - _this.dataCount = dataCount; - return _this; - }; - - var _this = {}; - - var getRsBlockTable = function(typeNumber, errorCorrectLevel) { - - switch(errorCorrectLevel) { - case QRErrorCorrectLevel.L : - return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; - case QRErrorCorrectLevel.M : - return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; - case QRErrorCorrectLevel.Q : - return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; - case QRErrorCorrectLevel.H : - return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; - default : - return undefined; - } - }; - - _this.getRSBlocks = function(typeNumber, errorCorrectLevel) { - - var rsBlock = getRsBlockTable(typeNumber, errorCorrectLevel); - - if (typeof rsBlock == 'undefined') { - throw new Error('bad rs block @ typeNumber:' + typeNumber + - '/errorCorrectLevel:' + errorCorrectLevel); - } - - var length = rsBlock.length / 3; - - var list = new Array(); - - for (var i = 0; i < length; i += 1) { - - var count = rsBlock[i * 3 + 0]; - var totalCount = rsBlock[i * 3 + 1]; - var dataCount = rsBlock[i * 3 + 2]; - - for (var j = 0; j < count; j += 1) { - list.push(qrRSBlock(totalCount, dataCount) ); - } - } - - return list; - }; - - return _this; - }(); - - //--------------------------------------------------------------------- - // qrBitBuffer - //--------------------------------------------------------------------- - - var qrBitBuffer = function() { - - var _buffer = new Array(); - var _length = 0; - - var _this = {}; - - _this.getBuffer = function() { - return _buffer; - }; - - _this.getAt = function(index) { - var bufIndex = Math.floor(index / 8); - return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; - }; - - _this.put = function(num, length) { - for (var i = 0; i < length; i += 1) { - _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); - } - }; - - _this.getLengthInBits = function() { - return _length; - }; - - _this.putBit = function(bit) { - - var bufIndex = Math.floor(_length / 8); - if (_buffer.length <= bufIndex) { - _buffer.push(0); - } - - if (bit) { - _buffer[bufIndex] |= (0x80 >>> (_length % 8) ); - } - - _length += 1; - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // qr8BitByte - //--------------------------------------------------------------------- - - var qr8BitByte = function(data) { - - var _mode = QRMode.MODE_8BIT_BYTE; - var _data = data; - var _bytes = qrcode.stringToBytes(data); - - var _this = {}; - - _this.getMode = function() { - return _mode; - }; - - _this.getLength = function(buffer) { - return _bytes.length; - }; - - _this.write = function(buffer) { - for (var i = 0; i < _bytes.length; i += 1) { - buffer.put(_bytes[i], 8); - } - }; - - return _this; - }; - - //===================================================================== - // GIF Support etc. - // - - //--------------------------------------------------------------------- - // byteArrayOutputStream - //--------------------------------------------------------------------- - - var byteArrayOutputStream = function() { - - var _bytes = new Array(); - - var _this = {}; - - _this.writeByte = function(b) { - _bytes.push(b & 0xff); - }; - - _this.writeShort = function(i) { - _this.writeByte(i); - _this.writeByte(i >>> 8); - }; - - _this.writeBytes = function(b, off, len) { - off = off || 0; - len = len || b.length; - for (var i = 0; i < len; i += 1) { - _this.writeByte(b[i + off]); - } - }; - - _this.writeString = function(s) { - for (var i = 0; i < s.length; i += 1) { - _this.writeByte(s.charCodeAt(i) ); - } - }; - - _this.toByteArray = function() { - return _bytes; - }; - - _this.toString = function() { - var s = ''; - s += '['; - for (var i = 0; i < _bytes.length; i += 1) { - if (i > 0) { - s += ','; - } - s += _bytes[i]; - } - s += ']'; - return s; - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // base64EncodeOutputStream - //--------------------------------------------------------------------- - - var base64EncodeOutputStream = function() { - - var _buffer = 0; - var _buflen = 0; - var _length = 0; - var _base64 = ''; - - var _this = {}; - - var writeEncoded = function(b) { - _base64 += String.fromCharCode(encode(b & 0x3f) ); - }; - - var encode = function(n) { - if (n < 0) { - // error. - } else if (n < 26) { - return 0x41 + n; - } else if (n < 52) { - return 0x61 + (n - 26); - } else if (n < 62) { - return 0x30 + (n - 52); - } else if (n == 62) { - return 0x2b; - } else if (n == 63) { - return 0x2f; - } - throw new Error('n:' + n); - }; - - _this.writeByte = function(n) { - - _buffer = (_buffer << 8) | (n & 0xff); - _buflen += 8; - _length += 1; - - while (_buflen >= 6) { - writeEncoded(_buffer >>> (_buflen - 6) ); - _buflen -= 6; - } - }; - - _this.flush = function() { - - if (_buflen > 0) { - writeEncoded(_buffer << (6 - _buflen) ); - _buffer = 0; - _buflen = 0; - } - - if (_length % 3 != 0) { - // padding - var padlen = 3 - _length % 3; - for (var i = 0; i < padlen; i += 1) { - _base64 += '='; - } - } - }; - - _this.toString = function() { - return _base64; - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // base64DecodeInputStream - //--------------------------------------------------------------------- - - var base64DecodeInputStream = function(str) { - - var _str = str; - var _pos = 0; - var _buffer = 0; - var _buflen = 0; - - var _this = {}; - - _this.read = function() { - - while (_buflen < 8) { - - if (_pos >= _str.length) { - if (_buflen == 0) { - return -1; - } - throw new Error('unexpected end of file./' + _buflen); - } - - var c = _str.charAt(_pos); - _pos += 1; - - if (c == '=') { - _buflen = 0; - return -1; - } else if (c.match(/^\s$/) ) { - // ignore if whitespace. - continue; - } - - _buffer = (_buffer << 6) | decode(c.charCodeAt(0) ); - _buflen += 6; - } - - var n = (_buffer >>> (_buflen - 8) ) & 0xff; - _buflen -= 8; - return n; - }; - - var decode = function(c) { - if (0x41 <= c && c <= 0x5a) { - return c - 0x41; - } else if (0x61 <= c && c <= 0x7a) { - return c - 0x61 + 26; - } else if (0x30 <= c && c <= 0x39) { - return c - 0x30 + 52; - } else if (c == 0x2b) { - return 62; - } else if (c == 0x2f) { - return 63; - } else { - throw new Error('c:' + c); - } - }; - - return _this; - }; - - //--------------------------------------------------------------------- - // gifImage (B/W) - //--------------------------------------------------------------------- - - var gifImage = function(width, height) { - - var _width = width; - var _height = height; - var _data = new Array(width * height); - - var _this = {}; - - _this.setPixel = function(x, y, pixel) { - _data[y * _width + x] = pixel; - }; - - _this.write = function(out) { - - //--------------------------------- - // GIF Signature - - out.writeString('GIF87a'); - - //--------------------------------- - // Screen Descriptor - - out.writeShort(_width); - out.writeShort(_height); - - out.writeByte(0x80); // 2bit - out.writeByte(0); - out.writeByte(0); - - //--------------------------------- - // Global Color Map - - // black - out.writeByte(0x00); - out.writeByte(0x00); - out.writeByte(0x00); - - // white - out.writeByte(0xff); - out.writeByte(0xff); - out.writeByte(0xff); - - //--------------------------------- - // Image Descriptor - - out.writeString(','); - out.writeShort(0); - out.writeShort(0); - out.writeShort(_width); - out.writeShort(_height); - out.writeByte(0); - - //--------------------------------- - // Local Color Map - - //--------------------------------- - // Raster Data - - var lzwMinCodeSize = 2; - var raster = getLZWRaster(lzwMinCodeSize); - - out.writeByte(lzwMinCodeSize); - - var offset = 0; - - while (raster.length - offset > 255) { - out.writeByte(255); - out.writeBytes(raster, offset, 255); - offset += 255; - } - - out.writeByte(raster.length - offset); - out.writeBytes(raster, offset, raster.length - offset); - out.writeByte(0x00); - - //--------------------------------- - // GIF Terminator - out.writeString(';'); - }; - - var bitOutputStream = function(out) { - - var _out = out; - var _bitLength = 0; - var _bitBuffer = 0; - - var _this = {}; - - _this.write = function(data, length) { - - if ( (data >>> length) != 0) { - throw new Error('length over'); - } - - while (_bitLength + length >= 8) { - _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) ); - length -= (8 - _bitLength); - data >>>= (8 - _bitLength); - _bitBuffer = 0; - _bitLength = 0; - } - - _bitBuffer = (data << _bitLength) | _bitBuffer; - _bitLength = _bitLength + length; - }; - - _this.flush = function() { - if (_bitLength > 0) { - _out.writeByte(_bitBuffer); - } - }; - - return _this; - }; - - var getLZWRaster = function(lzwMinCodeSize) { - - var clearCode = 1 << lzwMinCodeSize; - var endCode = (1 << lzwMinCodeSize) + 1; - var bitLength = lzwMinCodeSize + 1; - - // Setup LZWTable - var table = lzwTable(); - - for (var i = 0; i < clearCode; i += 1) { - table.add(String.fromCharCode(i) ); - } - table.add(String.fromCharCode(clearCode) ); - table.add(String.fromCharCode(endCode) ); - - var byteOut = byteArrayOutputStream(); - var bitOut = bitOutputStream(byteOut); - - // clear code - bitOut.write(clearCode, bitLength); - - var dataIndex = 0; - - var s = String.fromCharCode(_data[dataIndex]); - dataIndex += 1; - - while (dataIndex < _data.length) { - - var c = String.fromCharCode(_data[dataIndex]); - dataIndex += 1; - - if (table.contains(s + c) ) { - - s = s + c; - - } else { - - bitOut.write(table.indexOf(s), bitLength); - - if (table.size() < 0xfff) { - - if (table.size() == (1 << bitLength) ) { - bitLength += 1; - } - - table.add(s + c); - } - - s = c; - } - } - - bitOut.write(table.indexOf(s), bitLength); - - // end code - bitOut.write(endCode, bitLength); - - bitOut.flush(); - - return byteOut.toByteArray(); - }; - - var lzwTable = function() { - - var _map = {}; - var _size = 0; - - var _this = {}; - - _this.add = function(key) { - if (_this.contains(key) ) { - throw new Error('dup key:' + key); - } - _map[key] = _size; - _size += 1; - }; - - _this.size = function() { - return _size; - }; - - _this.indexOf = function(key) { - return _map[key]; - }; - - _this.contains = function(key) { - return typeof _map[key] != 'undefined'; - }; - - return _this; - }; - - return _this; - }; - - var createImgTag = function(width, height, getPixel, alt) { - - var gif = gifImage(width, height); - for (var y = 0; y < height; y += 1) { - for (var x = 0; x < width; x += 1) { - gif.setPixel(x, y, getPixel(x, y) ); - } - } - - var b = byteArrayOutputStream(); - gif.write(b); - - var base64 = base64EncodeOutputStream(); - var bytes = b.toByteArray(); - for (var i = 0; i < bytes.length; i += 1) { - base64.writeByte(bytes[i]); - } - base64.flush(); - - var img = ''; - img += ' width || y < - 1 || y > height) - { - throw "Error.checkAndNudgePoints "; - } - nudged = false; - if (x == - 1) - { - points[offset] = 0.0; - nudged = true; - } - else if (x == width) - { - points[offset] = width - 1; - nudged = true; - } - if (y == - 1) - { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y == height) - { - points[offset + 1] = height - 1; - nudged = true; - } - } - // Check and nudge points from end: - nudged = true; - for (var offset = points.length - 2; offset >= 0 && nudged; offset -= 2) - { - var x = Math.floor( points[offset]); - var y = Math.floor( points[offset + 1]); - if (x < - 1 || x > width || y < - 1 || y > height) - { - throw "Error.checkAndNudgePoints "; - } - nudged = false; - if (x == - 1) - { - points[offset] = 0.0; - nudged = true; - } - else if (x == width) - { - points[offset] = width - 1; - nudged = true; - } - if (y == - 1) - { - points[offset + 1] = 0.0; - nudged = true; - } - else if (y == height) - { - points[offset + 1] = height - 1; - nudged = true; - } - } - } - - - -GridSampler.sampleGrid3=function( image, dimension, transform) - { - var bits = new BitMatrix(dimension); - var points = new Array(dimension << 1); - for (var y = 0; y < dimension; y++) - { - var max = points.length; - var iValue = y + 0.5; - for (var x = 0; x < max; x += 2) - { - points[x] = (x >> 1) + 0.5; - points[x + 1] = iValue; - } - transform.transformPoints1(points); - // Quick check to see if points transformed to something inside the image; - // sufficient to check the endpoints - GridSampler.checkAndNudgePoints(image, points); - try - { - for (var x = 0; x < max; x += 2) - { - var xpoint = (Math.floor( points[x]) * 4) + (Math.floor( points[x + 1]) * qrcode.width * 4); - var bit = image[Math.floor( points[x])+ qrcode.width* Math.floor( points[x + 1])]; - qrcode.imagedata.data[xpoint] = bit?255:0; - qrcode.imagedata.data[xpoint+1] = bit?255:0; - qrcode.imagedata.data[xpoint+2] = 0; - qrcode.imagedata.data[xpoint+3] = 255; - //bits[x >> 1][ y]=bit; - if(bit) - bits.set_Renamed(x >> 1, y); - } - } - catch ( aioobe) - { - // This feels wrong, but, sometimes if the finder patterns are misidentified, the resulting - // transform gets "twisted" such that it maps a straight line of points to a set of points - // whose endpoints are in bounds, but others are not. There is probably some mathematical - // way to detect this about the transformation that I don't know yet. - // This results in an ugly runtime exception despite our clever checks above -- can't have - // that. We could check each point's coordinates but that feels duplicative. We settle for - // catching and wrapping ArrayIndexOutOfBoundsException. - throw "Error.checkAndNudgePoints"; - } - } - return bits; - } - -GridSampler.sampleGridx=function( image, dimension, p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY) -{ - var transform = PerspectiveTransform.quadrilateralToQuadrilateral(p1ToX, p1ToY, p2ToX, p2ToY, p3ToX, p3ToY, p4ToX, p4ToY, p1FromX, p1FromY, p2FromX, p2FromY, p3FromX, p3FromY, p4FromX, p4FromY); - - return GridSampler.sampleGrid3(image, dimension, transform); -} - -// Source: public/src/js/jsqrcode/version.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - - -function ECB(count, dataCodewords) -{ - this.count = count; - this.dataCodewords = dataCodewords; - - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("DataCodewords", function() - { - return this.dataCodewords; - }); -} - -function ECBlocks( ecCodewordsPerBlock, ecBlocks1, ecBlocks2) -{ - this.ecCodewordsPerBlock = ecCodewordsPerBlock; - if(ecBlocks2) - this.ecBlocks = new Array(ecBlocks1, ecBlocks2); - else - this.ecBlocks = new Array(ecBlocks1); - - this.__defineGetter__("ECCodewordsPerBlock", function() - { - return this.ecCodewordsPerBlock; - }); - - this.__defineGetter__("TotalECCodewords", function() - { - return this.ecCodewordsPerBlock * this.NumBlocks; - }); - - this.__defineGetter__("NumBlocks", function() - { - var total = 0; - for (var i = 0; i < this.ecBlocks.length; i++) - { - total += this.ecBlocks[i].length; - } - return total; - }); - - this.getECBlocks=function() - { - return this.ecBlocks; - } -} - -function Version( versionNumber, alignmentPatternCenters, ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4) -{ - this.versionNumber = versionNumber; - this.alignmentPatternCenters = alignmentPatternCenters; - this.ecBlocks = new Array(ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4); - - var total = 0; - var ecCodewords = ecBlocks1.ECCodewordsPerBlock; - var ecbArray = ecBlocks1.getECBlocks(); - for (var i = 0; i < ecbArray.length; i++) - { - var ecBlock = ecbArray[i]; - total += ecBlock.Count * (ecBlock.DataCodewords + ecCodewords); - } - this.totalCodewords = total; - - this.__defineGetter__("VersionNumber", function() - { - return this.versionNumber; - }); - - this.__defineGetter__("AlignmentPatternCenters", function() - { - return this.alignmentPatternCenters; - }); - this.__defineGetter__("TotalCodewords", function() - { - return this.totalCodewords; - }); - this.__defineGetter__("DimensionForVersion", function() - { - return 17 + 4 * this.versionNumber; - }); - - this.buildFunctionPattern=function() - { - var dimension = this.DimensionForVersion; - var bitMatrix = new BitMatrix(dimension); - - // Top left finder pattern + separator + format - bitMatrix.setRegion(0, 0, 9, 9); - // Top right finder pattern + separator + format - bitMatrix.setRegion(dimension - 8, 0, 8, 9); - // Bottom left finder pattern + separator + format - bitMatrix.setRegion(0, dimension - 8, 9, 8); - - // Alignment patterns - var max = this.alignmentPatternCenters.length; - for (var x = 0; x < max; x++) - { - var i = this.alignmentPatternCenters[x] - 2; - for (var y = 0; y < max; y++) - { - if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) - { - // No alignment patterns near the three finder paterns - continue; - } - bitMatrix.setRegion(this.alignmentPatternCenters[y] - 2, i, 5, 5); - } - } - - // Vertical timing pattern - bitMatrix.setRegion(6, 9, 1, dimension - 17); - // Horizontal timing pattern - bitMatrix.setRegion(9, 6, dimension - 17, 1); - - if (this.versionNumber > 6) - { - // Version info, top right - bitMatrix.setRegion(dimension - 11, 0, 3, 6); - // Version info, bottom left - bitMatrix.setRegion(0, dimension - 11, 6, 3); - } - - return bitMatrix; - } - this.getECBlocksForLevel=function( ecLevel) - { - return this.ecBlocks[ecLevel.ordinal()]; - } -} - -Version.VERSION_DECODE_INFO = new Array(0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6, 0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78, 0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683, 0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB, 0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250, 0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B, 0x2542E, 0x26A64, 0x27541, 0x28C69); - -Version.VERSIONS = buildVersions(); - -Version.getVersionForNumber=function( versionNumber) -{ - if (versionNumber < 1 || versionNumber > 40) - { - throw "ArgumentException"; - } - return Version.VERSIONS[versionNumber - 1]; -} - -Version.getProvisionalVersionForDimension=function(dimension) -{ - if (dimension % 4 != 1) - { - throw "Error getProvisionalVersionForDimension"; - } - try - { - return Version.getVersionForNumber((dimension - 17) >> 2); - } - catch ( iae) - { - throw "Error getVersionForNumber"; - } -} - -Version.decodeVersionInformation=function( versionBits) -{ - var bestDifference = 0xffffffff; - var bestVersion = 0; - for (var i = 0; i < Version.VERSION_DECODE_INFO.length; i++) - { - var targetVersion = Version.VERSION_DECODE_INFO[i]; - // Do the version info bits match exactly? done. - if (targetVersion == versionBits) - { - return this.getVersionForNumber(i + 7); - } - // Otherwise see if this is the closest to a real version info bit string - // we have seen so far - var bitsDifference = FormatInformation.numBitsDiffering(versionBits, targetVersion); - if (bitsDifference < bestDifference) - { - bestVersion = i + 7; - bestDifference = bitsDifference; - } - } - // We can tolerate up to 3 bits of error since no two version info codewords will - // differ in less than 4 bits. - if (bestDifference <= 3) - { - return this.getVersionForNumber(bestVersion); - } - // If we didn't find a close enough match, fail - return null; -} - -function buildVersions() -{ - return new Array(new Version(1, new Array(), new ECBlocks(7, new ECB(1, 19)), new ECBlocks(10, new ECB(1, 16)), new ECBlocks(13, new ECB(1, 13)), new ECBlocks(17, new ECB(1, 9))), - new Version(2, new Array(6, 18), new ECBlocks(10, new ECB(1, 34)), new ECBlocks(16, new ECB(1, 28)), new ECBlocks(22, new ECB(1, 22)), new ECBlocks(28, new ECB(1, 16))), - new Version(3, new Array(6, 22), new ECBlocks(15, new ECB(1, 55)), new ECBlocks(26, new ECB(1, 44)), new ECBlocks(18, new ECB(2, 17)), new ECBlocks(22, new ECB(2, 13))), - new Version(4, new Array(6, 26), new ECBlocks(20, new ECB(1, 80)), new ECBlocks(18, new ECB(2, 32)), new ECBlocks(26, new ECB(2, 24)), new ECBlocks(16, new ECB(4, 9))), - new Version(5, new Array(6, 30), new ECBlocks(26, new ECB(1, 108)), new ECBlocks(24, new ECB(2, 43)), new ECBlocks(18, new ECB(2, 15), new ECB(2, 16)), new ECBlocks(22, new ECB(2, 11), new ECB(2, 12))), - new Version(6, new Array(6, 34), new ECBlocks(18, new ECB(2, 68)), new ECBlocks(16, new ECB(4, 27)), new ECBlocks(24, new ECB(4, 19)), new ECBlocks(28, new ECB(4, 15))), - new Version(7, new Array(6, 22, 38), new ECBlocks(20, new ECB(2, 78)), new ECBlocks(18, new ECB(4, 31)), new ECBlocks(18, new ECB(2, 14), new ECB(4, 15)), new ECBlocks(26, new ECB(4, 13), new ECB(1, 14))), - new Version(8, new Array(6, 24, 42), new ECBlocks(24, new ECB(2, 97)), new ECBlocks(22, new ECB(2, 38), new ECB(2, 39)), new ECBlocks(22, new ECB(4, 18), new ECB(2, 19)), new ECBlocks(26, new ECB(4, 14), new ECB(2, 15))), - new Version(9, new Array(6, 26, 46), new ECBlocks(30, new ECB(2, 116)), new ECBlocks(22, new ECB(3, 36), new ECB(2, 37)), new ECBlocks(20, new ECB(4, 16), new ECB(4, 17)), new ECBlocks(24, new ECB(4, 12), new ECB(4, 13))), - new Version(10, new Array(6, 28, 50), new ECBlocks(18, new ECB(2, 68), new ECB(2, 69)), new ECBlocks(26, new ECB(4, 43), new ECB(1, 44)), new ECBlocks(24, new ECB(6, 19), new ECB(2, 20)), new ECBlocks(28, new ECB(6, 15), new ECB(2, 16))), - new Version(11, new Array(6, 30, 54), new ECBlocks(20, new ECB(4, 81)), new ECBlocks(30, new ECB(1, 50), new ECB(4, 51)), new ECBlocks(28, new ECB(4, 22), new ECB(4, 23)), new ECBlocks(24, new ECB(3, 12), new ECB(8, 13))), - new Version(12, new Array(6, 32, 58), new ECBlocks(24, new ECB(2, 92), new ECB(2, 93)), new ECBlocks(22, new ECB(6, 36), new ECB(2, 37)), new ECBlocks(26, new ECB(4, 20), new ECB(6, 21)), new ECBlocks(28, new ECB(7, 14), new ECB(4, 15))), - new Version(13, new Array(6, 34, 62), new ECBlocks(26, new ECB(4, 107)), new ECBlocks(22, new ECB(8, 37), new ECB(1, 38)), new ECBlocks(24, new ECB(8, 20), new ECB(4, 21)), new ECBlocks(22, new ECB(12, 11), new ECB(4, 12))), - new Version(14, new Array(6, 26, 46, 66), new ECBlocks(30, new ECB(3, 115), new ECB(1, 116)), new ECBlocks(24, new ECB(4, 40), new ECB(5, 41)), new ECBlocks(20, new ECB(11, 16), new ECB(5, 17)), new ECBlocks(24, new ECB(11, 12), new ECB(5, 13))), - new Version(15, new Array(6, 26, 48, 70), new ECBlocks(22, new ECB(5, 87), new ECB(1, 88)), new ECBlocks(24, new ECB(5, 41), new ECB(5, 42)), new ECBlocks(30, new ECB(5, 24), new ECB(7, 25)), new ECBlocks(24, new ECB(11, 12), new ECB(7, 13))), - new Version(16, new Array(6, 26, 50, 74), new ECBlocks(24, new ECB(5, 98), new ECB(1, 99)), new ECBlocks(28, new ECB(7, 45), new ECB(3, 46)), new ECBlocks(24, new ECB(15, 19), new ECB(2, 20)), new ECBlocks(30, new ECB(3, 15), new ECB(13, 16))), - new Version(17, new Array(6, 30, 54, 78), new ECBlocks(28, new ECB(1, 107), new ECB(5, 108)), new ECBlocks(28, new ECB(10, 46), new ECB(1, 47)), new ECBlocks(28, new ECB(1, 22), new ECB(15, 23)), new ECBlocks(28, new ECB(2, 14), new ECB(17, 15))), - new Version(18, new Array(6, 30, 56, 82), new ECBlocks(30, new ECB(5, 120), new ECB(1, 121)), new ECBlocks(26, new ECB(9, 43), new ECB(4, 44)), new ECBlocks(28, new ECB(17, 22), new ECB(1, 23)), new ECBlocks(28, new ECB(2, 14), new ECB(19, 15))), - new Version(19, new Array(6, 30, 58, 86), new ECBlocks(28, new ECB(3, 113), new ECB(4, 114)), new ECBlocks(26, new ECB(3, 44), new ECB(11, 45)), new ECBlocks(26, new ECB(17, 21), new ECB(4, 22)), new ECBlocks(26, new ECB(9, 13), new ECB(16, 14))), - new Version(20, new Array(6, 34, 62, 90), new ECBlocks(28, new ECB(3, 107), new ECB(5, 108)), new ECBlocks(26, new ECB(3, 41), new ECB(13, 42)), new ECBlocks(30, new ECB(15, 24), new ECB(5, 25)), new ECBlocks(28, new ECB(15, 15), new ECB(10, 16))), - new Version(21, new Array(6, 28, 50, 72, 94), new ECBlocks(28, new ECB(4, 116), new ECB(4, 117)), new ECBlocks(26, new ECB(17, 42)), new ECBlocks(28, new ECB(17, 22), new ECB(6, 23)), new ECBlocks(30, new ECB(19, 16), new ECB(6, 17))), - new Version(22, new Array(6, 26, 50, 74, 98), new ECBlocks(28, new ECB(2, 111), new ECB(7, 112)), new ECBlocks(28, new ECB(17, 46)), new ECBlocks(30, new ECB(7, 24), new ECB(16, 25)), new ECBlocks(24, new ECB(34, 13))), - new Version(23, new Array(6, 30, 54, 74, 102), new ECBlocks(30, new ECB(4, 121), new ECB(5, 122)), new ECBlocks(28, new ECB(4, 47), new ECB(14, 48)), new ECBlocks(30, new ECB(11, 24), new ECB(14, 25)), new ECBlocks(30, new ECB(16, 15), new ECB(14, 16))), - new Version(24, new Array(6, 28, 54, 80, 106), new ECBlocks(30, new ECB(6, 117), new ECB(4, 118)), new ECBlocks(28, new ECB(6, 45), new ECB(14, 46)), new ECBlocks(30, new ECB(11, 24), new ECB(16, 25)), new ECBlocks(30, new ECB(30, 16), new ECB(2, 17))), - new Version(25, new Array(6, 32, 58, 84, 110), new ECBlocks(26, new ECB(8, 106), new ECB(4, 107)), new ECBlocks(28, new ECB(8, 47), new ECB(13, 48)), new ECBlocks(30, new ECB(7, 24), new ECB(22, 25)), new ECBlocks(30, new ECB(22, 15), new ECB(13, 16))), - new Version(26, new Array(6, 30, 58, 86, 114), new ECBlocks(28, new ECB(10, 114), new ECB(2, 115)), new ECBlocks(28, new ECB(19, 46), new ECB(4, 47)), new ECBlocks(28, new ECB(28, 22), new ECB(6, 23)), new ECBlocks(30, new ECB(33, 16), new ECB(4, 17))), - new Version(27, new Array(6, 34, 62, 90, 118), new ECBlocks(30, new ECB(8, 122), new ECB(4, 123)), new ECBlocks(28, new ECB(22, 45), new ECB(3, 46)), new ECBlocks(30, new ECB(8, 23), new ECB(26, 24)), new ECBlocks(30, new ECB(12, 15), new ECB(28, 16))), - new Version(28, new Array(6, 26, 50, 74, 98, 122), new ECBlocks(30, new ECB(3, 117), new ECB(10, 118)), new ECBlocks(28, new ECB(3, 45), new ECB(23, 46)), new ECBlocks(30, new ECB(4, 24), new ECB(31, 25)), new ECBlocks(30, new ECB(11, 15), new ECB(31, 16))), - new Version(29, new Array(6, 30, 54, 78, 102, 126), new ECBlocks(30, new ECB(7, 116), new ECB(7, 117)), new ECBlocks(28, new ECB(21, 45), new ECB(7, 46)), new ECBlocks(30, new ECB(1, 23), new ECB(37, 24)), new ECBlocks(30, new ECB(19, 15), new ECB(26, 16))), - new Version(30, new Array(6, 26, 52, 78, 104, 130), new ECBlocks(30, new ECB(5, 115), new ECB(10, 116)), new ECBlocks(28, new ECB(19, 47), new ECB(10, 48)), new ECBlocks(30, new ECB(15, 24), new ECB(25, 25)), new ECBlocks(30, new ECB(23, 15), new ECB(25, 16))), - new Version(31, new Array(6, 30, 56, 82, 108, 134), new ECBlocks(30, new ECB(13, 115), new ECB(3, 116)), new ECBlocks(28, new ECB(2, 46), new ECB(29, 47)), new ECBlocks(30, new ECB(42, 24), new ECB(1, 25)), new ECBlocks(30, new ECB(23, 15), new ECB(28, 16))), - new Version(32, new Array(6, 34, 60, 86, 112, 138), new ECBlocks(30, new ECB(17, 115)), new ECBlocks(28, new ECB(10, 46), new ECB(23, 47)), new ECBlocks(30, new ECB(10, 24), new ECB(35, 25)), new ECBlocks(30, new ECB(19, 15), new ECB(35, 16))), - new Version(33, new Array(6, 30, 58, 86, 114, 142), new ECBlocks(30, new ECB(17, 115), new ECB(1, 116)), new ECBlocks(28, new ECB(14, 46), new ECB(21, 47)), new ECBlocks(30, new ECB(29, 24), new ECB(19, 25)), new ECBlocks(30, new ECB(11, 15), new ECB(46, 16))), - new Version(34, new Array(6, 34, 62, 90, 118, 146), new ECBlocks(30, new ECB(13, 115), new ECB(6, 116)), new ECBlocks(28, new ECB(14, 46), new ECB(23, 47)), new ECBlocks(30, new ECB(44, 24), new ECB(7, 25)), new ECBlocks(30, new ECB(59, 16), new ECB(1, 17))), - new Version(35, new Array(6, 30, 54, 78, 102, 126, 150), new ECBlocks(30, new ECB(12, 121), new ECB(7, 122)), new ECBlocks(28, new ECB(12, 47), new ECB(26, 48)), new ECBlocks(30, new ECB(39, 24), new ECB(14, 25)),new ECBlocks(30, new ECB(22, 15), new ECB(41, 16))), - new Version(36, new Array(6, 24, 50, 76, 102, 128, 154), new ECBlocks(30, new ECB(6, 121), new ECB(14, 122)), new ECBlocks(28, new ECB(6, 47), new ECB(34, 48)), new ECBlocks(30, new ECB(46, 24), new ECB(10, 25)), new ECBlocks(30, new ECB(2, 15), new ECB(64, 16))), - new Version(37, new Array(6, 28, 54, 80, 106, 132, 158), new ECBlocks(30, new ECB(17, 122), new ECB(4, 123)), new ECBlocks(28, new ECB(29, 46), new ECB(14, 47)), new ECBlocks(30, new ECB(49, 24), new ECB(10, 25)), new ECBlocks(30, new ECB(24, 15), new ECB(46, 16))), - new Version(38, new Array(6, 32, 58, 84, 110, 136, 162), new ECBlocks(30, new ECB(4, 122), new ECB(18, 123)), new ECBlocks(28, new ECB(13, 46), new ECB(32, 47)), new ECBlocks(30, new ECB(48, 24), new ECB(14, 25)), new ECBlocks(30, new ECB(42, 15), new ECB(32, 16))), - new Version(39, new Array(6, 26, 54, 82, 110, 138, 166), new ECBlocks(30, new ECB(20, 117), new ECB(4, 118)), new ECBlocks(28, new ECB(40, 47), new ECB(7, 48)), new ECBlocks(30, new ECB(43, 24), new ECB(22, 25)), new ECBlocks(30, new ECB(10, 15), new ECB(67, 16))), - new Version(40, new Array(6, 30, 58, 86, 114, 142, 170), new ECBlocks(30, new ECB(19, 118), new ECB(6, 119)), new ECBlocks(28, new ECB(18, 47), new ECB(31, 48)), new ECBlocks(30, new ECB(34, 24), new ECB(34, 25)), new ECBlocks(30, new ECB(20, 15), new ECB(61, 16)))); -} -// Source: public/src/js/jsqrcode/detector.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function PerspectiveTransform( a11, a21, a31, a12, a22, a32, a13, a23, a33) -{ - this.a11 = a11; - this.a12 = a12; - this.a13 = a13; - this.a21 = a21; - this.a22 = a22; - this.a23 = a23; - this.a31 = a31; - this.a32 = a32; - this.a33 = a33; - this.transformPoints1=function( points) - { - var max = points.length; - var a11 = this.a11; - var a12 = this.a12; - var a13 = this.a13; - var a21 = this.a21; - var a22 = this.a22; - var a23 = this.a23; - var a31 = this.a31; - var a32 = this.a32; - var a33 = this.a33; - for (var i = 0; i < max; i += 2) - { - var x = points[i]; - var y = points[i + 1]; - var denominator = a13 * x + a23 * y + a33; - points[i] = (a11 * x + a21 * y + a31) / denominator; - points[i + 1] = (a12 * x + a22 * y + a32) / denominator; - } - } - this. transformPoints2=function(xValues, yValues) - { - var n = xValues.length; - for (var i = 0; i < n; i++) - { - var x = xValues[i]; - var y = yValues[i]; - var denominator = this.a13 * x + this.a23 * y + this.a33; - xValues[i] = (this.a11 * x + this.a21 * y + this.a31) / denominator; - yValues[i] = (this.a12 * x + this.a22 * y + this.a32) / denominator; - } - } - - this.buildAdjoint=function() - { - // Adjoint is the transpose of the cofactor matrix: - return new PerspectiveTransform(this.a22 * this.a33 - this.a23 * this.a32, this.a23 * this.a31 - this.a21 * this.a33, this.a21 * this.a32 - this.a22 * this.a31, this.a13 * this.a32 - this.a12 * this.a33, this.a11 * this.a33 - this.a13 * this.a31, this.a12 * this.a31 - this.a11 * this.a32, this.a12 * this.a23 - this.a13 * this.a22, this.a13 * this.a21 - this.a11 * this.a23, this.a11 * this.a22 - this.a12 * this.a21); - } - this.times=function( other) - { - return new PerspectiveTransform(this.a11 * other.a11 + this.a21 * other.a12 + this.a31 * other.a13, this.a11 * other.a21 + this.a21 * other.a22 + this.a31 * other.a23, this.a11 * other.a31 + this.a21 * other.a32 + this.a31 * other.a33, this.a12 * other.a11 + this.a22 * other.a12 + this.a32 * other.a13, this.a12 * other.a21 + this.a22 * other.a22 + this.a32 * other.a23, this.a12 * other.a31 + this.a22 * other.a32 + this.a32 * other.a33, this.a13 * other.a11 + this.a23 * other.a12 +this.a33 * other.a13, this.a13 * other.a21 + this.a23 * other.a22 + this.a33 * other.a23, this.a13 * other.a31 + this.a23 * other.a32 + this.a33 * other.a33); - } - -} - -PerspectiveTransform.quadrilateralToQuadrilateral=function( x0, y0, x1, y1, x2, y2, x3, y3, x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p) -{ - - var qToS = this.quadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3); - var sToQ = this.squareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p); - return sToQ.times(qToS); -} - -PerspectiveTransform.squareToQuadrilateral=function( x0, y0, x1, y1, x2, y2, x3, y3) -{ - dy2 = y3 - y2; - dy3 = y0 - y1 + y2 - y3; - if (dy2 == 0.0 && dy3 == 0.0) - { - return new PerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0, y2 - y1, y0, 0.0, 0.0, 1.0); - } - else - { - dx1 = x1 - x2; - dx2 = x3 - x2; - dx3 = x0 - x1 + x2 - x3; - dy1 = y1 - y2; - denominator = dx1 * dy2 - dx2 * dy1; - a13 = (dx3 * dy2 - dx2 * dy3) / denominator; - a23 = (dx1 * dy3 - dx3 * dy1) / denominator; - return new PerspectiveTransform(x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1, y3 - y0 + a23 * y3, y0, a13, a23, 1.0); - } -} - -PerspectiveTransform.quadrilateralToSquare=function( x0, y0, x1, y1, x2, y2, x3, y3) -{ - // Here, the adjoint serves as the inverse: - return this.squareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3).buildAdjoint(); -} - -function DetectorResult(bits, points) -{ - this.bits = bits; - this.points = points; -} - - -function Detector(image) -{ - this.image=image; - this.resultPointCallback = null; - - this.sizeOfBlackWhiteBlackRun=function( fromX, fromY, toX, toY) - { - // Mild variant of Bresenham's algorithm; - // see http://en.wikipedia.org/wiki/Bresenham's_line_algorithm - var steep = Math.abs(toY - fromY) > Math.abs(toX - fromX); - if (steep) - { - var temp = fromX; - fromX = fromY; - fromY = temp; - temp = toX; - toX = toY; - toY = temp; - } - - var dx = Math.abs(toX - fromX); - var dy = Math.abs(toY - fromY); - var error = - dx >> 1; - var ystep = fromY < toY?1:- 1; - var xstep = fromX < toX?1:- 1; - var state = 0; // In black pixels, looking for white, first or second time - for (var x = fromX, y = fromY; x != toX; x += xstep) - { - - var realX = steep?y:x; - var realY = steep?x:y; - if (state == 1) - { - // In white pixels, looking for black - if (this.image[realX + realY*qrcode.width]) - { - state++; - } - } - else - { - if (!this.image[realX + realY*qrcode.width]) - { - state++; - } - } - - if (state == 3) - { - // Found black, white, black, and stumbled back onto white; done - var diffX = x - fromX; - var diffY = y - fromY; - return Math.sqrt( (diffX * diffX + diffY * diffY)); - } - error += dy; - if (error > 0) - { - if (y == toY) - { - break; - } - y += ystep; - error -= dx; - } - } - var diffX2 = toX - fromX; - var diffY2 = toY - fromY; - return Math.sqrt( (diffX2 * diffX2 + diffY2 * diffY2)); - } - - - this.sizeOfBlackWhiteBlackRunBothWays=function( fromX, fromY, toX, toY) - { - - var result = this.sizeOfBlackWhiteBlackRun(fromX, fromY, toX, toY); - - // Now count other way -- don't run off image though of course - var scale = 1.0; - var otherToX = fromX - (toX - fromX); - if (otherToX < 0) - { - scale = fromX / (fromX - otherToX); - otherToX = 0; - } - else if (otherToX >= qrcode.width) - { - scale = (qrcode.width - 1 - fromX) / (otherToX - fromX); - otherToX = qrcode.width - 1; - } - var otherToY = Math.floor (fromY - (toY - fromY) * scale); - - scale = 1.0; - if (otherToY < 0) - { - scale = fromY / (fromY - otherToY); - otherToY = 0; - } - else if (otherToY >= qrcode.height) - { - scale = (qrcode.height - 1 - fromY) / (otherToY - fromY); - otherToY = qrcode.height - 1; - } - otherToX = Math.floor (fromX + (otherToX - fromX) * scale); - - result += this.sizeOfBlackWhiteBlackRun(fromX, fromY, otherToX, otherToY); - return result - 1.0; // -1 because we counted the middle pixel twice - } - - - - this.calculateModuleSizeOneWay=function( pattern, otherPattern) - { - var moduleSizeEst1 = this.sizeOfBlackWhiteBlackRunBothWays(Math.floor( pattern.X), Math.floor( pattern.Y), Math.floor( otherPattern.X), Math.floor(otherPattern.Y)); - var moduleSizeEst2 = this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(otherPattern.X), Math.floor(otherPattern.Y), Math.floor( pattern.X), Math.floor(pattern.Y)); - if (isNaN(moduleSizeEst1)) - { - return moduleSizeEst2 / 7.0; - } - if (isNaN(moduleSizeEst2)) - { - return moduleSizeEst1 / 7.0; - } - // Average them, and divide by 7 since we've counted the width of 3 black modules, - // and 1 white and 1 black module on either side. Ergo, divide sum by 14. - return (moduleSizeEst1 + moduleSizeEst2) / 14.0; - } - - - this.calculateModuleSize=function( topLeft, topRight, bottomLeft) - { - // Take the average - return (this.calculateModuleSizeOneWay(topLeft, topRight) + this.calculateModuleSizeOneWay(topLeft, bottomLeft)) / 2.0; - } - - this.distance=function( pattern1, pattern2) - { - xDiff = pattern1.X - pattern2.X; - yDiff = pattern1.Y - pattern2.Y; - return Math.sqrt( (xDiff * xDiff + yDiff * yDiff)); - } - this.computeDimension=function( topLeft, topRight, bottomLeft, moduleSize) - { - - var tltrCentersDimension = Math.round(this.distance(topLeft, topRight) / moduleSize); - var tlblCentersDimension = Math.round(this.distance(topLeft, bottomLeft) / moduleSize); - var dimension = ((tltrCentersDimension + tlblCentersDimension) >> 1) + 7; - switch (dimension & 0x03) - { - - // mod 4 - case 0: - dimension++; - break; - // 1? do nothing - - case 2: - dimension--; - break; - - case 3: - throw "Error"; - } - return dimension; - } - - this.findAlignmentInRegion=function( overallEstModuleSize, estAlignmentX, estAlignmentY, allowanceFactor) - { - // Look for an alignment pattern (3 modules in size) around where it - // should be - var allowance = Math.floor (allowanceFactor * overallEstModuleSize); - var alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); - var alignmentAreaRightX = Math.min(qrcode.width - 1, estAlignmentX + allowance); - if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) - { - throw "Error"; - } - - var alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); - var alignmentAreaBottomY = Math.min(qrcode.height - 1, estAlignmentY + allowance); - - var alignmentFinder = new AlignmentPatternFinder(this.image, alignmentAreaLeftX, alignmentAreaTopY, alignmentAreaRightX - alignmentAreaLeftX, alignmentAreaBottomY - alignmentAreaTopY, overallEstModuleSize, this.resultPointCallback); - return alignmentFinder.find(); - } - - this.createTransform=function( topLeft, topRight, bottomLeft, alignmentPattern, dimension) - { - var dimMinusThree = dimension - 3.5; - var bottomRightX; - var bottomRightY; - var sourceBottomRightX; - var sourceBottomRightY; - if (alignmentPattern != null) - { - bottomRightX = alignmentPattern.X; - bottomRightY = alignmentPattern.Y; - sourceBottomRightX = sourceBottomRightY = dimMinusThree - 3.0; - } - else - { - // Don't have an alignment pattern, just make up the bottom-right point - bottomRightX = (topRight.X - topLeft.X) + bottomLeft.X; - bottomRightY = (topRight.Y - topLeft.Y) + bottomLeft.Y; - sourceBottomRightX = sourceBottomRightY = dimMinusThree; - } - - var transform = PerspectiveTransform.quadrilateralToQuadrilateral(3.5, 3.5, dimMinusThree, 3.5, sourceBottomRightX, sourceBottomRightY, 3.5, dimMinusThree, topLeft.X, topLeft.Y, topRight.X, topRight.Y, bottomRightX, bottomRightY, bottomLeft.X, bottomLeft.Y); - - return transform; - } - - this.sampleGrid=function( image, transform, dimension) - { - - var sampler = GridSampler; - return sampler.sampleGrid3(image, dimension, transform); - } - - this.processFinderPatternInfo = function( info) - { - - var topLeft = info.TopLeft; - var topRight = info.TopRight; - var bottomLeft = info.BottomLeft; - - var moduleSize = this.calculateModuleSize(topLeft, topRight, bottomLeft); - if (moduleSize < 1.0) - { - throw "Error"; - } - var dimension = this.computeDimension(topLeft, topRight, bottomLeft, moduleSize); - var provisionalVersion = Version.getProvisionalVersionForDimension(dimension); - var modulesBetweenFPCenters = provisionalVersion.DimensionForVersion - 7; - - var alignmentPattern = null; - // Anything above version 1 has an alignment pattern - if (provisionalVersion.AlignmentPatternCenters.length > 0) - { - - // Guess where a "bottom right" finder pattern would have been - var bottomRightX = topRight.X - topLeft.X + bottomLeft.X; - var bottomRightY = topRight.Y - topLeft.Y + bottomLeft.Y; - - // Estimate that alignment pattern is closer by 3 modules - // from "bottom right" to known top left location - var correctionToTopLeft = 1.0 - 3.0 / modulesBetweenFPCenters; - var estAlignmentX = Math.floor (topLeft.X + correctionToTopLeft * (bottomRightX - topLeft.X)); - var estAlignmentY = Math.floor (topLeft.Y + correctionToTopLeft * (bottomRightY - topLeft.Y)); - - // Kind of arbitrary -- expand search radius before giving up - for (var i = 4; i <= 16; i <<= 1) - { - //try - //{ - alignmentPattern = this.findAlignmentInRegion(moduleSize, estAlignmentX, estAlignmentY, i); - break; - //} - //catch (re) - //{ - // try next round - //} - } - // If we didn't find alignment pattern... well try anyway without it - } - - var transform = this.createTransform(topLeft, topRight, bottomLeft, alignmentPattern, dimension); - - var bits = this.sampleGrid(this.image, transform, dimension); - - var points; - if (alignmentPattern == null) - { - points = new Array(bottomLeft, topLeft, topRight); - } - else - { - points = new Array(bottomLeft, topLeft, topRight, alignmentPattern); - } - return new DetectorResult(bits, points); - } - - - - this.detect=function() - { - var info = new FinderPatternFinder().findFinderPattern(this.image); - - return this.processFinderPatternInfo(info); - } -} -// Source: public/src/js/jsqrcode/formatinf.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -var FORMAT_INFO_MASK_QR = 0x5412; -var FORMAT_INFO_DECODE_LOOKUP = new Array(new Array(0x5412, 0x00), new Array(0x5125, 0x01), new Array(0x5E7C, 0x02), new Array(0x5B4B, 0x03), new Array(0x45F9, 0x04), new Array(0x40CE, 0x05), new Array(0x4F97, 0x06), new Array(0x4AA0, 0x07), new Array(0x77C4, 0x08), new Array(0x72F3, 0x09), new Array(0x7DAA, 0x0A), new Array(0x789D, 0x0B), new Array(0x662F, 0x0C), new Array(0x6318, 0x0D), new Array(0x6C41, 0x0E), new Array(0x6976, 0x0F), new Array(0x1689, 0x10), new Array(0x13BE, 0x11), new Array(0x1CE7, 0x12), new Array(0x19D0, 0x13), new Array(0x0762, 0x14), new Array(0x0255, 0x15), new Array(0x0D0C, 0x16), new Array(0x083B, 0x17), new Array(0x355F, 0x18), new Array(0x3068, 0x19), new Array(0x3F31, 0x1A), new Array(0x3A06, 0x1B), new Array(0x24B4, 0x1C), new Array(0x2183, 0x1D), new Array(0x2EDA, 0x1E), new Array(0x2BED, 0x1F)); -var BITS_SET_IN_HALF_BYTE = new Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); - - -function FormatInformation(formatInfo) -{ - this.errorCorrectionLevel = ErrorCorrectionLevel.forBits((formatInfo >> 3) & 0x03); - this.dataMask = (formatInfo & 0x07); - - this.__defineGetter__("ErrorCorrectionLevel", function() - { - return this.errorCorrectionLevel; - }); - this.__defineGetter__("DataMask", function() - { - return this.dataMask; - }); - this.GetHashCode=function() - { - return (this.errorCorrectionLevel.ordinal() << 3) | dataMask; - } - this.Equals=function( o) - { - var other = o; - return this.errorCorrectionLevel == other.errorCorrectionLevel && this.dataMask == other.dataMask; - } -} - -FormatInformation.numBitsDiffering=function( a, b) -{ - a ^= b; // a now has a 1 bit exactly where its bit differs with b's - // Count bits set quickly with a series of lookups: - return BITS_SET_IN_HALF_BYTE[a & 0x0F] + BITS_SET_IN_HALF_BYTE[(URShift(a, 4) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 8) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 12) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 16) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 20) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 24) & 0x0F)] + BITS_SET_IN_HALF_BYTE[(URShift(a, 28) & 0x0F)]; -} - -FormatInformation.decodeFormatInformation=function( maskedFormatInfo) -{ - var formatInfo = FormatInformation.doDecodeFormatInformation(maskedFormatInfo); - if (formatInfo != null) - { - return formatInfo; - } - // Should return null, but, some QR codes apparently - // do not mask this info. Try again by actually masking the pattern - // first - return FormatInformation.doDecodeFormatInformation(maskedFormatInfo ^ FORMAT_INFO_MASK_QR); -} -FormatInformation.doDecodeFormatInformation=function( maskedFormatInfo) -{ - // Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing - var bestDifference = 0xffffffff; - var bestFormatInfo = 0; - for (var i = 0; i < FORMAT_INFO_DECODE_LOOKUP.length; i++) - { - var decodeInfo = FORMAT_INFO_DECODE_LOOKUP[i]; - var targetInfo = decodeInfo[0]; - if (targetInfo == maskedFormatInfo) - { - // Found an exact match - return new FormatInformation(decodeInfo[1]); - } - var bitsDifference = this.numBitsDiffering(maskedFormatInfo, targetInfo); - if (bitsDifference < bestDifference) - { - bestFormatInfo = decodeInfo[1]; - bestDifference = bitsDifference; - } - } - // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits - // differing means we found a match - if (bestDifference <= 3) - { - return new FormatInformation(bestFormatInfo); - } - return null; -} - - -// Source: public/src/js/jsqrcode/errorlevel.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function ErrorCorrectionLevel(ordinal, bits, name) -{ - this.ordinal_Renamed_Field = ordinal; - this.bits = bits; - this.name = name; - this.__defineGetter__("Bits", function() - { - return this.bits; - }); - this.__defineGetter__("Name", function() - { - return this.name; - }); - this.ordinal=function() - { - return this.ordinal_Renamed_Field; - } -} - -ErrorCorrectionLevel.forBits=function( bits) -{ - if (bits < 0 || bits >= FOR_BITS.length) - { - throw "ArgumentException"; - } - return FOR_BITS[bits]; -} - -var L = new ErrorCorrectionLevel(0, 0x01, "L"); -var M = new ErrorCorrectionLevel(1, 0x00, "M"); -var Q = new ErrorCorrectionLevel(2, 0x03, "Q"); -var H = new ErrorCorrectionLevel(3, 0x02, "H"); -var FOR_BITS = new Array( M, L, H, Q); - -// Source: public/src/js/jsqrcode/bitmat.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function BitMatrix( width, height) -{ - if(!height) - height=width; - if (width < 1 || height < 1) - { - throw "Both dimensions must be greater than 0"; - } - this.width = width; - this.height = height; - var rowSize = width >> 5; - if ((width & 0x1f) != 0) - { - rowSize++; - } - this.rowSize = rowSize; - this.bits = new Array(rowSize * height); - for(var i=0;i> 5); - return ((URShift(this.bits[offset], (x & 0x1f))) & 1) != 0; - } - this.set_Renamed=function( x, y) - { - var offset = y * this.rowSize + (x >> 5); - this.bits[offset] |= 1 << (x & 0x1f); - } - this.flip=function( x, y) - { - var offset = y * this.rowSize + (x >> 5); - this.bits[offset] ^= 1 << (x & 0x1f); - } - this.clear=function() - { - var max = this.bits.length; - for (var i = 0; i < max; i++) - { - this.bits[i] = 0; - } - } - this.setRegion=function( left, top, width, height) - { - if (top < 0 || left < 0) - { - throw "Left and top must be nonnegative"; - } - if (height < 1 || width < 1) - { - throw "Height and width must be at least 1"; - } - var right = left + width; - var bottom = top + height; - if (bottom > this.height || right > this.width) - { - throw "The region must fit inside the matrix"; - } - for (var y = top; y < bottom; y++) - { - var offset = y * this.rowSize; - for (var x = left; x < right; x++) - { - this.bits[offset + (x >> 5)] |= 1 << (x & 0x1f); - } - } - } -} -// Source: public/src/js/jsqrcode/datablock.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function DataBlock(numDataCodewords, codewords) -{ - this.numDataCodewords = numDataCodewords; - this.codewords = codewords; - - this.__defineGetter__("NumDataCodewords", function() - { - return this.numDataCodewords; - }); - this.__defineGetter__("Codewords", function() - { - return this.codewords; - }); -} - -DataBlock.getDataBlocks=function(rawCodewords, version, ecLevel) -{ - - if (rawCodewords.length != version.TotalCodewords) - { - throw "ArgumentException"; - } - - // Figure out the number and size of data blocks used by this version and - // error correction level - var ecBlocks = version.getECBlocksForLevel(ecLevel); - - // First count the total number of data blocks - var totalBlocks = 0; - var ecBlockArray = ecBlocks.getECBlocks(); - for (var i = 0; i < ecBlockArray.length; i++) - { - totalBlocks += ecBlockArray[i].Count; - } - - // Now establish DataBlocks of the appropriate size and number of data codewords - var result = new Array(totalBlocks); - var numResultBlocks = 0; - for (var j = 0; j < ecBlockArray.length; j++) - { - var ecBlock = ecBlockArray[j]; - for (var i = 0; i < ecBlock.Count; i++) - { - var numDataCodewords = ecBlock.DataCodewords; - var numBlockCodewords = ecBlocks.ECCodewordsPerBlock + numDataCodewords; - result[numResultBlocks++] = new DataBlock(numDataCodewords, new Array(numBlockCodewords)); - } - } - - // All blocks have the same amount of data, except that the last n - // (where n may be 0) have 1 more byte. Figure out where these start. - var shorterBlocksTotalCodewords = result[0].codewords.length; - var longerBlocksStartAt = result.length - 1; - while (longerBlocksStartAt >= 0) - { - var numCodewords = result[longerBlocksStartAt].codewords.length; - if (numCodewords == shorterBlocksTotalCodewords) - { - break; - } - longerBlocksStartAt--; - } - longerBlocksStartAt++; - - var shorterBlocksNumDataCodewords = shorterBlocksTotalCodewords - ecBlocks.ECCodewordsPerBlock; - // The last elements of result may be 1 element longer; - // first fill out as many elements as all of them have - var rawCodewordsOffset = 0; - for (var i = 0; i < shorterBlocksNumDataCodewords; i++) - { - for (var j = 0; j < numResultBlocks; j++) - { - result[j].codewords[i] = rawCodewords[rawCodewordsOffset++]; - } - } - // Fill out the last data block in the longer ones - for (var j = longerBlocksStartAt; j < numResultBlocks; j++) - { - result[j].codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset++]; - } - // Now add in error correction blocks - var max = result[0].codewords.length; - for (var i = shorterBlocksNumDataCodewords; i < max; i++) - { - for (var j = 0; j < numResultBlocks; j++) - { - var iOffset = j < longerBlocksStartAt?i:i + 1; - result[j].codewords[iOffset] = rawCodewords[rawCodewordsOffset++]; - } - } - return result; -} - -// Source: public/src/js/jsqrcode/bmparser.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function BitMatrixParser(bitMatrix) -{ - var dimension = bitMatrix.Dimension; - if (dimension < 21 || (dimension & 0x03) != 1) - { - throw "Error BitMatrixParser"; - } - this.bitMatrix = bitMatrix; - this.parsedVersion = null; - this.parsedFormatInfo = null; - - this.copyBit=function( i, j, versionBits) - { - return this.bitMatrix.get_Renamed(i, j)?(versionBits << 1) | 0x1:versionBits << 1; - } - - this.readFormatInformation=function() - { - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - - // Read top-left format info bits - var formatInfoBits = 0; - for (var i = 0; i < 6; i++) - { - formatInfoBits = this.copyBit(i, 8, formatInfoBits); - } - // .. and skip a bit in the timing pattern ... - formatInfoBits = this.copyBit(7, 8, formatInfoBits); - formatInfoBits = this.copyBit(8, 8, formatInfoBits); - formatInfoBits = this.copyBit(8, 7, formatInfoBits); - // .. and skip a bit in the timing pattern ... - for (var j = 5; j >= 0; j--) - { - formatInfoBits = this.copyBit(8, j, formatInfoBits); - } - - this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits); - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - - // Hmm, failed. Try the top-right/bottom-left pattern - var dimension = this.bitMatrix.Dimension; - formatInfoBits = 0; - var iMin = dimension - 8; - for (var i = dimension - 1; i >= iMin; i--) - { - formatInfoBits = this.copyBit(i, 8, formatInfoBits); - } - for (var j = dimension - 7; j < dimension; j++) - { - formatInfoBits = this.copyBit(8, j, formatInfoBits); - } - - this.parsedFormatInfo = FormatInformation.decodeFormatInformation(formatInfoBits); - if (this.parsedFormatInfo != null) - { - return this.parsedFormatInfo; - } - throw "Error readFormatInformation"; - } - this.readVersion=function() - { - - if (this.parsedVersion != null) - { - return this.parsedVersion; - } - - var dimension = this.bitMatrix.Dimension; - - var provisionalVersion = (dimension - 17) >> 2; - if (provisionalVersion <= 6) - { - return Version.getVersionForNumber(provisionalVersion); - } - - // Read top-right version info: 3 wide by 6 tall - var versionBits = 0; - var ijMin = dimension - 11; - for (var j = 5; j >= 0; j--) - { - for (var i = dimension - 9; i >= ijMin; i--) - { - versionBits = this.copyBit(i, j, versionBits); - } - } - - this.parsedVersion = Version.decodeVersionInformation(versionBits); - if (this.parsedVersion != null && this.parsedVersion.DimensionForVersion == dimension) - { - return this.parsedVersion; - } - - // Hmm, failed. Try bottom left: 6 wide by 3 tall - versionBits = 0; - for (var i = 5; i >= 0; i--) - { - for (var j = dimension - 9; j >= ijMin; j--) - { - versionBits = this.copyBit(i, j, versionBits); - } - } - - this.parsedVersion = Version.decodeVersionInformation(versionBits); - if (this.parsedVersion != null && this.parsedVersion.DimensionForVersion == dimension) - { - return this.parsedVersion; - } - throw "Error readVersion"; - } - this.readCodewords=function() - { - - var formatInfo = this.readFormatInformation(); - var version = this.readVersion(); - - // Get the data mask for the format used in this QR Code. This will exclude - // some bits from reading as we wind through the bit matrix. - var dataMask = DataMask.forReference( formatInfo.DataMask); - var dimension = this.bitMatrix.Dimension; - dataMask.unmaskBitMatrix(this.bitMatrix, dimension); - - var functionPattern = version.buildFunctionPattern(); - - var readingUp = true; - var result = new Array(version.TotalCodewords); - var resultOffset = 0; - var currentByte = 0; - var bitsRead = 0; - // Read columns in pairs, from right to left - for (var j = dimension - 1; j > 0; j -= 2) - { - if (j == 6) - { - // Skip whole column with vertical alignment pattern; - // saves time and makes the other code proceed more cleanly - j--; - } - // Read alternatingly from bottom to top then top to bottom - for (var count = 0; count < dimension; count++) - { - var i = readingUp?dimension - 1 - count:count; - for (var col = 0; col < 2; col++) - { - // Ignore bits covered by the function pattern - if (!functionPattern.get_Renamed(j - col, i)) - { - // Read a bit - bitsRead++; - currentByte <<= 1; - if (this.bitMatrix.get_Renamed(j - col, i)) - { - currentByte |= 1; - } - // If we've made a whole byte, save it off - if (bitsRead == 8) - { - result[resultOffset++] = currentByte; - bitsRead = 0; - currentByte = 0; - } - } - } - } - readingUp ^= true; // readingUp = !readingUp; // switch directions - } - if (resultOffset != version.TotalCodewords) - { - throw "Error readCodewords"; - } - return result; - } -} -// Source: public/src/js/jsqrcode/datamask.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -DataMask = {}; - -DataMask.forReference = function(reference) -{ - if (reference < 0 || reference > 7) - { - throw "System.ArgumentException"; - } - return DataMask.DATA_MASKS[reference]; -} - -function DataMask000() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return ((i + j) & 0x01) == 0; - } -} - -function DataMask001() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (i & 0x01) == 0; - } -} - -function DataMask010() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return j % 3 == 0; - } -} - -function DataMask011() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (i + j) % 3 == 0; - } -} - -function DataMask100() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return (((URShift(i, 1)) + (j / 3)) & 0x01) == 0; - } -} - -function DataMask101() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - var temp = i * j; - return (temp & 0x01) + (temp % 3) == 0; - } -} - -function DataMask110() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - var temp = i * j; - return (((temp & 0x01) + (temp % 3)) & 0x01) == 0; - } -} -function DataMask111() -{ - this.unmaskBitMatrix=function(bits, dimension) - { - for (var i = 0; i < dimension; i++) - { - for (var j = 0; j < dimension; j++) - { - if (this.isMasked(i, j)) - { - bits.flip(j, i); - } - } - } - } - this.isMasked=function( i, j) - { - return ((((i + j) & 0x01) + ((i * j) % 3)) & 0x01) == 0; - } -} - -DataMask.DATA_MASKS = new Array(new DataMask000(), new DataMask001(), new DataMask010(), new DataMask011(), new DataMask100(), new DataMask101(), new DataMask110(), new DataMask111()); - - -// Source: public/src/js/jsqrcode/rsdecoder.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function ReedSolomonDecoder(field) -{ - this.field = field; - this.decode=function(received, twoS) - { - var poly = new GF256Poly(this.field, received); - var syndromeCoefficients = new Array(twoS); - for(var i=0;i= b's - if (a.Degree < b.Degree) - { - var temp = a; - a = b; - b = temp; - } - - var rLast = a; - var r = b; - var sLast = this.field.One; - var s = this.field.Zero; - var tLast = this.field.Zero; - var t = this.field.One; - - // Run Euclidean algorithm until r's degree is less than R/2 - while (r.Degree >= Math.floor(R / 2)) - { - var rLastLast = rLast; - var sLastLast = sLast; - var tLastLast = tLast; - rLast = r; - sLast = s; - tLast = t; - - // Divide rLastLast by rLast, with quotient in q and remainder in r - if (rLast.Zero) - { - // Oops, Euclidean algorithm already terminated? - throw "r_{i-1} was zero"; - } - r = rLastLast; - var q = this.field.Zero; - var denominatorLeadingTerm = rLast.getCoefficient(rLast.Degree); - var dltInverse = this.field.inverse(denominatorLeadingTerm); - while (r.Degree >= rLast.Degree && !r.Zero) - { - var degreeDiff = r.Degree - rLast.Degree; - var scale = this.field.multiply(r.getCoefficient(r.Degree), dltInverse); - q = q.addOrSubtract(this.field.buildMonomial(degreeDiff, scale)); - r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale)); - //r.EXE(); - } - - s = q.multiply1(sLast).addOrSubtract(sLastLast); - t = q.multiply1(tLast).addOrSubtract(tLastLast); - } - - var sigmaTildeAtZero = t.getCoefficient(0); - if (sigmaTildeAtZero == 0) - { - throw "ReedSolomonException sigmaTilde(0) was zero"; - } - - var inverse = this.field.inverse(sigmaTildeAtZero); - var sigma = t.multiply2(inverse); - var omega = r.multiply2(inverse); - return new Array(sigma, omega); - } - this.findErrorLocations=function( errorLocator) - { - // This is a direct application of Chien's search - var numErrors = errorLocator.Degree; - if (numErrors == 1) - { - // shortcut - return new Array(errorLocator.getCoefficient(1)); - } - var result = new Array(numErrors); - var e = 0; - for (var i = 1; i < 256 && e < numErrors; i++) - { - if (errorLocator.evaluateAt(i) == 0) - { - result[e] = this.field.inverse(i); - e++; - } - } - if (e != numErrors) - { - throw "Error locator degree does not match number of roots"; - } - return result; - } - this.findErrorMagnitudes=function( errorEvaluator, errorLocations, dataMatrix) - { - // This is directly applying Forney's Formula - var s = errorLocations.length; - var result = new Array(s); - for (var i = 0; i < s; i++) - { - var xiInverse = this.field.inverse(errorLocations[i]); - var denominator = 1; - for (var j = 0; j < s; j++) - { - if (i != j) - { - denominator = this.field.multiply(denominator, GF256.addOrSubtract(1, this.field.multiply(errorLocations[j], xiInverse))); - } - } - result[i] = this.field.multiply(errorEvaluator.evaluateAt(xiInverse), this.field.inverse(denominator)); - // Thanks to sanfordsquires for this fix: - if (dataMatrix) - { - result[i] = this.field.multiply(result[i], xiInverse); - } - } - return result; - } -} -// Source: public/src/js/jsqrcode/gf256poly.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function GF256Poly(field, coefficients) -{ - if (coefficients == null || coefficients.length == 0) - { - throw "System.ArgumentException"; - } - this.field = field; - var coefficientsLength = coefficients.length; - if (coefficientsLength > 1 && coefficients[0] == 0) - { - // Leading term must be non-zero for anything except the constant polynomial "0" - var firstNonZero = 1; - while (firstNonZero < coefficientsLength && coefficients[firstNonZero] == 0) - { - firstNonZero++; - } - if (firstNonZero == coefficientsLength) - { - this.coefficients = field.Zero.coefficients; - } - else - { - this.coefficients = new Array(coefficientsLength - firstNonZero); - for(var i=0;i largerCoefficients.length) - { - var temp = smallerCoefficients; - smallerCoefficients = largerCoefficients; - largerCoefficients = temp; - } - var sumDiff = new Array(largerCoefficients.length); - var lengthDiff = largerCoefficients.length - smallerCoefficients.length; - // Copy high-order terms only found in higher-degree polynomial's coefficients - //Array.Copy(largerCoefficients, 0, sumDiff, 0, lengthDiff); - for(var ci=0;ci= other.Degree && !remainder.Zero) - { - var degreeDifference = remainder.Degree - other.Degree; - var scale = this.field.multiply(remainder.getCoefficient(remainder.Degree), inverseDenominatorLeadingTerm); - var term = other.multiplyByMonomial(degreeDifference, scale); - var iterationQuotient = this.field.buildMonomial(degreeDifference, scale); - quotient = quotient.addOrSubtract(iterationQuotient); - remainder = remainder.addOrSubtract(term); - } - - return new Array(quotient, remainder); - } -} -// Source: public/src/js/jsqrcode/gf256.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function GF256( primitive) -{ - this.expTable = new Array(256); - this.logTable = new Array(256); - var x = 1; - for (var i = 0; i < 256; i++) - { - this.expTable[i] = x; - x <<= 1; // x = x * 2; we're assuming the generator alpha is 2 - if (x >= 0x100) - { - x ^= primitive; - } - } - for (var i = 0; i < 255; i++) - { - this.logTable[this.expTable[i]] = i; - } - // logTable[0] == 0 but this should never be used - var at0=new Array(1);at0[0]=0; - this.zero = new GF256Poly(this, new Array(at0)); - var at1=new Array(1);at1[0]=1; - this.one = new GF256Poly(this, new Array(at1)); - - this.__defineGetter__("Zero", function() - { - return this.zero; - }); - this.__defineGetter__("One", function() - { - return this.one; - }); - this.buildMonomial=function( degree, coefficient) - { - if (degree < 0) - { - throw "System.ArgumentException"; - } - if (coefficient == 0) - { - return zero; - } - var coefficients = new Array(degree + 1); - for(var i=0;iqrcode.maxImgSize) - { - var ir = image.width / image.height; - nheight = Math.sqrt(qrcode.maxImgSize/ir); - nwidth=ir*nheight; - } - - canvas_qr.width = nwidth; - canvas_qr.height = nheight; - - context.drawImage(image, 0, 0, canvas_qr.width, canvas_qr.height ); - qrcode.width = canvas_qr.width; - qrcode.height = canvas_qr.height; - try{ - qrcode.imagedata = context.getImageData(0, 0, canvas_qr.width, canvas_qr.height); - }catch(e){ - qrcode.result = "Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!"; - if(qrcode.callback!=null) - qrcode.callback(qrcode.result); - return; - } - - try - { - qrcode.result = qrcode.process(context); - } - catch(e) - { - console.log(e); - qrcode.result = "error decoding QR Code"; - } - if(qrcode.callback!=null) - qrcode.callback(qrcode.result); - } - image.src = src; - } -} - -qrcode.isUrl = function(s) -{ - var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; - return regexp.test(s); -} - -qrcode.decode_url = function (s) -{ - var escaped = ""; - try{ - escaped = escape( s ); - } - catch(e) - { - console.log(e); - escaped = s; - } - var ret = ""; - try{ - ret = decodeURIComponent( escaped ); - } - catch(e) - { - console.log(e); - ret = escaped; - } - return ret; -} - -qrcode.decode_utf8 = function ( s ) -{ - if(qrcode.isUrl(s)) - return qrcode.decode_url(s); - else - return s; -} - -qrcode.process = function(ctx){ - - var start = new Date().getTime(); - - var image = qrcode.grayScaleToBitmap(qrcode.grayscale()); - //var image = qrcode.binarize(128); - - if(qrcode.debug) - { - for (var y = 0; y < qrcode.height; y++) - { - for (var x = 0; x < qrcode.width; x++) - { - var point = (x * 4) + (y * qrcode.width * 4); - qrcode.imagedata.data[point] = image[x+y*qrcode.width]?0:0; - qrcode.imagedata.data[point+1] = image[x+y*qrcode.width]?0:0; - qrcode.imagedata.data[point+2] = image[x+y*qrcode.width]?255:0; - } - } - ctx.putImageData(qrcode.imagedata, 0, 0); - } - - //var finderPatternInfo = new FinderPatternFinder().findFinderPattern(image); - - var detector = new Detector(image); - - var qRCodeMatrix = detector.detect(); - - /*for (var y = 0; y < qRCodeMatrix.bits.Height; y++) - { - for (var x = 0; x < qRCodeMatrix.bits.Width; x++) - { - var point = (x * 4*2) + (y*2 * qrcode.width * 4); - qrcode.imagedata.data[point] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0; - qrcode.imagedata.data[point+1] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0; - qrcode.imagedata.data[point+2] = qRCodeMatrix.bits.get_Renamed(x,y)?255:0; - } - }*/ - if(qrcode.debug) - ctx.putImageData(qrcode.imagedata, 0, 0); - - var reader = Decoder.decode(qRCodeMatrix.bits); - var data = reader.DataByte; - var str=""; - for(var i=0;i minmax[ax][ay][1]) - minmax[ax][ay][1] = target; - } - } - //minmax[ax][ay][0] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2; - } - } - var middle = new Array(numSqrtArea); - for (var i3 = 0; i3 < numSqrtArea; i3++) - { - middle[i3] = new Array(numSqrtArea); - } - for (var ay = 0; ay < numSqrtArea; ay++) - { - for (var ax = 0; ax < numSqrtArea; ax++) - { - middle[ax][ay] = Math.floor((minmax[ax][ay][0] + minmax[ax][ay][1]) / 2); - //Console.out.print(middle[ax][ay] + ","); - } - //Console.out.println(""); - } - //Console.out.println(""); - - return middle; -} - -qrcode.grayScaleToBitmap=function(grayScale) -{ - var middle = qrcode.getMiddleBrightnessPerArea(grayScale); - var sqrtNumArea = middle.length; - var areaWidth = Math.floor(qrcode.width / sqrtNumArea); - var areaHeight = Math.floor(qrcode.height / sqrtNumArea); - var bitmap = new Array(qrcode.height*qrcode.width); - - for (var ay = 0; ay < sqrtNumArea; ay++) - { - for (var ax = 0; ax < sqrtNumArea; ax++) - { - for (var dy = 0; dy < areaHeight; dy++) - { - for (var dx = 0; dx < areaWidth; dx++) - { - bitmap[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] = (grayScale[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] < middle[ax][ay])?true:false; - } - } - } - } - return bitmap; -} - -qrcode.grayscale = function(){ - var ret = new Array(qrcode.width*qrcode.height); - for (var y = 0; y < qrcode.height; y++) - { - for (var x = 0; x < qrcode.width; x++) - { - var gray = qrcode.getPixel(x, y); - - ret[x+y*qrcode.width] = gray; - } - } - return ret; -} - - - - -function URShift( number, bits) -{ - if (number >= 0) - return number >> bits; - else - return (number >> bits) + (2 << ~bits); -} - - -Array.prototype.remove = function(from, to) { - var rest = this.slice((to || from) + 1 || this.length); - this.length = from < 0 ? this.length + from : from; - return this.push.apply(this, rest); -}; - -// Source: public/src/js/jsqrcode/findpat.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -var MIN_SKIP = 3; -var MAX_MODULES = 57; -var INTEGER_MATH_SHIFT = 8; -var CENTER_QUORUM = 2; - -qrcode.orderBestPatterns=function(patterns) - { - - function distance( pattern1, pattern2) - { - xDiff = pattern1.X - pattern2.X; - yDiff = pattern1.Y - pattern2.Y; - return Math.sqrt( (xDiff * xDiff + yDiff * yDiff)); - } - - /// Returns the z component of the cross product between vectors BC and BA. - function crossProductZ( pointA, pointB, pointC) - { - var bX = pointB.x; - var bY = pointB.y; - return ((pointC.x - bX) * (pointA.y - bY)) - ((pointC.y - bY) * (pointA.x - bX)); - } - - - // Find distances between pattern centers - var zeroOneDistance = distance(patterns[0], patterns[1]); - var oneTwoDistance = distance(patterns[1], patterns[2]); - var zeroTwoDistance = distance(patterns[0], patterns[2]); - - var pointA, pointB, pointC; - // Assume one closest to other two is B; A and C will just be guesses at first - if (oneTwoDistance >= zeroOneDistance && oneTwoDistance >= zeroTwoDistance) - { - pointB = patterns[0]; - pointA = patterns[1]; - pointC = patterns[2]; - } - else if (zeroTwoDistance >= oneTwoDistance && zeroTwoDistance >= zeroOneDistance) - { - pointB = patterns[1]; - pointA = patterns[0]; - pointC = patterns[2]; - } - else - { - pointB = patterns[2]; - pointA = patterns[0]; - pointC = patterns[1]; - } - - // Use cross product to figure out whether A and C are correct or flipped. - // This asks whether BC x BA has a positive z component, which is the arrangement - // we want for A, B, C. If it's negative, then we've got it flipped around and - // should swap A and C. - if (crossProductZ(pointA, pointB, pointC) < 0.0) - { - var temp = pointA; - pointA = pointC; - pointC = temp; - } - - patterns[0] = pointA; - patterns[1] = pointB; - patterns[2] = pointC; - } - - -function FinderPattern(posX, posY, estimatedModuleSize) -{ - this.x=posX; - this.y=posY; - this.count = 1; - this.estimatedModuleSize = estimatedModuleSize; - - this.__defineGetter__("EstimatedModuleSize", function() - { - return this.estimatedModuleSize; - }); - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("X", function() - { - return this.x; - }); - this.__defineGetter__("Y", function() - { - return this.y; - }); - this.incrementCount = function() - { - this.count++; - } - this.aboutEquals=function( moduleSize, i, j) - { - if (Math.abs(i - this.y) <= moduleSize && Math.abs(j - this.x) <= moduleSize) - { - var moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff / this.estimatedModuleSize <= 1.0; - } - return false; - } - -} - -function FinderPatternInfo(patternCenters) -{ - this.bottomLeft = patternCenters[0]; - this.topLeft = patternCenters[1]; - this.topRight = patternCenters[2]; - this.__defineGetter__("BottomLeft", function() - { - return this.bottomLeft; - }); - this.__defineGetter__("TopLeft", function() - { - return this.topLeft; - }); - this.__defineGetter__("TopRight", function() - { - return this.topRight; - }); -} - -function FinderPatternFinder() -{ - this.image=null; - this.possibleCenters = []; - this.hasSkipped = false; - this.crossCheckStateCount = new Array(0,0,0,0,0); - this.resultPointCallback = null; - - this.__defineGetter__("CrossCheckStateCount", function() - { - this.crossCheckStateCount[0] = 0; - this.crossCheckStateCount[1] = 0; - this.crossCheckStateCount[2] = 0; - this.crossCheckStateCount[3] = 0; - this.crossCheckStateCount[4] = 0; - return this.crossCheckStateCount; - }); - - this.foundPatternCross=function( stateCount) - { - var totalModuleSize = 0; - for (var i = 0; i < 5; i++) - { - var count = stateCount[i]; - if (count == 0) - { - return false; - } - totalModuleSize += count; - } - if (totalModuleSize < 7) - { - return false; - } - var moduleSize = Math.floor((totalModuleSize << INTEGER_MATH_SHIFT) / 7); - var maxVariance = Math.floor(moduleSize / 2); - // Allow less than 50% variance from 1-1-3-1-1 proportions - return Math.abs(moduleSize - (stateCount[0] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(moduleSize - (stateCount[1] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(3 * moduleSize - (stateCount[2] << INTEGER_MATH_SHIFT)) < 3 * maxVariance && Math.abs(moduleSize - (stateCount[3] << INTEGER_MATH_SHIFT)) < maxVariance && Math.abs(moduleSize - (stateCount[4] << INTEGER_MATH_SHIFT)) < maxVariance; - } - this.centerFromEnd=function( stateCount, end) - { - return (end - stateCount[4] - stateCount[3]) - stateCount[2] / 2.0; - } - this.crossCheckVertical=function( startI, centerJ, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxI = qrcode.height; - var stateCount = this.CrossCheckStateCount; - - // Start counting up from center - var i = startI; - while (i >= 0 && image[centerJ + i*qrcode.width]) - { - stateCount[2]++; - i--; - } - if (i < 0) - { - return NaN; - } - while (i >= 0 && !image[centerJ +i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (i >= 0 && image[centerJ + i*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image[centerJ +i*qrcode.width]) - { - stateCount[2]++; - i++; - } - if (i == maxI) - { - return NaN; - } - while (i < maxI && !image[centerJ + i*qrcode.width] && stateCount[3] < maxCount) - { - stateCount[3]++; - i++; - } - if (i == maxI || stateCount[3] >= maxCount) - { - return NaN; - } - while (i < maxI && image[centerJ + i*qrcode.width] && stateCount[4] < maxCount) - { - stateCount[4]++; - i++; - } - if (stateCount[4] >= maxCount) - { - return NaN; - } - - // If we found a finder-pattern-like section, but its size is more than 40% different than - // the original, assume it's a false positive - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, i):NaN; - } - this.crossCheckHorizontal=function( startJ, centerI, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxJ = qrcode.width; - var stateCount = this.CrossCheckStateCount; - - var j = startJ; - while (j >= 0 && image[j+ centerI*qrcode.width]) - { - stateCount[2]++; - j--; - } - if (j < 0) - { - return NaN; - } - while (j >= 0 && !image[j+ centerI*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - j--; - } - if (j < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (j >= 0 && image[j+ centerI*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - j--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - j = startJ + 1; - while (j < maxJ && image[j+ centerI*qrcode.width]) - { - stateCount[2]++; - j++; - } - if (j == maxJ) - { - return NaN; - } - while (j < maxJ && !image[j+ centerI*qrcode.width] && stateCount[3] < maxCount) - { - stateCount[3]++; - j++; - } - if (j == maxJ || stateCount[3] >= maxCount) - { - return NaN; - } - while (j < maxJ && image[j+ centerI*qrcode.width] && stateCount[4] < maxCount) - { - stateCount[4]++; - j++; - } - if (stateCount[4] >= maxCount) - { - return NaN; - } - - // If we found a finder-pattern-like section, but its size is significantly different than - // the original, assume it's a false positive - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, j):NaN; - } - this.handlePossibleCenter=function( stateCount, i, j) - { - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4]; - var centerJ = this.centerFromEnd(stateCount, j); //float - var centerI = this.crossCheckVertical(i, Math.floor( centerJ), stateCount[2], stateCountTotal); //float - if (!isNaN(centerI)) - { - // Re-cross check - centerJ = this.crossCheckHorizontal(Math.floor( centerJ), Math.floor( centerI), stateCount[2], stateCountTotal); - if (!isNaN(centerJ)) - { - var estimatedModuleSize = stateCountTotal / 7.0; - var found = false; - var max = this.possibleCenters.length; - for (var index = 0; index < max; index++) - { - var center = this.possibleCenters[index]; - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) - { - center.incrementCount(); - found = true; - break; - } - } - if (!found) - { - var point = new FinderPattern(centerJ, centerI, estimatedModuleSize); - this.possibleCenters.push(point); - if (this.resultPointCallback != null) - { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return true; - } - } - return false; - } - - this.selectBestPatterns=function() - { - - var startSize = this.possibleCenters.length; - if (startSize < 3) - { - // Couldn't find enough finder patterns - throw "Couldn't find enough finder patterns"; - } - - // Filter outlier possibilities whose module size is too different - if (startSize > 3) - { - // But we can only afford to do so if we have at least 4 possibilities to choose from - var totalModuleSize = 0.0; - var square = 0.0; - for (var i = 0; i < startSize; i++) - { - //totalModuleSize += this.possibleCenters[i].EstimatedModuleSize; - var centerValue=this.possibleCenters[i].EstimatedModuleSize; - totalModuleSize += centerValue; - square += (centerValue * centerValue); - } - var average = totalModuleSize / startSize; - this.possibleCenters.sort(function(center1,center2) { - var dA=Math.abs(center2.EstimatedModuleSize - average); - var dB=Math.abs(center1.EstimatedModuleSize - average); - if (dA < dB) { - return (-1); - } else if (dA == dB) { - return 0; - } else { - return 1; - } - }); - - var stdDev = Math.sqrt(square / startSize - average * average); - var limit = Math.max(0.2 * average, stdDev); - for (var i = 0; i < this.possibleCenters.length && this.possibleCenters.length > 3; i++) - { - var pattern = this.possibleCenters[i]; - //if (Math.abs(pattern.EstimatedModuleSize - average) > 0.2 * average) - if (Math.abs(pattern.EstimatedModuleSize - average) > limit) - { - this.possibleCenters.remove(i); - i--; - } - } - } - - if (this.possibleCenters.length > 3) - { - // Throw away all but those first size candidate points we found. - this.possibleCenters.sort(function(a, b){ - if (a.count > b.count){return -1;} - if (a.count < b.count){return 1;} - return 0; - }); - } - - return new Array( this.possibleCenters[0], this.possibleCenters[1], this.possibleCenters[2]); - } - - this.findRowSkip=function() - { - var max = this.possibleCenters.length; - if (max <= 1) - { - return 0; - } - var firstConfirmedCenter = null; - for (var i = 0; i < max; i++) - { - var center = this.possibleCenters[i]; - if (center.Count >= CENTER_QUORUM) - { - if (firstConfirmedCenter == null) - { - firstConfirmedCenter = center; - } - else - { - // We have two confirmed centers - // How far down can we skip before resuming looking for the next - // pattern? In the worst case, only the difference between the - // difference in the x / y coordinates of the two centers. - // This is the case where you find top left last. - this.hasSkipped = true; - return Math.floor ((Math.abs(firstConfirmedCenter.X - center.X) - Math.abs(firstConfirmedCenter.Y - center.Y)) / 2); - } - } - } - return 0; - } - - this.haveMultiplyConfirmedCenters=function() - { - var confirmedCount = 0; - var totalModuleSize = 0.0; - var max = this.possibleCenters.length; - for (var i = 0; i < max; i++) - { - var pattern = this.possibleCenters[i]; - if (pattern.Count >= CENTER_QUORUM) - { - confirmedCount++; - totalModuleSize += pattern.EstimatedModuleSize; - } - } - if (confirmedCount < 3) - { - return false; - } - // OK, we have at least 3 confirmed centers, but, it's possible that one is a "false positive" - // and that we need to keep looking. We detect this by asking if the estimated module sizes - // vary too much. We arbitrarily say that when the total deviation from average exceeds - // 5% of the total module size estimates, it's too much. - var average = totalModuleSize / max; - var totalDeviation = 0.0; - for (var i = 0; i < max; i++) - { - pattern = this.possibleCenters[i]; - totalDeviation += Math.abs(pattern.EstimatedModuleSize - average); - } - return totalDeviation <= 0.05 * totalModuleSize; - } - - this.findFinderPattern = function(image){ - var tryHarder = false; - this.image=image; - var maxI = qrcode.height; - var maxJ = qrcode.width; - var iSkip = Math.floor((3 * maxI) / (4 * MAX_MODULES)); - if (iSkip < MIN_SKIP || tryHarder) - { - iSkip = MIN_SKIP; - } - - var done = false; - var stateCount = new Array(5); - for (var i = iSkip - 1; i < maxI && !done; i += iSkip) - { - // Get a row of black/white values - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - var currentState = 0; - for (var j = 0; j < maxJ; j++) - { - if (image[j+i*qrcode.width] ) - { - // Black pixel - if ((currentState & 1) == 1) - { - // Counting white pixels - currentState++; - } - stateCount[currentState]++; - } - else - { - // White pixel - if ((currentState & 1) == 0) - { - // Counting black pixels - if (currentState == 4) - { - // A winner? - if (this.foundPatternCross(stateCount)) - { - // Yes - var confirmed = this.handlePossibleCenter(stateCount, i, j); - if (confirmed) - { - // Start examining every other line. Checking each line turned out to be too - // expensive and didn't improve performance. - iSkip = 2; - if (this.hasSkipped) - { - done = this.haveMultiplyConfirmedCenters(); - } - else - { - var rowSkip = this.findRowSkip(); - if (rowSkip > stateCount[2]) - { - // Skip rows between row of lower confirmed center - // and top of presumed third confirmed center - // but back up a bit to get a full chance of detecting - // it, entire width of center of finder pattern - - // Skip by rowSkip, but back off by stateCount[2] (size of last center - // of pattern we saw) to be conservative, and also back off by iSkip which - // is about to be re-added - i += rowSkip - stateCount[2] - iSkip; - j = maxJ - 1; - } - } - } - else - { - // Advance to next black pixel - do - { - j++; - } - while (j < maxJ && !image[j + i*qrcode.width]); - j--; // back up to that last white pixel - } - // Clear state to start looking again - currentState = 0; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - stateCount[3] = 0; - stateCount[4] = 0; - } - else - { - // No, shift counts back by two - stateCount[0] = stateCount[2]; - stateCount[1] = stateCount[3]; - stateCount[2] = stateCount[4]; - stateCount[3] = 1; - stateCount[4] = 0; - currentState = 3; - } - } - else - { - stateCount[++currentState]++; - } - } - else - { - // Counting white pixels - stateCount[currentState]++; - } - } - } - if (this.foundPatternCross(stateCount)) - { - var confirmed = this.handlePossibleCenter(stateCount, i, maxJ); - if (confirmed) - { - iSkip = stateCount[0]; - if (this.hasSkipped) - { - // Found a third one - done = haveMultiplyConfirmedCenters(); - } - } - } - } - - var patternInfo = this.selectBestPatterns(); - qrcode.orderBestPatterns(patternInfo); - - return new FinderPatternInfo(patternInfo); - }; -} - -// Source: public/src/js/jsqrcode/alignpat.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function AlignmentPattern(posX, posY, estimatedModuleSize) -{ - this.x=posX; - this.y=posY; - this.count = 1; - this.estimatedModuleSize = estimatedModuleSize; - - this.__defineGetter__("EstimatedModuleSize", function() - { - return this.estimatedModuleSize; - }); - this.__defineGetter__("Count", function() - { - return this.count; - }); - this.__defineGetter__("X", function() - { - return Math.floor(this.x); - }); - this.__defineGetter__("Y", function() - { - return Math.floor(this.y); - }); - this.incrementCount = function() - { - this.count++; - } - this.aboutEquals=function( moduleSize, i, j) - { - if (Math.abs(i - this.y) <= moduleSize && Math.abs(j - this.x) <= moduleSize) - { - var moduleSizeDiff = Math.abs(moduleSize - this.estimatedModuleSize); - return moduleSizeDiff <= 1.0 || moduleSizeDiff / this.estimatedModuleSize <= 1.0; - } - return false; - } - -} - -function AlignmentPatternFinder( image, startX, startY, width, height, moduleSize, resultPointCallback) -{ - this.image = image; - this.possibleCenters = new Array(); - this.startX = startX; - this.startY = startY; - this.width = width; - this.height = height; - this.moduleSize = moduleSize; - this.crossCheckStateCount = new Array(0,0,0); - this.resultPointCallback = resultPointCallback; - - this.centerFromEnd=function(stateCount, end) - { - return (end - stateCount[2]) - stateCount[1] / 2.0; - } - this.foundPatternCross = function(stateCount) - { - var moduleSize = this.moduleSize; - var maxVariance = moduleSize / 2.0; - for (var i = 0; i < 3; i++) - { - if (Math.abs(moduleSize - stateCount[i]) >= maxVariance) - { - return false; - } - } - return true; - } - - this.crossCheckVertical=function( startI, centerJ, maxCount, originalStateCountTotal) - { - var image = this.image; - - var maxI = qrcode.height; - var stateCount = this.crossCheckStateCount; - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - - // Start counting up from center - var i = startI; - while (i >= 0 && image[centerJ + i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i--; - } - // If already too many modules in this state or ran off the edge: - if (i < 0 || stateCount[1] > maxCount) - { - return NaN; - } - while (i >= 0 && !image[centerJ + i*qrcode.width] && stateCount[0] <= maxCount) - { - stateCount[0]++; - i--; - } - if (stateCount[0] > maxCount) - { - return NaN; - } - - // Now also count down from center - i = startI + 1; - while (i < maxI && image[centerJ + i*qrcode.width] && stateCount[1] <= maxCount) - { - stateCount[1]++; - i++; - } - if (i == maxI || stateCount[1] > maxCount) - { - return NaN; - } - while (i < maxI && !image[centerJ + i*qrcode.width] && stateCount[2] <= maxCount) - { - stateCount[2]++; - i++; - } - if (stateCount[2] > maxCount) - { - return NaN; - } - - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - if (5 * Math.abs(stateCountTotal - originalStateCountTotal) >= 2 * originalStateCountTotal) - { - return NaN; - } - - return this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount, i):NaN; - } - - this.handlePossibleCenter=function( stateCount, i, j) - { - var stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2]; - var centerJ = this.centerFromEnd(stateCount, j); - var centerI = this.crossCheckVertical(i, Math.floor (centerJ), 2 * stateCount[1], stateCountTotal); - if (!isNaN(centerI)) - { - var estimatedModuleSize = (stateCount[0] + stateCount[1] + stateCount[2]) / 3.0; - var max = this.possibleCenters.length; - for (var index = 0; index < max; index++) - { - var center = this.possibleCenters[index]; - // Look for about the same center and module size: - if (center.aboutEquals(estimatedModuleSize, centerI, centerJ)) - { - return new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - } - } - // Hadn't found this before; save it - var point = new AlignmentPattern(centerJ, centerI, estimatedModuleSize); - this.possibleCenters.push(point); - if (this.resultPointCallback != null) - { - this.resultPointCallback.foundPossibleResultPoint(point); - } - } - return null; - } - - this.find = function() - { - var startX = this.startX; - var height = this.height; - var maxJ = startX + width; - var middleI = startY + (height >> 1); - // We are looking for black/white/black modules in 1:1:1 ratio; - // this tracks the number of black/white/black modules seen so far - var stateCount = new Array(0,0,0); - for (var iGen = 0; iGen < height; iGen++) - { - // Search from middle outwards - var i = middleI + ((iGen & 0x01) == 0?((iGen + 1) >> 1):- ((iGen + 1) >> 1)); - stateCount[0] = 0; - stateCount[1] = 0; - stateCount[2] = 0; - var j = startX; - // Burn off leading white pixels before anything else; if we start in the middle of - // a white run, it doesn't make sense to count its length, since we don't know if the - // white run continued to the left of the start point - while (j < maxJ && !image[j + qrcode.width* i]) - { - j++; - } - var currentState = 0; - while (j < maxJ) - { - if (image[j + i*qrcode.width]) - { - // Black pixel - if (currentState == 1) - { - // Counting black pixels - stateCount[currentState]++; - } - else - { - // Counting white pixels - if (currentState == 2) - { - // A winner? - if (this.foundPatternCross(stateCount)) - { - // Yes - var confirmed = this.handlePossibleCenter(stateCount, i, j); - if (confirmed != null) - { - return confirmed; - } - } - stateCount[0] = stateCount[2]; - stateCount[1] = 1; - stateCount[2] = 0; - currentState = 1; - } - else - { - stateCount[++currentState]++; - } - } - } - else - { - // White pixel - if (currentState == 1) - { - // Counting black pixels - currentState++; - } - stateCount[currentState]++; - } - j++; - } - if (this.foundPatternCross(stateCount)) - { - var confirmed = this.handlePossibleCenter(stateCount, i, maxJ); - if (confirmed != null) - { - return confirmed; - } - } - } - - // Hmm, nothing we saw was observed and confirmed twice. If we had - // any guess at all, return it. - if (!(this.possibleCenters.length == 0)) - { - return this.possibleCenters[0]; - } - - throw "Couldn't find enough alignment patterns"; - } - -} -// Source: public/src/js/jsqrcode/databr.js -/* - Ported to JavaScript by Lazar Laszlo 2011 - - lazarsoft@gmail.com, www.lazarsoft.info - -*/ - -/* -* -* Copyright 2007 ZXing authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - - -function QRCodeDataBlockReader(blocks, version, numErrorCorrectionCode) -{ - this.blockPointer = 0; - this.bitPointer = 7; - this.dataLength = 0; - this.blocks = blocks; - this.numErrorCorrectionCode = numErrorCorrectionCode; - if (version <= 9) - this.dataLengthMode = 0; - else if (version >= 10 && version <= 26) - this.dataLengthMode = 1; - else if (version >= 27 && version <= 40) - this.dataLengthMode = 2; - - this.getNextBits = function( numBits) - { - var bits = 0; - if (numBits < this.bitPointer + 1) - { - // next word fits into current data block - var mask = 0; - for (var i = 0; i < numBits; i++) - { - mask += (1 << i); - } - mask <<= (this.bitPointer - numBits + 1); - - bits = (this.blocks[this.blockPointer] & mask) >> (this.bitPointer - numBits + 1); - this.bitPointer -= numBits; - return bits; - } - else if (numBits < this.bitPointer + 1 + 8) - { - // next word crosses 2 data blocks - var mask1 = 0; - for (var i = 0; i < this.bitPointer + 1; i++) - { - mask1 += (1 << i); - } - bits = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1)); - this.blockPointer++; - bits += ((this.blocks[this.blockPointer]) >> (8 - (numBits - (this.bitPointer + 1)))); - - this.bitPointer = this.bitPointer - numBits % 8; - if (this.bitPointer < 0) - { - this.bitPointer = 8 + this.bitPointer; - } - return bits; - } - else if (numBits < this.bitPointer + 1 + 16) - { - // next word crosses 3 data blocks - var mask1 = 0; // mask of first block - var mask3 = 0; // mask of 3rd block - //bitPointer + 1 : number of bits of the 1st block - //8 : number of the 2nd block (note that use already 8bits because next word uses 3 data blocks) - //numBits - (bitPointer + 1 + 8) : number of bits of the 3rd block - for (var i = 0; i < this.bitPointer + 1; i++) - { - mask1 += (1 << i); - } - var bitsFirstBlock = (this.blocks[this.blockPointer] & mask1) << (numBits - (this.bitPointer + 1)); - this.blockPointer++; - - var bitsSecondBlock = this.blocks[this.blockPointer] << (numBits - (this.bitPointer + 1 + 8)); - this.blockPointer++; - - for (var i = 0; i < numBits - (this.bitPointer + 1 + 8); i++) - { - mask3 += (1 << i); - } - mask3 <<= 8 - (numBits - (this.bitPointer + 1 + 8)); - var bitsThirdBlock = (this.blocks[this.blockPointer] & mask3) >> (8 - (numBits - (this.bitPointer + 1 + 8))); - - bits = bitsFirstBlock + bitsSecondBlock + bitsThirdBlock; - this.bitPointer = this.bitPointer - (numBits - 8) % 8; - if (this.bitPointer < 0) - { - this.bitPointer = 8 + this.bitPointer; - } - return bits; - } - else - { - return 0; - } - } - this.NextMode=function() - { - if ((this.blockPointer > this.blocks.length - this.numErrorCorrectionCode - 2)) - return 0; - else - return this.getNextBits(4); - } - this.getDataLength=function( modeIndicator) - { - var index = 0; - while (true) - { - if ((modeIndicator >> index) == 1) - break; - index++; - } - - return this.getNextBits(qrcode.sizeOfDataLengthInfo[this.dataLengthMode][index]); - } - this.getRomanAndFigureString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var strData = ""; - var tableRomanAndFigure = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' ', '$', '%', '*', '+', '-', '.', '/', ':'); - do - { - if (length > 1) - { - intData = this.getNextBits(11); - var firstLetter = Math.floor(intData / 45); - var secondLetter = intData % 45; - strData += tableRomanAndFigure[firstLetter]; - strData += tableRomanAndFigure[secondLetter]; - length -= 2; - } - else if (length == 1) - { - intData = this.getNextBits(6); - strData += tableRomanAndFigure[intData]; - length -= 1; - } - } - while (length > 0); - - return strData; - } - this.getFigureString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var strData = ""; - do - { - if (length >= 3) - { - intData = this.getNextBits(10); - if (intData < 100) - strData += "0"; - if (intData < 10) - strData += "0"; - length -= 3; - } - else if (length == 2) - { - intData = this.getNextBits(7); - if (intData < 10) - strData += "0"; - length -= 2; - } - else if (length == 1) - { - intData = this.getNextBits(4); - length -= 1; - } - strData += intData; - } - while (length > 0); - - return strData; - } - this.get8bitByteArray=function( dataLength) - { - var length = dataLength; - var intData = 0; - var output = new Array(); - - do - { - intData = this.getNextBits(8); - output.push( intData); - length--; - } - while (length > 0); - return output; - } - this.getKanjiString=function( dataLength) - { - var length = dataLength; - var intData = 0; - var unicodeString = ""; - do - { - intData = getNextBits(13); - var lowerByte = intData % 0xC0; - var higherByte = intData / 0xC0; - - var tempWord = (higherByte << 8) + lowerByte; - var shiftjisWord = 0; - if (tempWord + 0x8140 <= 0x9FFC) - { - // between 8140 - 9FFC on Shift_JIS character set - shiftjisWord = tempWord + 0x8140; - } - else - { - // between E040 - EBBF on Shift_JIS character set - shiftjisWord = tempWord + 0xC140; - } - - //var tempByte = new Array(0,0); - //tempByte[0] = (sbyte) (shiftjisWord >> 8); - //tempByte[1] = (sbyte) (shiftjisWord & 0xFF); - //unicodeString += new String(SystemUtils.ToCharArray(SystemUtils.ToByteArray(tempByte))); - unicodeString += String.fromCharCode(shiftjisWord); - length--; - } - while (length > 0); - - - return unicodeString; - } - - this.__defineGetter__("DataByte", function() - { - var output = new Array(); - var MODE_NUMBER = 1; - var MODE_ROMAN_AND_NUMBER = 2; - var MODE_8BIT_BYTE = 4; - var MODE_KANJI = 8; - do - { - var mode = this.NextMode(); - //canvas.println("mode: " + mode); - if (mode == 0) - { - if (output.length > 0) - break; - else - throw "Empty data block"; - } - //if (mode != 1 && mode != 2 && mode != 4 && mode != 8) - // break; - //} - if (mode != MODE_NUMBER && mode != MODE_ROMAN_AND_NUMBER && mode != MODE_8BIT_BYTE && mode != MODE_KANJI) - { - /* canvas.println("Invalid mode: " + mode); - mode = guessMode(mode); - canvas.println("Guessed mode: " + mode); */ - throw "Invalid mode: " + mode + " in (block:" + this.blockPointer + " bit:" + this.bitPointer + ")"; - } - dataLength = this.getDataLength(mode); - if (dataLength < 1) - throw "Invalid data length: " + dataLength; - //canvas.println("length: " + dataLength); - switch (mode) - { - - case MODE_NUMBER: - //canvas.println("Mode: Figure"); - var temp_str = this.getFigureString(dataLength); - var ta = new Array(temp_str.length); - for(var j=0;ja?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3);break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&ju(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,a._d=new Date(0/0),void 0;for(f=0;fg)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 00:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;ebx;x++)for(var i=this.alignmentPatternCenters[x]-2,y=0;max>y;y++)0==x&&(0==y||y==max-1)||x==max-1&&0==y||bitMatrix.setRegion(this.alignmentPatternCenters[y]-2,i,5,5);return bitMatrix.setRegion(6,9,1,dimension-17),bitMatrix.setRegion(9,6,dimension-17,1),this.versionNumber>6&&(bitMatrix.setRegion(dimension-11,0,3,6),bitMatrix.setRegion(0,dimension-11,6,3)),bitMatrix},this.getECBlocksForLevel=function(ecLevel){return this.ecBlocks[ecLevel.ordinal()]}}function buildVersions(){return new Array(new Version(1,new Array,new ECBlocks(7,new ECB(1,19)),new ECBlocks(10,new ECB(1,16)),new ECBlocks(13,new ECB(1,13)),new ECBlocks(17,new ECB(1,9))),new Version(2,new Array(6,18),new ECBlocks(10,new ECB(1,34)),new ECBlocks(16,new ECB(1,28)),new ECBlocks(22,new ECB(1,22)),new ECBlocks(28,new ECB(1,16))),new Version(3,new Array(6,22),new ECBlocks(15,new ECB(1,55)),new ECBlocks(26,new ECB(1,44)),new ECBlocks(18,new ECB(2,17)),new ECBlocks(22,new ECB(2,13))),new Version(4,new Array(6,26),new ECBlocks(20,new ECB(1,80)),new ECBlocks(18,new ECB(2,32)),new ECBlocks(26,new ECB(2,24)),new ECBlocks(16,new ECB(4,9))),new Version(5,new Array(6,30),new ECBlocks(26,new ECB(1,108)),new ECBlocks(24,new ECB(2,43)),new ECBlocks(18,new ECB(2,15),new ECB(2,16)),new ECBlocks(22,new ECB(2,11),new ECB(2,12))),new Version(6,new Array(6,34),new ECBlocks(18,new ECB(2,68)),new ECBlocks(16,new ECB(4,27)),new ECBlocks(24,new ECB(4,19)),new ECBlocks(28,new ECB(4,15))),new Version(7,new Array(6,22,38),new ECBlocks(20,new ECB(2,78)),new ECBlocks(18,new ECB(4,31)),new ECBlocks(18,new ECB(2,14),new ECB(4,15)),new ECBlocks(26,new ECB(4,13),new ECB(1,14))),new Version(8,new Array(6,24,42),new ECBlocks(24,new ECB(2,97)),new ECBlocks(22,new ECB(2,38),new ECB(2,39)),new ECBlocks(22,new ECB(4,18),new ECB(2,19)),new ECBlocks(26,new ECB(4,14),new ECB(2,15))),new Version(9,new Array(6,26,46),new ECBlocks(30,new ECB(2,116)),new ECBlocks(22,new ECB(3,36),new ECB(2,37)),new ECBlocks(20,new ECB(4,16),new ECB(4,17)),new ECBlocks(24,new ECB(4,12),new ECB(4,13))),new Version(10,new Array(6,28,50),new ECBlocks(18,new ECB(2,68),new ECB(2,69)),new ECBlocks(26,new ECB(4,43),new ECB(1,44)),new ECBlocks(24,new ECB(6,19),new ECB(2,20)),new ECBlocks(28,new ECB(6,15),new ECB(2,16))),new Version(11,new Array(6,30,54),new ECBlocks(20,new ECB(4,81)),new ECBlocks(30,new ECB(1,50),new ECB(4,51)),new ECBlocks(28,new ECB(4,22),new ECB(4,23)),new ECBlocks(24,new ECB(3,12),new ECB(8,13))),new Version(12,new Array(6,32,58),new ECBlocks(24,new ECB(2,92),new ECB(2,93)),new ECBlocks(22,new ECB(6,36),new ECB(2,37)),new ECBlocks(26,new ECB(4,20),new ECB(6,21)),new ECBlocks(28,new ECB(7,14),new ECB(4,15))),new Version(13,new Array(6,34,62),new ECBlocks(26,new ECB(4,107)),new ECBlocks(22,new ECB(8,37),new ECB(1,38)),new ECBlocks(24,new ECB(8,20),new ECB(4,21)),new ECBlocks(22,new ECB(12,11),new ECB(4,12))),new Version(14,new Array(6,26,46,66),new ECBlocks(30,new ECB(3,115),new ECB(1,116)),new ECBlocks(24,new ECB(4,40),new ECB(5,41)),new ECBlocks(20,new ECB(11,16),new ECB(5,17)),new ECBlocks(24,new ECB(11,12),new ECB(5,13))),new Version(15,new Array(6,26,48,70),new ECBlocks(22,new ECB(5,87),new ECB(1,88)),new ECBlocks(24,new ECB(5,41),new ECB(5,42)),new ECBlocks(30,new ECB(5,24),new ECB(7,25)),new ECBlocks(24,new ECB(11,12),new ECB(7,13))),new Version(16,new Array(6,26,50,74),new ECBlocks(24,new ECB(5,98),new ECB(1,99)),new ECBlocks(28,new ECB(7,45),new ECB(3,46)),new ECBlocks(24,new ECB(15,19),new ECB(2,20)),new ECBlocks(30,new ECB(3,15),new ECB(13,16))),new Version(17,new Array(6,30,54,78),new ECBlocks(28,new ECB(1,107),new ECB(5,108)),new ECBlocks(28,new ECB(10,46),new ECB(1,47)),new ECBlocks(28,new ECB(1,22),new ECB(15,23)),new ECBlocks(28,new ECB(2,14),new ECB(17,15))),new Version(18,new Array(6,30,56,82),new ECBlocks(30,new ECB(5,120),new ECB(1,121)),new ECBlocks(26,new ECB(9,43),new ECB(4,44)),new ECBlocks(28,new ECB(17,22),new ECB(1,23)),new ECBlocks(28,new ECB(2,14),new ECB(19,15))),new Version(19,new Array(6,30,58,86),new ECBlocks(28,new ECB(3,113),new ECB(4,114)),new ECBlocks(26,new ECB(3,44),new ECB(11,45)),new ECBlocks(26,new ECB(17,21),new ECB(4,22)),new ECBlocks(26,new ECB(9,13),new ECB(16,14))),new Version(20,new Array(6,34,62,90),new ECBlocks(28,new ECB(3,107),new ECB(5,108)),new ECBlocks(26,new ECB(3,41),new ECB(13,42)),new ECBlocks(30,new ECB(15,24),new ECB(5,25)),new ECBlocks(28,new ECB(15,15),new ECB(10,16))),new Version(21,new Array(6,28,50,72,94),new ECBlocks(28,new ECB(4,116),new ECB(4,117)),new ECBlocks(26,new ECB(17,42)),new ECBlocks(28,new ECB(17,22),new ECB(6,23)),new ECBlocks(30,new ECB(19,16),new ECB(6,17))),new Version(22,new Array(6,26,50,74,98),new ECBlocks(28,new ECB(2,111),new ECB(7,112)),new ECBlocks(28,new ECB(17,46)),new ECBlocks(30,new ECB(7,24),new ECB(16,25)),new ECBlocks(24,new ECB(34,13))),new Version(23,new Array(6,30,54,74,102),new ECBlocks(30,new ECB(4,121),new ECB(5,122)),new ECBlocks(28,new ECB(4,47),new ECB(14,48)),new ECBlocks(30,new ECB(11,24),new ECB(14,25)),new ECBlocks(30,new ECB(16,15),new ECB(14,16))),new Version(24,new Array(6,28,54,80,106),new ECBlocks(30,new ECB(6,117),new ECB(4,118)),new ECBlocks(28,new ECB(6,45),new ECB(14,46)),new ECBlocks(30,new ECB(11,24),new ECB(16,25)),new ECBlocks(30,new ECB(30,16),new ECB(2,17))),new Version(25,new Array(6,32,58,84,110),new ECBlocks(26,new ECB(8,106),new ECB(4,107)),new ECBlocks(28,new ECB(8,47),new ECB(13,48)),new ECBlocks(30,new ECB(7,24),new ECB(22,25)),new ECBlocks(30,new ECB(22,15),new ECB(13,16))),new Version(26,new Array(6,30,58,86,114),new ECBlocks(28,new ECB(10,114),new ECB(2,115)),new ECBlocks(28,new ECB(19,46),new ECB(4,47)),new ECBlocks(28,new ECB(28,22),new ECB(6,23)),new ECBlocks(30,new ECB(33,16),new ECB(4,17))),new Version(27,new Array(6,34,62,90,118),new ECBlocks(30,new ECB(8,122),new ECB(4,123)),new ECBlocks(28,new ECB(22,45),new ECB(3,46)),new ECBlocks(30,new ECB(8,23),new ECB(26,24)),new ECBlocks(30,new ECB(12,15),new ECB(28,16))),new Version(28,new Array(6,26,50,74,98,122),new ECBlocks(30,new ECB(3,117),new ECB(10,118)),new ECBlocks(28,new ECB(3,45),new ECB(23,46)),new ECBlocks(30,new ECB(4,24),new ECB(31,25)),new ECBlocks(30,new ECB(11,15),new ECB(31,16))),new Version(29,new Array(6,30,54,78,102,126),new ECBlocks(30,new ECB(7,116),new ECB(7,117)),new ECBlocks(28,new ECB(21,45),new ECB(7,46)),new ECBlocks(30,new ECB(1,23),new ECB(37,24)),new ECBlocks(30,new ECB(19,15),new ECB(26,16))),new Version(30,new Array(6,26,52,78,104,130),new ECBlocks(30,new ECB(5,115),new ECB(10,116)),new ECBlocks(28,new ECB(19,47),new ECB(10,48)),new ECBlocks(30,new ECB(15,24),new ECB(25,25)),new ECBlocks(30,new ECB(23,15),new ECB(25,16))),new Version(31,new Array(6,30,56,82,108,134),new ECBlocks(30,new ECB(13,115),new ECB(3,116)),new ECBlocks(28,new ECB(2,46),new ECB(29,47)),new ECBlocks(30,new ECB(42,24),new ECB(1,25)),new ECBlocks(30,new ECB(23,15),new ECB(28,16))),new Version(32,new Array(6,34,60,86,112,138),new ECBlocks(30,new ECB(17,115)),new ECBlocks(28,new ECB(10,46),new ECB(23,47)),new ECBlocks(30,new ECB(10,24),new ECB(35,25)),new ECBlocks(30,new ECB(19,15),new ECB(35,16))),new Version(33,new Array(6,30,58,86,114,142),new ECBlocks(30,new ECB(17,115),new ECB(1,116)),new ECBlocks(28,new ECB(14,46),new ECB(21,47)),new ECBlocks(30,new ECB(29,24),new ECB(19,25)),new ECBlocks(30,new ECB(11,15),new ECB(46,16))),new Version(34,new Array(6,34,62,90,118,146),new ECBlocks(30,new ECB(13,115),new ECB(6,116)),new ECBlocks(28,new ECB(14,46),new ECB(23,47)),new ECBlocks(30,new ECB(44,24),new ECB(7,25)),new ECBlocks(30,new ECB(59,16),new ECB(1,17))),new Version(35,new Array(6,30,54,78,102,126,150),new ECBlocks(30,new ECB(12,121),new ECB(7,122)),new ECBlocks(28,new ECB(12,47),new ECB(26,48)),new ECBlocks(30,new ECB(39,24),new ECB(14,25)),new ECBlocks(30,new ECB(22,15),new ECB(41,16))),new Version(36,new Array(6,24,50,76,102,128,154),new ECBlocks(30,new ECB(6,121),new ECB(14,122)),new ECBlocks(28,new ECB(6,47),new ECB(34,48)),new ECBlocks(30,new ECB(46,24),new ECB(10,25)),new ECBlocks(30,new ECB(2,15),new ECB(64,16))),new Version(37,new Array(6,28,54,80,106,132,158),new ECBlocks(30,new ECB(17,122),new ECB(4,123)),new ECBlocks(28,new ECB(29,46),new ECB(14,47)),new ECBlocks(30,new ECB(49,24),new ECB(10,25)),new ECBlocks(30,new ECB(24,15),new ECB(46,16))),new Version(38,new Array(6,32,58,84,110,136,162),new ECBlocks(30,new ECB(4,122),new ECB(18,123)),new ECBlocks(28,new ECB(13,46),new ECB(32,47)),new ECBlocks(30,new ECB(48,24),new ECB(14,25)),new ECBlocks(30,new ECB(42,15),new ECB(32,16))),new Version(39,new Array(6,26,54,82,110,138,166),new ECBlocks(30,new ECB(20,117),new ECB(4,118)),new ECBlocks(28,new ECB(40,47),new ECB(7,48)),new ECBlocks(30,new ECB(43,24),new ECB(22,25)),new ECBlocks(30,new ECB(10,15),new ECB(67,16))),new Version(40,new Array(6,30,58,86,114,142,170),new ECBlocks(30,new ECB(19,118),new ECB(6,119)),new ECBlocks(28,new ECB(18,47),new ECB(31,48)),new ECBlocks(30,new ECB(34,24),new ECB(34,25)),new ECBlocks(30,new ECB(20,15),new ECB(61,16))))}function PerspectiveTransform(a11,a21,a31,a12,a22,a32,a13,a23,a33){this.a11=a11,this.a12=a12,this.a13=a13,this.a21=a21,this.a22=a22,this.a23=a23,this.a31=a31,this.a32=a32,this.a33=a33,this.transformPoints1=function(points){for(var max=points.length,a11=this.a11,a12=this.a12,a13=this.a13,a21=this.a21,a22=this.a22,a23=this.a23,a31=this.a31,a32=this.a32,a33=this.a33,i=0;max>i;i+=2){var x=points[i],y=points[i+1],denominator=a13*x+a23*y+a33;points[i]=(a11*x+a21*y+a31)/denominator,points[i+1]=(a12*x+a22*y+a32)/denominator}},this.transformPoints2=function(xValues,yValues){for(var n=xValues.length,i=0;n>i;i++){var x=xValues[i],y=yValues[i],denominator=this.a13*x+this.a23*y+this.a33;xValues[i]=(this.a11*x+this.a21*y+this.a31)/denominator,yValues[i]=(this.a12*x+this.a22*y+this.a32)/denominator}},this.buildAdjoint=function(){return new PerspectiveTransform(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)},this.times=function(other){return new PerspectiveTransform(this.a11*other.a11+this.a21*other.a12+this.a31*other.a13,this.a11*other.a21+this.a21*other.a22+this.a31*other.a23,this.a11*other.a31+this.a21*other.a32+this.a31*other.a33,this.a12*other.a11+this.a22*other.a12+this.a32*other.a13,this.a12*other.a21+this.a22*other.a22+this.a32*other.a23,this.a12*other.a31+this.a22*other.a32+this.a32*other.a33,this.a13*other.a11+this.a23*other.a12+this.a33*other.a13,this.a13*other.a21+this.a23*other.a22+this.a33*other.a23,this.a13*other.a31+this.a23*other.a32+this.a33*other.a33)}}function DetectorResult(bits,points){this.bits=bits,this.points=points}function Detector(image){this.image=image,this.resultPointCallback=null,this.sizeOfBlackWhiteBlackRun=function(fromX,fromY,toX,toY){var steep=Math.abs(toY-fromY)>Math.abs(toX-fromX);if(steep){var temp=fromX;fromX=fromY,fromY=temp,temp=toX,toX=toY,toY=temp}for(var dx=Math.abs(toX-fromX),dy=Math.abs(toY-fromY),error=-dx>>1,ystep=toY>fromY?1:-1,xstep=toX>fromX?1:-1,state=0,x=fromX,y=fromY;x!=toX;x+=xstep){var realX=steep?y:x,realY=steep?x:y;if(1==state?this.image[realX+realY*qrcode.width]&&state++:this.image[realX+realY*qrcode.width]||state++,3==state){var diffX=x-fromX,diffY=y-fromY;return Math.sqrt(diffX*diffX+diffY*diffY)}if(error+=dy,error>0){if(y==toY)break;y+=ystep,error-=dx}}var diffX2=toX-fromX,diffY2=toY-fromY;return Math.sqrt(diffX2*diffX2+diffY2*diffY2)},this.sizeOfBlackWhiteBlackRunBothWays=function(fromX,fromY,toX,toY){var result=this.sizeOfBlackWhiteBlackRun(fromX,fromY,toX,toY),scale=1,otherToX=fromX-(toX-fromX);0>otherToX?(scale=fromX/(fromX-otherToX),otherToX=0):otherToX>=qrcode.width&&(scale=(qrcode.width-1-fromX)/(otherToX-fromX),otherToX=qrcode.width-1);var otherToY=Math.floor(fromY-(toY-fromY)*scale);return scale=1,0>otherToY?(scale=fromY/(fromY-otherToY),otherToY=0):otherToY>=qrcode.height&&(scale=(qrcode.height-1-fromY)/(otherToY-fromY),otherToY=qrcode.height-1),otherToX=Math.floor(fromX+(otherToX-fromX)*scale),result+=this.sizeOfBlackWhiteBlackRun(fromX,fromY,otherToX,otherToY),result-1},this.calculateModuleSizeOneWay=function(pattern,otherPattern){var moduleSizeEst1=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(pattern.X),Math.floor(pattern.Y),Math.floor(otherPattern.X),Math.floor(otherPattern.Y)),moduleSizeEst2=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(otherPattern.X),Math.floor(otherPattern.Y),Math.floor(pattern.X),Math.floor(pattern.Y));return isNaN(moduleSizeEst1)?moduleSizeEst2/7:isNaN(moduleSizeEst2)?moduleSizeEst1/7:(moduleSizeEst1+moduleSizeEst2)/14},this.calculateModuleSize=function(topLeft,topRight,bottomLeft){return(this.calculateModuleSizeOneWay(topLeft,topRight)+this.calculateModuleSizeOneWay(topLeft,bottomLeft))/2},this.distance=function(pattern1,pattern2){return xDiff=pattern1.X-pattern2.X,yDiff=pattern1.Y-pattern2.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)},this.computeDimension=function(topLeft,topRight,bottomLeft,moduleSize){var tltrCentersDimension=Math.round(this.distance(topLeft,topRight)/moduleSize),tlblCentersDimension=Math.round(this.distance(topLeft,bottomLeft)/moduleSize),dimension=(tltrCentersDimension+tlblCentersDimension>>1)+7;switch(3&dimension){case 0:dimension++;break;case 2:dimension--;break;case 3:throw"Error"}return dimension},this.findAlignmentInRegion=function(overallEstModuleSize,estAlignmentX,estAlignmentY,allowanceFactor){var allowance=Math.floor(allowanceFactor*overallEstModuleSize),alignmentAreaLeftX=Math.max(0,estAlignmentX-allowance),alignmentAreaRightX=Math.min(qrcode.width-1,estAlignmentX+allowance);if(3*overallEstModuleSize>alignmentAreaRightX-alignmentAreaLeftX)throw"Error";var alignmentAreaTopY=Math.max(0,estAlignmentY-allowance),alignmentAreaBottomY=Math.min(qrcode.height-1,estAlignmentY+allowance),alignmentFinder=new AlignmentPatternFinder(this.image,alignmentAreaLeftX,alignmentAreaTopY,alignmentAreaRightX-alignmentAreaLeftX,alignmentAreaBottomY-alignmentAreaTopY,overallEstModuleSize,this.resultPointCallback);return alignmentFinder.find()},this.createTransform=function(topLeft,topRight,bottomLeft,alignmentPattern,dimension){var bottomRightX,bottomRightY,sourceBottomRightX,sourceBottomRightY,dimMinusThree=dimension-3.5;null!=alignmentPattern?(bottomRightX=alignmentPattern.X,bottomRightY=alignmentPattern.Y,sourceBottomRightX=sourceBottomRightY=dimMinusThree-3):(bottomRightX=topRight.X-topLeft.X+bottomLeft.X,bottomRightY=topRight.Y-topLeft.Y+bottomLeft.Y,sourceBottomRightX=sourceBottomRightY=dimMinusThree);var transform=PerspectiveTransform.quadrilateralToQuadrilateral(3.5,3.5,dimMinusThree,3.5,sourceBottomRightX,sourceBottomRightY,3.5,dimMinusThree,topLeft.X,topLeft.Y,topRight.X,topRight.Y,bottomRightX,bottomRightY,bottomLeft.X,bottomLeft.Y);return transform},this.sampleGrid=function(image,transform,dimension){var sampler=GridSampler;return sampler.sampleGrid3(image,dimension,transform)},this.processFinderPatternInfo=function(info){var topLeft=info.TopLeft,topRight=info.TopRight,bottomLeft=info.BottomLeft,moduleSize=this.calculateModuleSize(topLeft,topRight,bottomLeft);if(1>moduleSize)throw"Error";var dimension=this.computeDimension(topLeft,topRight,bottomLeft,moduleSize),provisionalVersion=Version.getProvisionalVersionForDimension(dimension),modulesBetweenFPCenters=provisionalVersion.DimensionForVersion-7,alignmentPattern=null;if(provisionalVersion.AlignmentPatternCenters.length>0)for(var bottomRightX=topRight.X-topLeft.X+bottomLeft.X,bottomRightY=topRight.Y-topLeft.Y+bottomLeft.Y,correctionToTopLeft=1-3/modulesBetweenFPCenters,estAlignmentX=Math.floor(topLeft.X+correctionToTopLeft*(bottomRightX-topLeft.X)),estAlignmentY=Math.floor(topLeft.Y+correctionToTopLeft*(bottomRightY-topLeft.Y)),i=4;16>=i;i<<=1){alignmentPattern=this.findAlignmentInRegion(moduleSize,estAlignmentX,estAlignmentY,i);break}var points,transform=this.createTransform(topLeft,topRight,bottomLeft,alignmentPattern,dimension),bits=this.sampleGrid(this.image,transform,dimension);return points=null==alignmentPattern?new Array(bottomLeft,topLeft,topRight):new Array(bottomLeft,topLeft,topRight,alignmentPattern),new DetectorResult(bits,points)},this.detect=function(){var info=(new FinderPatternFinder).findFinderPattern(this.image);return this.processFinderPatternInfo(info)}}function FormatInformation(formatInfo){this.errorCorrectionLevel=ErrorCorrectionLevel.forBits(formatInfo>>3&3),this.dataMask=7&formatInfo,this.__defineGetter__("ErrorCorrectionLevel",function(){return this.errorCorrectionLevel}),this.__defineGetter__("DataMask",function(){return this.dataMask}),this.GetHashCode=function(){return this.errorCorrectionLevel.ordinal()<<3|dataMask},this.Equals=function(o){var other=o;return this.errorCorrectionLevel==other.errorCorrectionLevel&&this.dataMask==other.dataMask}}function ErrorCorrectionLevel(ordinal,bits,name){this.ordinal_Renamed_Field=ordinal,this.bits=bits,this.name=name,this.__defineGetter__("Bits",function(){return this.bits}),this.__defineGetter__("Name",function(){return this.name}),this.ordinal=function(){return this.ordinal_Renamed_Field}}function BitMatrix(width,height){if(height||(height=width),1>width||1>height)throw"Both dimensions must be greater than 0";this.width=width,this.height=height;var rowSize=width>>5;0!=(31&width)&&rowSize++,this.rowSize=rowSize,this.bits=new Array(rowSize*height);for(var i=0;i>5);return 0!=(1&URShift(this.bits[offset],31&x))},this.set_Renamed=function(x,y){var offset=y*this.rowSize+(x>>5);this.bits[offset]|=1<<(31&x)},this.flip=function(x,y){var offset=y*this.rowSize+(x>>5);this.bits[offset]^=1<<(31&x)},this.clear=function(){for(var max=this.bits.length,i=0;max>i;i++)this.bits[i]=0},this.setRegion=function(left,top,width,height){if(0>top||0>left)throw"Left and top must be nonnegative";if(1>height||1>width)throw"Height and width must be at least 1";var right=left+width,bottom=top+height;if(bottom>this.height||right>this.width)throw"The region must fit inside the matrix";for(var y=top;bottom>y;y++)for(var offset=y*this.rowSize,x=left;right>x;x++)this.bits[offset+(x>>5)]|=1<<(31&x)}}function DataBlock(numDataCodewords,codewords){this.numDataCodewords=numDataCodewords,this.codewords=codewords,this.__defineGetter__("NumDataCodewords",function(){return this.numDataCodewords}),this.__defineGetter__("Codewords",function(){return this.codewords})}function BitMatrixParser(bitMatrix){var dimension=bitMatrix.Dimension;if(21>dimension||1!=(3&dimension))throw"Error BitMatrixParser";this.bitMatrix=bitMatrix,this.parsedVersion=null,this.parsedFormatInfo=null,this.copyBit=function(i,j,versionBits){return this.bitMatrix.get_Renamed(i,j)?versionBits<<1|1:versionBits<<1},this.readFormatInformation=function(){if(null!=this.parsedFormatInfo)return this.parsedFormatInfo;for(var formatInfoBits=0,i=0;6>i;i++)formatInfoBits=this.copyBit(i,8,formatInfoBits);formatInfoBits=this.copyBit(7,8,formatInfoBits),formatInfoBits=this.copyBit(8,8,formatInfoBits),formatInfoBits=this.copyBit(8,7,formatInfoBits);for(var j=5;j>=0;j--)formatInfoBits=this.copyBit(8,j,formatInfoBits);if(this.parsedFormatInfo=FormatInformation.decodeFormatInformation(formatInfoBits),null!=this.parsedFormatInfo)return this.parsedFormatInfo;var dimension=this.bitMatrix.Dimension;formatInfoBits=0;for(var iMin=dimension-8,i=dimension-1;i>=iMin;i--)formatInfoBits=this.copyBit(i,8,formatInfoBits);for(var j=dimension-7;dimension>j;j++)formatInfoBits=this.copyBit(8,j,formatInfoBits);if(this.parsedFormatInfo=FormatInformation.decodeFormatInformation(formatInfoBits),null!=this.parsedFormatInfo)return this.parsedFormatInfo;throw"Error readFormatInformation"},this.readVersion=function(){if(null!=this.parsedVersion)return this.parsedVersion;var dimension=this.bitMatrix.Dimension,provisionalVersion=dimension-17>>2;if(6>=provisionalVersion)return Version.getVersionForNumber(provisionalVersion);for(var versionBits=0,ijMin=dimension-11,j=5;j>=0;j--)for(var i=dimension-9;i>=ijMin;i--)versionBits=this.copyBit(i,j,versionBits);if(this.parsedVersion=Version.decodeVersionInformation(versionBits),null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==dimension)return this.parsedVersion;versionBits=0;for(var i=5;i>=0;i--)for(var j=dimension-9;j>=ijMin;j--)versionBits=this.copyBit(i,j,versionBits);if(this.parsedVersion=Version.decodeVersionInformation(versionBits),null!=this.parsedVersion&&this.parsedVersion.DimensionForVersion==dimension)return this.parsedVersion;throw"Error readVersion"},this.readCodewords=function(){var formatInfo=this.readFormatInformation(),version=this.readVersion(),dataMask=DataMask.forReference(formatInfo.DataMask),dimension=this.bitMatrix.Dimension;dataMask.unmaskBitMatrix(this.bitMatrix,dimension);for(var functionPattern=version.buildFunctionPattern(),readingUp=!0,result=new Array(version.TotalCodewords),resultOffset=0,currentByte=0,bitsRead=0,j=dimension-1;j>0;j-=2){6==j&&j--;for(var count=0;dimension>count;count++)for(var i=readingUp?dimension-1-count:count,col=0;2>col;col++)functionPattern.get_Renamed(j-col,i)||(bitsRead++,currentByte<<=1,this.bitMatrix.get_Renamed(j-col,i)&&(currentByte|=1),8==bitsRead&&(result[resultOffset++]=currentByte,bitsRead=0,currentByte=0));readingUp^=!0}if(resultOffset!=version.TotalCodewords)throw"Error readCodewords";return result}}function DataMask000(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(i+j&1)}}function DataMask001(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(1&i)}}function DataMask010(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return j%3==0}}function DataMask011(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return(i+j)%3==0}}function DataMask100(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==(URShift(i,1)+j/3&1)}}function DataMask101(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){var temp=i*j;return(1&temp)+temp%3==0}}function DataMask110(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){var temp=i*j;return 0==((1&temp)+temp%3&1)}}function DataMask111(){this.unmaskBitMatrix=function(bits,dimension){for(var i=0;dimension>i;i++)for(var j=0;dimension>j;j++)this.isMasked(i,j)&&bits.flip(j,i)},this.isMasked=function(i,j){return 0==((i+j&1)+i*j%3&1)}}function ReedSolomonDecoder(field){this.field=field,this.decode=function(received,twoS){for(var poly=new GF256Poly(this.field,received),syndromeCoefficients=new Array(twoS),i=0;ii;i++){var eval=poly.evaluateAt(this.field.exp(dataMatrix?i+1:i));syndromeCoefficients[syndromeCoefficients.length-1-i]=eval,0!=eval&&(noError=!1)}if(!noError)for(var syndrome=new GF256Poly(this.field,syndromeCoefficients),sigmaOmega=this.runEuclideanAlgorithm(this.field.buildMonomial(twoS,1),syndrome,twoS),sigma=sigmaOmega[0],omega=sigmaOmega[1],errorLocations=this.findErrorLocations(sigma),errorMagnitudes=this.findErrorMagnitudes(omega,errorLocations,dataMatrix),i=0;iposition)throw"ReedSolomonException Bad error location";received[position]=GF256.addOrSubtract(received[position],errorMagnitudes[i])}},this.runEuclideanAlgorithm=function(a,b,R){if(a.Degree=Math.floor(R/2);){var rLastLast=rLast,sLastLast=sLast,tLastLast=tLast;if(rLast=r,sLast=s,tLast=t,rLast.Zero)throw"r_{i-1} was zero";r=rLastLast;for(var q=this.field.Zero,denominatorLeadingTerm=rLast.getCoefficient(rLast.Degree),dltInverse=this.field.inverse(denominatorLeadingTerm);r.Degree>=rLast.Degree&&!r.Zero;){var degreeDiff=r.Degree-rLast.Degree,scale=this.field.multiply(r.getCoefficient(r.Degree),dltInverse);q=q.addOrSubtract(this.field.buildMonomial(degreeDiff,scale)),r=r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff,scale))}s=q.multiply1(sLast).addOrSubtract(sLastLast),t=q.multiply1(tLast).addOrSubtract(tLastLast)}var sigmaTildeAtZero=t.getCoefficient(0);if(0==sigmaTildeAtZero)throw"ReedSolomonException sigmaTilde(0) was zero";var inverse=this.field.inverse(sigmaTildeAtZero),sigma=t.multiply2(inverse),omega=r.multiply2(inverse);return new Array(sigma,omega)},this.findErrorLocations=function(errorLocator){var numErrors=errorLocator.Degree;if(1==numErrors)return new Array(errorLocator.getCoefficient(1));for(var result=new Array(numErrors),e=0,i=1;256>i&&numErrors>e;i++)0==errorLocator.evaluateAt(i)&&(result[e]=this.field.inverse(i),e++);if(e!=numErrors)throw"Error locator degree does not match number of roots";return result},this.findErrorMagnitudes=function(errorEvaluator,errorLocations,dataMatrix){for(var s=errorLocations.length,result=new Array(s),i=0;s>i;i++){for(var xiInverse=this.field.inverse(errorLocations[i]),denominator=1,j=0;s>j;j++)i!=j&&(denominator=this.field.multiply(denominator,GF256.addOrSubtract(1,this.field.multiply(errorLocations[j],xiInverse))));result[i]=this.field.multiply(errorEvaluator.evaluateAt(xiInverse),this.field.inverse(denominator)),dataMatrix&&(result[i]=this.field.multiply(result[i],xiInverse))}return result}}function GF256Poly(field,coefficients){if(null==coefficients||0==coefficients.length)throw"System.ArgumentException";this.field=field;var coefficientsLength=coefficients.length;if(coefficientsLength>1&&0==coefficients[0]){for(var firstNonZero=1;coefficientsLength>firstNonZero&&0==coefficients[firstNonZero];)firstNonZero++;if(firstNonZero==coefficientsLength)this.coefficients=field.Zero.coefficients;else{this.coefficients=new Array(coefficientsLength-firstNonZero);for(var i=0;ii;i++)result=GF256.addOrSubtract(result,this.coefficients[i]);return result}for(var result2=this.coefficients[0],i=1;size>i;i++)result2=GF256.addOrSubtract(this.field.multiply(a,result2),this.coefficients[i]);return result2},this.addOrSubtract=function(other){if(this.field!=other.field)throw"GF256Polys do not have same GF256 field";if(this.Zero)return other;if(other.Zero)return this;var smallerCoefficients=this.coefficients,largerCoefficients=other.coefficients;if(smallerCoefficients.length>largerCoefficients.length){var temp=smallerCoefficients;smallerCoefficients=largerCoefficients,largerCoefficients=temp}for(var sumDiff=new Array(largerCoefficients.length),lengthDiff=largerCoefficients.length-smallerCoefficients.length,ci=0;lengthDiff>ci;ci++)sumDiff[ci]=largerCoefficients[ci];for(var i=lengthDiff;ii;i++)for(var aCoeff=aCoefficients[i],j=0;bLength>j;j++)product[i+j]=GF256.addOrSubtract(product[i+j],this.field.multiply(aCoeff,bCoefficients[j]));return new GF256Poly(this.field,product)},this.multiply2=function(scalar){if(0==scalar)return this.field.Zero;if(1==scalar)return this;for(var size=this.coefficients.length,product=new Array(size),i=0;size>i;i++)product[i]=this.field.multiply(this.coefficients[i],scalar);return new GF256Poly(this.field,product)},this.multiplyByMonomial=function(degree,coefficient){if(0>degree)throw"System.ArgumentException";if(0==coefficient)return this.field.Zero;for(var size=this.coefficients.length,product=new Array(size+degree),i=0;ii;i++)product[i]=this.field.multiply(this.coefficients[i],coefficient);return new GF256Poly(this.field,product)},this.divide=function(other){if(this.field!=other.field)throw"GF256Polys do not have same GF256 field";if(other.Zero)throw"Divide by 0";for(var quotient=this.field.Zero,remainder=this,denominatorLeadingTerm=other.getCoefficient(other.Degree),inverseDenominatorLeadingTerm=this.field.inverse(denominatorLeadingTerm);remainder.Degree>=other.Degree&&!remainder.Zero;){ -var degreeDifference=remainder.Degree-other.Degree,scale=this.field.multiply(remainder.getCoefficient(remainder.Degree),inverseDenominatorLeadingTerm),term=other.multiplyByMonomial(degreeDifference,scale),iterationQuotient=this.field.buildMonomial(degreeDifference,scale);quotient=quotient.addOrSubtract(iterationQuotient),remainder=remainder.addOrSubtract(term)}return new Array(quotient,remainder)}}function GF256(primitive){this.expTable=new Array(256),this.logTable=new Array(256);for(var x=1,i=0;256>i;i++)this.expTable[i]=x,x<<=1,x>=256&&(x^=primitive);for(var i=0;255>i;i++)this.logTable[this.expTable[i]]=i;var at0=new Array(1);at0[0]=0,this.zero=new GF256Poly(this,new Array(at0));var at1=new Array(1);at1[0]=1,this.one=new GF256Poly(this,new Array(at1)),this.__defineGetter__("Zero",function(){return this.zero}),this.__defineGetter__("One",function(){return this.one}),this.buildMonomial=function(degree,coefficient){if(0>degree)throw"System.ArgumentException";if(0==coefficient)return zero;for(var coefficients=new Array(degree+1),i=0;i=0?number>>bits:(number>>bits)+(2<<~bits)}function FinderPattern(posX,posY,estimatedModuleSize){this.x=posX,this.y=posY,this.count=1,this.estimatedModuleSize=estimatedModuleSize,this.__defineGetter__("EstimatedModuleSize",function(){return this.estimatedModuleSize}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return this.x}),this.__defineGetter__("Y",function(){return this.y}),this.incrementCount=function(){this.count++},this.aboutEquals=function(moduleSize,i,j){if(Math.abs(i-this.y)<=moduleSize&&Math.abs(j-this.x)<=moduleSize){var moduleSizeDiff=Math.abs(moduleSize-this.estimatedModuleSize);return 1>=moduleSizeDiff||moduleSizeDiff/this.estimatedModuleSize<=1}return!1}}function FinderPatternInfo(patternCenters){this.bottomLeft=patternCenters[0],this.topLeft=patternCenters[1],this.topRight=patternCenters[2],this.__defineGetter__("BottomLeft",function(){return this.bottomLeft}),this.__defineGetter__("TopLeft",function(){return this.topLeft}),this.__defineGetter__("TopRight",function(){return this.topRight})}function FinderPatternFinder(){this.image=null,this.possibleCenters=[],this.hasSkipped=!1,this.crossCheckStateCount=new Array(0,0,0,0,0),this.resultPointCallback=null,this.__defineGetter__("CrossCheckStateCount",function(){return this.crossCheckStateCount[0]=0,this.crossCheckStateCount[1]=0,this.crossCheckStateCount[2]=0,this.crossCheckStateCount[3]=0,this.crossCheckStateCount[4]=0,this.crossCheckStateCount}),this.foundPatternCross=function(stateCount){for(var totalModuleSize=0,i=0;5>i;i++){var count=stateCount[i];if(0==count)return!1;totalModuleSize+=count}if(7>totalModuleSize)return!1;var moduleSize=Math.floor((totalModuleSize<=0&&image[centerJ+i*qrcode.width];)stateCount[2]++,i--;if(0>i)return NaN;for(;i>=0&&!image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i--;if(0>i||stateCount[1]>maxCount)return NaN;for(;i>=0&&image[centerJ+i*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,i--;if(stateCount[0]>maxCount)return NaN;for(i=startI+1;maxI>i&&image[centerJ+i*qrcode.width];)stateCount[2]++,i++;if(i==maxI)return NaN;for(;maxI>i&&!image[centerJ+i*qrcode.width]&&stateCount[3]=maxCount)return NaN;for(;maxI>i&&image[centerJ+i*qrcode.width]&&stateCount[4]=maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=2*originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,i):NaN},this.crossCheckHorizontal=function(startJ,centerI,maxCount,originalStateCountTotal){for(var image=this.image,maxJ=qrcode.width,stateCount=this.CrossCheckStateCount,j=startJ;j>=0&&image[j+centerI*qrcode.width];)stateCount[2]++,j--;if(0>j)return NaN;for(;j>=0&&!image[j+centerI*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,j--;if(0>j||stateCount[1]>maxCount)return NaN;for(;j>=0&&image[j+centerI*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,j--;if(stateCount[0]>maxCount)return NaN;for(j=startJ+1;maxJ>j&&image[j+centerI*qrcode.width];)stateCount[2]++,j++;if(j==maxJ)return NaN;for(;maxJ>j&&!image[j+centerI*qrcode.width]&&stateCount[3]=maxCount)return NaN;for(;maxJ>j&&image[j+centerI*qrcode.width]&&stateCount[4]=maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,j):NaN},this.handlePossibleCenter=function(stateCount,i,j){var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2]+stateCount[3]+stateCount[4],centerJ=this.centerFromEnd(stateCount,j),centerI=this.crossCheckVertical(i,Math.floor(centerJ),stateCount[2],stateCountTotal);if(!isNaN(centerI)&&(centerJ=this.crossCheckHorizontal(Math.floor(centerJ),Math.floor(centerI),stateCount[2],stateCountTotal),!isNaN(centerJ))){for(var estimatedModuleSize=stateCountTotal/7,found=!1,max=this.possibleCenters.length,index=0;max>index;index++){var center=this.possibleCenters[index];if(center.aboutEquals(estimatedModuleSize,centerI,centerJ)){center.incrementCount(),found=!0;break}}if(!found){var point=new FinderPattern(centerJ,centerI,estimatedModuleSize);this.possibleCenters.push(point),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(point)}return!0}return!1},this.selectBestPatterns=function(){var startSize=this.possibleCenters.length;if(3>startSize)throw"Couldn't find enough finder patterns";if(startSize>3){for(var totalModuleSize=0,square=0,i=0;startSize>i;i++){var centerValue=this.possibleCenters[i].EstimatedModuleSize;totalModuleSize+=centerValue,square+=centerValue*centerValue}var average=totalModuleSize/startSize;this.possibleCenters.sort(function(center1,center2){var dA=Math.abs(center2.EstimatedModuleSize-average),dB=Math.abs(center1.EstimatedModuleSize-average);return dB>dA?-1:dA==dB?0:1});for(var stdDev=Math.sqrt(square/startSize-average*average),limit=Math.max(.2*average,stdDev),i=0;i3;i++){var pattern=this.possibleCenters[i];Math.abs(pattern.EstimatedModuleSize-average)>limit&&(this.possibleCenters.remove(i),i--)}}return this.possibleCenters.length>3&&this.possibleCenters.sort(function(a,b){return a.count>b.count?-1:a.count=max)return 0;for(var firstConfirmedCenter=null,i=0;max>i;i++){var center=this.possibleCenters[i];if(center.Count>=CENTER_QUORUM){if(null!=firstConfirmedCenter)return this.hasSkipped=!0,Math.floor((Math.abs(firstConfirmedCenter.X-center.X)-Math.abs(firstConfirmedCenter.Y-center.Y))/2);firstConfirmedCenter=center}}return 0},this.haveMultiplyConfirmedCenters=function(){for(var confirmedCount=0,totalModuleSize=0,max=this.possibleCenters.length,i=0;max>i;i++){var pattern=this.possibleCenters[i];pattern.Count>=CENTER_QUORUM&&(confirmedCount++,totalModuleSize+=pattern.EstimatedModuleSize)}if(3>confirmedCount)return!1;for(var average=totalModuleSize/max,totalDeviation=0,i=0;max>i;i++)pattern=this.possibleCenters[i],totalDeviation+=Math.abs(pattern.EstimatedModuleSize-average);return.05*totalModuleSize>=totalDeviation},this.findFinderPattern=function(image){var tryHarder=!1;this.image=image;var maxI=qrcode.height,maxJ=qrcode.width,iSkip=Math.floor(3*maxI/(4*MAX_MODULES));(MIN_SKIP>iSkip||tryHarder)&&(iSkip=MIN_SKIP);for(var done=!1,stateCount=new Array(5),i=iSkip-1;maxI>i&&!done;i+=iSkip){stateCount[0]=0,stateCount[1]=0,stateCount[2]=0,stateCount[3]=0,stateCount[4]=0;for(var currentState=0,j=0;maxJ>j;j++)if(image[j+i*qrcode.width])1==(1¤tState)&¤tState++,stateCount[currentState]++;else if(0==(1¤tState))if(4==currentState)if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,j);if(confirmed)if(iSkip=2,this.hasSkipped)done=this.haveMultiplyConfirmedCenters();else{var rowSkip=this.findRowSkip();rowSkip>stateCount[2]&&(i+=rowSkip-stateCount[2]-iSkip,j=maxJ-1)}else{do j++;while(maxJ>j&&!image[j+i*qrcode.width]);j--}currentState=0,stateCount[0]=0,stateCount[1]=0,stateCount[2]=0,stateCount[3]=0,stateCount[4]=0}else stateCount[0]=stateCount[2],stateCount[1]=stateCount[3],stateCount[2]=stateCount[4],stateCount[3]=1,stateCount[4]=0,currentState=3;else stateCount[++currentState]++;else stateCount[currentState]++;if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,maxJ);confirmed&&(iSkip=stateCount[0],this.hasSkipped&&(done=haveMultiplyConfirmedCenters()))}}var patternInfo=this.selectBestPatterns();return qrcode.orderBestPatterns(patternInfo),new FinderPatternInfo(patternInfo)}}function AlignmentPattern(posX,posY,estimatedModuleSize){this.x=posX,this.y=posY,this.count=1,this.estimatedModuleSize=estimatedModuleSize,this.__defineGetter__("EstimatedModuleSize",function(){return this.estimatedModuleSize}),this.__defineGetter__("Count",function(){return this.count}),this.__defineGetter__("X",function(){return Math.floor(this.x)}),this.__defineGetter__("Y",function(){return Math.floor(this.y)}),this.incrementCount=function(){this.count++},this.aboutEquals=function(moduleSize,i,j){if(Math.abs(i-this.y)<=moduleSize&&Math.abs(j-this.x)<=moduleSize){var moduleSizeDiff=Math.abs(moduleSize-this.estimatedModuleSize);return 1>=moduleSizeDiff||moduleSizeDiff/this.estimatedModuleSize<=1}return!1}}function AlignmentPatternFinder(image,startX,startY,width,height,moduleSize,resultPointCallback){this.image=image,this.possibleCenters=new Array,this.startX=startX,this.startY=startY,this.width=width,this.height=height,this.moduleSize=moduleSize,this.crossCheckStateCount=new Array(0,0,0),this.resultPointCallback=resultPointCallback,this.centerFromEnd=function(stateCount,end){return end-stateCount[2]-stateCount[1]/2},this.foundPatternCross=function(stateCount){for(var moduleSize=this.moduleSize,maxVariance=moduleSize/2,i=0;3>i;i++)if(Math.abs(moduleSize-stateCount[i])>=maxVariance)return!1;return!0},this.crossCheckVertical=function(startI,centerJ,maxCount,originalStateCountTotal){var image=this.image,maxI=qrcode.height,stateCount=this.crossCheckStateCount;stateCount[0]=0,stateCount[1]=0,stateCount[2]=0;for(var i=startI;i>=0&&image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i--;if(0>i||stateCount[1]>maxCount)return NaN;for(;i>=0&&!image[centerJ+i*qrcode.width]&&stateCount[0]<=maxCount;)stateCount[0]++,i--;if(stateCount[0]>maxCount)return NaN;for(i=startI+1;maxI>i&&image[centerJ+i*qrcode.width]&&stateCount[1]<=maxCount;)stateCount[1]++,i++;if(i==maxI||stateCount[1]>maxCount)return NaN;for(;maxI>i&&!image[centerJ+i*qrcode.width]&&stateCount[2]<=maxCount;)stateCount[2]++,i++;if(stateCount[2]>maxCount)return NaN;var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2];return 5*Math.abs(stateCountTotal-originalStateCountTotal)>=2*originalStateCountTotal?NaN:this.foundPatternCross(stateCount)?this.centerFromEnd(stateCount,i):NaN},this.handlePossibleCenter=function(stateCount,i,j){var stateCountTotal=stateCount[0]+stateCount[1]+stateCount[2],centerJ=this.centerFromEnd(stateCount,j),centerI=this.crossCheckVertical(i,Math.floor(centerJ),2*stateCount[1],stateCountTotal);if(!isNaN(centerI)){for(var estimatedModuleSize=(stateCount[0]+stateCount[1]+stateCount[2])/3,max=this.possibleCenters.length,index=0;max>index;index++){var center=this.possibleCenters[index];if(center.aboutEquals(estimatedModuleSize,centerI,centerJ))return new AlignmentPattern(centerJ,centerI,estimatedModuleSize)}var point=new AlignmentPattern(centerJ,centerI,estimatedModuleSize);this.possibleCenters.push(point),null!=this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(point)}return null},this.find=function(){for(var startX=this.startX,height=this.height,maxJ=startX+width,middleI=startY+(height>>1),stateCount=new Array(0,0,0),iGen=0;height>iGen;iGen++){var i=middleI+(0==(1&iGen)?iGen+1>>1:-(iGen+1>>1));stateCount[0]=0,stateCount[1]=0,stateCount[2]=0;for(var j=startX;maxJ>j&&!image[j+qrcode.width*i];)j++;for(var currentState=0;maxJ>j;){if(image[j+i*qrcode.width])if(1==currentState)stateCount[currentState]++;else if(2==currentState){if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,j);if(null!=confirmed)return confirmed}stateCount[0]=stateCount[2],stateCount[1]=1,stateCount[2]=0,currentState=1}else stateCount[++currentState]++;else 1==currentState&¤tState++,stateCount[currentState]++;j++}if(this.foundPatternCross(stateCount)){var confirmed=this.handlePossibleCenter(stateCount,i,maxJ);if(null!=confirmed)return confirmed}}if(0!=this.possibleCenters.length)return this.possibleCenters[0];throw"Couldn't find enough alignment patterns"}}function QRCodeDataBlockReader(blocks,version,numErrorCorrectionCode){this.blockPointer=0,this.bitPointer=7,this.dataLength=0,this.blocks=blocks,this.numErrorCorrectionCode=numErrorCorrectionCode,9>=version?this.dataLengthMode=0:version>=10&&26>=version?this.dataLengthMode=1:version>=27&&40>=version&&(this.dataLengthMode=2),this.getNextBits=function(numBits){var bits=0;if(numBitsi;i++)mask+=1<>this.bitPointer-numBits+1,this.bitPointer-=numBits,bits}if(numBits>8-(numBits-(this.bitPointer+1)),this.bitPointer=this.bitPointer-numBits%8,this.bitPointer<0&&(this.bitPointer=8+this.bitPointer),bits}if(numBits>8-(numBits-(this.bitPointer+1+8));return bits=bitsFirstBlock+bitsSecondBlock+bitsThirdBlock,this.bitPointer=this.bitPointer-(numBits-8)%8,this.bitPointer<0&&(this.bitPointer=8+this.bitPointer),bits}return 0},this.NextMode=function(){return this.blockPointer>this.blocks.length-this.numErrorCorrectionCode-2?0:this.getNextBits(4)},this.getDataLength=function(modeIndicator){for(var index=0;;){if(modeIndicator>>index==1)break;index++}return this.getNextBits(qrcode.sizeOfDataLengthInfo[this.dataLengthMode][index])},this.getRomanAndFigureString=function(dataLength){var length=dataLength,intData=0,strData="",tableRomanAndFigure=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":");do if(length>1){intData=this.getNextBits(11);var firstLetter=Math.floor(intData/45),secondLetter=intData%45;strData+=tableRomanAndFigure[firstLetter],strData+=tableRomanAndFigure[secondLetter],length-=2}else 1==length&&(intData=this.getNextBits(6),strData+=tableRomanAndFigure[intData],length-=1);while(length>0);return strData},this.getFigureString=function(dataLength){var length=dataLength,intData=0,strData="";do length>=3?(intData=this.getNextBits(10),100>intData&&(strData+="0"),10>intData&&(strData+="0"),length-=3):2==length?(intData=this.getNextBits(7),10>intData&&(strData+="0"),length-=2):1==length&&(intData=this.getNextBits(4),length-=1),strData+=intData;while(length>0);return strData},this.get8bitByteArray=function(dataLength){var length=dataLength,intData=0,output=new Array;do intData=this.getNextBits(8),output.push(intData),length--;while(length>0);return output},this.getKanjiString=function(dataLength){var length=dataLength,intData=0,unicodeString="";do{intData=getNextBits(13);var lowerByte=intData%192,higherByte=intData/192,tempWord=(higherByte<<8)+lowerByte,shiftjisWord=0;shiftjisWord=40956>=tempWord+33088?tempWord+33088:tempWord+49472,unicodeString+=String.fromCharCode(shiftjisWord),length--}while(length>0);return unicodeString},this.__defineGetter__("DataByte",function(){for(var output=new Array,MODE_NUMBER=1,MODE_ROMAN_AND_NUMBER=2,MODE_8BIT_BYTE=4,MODE_KANJI=8;;){var mode=this.NextMode();if(0==mode){if(output.length>0)break;throw"Empty data block"}if(mode!=MODE_NUMBER&&mode!=MODE_ROMAN_AND_NUMBER&&mode!=MODE_8BIT_BYTE&&mode!=MODE_KANJI)throw"Invalid mode: "+mode+" in (block:"+this.blockPointer+" bit:"+this.bitPointer+")";if(dataLength=this.getDataLength(mode),dataLength<1)throw"Invalid data length: "+dataLength;switch(mode){case MODE_NUMBER:for(var temp_str=this.getFigureString(dataLength),ta=new Array(temp_str.length),j=0;j1048576){var canvas=document.createElement("canvas");canvas.width=canvas.height=1;var ctx=canvas.getContext("2d");return ctx.drawImage(img,-iw+1,0),0===ctx.getImageData(0,0,1,1).data[3]}return!1}function detectVerticalSquash(img,iw,ih){var canvas=document.createElement("canvas");canvas.width=1,canvas.height=ih;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);for(var data=ctx.getImageData(0,0,1,ih).data,sy=0,ey=ih,py=ih;py>sy;){var alpha=data[4*(py-1)+3];0===alpha?ey=py:sy=py,py=ey+sy>>1}var ratio=py/ih;return 0===ratio?1:ratio}function renderImageToDataURL(img,options,doSquash){var canvas=document.createElement("canvas");return renderImageToCanvas(img,canvas,options,doSquash),canvas.toDataURL("image/jpeg",options.quality||.8)}function renderImageToCanvas(img,canvas,options,doSquash){var iw=img.naturalWidth,ih=img.naturalHeight,width=options.width,height=options.height,ctx=canvas.getContext("2d");ctx.save(),transformCoordinate(canvas,width,height,options.orientation);var subsampled=detectSubsampling(img);subsampled&&(iw/=2,ih/=2);var d=1024,tmpCanvas=document.createElement("canvas");tmpCanvas.width=tmpCanvas.height=d;for(var tmpCtx=tmpCanvas.getContext("2d"),vertSquashRatio=doSquash?detectVerticalSquash(img,iw,ih):1,dw=Math.ceil(d*width/iw),dh=Math.ceil(d*height/ih/vertSquashRatio),sy=0,dy=0;ih>sy;){for(var sx=0,dx=0;iw>sx;)tmpCtx.clearRect(0,0,d,d),tmpCtx.drawImage(img,-sx,-sy),ctx.drawImage(tmpCanvas,0,0,d,d,dx,dy,dw,dh),sx+=d,dx+=dw;sy+=d,dy+=dh}ctx.restore(),tmpCanvas=tmpCtx=null}function transformCoordinate(canvas,width,height,orientation){switch(orientation){case 5:case 6:case 7:case 8:canvas.width=height,canvas.height=width;break;default:canvas.width=width,canvas.height=height}var ctx=canvas.getContext("2d");switch(orientation){case 2:ctx.translate(width,0),ctx.scale(-1,1);break;case 3:ctx.translate(width,height),ctx.rotate(Math.PI);break;case 4:ctx.translate(0,height),ctx.scale(1,-1);break;case 5:ctx.rotate(.5*Math.PI),ctx.scale(1,-1);break;case 6:ctx.rotate(.5*Math.PI),ctx.translate(0,-height);break;case 7:ctx.rotate(.5*Math.PI),ctx.translate(width,-height),ctx.scale(-1,1);break;case 8:ctx.rotate(-.5*Math.PI),ctx.translate(-width,0)}}function MegaPixImage(srcImage){if(window.Blob&&srcImage instanceof Blob){var img=new Image,URL=window.URL&&window.URL.createObjectURL?window.URL:window.webkitURL&&window.webkitURL.createObjectURL?window.webkitURL:null;if(!URL)throw Error("No createObjectURL function found to create blob url");img.src=URL.createObjectURL(srcImage),this.blob=srcImage,srcImage=img}if(!srcImage.naturalWidth&&!srcImage.naturalHeight){var _this=this;srcImage.onload=function(){var listeners=_this.imageLoadListeners;if(listeners){_this.imageLoadListeners=null;for(var i=0,len=listeners.length;len>i;i++)listeners[i]()}},this.imageLoadListeners=[]}this.srcImage=srcImage}MegaPixImage.prototype.render=function(target,options){if(this.imageLoadListeners){var _this=this;return void this.imageLoadListeners.push(function(){_this.render(target,options)})}options=options||{};var imgWidth=this.srcImage.naturalWidth,imgHeight=this.srcImage.naturalHeight,width=options.width,height=options.height,maxWidth=options.maxWidth,maxHeight=options.maxHeight,doSquash=!this.blob||"image/jpeg"===this.blob.type;width&&!height?height=imgHeight*width/imgWidth<<0:height&&!width?width=imgWidth*height/imgHeight<<0:(width=imgWidth,height=imgHeight),maxWidth&&width>maxWidth&&(width=maxWidth,height=imgHeight*width/imgWidth<<0),maxHeight&&height>maxHeight&&(height=maxHeight,width=imgWidth*height/imgHeight<<0);var opt={width:width,height:height};for(var k in options)opt[k]=options[k];var tagName=target.tagName.toLowerCase();"img"===tagName?target.src=renderImageToDataURL(this.srcImage,opt,doSquash):"canvas"===tagName&&renderImageToCanvas(this.srcImage,target,opt,doSquash),"function"==typeof this.onrender&&this.onrender(target)},"function"==typeof define&&define.amd?define([],function(){return MegaPixImage}):this.MegaPixImage=MegaPixImage}();var qrcode=function(){function qrPolynomial(num,shift){if("undefined"==typeof num.length)throw new Error(num.length+"/"+shift);var _num=function(){for(var offset=0;offsetrow;row+=1){modules[row]=new Array(moduleCount);for(var col=0;moduleCount>col;col+=1)modules[row][col]=null}return modules}(_moduleCount),setupPositionProbePattern(0,0),setupPositionProbePattern(_moduleCount-7,0),setupPositionProbePattern(0,_moduleCount-7),setupPositionAdjustPattern(),setupTimingPattern(),setupTypeInfo(test,maskPattern),_typeNumber>=7&&setupTypeNumber(test),null==_dataCache&&(_dataCache=createData(_typeNumber,_errorCorrectLevel,_dataList)),mapData(_dataCache,maskPattern)},setupPositionProbePattern=function(row,col){for(var r=-1;7>=r;r+=1)if(!(-1>=row+r||row+r>=_moduleCount))for(var c=-1;7>=c;c+=1)-1>=col+c||col+c>=_moduleCount||(r>=0&&6>=r&&(0==c||6==c)||c>=0&&6>=c&&(0==r||6==r)||r>=2&&4>=r&&c>=2&&4>=c?_modules[row+r][col+c]=!0:_modules[row+r][col+c]=!1)},getBestMaskPattern=function(){for(var minLostPoint=0,pattern=0,i=0;8>i;i+=1){makeImpl(!0,i);var lostPoint=QRUtil.getLostPoint(_this);(0==i||minLostPoint>lostPoint)&&(minLostPoint=lostPoint,pattern=i)}return pattern},setupTimingPattern=function(){for(var r=8;_moduleCount-8>r;r+=1)null==_modules[r][6]&&(_modules[r][6]=r%2==0);for(var c=8;_moduleCount-8>c;c+=1)null==_modules[6][c]&&(_modules[6][c]=c%2==0)},setupPositionAdjustPattern=function(){for(var pos=QRUtil.getPatternPosition(_typeNumber),i=0;i=r;r+=1)for(var c=-2;2>=c;c+=1)-2==r||2==r||-2==c||2==c||0==r&&0==c?_modules[row+r][col+c]=!0:_modules[row+r][col+c]=!1}},setupTypeNumber=function(test){for(var bits=QRUtil.getBCHTypeNumber(_typeNumber),i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[Math.floor(i/3)][i%3+_moduleCount-8-3]=mod}for(var i=0;18>i;i+=1){var mod=!test&&1==(bits>>i&1);_modules[i%3+_moduleCount-8-3][Math.floor(i/3)]=mod}},setupTypeInfo=function(test,maskPattern){for(var data=_errorCorrectLevel<<3|maskPattern,bits=QRUtil.getBCHTypeInfo(data),i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);6>i?_modules[i][8]=mod:8>i?_modules[i+1][8]=mod:_modules[_moduleCount-15+i][8]=mod}for(var i=0;15>i;i+=1){var mod=!test&&1==(bits>>i&1);8>i?_modules[8][_moduleCount-i-1]=mod:9>i?_modules[8][15-i-1+1]=mod:_modules[8][15-i-1]=mod}_modules[_moduleCount-8][8]=!test},mapData=function(data,maskPattern){for(var inc=-1,row=_moduleCount-1,bitIndex=7,byteIndex=0,maskFunc=QRUtil.getMaskFunction(maskPattern),col=_moduleCount-1;col>0;col-=2)for(6==col&&(col-=1);;){for(var c=0;2>c;c+=1)if(null==_modules[row][col-c]){var dark=!1;byteIndex>>bitIndex&1));var mask=maskFunc(row,col-c);mask&&(dark=!dark),_modules[row][col-c]=dark,bitIndex-=1,-1==bitIndex&&(byteIndex+=1,bitIndex=7)}if(row+=inc,0>row||row>=_moduleCount){row-=inc,inc=-inc;break}}},createBytes=function(buffer,rsBlocks){for(var offset=0,maxDcCount=0,maxEcCount=0,dcdata=new Array(rsBlocks.length),ecdata=new Array(rsBlocks.length),r=0;r=0?modPoly.getAt(modIndex):0}}for(var totalCodeCount=0,i=0;ii;i+=1)for(var r=0;ri;i+=1)for(var r=0;r8*totalDataCount)throw new Error("code length overflow. ("+buffer.getLengthInBits()+">"+8*totalDataCount+")");for(buffer.getLengthInBits()+4<=8*totalDataCount&&buffer.put(0,4);buffer.getLengthInBits()%8!=0;)buffer.putBit(!1);for(;;){if(buffer.getLengthInBits()>=8*totalDataCount)break;if(buffer.put(PAD0,8),buffer.getLengthInBits()>=8*totalDataCount)break;buffer.put(PAD1,8)}return createBytes(buffer,rsBlocks)};return _this.addData=function(data){var newData=qr8BitByte(data);_dataList.push(newData),_dataCache=null},_this.isDark=function(row,col){if(0>row||row>=_moduleCount||0>col||col>=_moduleCount)throw new Error(row+","+col);return _modules[row][col]},_this.getModuleCount=function(){return _moduleCount},_this.make=function(){makeImpl(!1,getBestMaskPattern())},_this.createTableTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var qrHtml="";qrHtml+='";for(var c=0;c<_this.getModuleCount();c+=1)qrHtml+='"}return qrHtml+="",qrHtml+="
      ';qrHtml+="
      "},_this.createImgTag=function(cellSize,margin){cellSize=cellSize||2,margin="undefined"==typeof margin?4*cellSize:margin;var size=_this.getModuleCount()*cellSize+2*margin,min=margin,max=size-margin;return createImgTag(size,size,function(x,y){if(x>=min&&max>x&&y>=min&&max>y){var c=Math.floor((x-min)/cellSize),r=Math.floor((y-min)/cellSize);return _this.isDark(r,c)?0:1}return 1})},_this};qrcode.stringToBytes=function(s){for(var bytes=new Array,i=0;ic)bytes.push(c);else{var b=unicodeMap[s.charAt(i)];"number"==typeof b?(255&b)==b?bytes.push(b):(bytes.push(b>>>8),bytes.push(255&b)):bytes.push(unknownChar)}}return bytes}};var QRMode={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},QRErrorCorrectLevel={L:1,M:0,Q:3,H:2},QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},QRUtil=function(){var PATTERN_POSITION_TABLE=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15=1335,G18=7973,G15_MASK=21522,_this={},getBCHDigit=function(data){ -for(var digit=0;0!=data;)digit+=1,data>>>=1;return digit};return _this.getBCHTypeInfo=function(data){for(var d=data<<10;getBCHDigit(d)-getBCHDigit(G15)>=0;)d^=G15<=0;)d^=G18<i;i+=1)a=a.multiply(qrPolynomial([1,QRMath.gexp(i)],0));return a},_this.getLengthInBits=function(mode,type){if(type>=1&&10>type)switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode)}else if(27>type)switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode)}else{if(!(41>type))throw new Error("type:"+type);switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode)}}},_this.getLostPoint=function(qrcode){for(var moduleCount=qrcode.getModuleCount(),lostPoint=0,row=0;moduleCount>row;row+=1)for(var col=0;moduleCount>col;col+=1){for(var sameCount=0,dark=qrcode.isDark(row,col),r=-1;1>=r;r+=1)if(!(0>row+r||row+r>=moduleCount))for(var c=-1;1>=c;c+=1)0>col+c||col+c>=moduleCount||(0!=r||0!=c)&&dark==qrcode.isDark(row+r,col+c)&&(sameCount+=1);sameCount>5&&(lostPoint+=3+sameCount-5)}for(var row=0;moduleCount-1>row;row+=1)for(var col=0;moduleCount-1>col;col+=1){var count=0;qrcode.isDark(row,col)&&(count+=1),qrcode.isDark(row+1,col)&&(count+=1),qrcode.isDark(row,col+1)&&(count+=1),qrcode.isDark(row+1,col+1)&&(count+=1),(0==count||4==count)&&(lostPoint+=3)}for(var row=0;moduleCount>row;row+=1)for(var col=0;moduleCount-6>col;col+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row,col+1)&&qrcode.isDark(row,col+2)&&qrcode.isDark(row,col+3)&&qrcode.isDark(row,col+4)&&!qrcode.isDark(row,col+5)&&qrcode.isDark(row,col+6)&&(lostPoint+=40);for(var col=0;moduleCount>col;col+=1)for(var row=0;moduleCount-6>row;row+=1)qrcode.isDark(row,col)&&!qrcode.isDark(row+1,col)&&qrcode.isDark(row+2,col)&&qrcode.isDark(row+3,col)&&qrcode.isDark(row+4,col)&&!qrcode.isDark(row+5,col)&&qrcode.isDark(row+6,col)&&(lostPoint+=40);for(var darkCount=0,col=0;moduleCount>col;col+=1)for(var row=0;moduleCount>row;row+=1)qrcode.isDark(row,col)&&(darkCount+=1);var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;return lostPoint+=10*ratio},_this}(),QRMath=function(){for(var EXP_TABLE=new Array(256),LOG_TABLE=new Array(256),i=0;8>i;i+=1)EXP_TABLE[i]=1<i;i+=1)EXP_TABLE[i]=EXP_TABLE[i-4]^EXP_TABLE[i-5]^EXP_TABLE[i-6]^EXP_TABLE[i-8];for(var i=0;255>i;i+=1)LOG_TABLE[EXP_TABLE[i]]=i;var _this={};return _this.glog=function(n){if(1>n)throw new Error("glog("+n+")");return LOG_TABLE[n]},_this.gexp=function(n){for(;0>n;)n+=255;for(;n>=256;)n-=255;return EXP_TABLE[n]},_this}(),QRRSBlock=function(){var RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16]],qrRSBlock=function(totalCount,dataCount){var _this={};return _this.totalCount=totalCount,_this.dataCount=dataCount,_this},_this={},getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return RS_BLOCK_TABLE[4*(typeNumber-1)+0];case QRErrorCorrectLevel.M:return RS_BLOCK_TABLE[4*(typeNumber-1)+1];case QRErrorCorrectLevel.Q:return RS_BLOCK_TABLE[4*(typeNumber-1)+2];case QRErrorCorrectLevel.H:return RS_BLOCK_TABLE[4*(typeNumber-1)+3];default:return void 0}};return _this.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=getRsBlockTable(typeNumber,errorCorrectLevel);if("undefined"==typeof rsBlock)throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);for(var length=rsBlock.length/3,list=new Array,i=0;length>i;i+=1)for(var count=rsBlock[3*i+0],totalCount=rsBlock[3*i+1],dataCount=rsBlock[3*i+2],j=0;count>j;j+=1)list.push(qrRSBlock(totalCount,dataCount));return list},_this}(),qrBitBuffer=function(){var _buffer=new Array,_length=0,_this={};return _this.getBuffer=function(){return _buffer},_this.getAt=function(index){var bufIndex=Math.floor(index/8);return 1==(_buffer[bufIndex]>>>7-index%8&1)},_this.put=function(num,length){for(var i=0;length>i;i+=1)_this.putBit(1==(num>>>length-i-1&1))},_this.getLengthInBits=function(){return _length},_this.putBit=function(bit){var bufIndex=Math.floor(_length/8);_buffer.length<=bufIndex&&_buffer.push(0),bit&&(_buffer[bufIndex]|=128>>>_length%8),_length+=1},_this},qr8BitByte=function(data){var _mode=QRMode.MODE_8BIT_BYTE,_bytes=qrcode.stringToBytes(data),_this={};return _this.getMode=function(){return _mode},_this.getLength=function(buffer){return _bytes.length},_this.write=function(buffer){for(var i=0;i<_bytes.length;i+=1)buffer.put(_bytes[i],8)},_this},byteArrayOutputStream=function(){var _bytes=new Array,_this={};return _this.writeByte=function(b){_bytes.push(255&b)},_this.writeShort=function(i){_this.writeByte(i),_this.writeByte(i>>>8)},_this.writeBytes=function(b,off,len){off=off||0,len=len||b.length;for(var i=0;len>i;i+=1)_this.writeByte(b[i+off])},_this.writeString=function(s){for(var i=0;i0&&(s+=","),s+=_bytes[i];return s+="]"},_this},base64EncodeOutputStream=function(){var _buffer=0,_buflen=0,_length=0,_base64="",_this={},writeEncoded=function(b){_base64+=String.fromCharCode(encode(63&b))},encode=function(n){if(0>n);else{if(26>n)return 65+n;if(52>n)return 97+(n-26);if(62>n)return 48+(n-52);if(62==n)return 43;if(63==n)return 47}throw new Error("n:"+n)};return _this.writeByte=function(n){for(_buffer=_buffer<<8|255&n,_buflen+=8,_length+=1;_buflen>=6;)writeEncoded(_buffer>>>_buflen-6),_buflen-=6},_this.flush=function(){if(_buflen>0&&(writeEncoded(_buffer<<6-_buflen),_buffer=0,_buflen=0),_length%3!=0)for(var padlen=3-_length%3,i=0;padlen>i;i+=1)_base64+="="},_this.toString=function(){return _base64},_this},base64DecodeInputStream=function(str){var _str=str,_pos=0,_buffer=0,_buflen=0,_this={};_this.read=function(){for(;8>_buflen;){if(_pos>=_str.length){if(0==_buflen)return-1;throw new Error("unexpected end of file./"+_buflen)}var c=_str.charAt(_pos);if(_pos+=1,"="==c)return _buflen=0,-1;c.match(/^\s$/)||(_buffer=_buffer<<6|decode(c.charCodeAt(0)),_buflen+=6)}var n=_buffer>>>_buflen-8&255;return _buflen-=8,n};var decode=function(c){if(c>=65&&90>=c)return c-65;if(c>=97&&122>=c)return c-97+26;if(c>=48&&57>=c)return c-48+52;if(43==c)return 62;if(47==c)return 63;throw new Error("c:"+c)};return _this},gifImage=function(width,height){var _width=width,_height=height,_data=new Array(width*height),_this={};_this.setPixel=function(x,y,pixel){_data[y*_width+x]=pixel},_this.write=function(out){out.writeString("GIF87a"),out.writeShort(_width),out.writeShort(_height),out.writeByte(128),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(0),out.writeByte(255),out.writeByte(255),out.writeByte(255),out.writeString(","),out.writeShort(0),out.writeShort(0),out.writeShort(_width),out.writeShort(_height),out.writeByte(0);var lzwMinCodeSize=2,raster=getLZWRaster(lzwMinCodeSize);out.writeByte(lzwMinCodeSize);for(var offset=0;raster.length-offset>255;)out.writeByte(255),out.writeBytes(raster,offset,255),offset+=255;out.writeByte(raster.length-offset),out.writeBytes(raster,offset,raster.length-offset),out.writeByte(0),out.writeString(";")};var bitOutputStream=function(out){var _out=out,_bitLength=0,_bitBuffer=0,_this={};return _this.write=function(data,length){if(data>>>length!=0)throw new Error("length over");for(;_bitLength+length>=8;)_out.writeByte(255&(data<<_bitLength|_bitBuffer)),length-=8-_bitLength,data>>>=8-_bitLength,_bitBuffer=0,_bitLength=0;_bitBuffer=data<<_bitLength|_bitBuffer,_bitLength+=length},_this.flush=function(){_bitLength>0&&_out.writeByte(_bitBuffer)},_this},getLZWRaster=function(lzwMinCodeSize){for(var clearCode=1<i;i+=1)table.add(String.fromCharCode(i));table.add(String.fromCharCode(clearCode)),table.add(String.fromCharCode(endCode));var byteOut=byteArrayOutputStream(),bitOut=bitOutputStream(byteOut);bitOut.write(clearCode,bitLength);var dataIndex=0,s=String.fromCharCode(_data[dataIndex]);for(dataIndex+=1;dataIndex<_data.length;){var c=String.fromCharCode(_data[dataIndex]);dataIndex+=1,table.contains(s+c)?s+=c:(bitOut.write(table.indexOf(s),bitLength),table.size()<4095&&(table.size()==1<y;y+=1)for(var x=0;width>x;x+=1)gif.setPixel(x,y,getPixel(x,y));var b=byteArrayOutputStream();gif.write(b);for(var base64=base64EncodeOutputStream(),bytes=b.toByteArray(),i=0;ix||x>width||-1>y||y>height)throw"Error.checkAndNudgePoints ";nudged=!1,-1==x?(points[offset]=0,nudged=!0):x==width&&(points[offset]=width-1,nudged=!0),-1==y?(points[offset+1]=0,nudged=!0):y==height&&(points[offset+1]=height-1,nudged=!0)}nudged=!0;for(var offset=points.length-2;offset>=0&&nudged;offset-=2){var x=Math.floor(points[offset]),y=Math.floor(points[offset+1]);if(-1>x||x>width||-1>y||y>height)throw"Error.checkAndNudgePoints ";nudged=!1,-1==x?(points[offset]=0,nudged=!0):x==width&&(points[offset]=width-1,nudged=!0),-1==y?(points[offset+1]=0,nudged=!0):y==height&&(points[offset+1]=height-1,nudged=!0)}},GridSampler.sampleGrid3=function(image,dimension,transform){for(var bits=new BitMatrix(dimension),points=new Array(dimension<<1),y=0;dimension>y;y++){for(var max=points.length,iValue=y+.5,x=0;max>x;x+=2)points[x]=(x>>1)+.5,points[x+1]=iValue;transform.transformPoints1(points),GridSampler.checkAndNudgePoints(image,points);try{for(var x=0;max>x;x+=2){var xpoint=4*Math.floor(points[x])+Math.floor(points[x+1])*qrcode.width*4,bit=image[Math.floor(points[x])+qrcode.width*Math.floor(points[x+1])];qrcode.imagedata.data[xpoint]=bit?255:0,qrcode.imagedata.data[xpoint+1]=bit?255:0,qrcode.imagedata.data[xpoint+2]=0,qrcode.imagedata.data[xpoint+3]=255,bit&&bits.set_Renamed(x>>1,y)}}catch(aioobe){throw"Error.checkAndNudgePoints"}}return bits},GridSampler.sampleGridx=function(image,dimension,p1ToX,p1ToY,p2ToX,p2ToY,p3ToX,p3ToY,p4ToX,p4ToY,p1FromX,p1FromY,p2FromX,p2FromY,p3FromX,p3FromY,p4FromX,p4FromY){var transform=PerspectiveTransform.quadrilateralToQuadrilateral(p1ToX,p1ToY,p2ToX,p2ToY,p3ToX,p3ToY,p4ToX,p4ToY,p1FromX,p1FromY,p2FromX,p2FromY,p3FromX,p3FromY,p4FromX,p4FromY);return GridSampler.sampleGrid3(image,dimension,transform)},Version.VERSION_DECODE_INFO=new Array(31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017),Version.VERSIONS=buildVersions(),Version.getVersionForNumber=function(versionNumber){if(1>versionNumber||versionNumber>40)throw"ArgumentException";return Version.VERSIONS[versionNumber-1]},Version.getProvisionalVersionForDimension=function(dimension){if(dimension%4!=1)throw"Error getProvisionalVersionForDimension";try{return Version.getVersionForNumber(dimension-17>>2)}catch(iae){throw"Error getVersionForNumber"}},Version.decodeVersionInformation=function(versionBits){for(var bestDifference=4294967295,bestVersion=0,i=0;ibitsDifference&&(bestVersion=i+7,bestDifference=bitsDifference)}return 3>=bestDifference?this.getVersionForNumber(bestVersion):null},PerspectiveTransform.quadrilateralToQuadrilateral=function(x0,y0,x1,y1,x2,y2,x3,y3,x0p,y0p,x1p,y1p,x2p,y2p,x3p,y3p){var qToS=this.quadrilateralToSquare(x0,y0,x1,y1,x2,y2,x3,y3),sToQ=this.squareToQuadrilateral(x0p,y0p,x1p,y1p,x2p,y2p,x3p,y3p);return sToQ.times(qToS)},PerspectiveTransform.squareToQuadrilateral=function(x0,y0,x1,y1,x2,y2,x3,y3){return dy2=y3-y2,dy3=y0-y1+y2-y3,0==dy2&&0==dy3?new PerspectiveTransform(x1-x0,x2-x1,x0,y1-y0,y2-y1,y0,0,0,1):(dx1=x1-x2,dx2=x3-x2,dx3=x0-x1+x2-x3,dy1=y1-y2,denominator=dx1*dy2-dx2*dy1,a13=(dx3*dy2-dx2*dy3)/denominator,a23=(dx1*dy3-dx3*dy1)/denominator,new PerspectiveTransform(x1-x0+a13*x1,x3-x0+a23*x3,x0,y1-y0+a13*y1,y3-y0+a23*y3,y0,a13,a23,1))},PerspectiveTransform.quadrilateralToSquare=function(x0,y0,x1,y1,x2,y2,x3,y3){return this.squareToQuadrilateral(x0,y0,x1,y1,x2,y2,x3,y3).buildAdjoint()};var FORMAT_INFO_MASK_QR=21522,FORMAT_INFO_DECODE_LOOKUP=new Array(new Array(21522,0),new Array(20773,1),new Array(24188,2),new Array(23371,3),new Array(17913,4),new Array(16590,5),new Array(20375,6),new Array(19104,7),new Array(30660,8),new Array(29427,9),new Array(32170,10),new Array(30877,11),new Array(26159,12),new Array(25368,13),new Array(27713,14),new Array(26998,15),new Array(5769,16),new Array(5054,17),new Array(7399,18),new Array(6608,19),new Array(1890,20),new Array(597,21),new Array(3340,22),new Array(2107,23),new Array(13663,24),new Array(12392,25),new Array(16177,26),new Array(14854,27),new Array(9396,28),new Array(8579,29),new Array(11994,30),new Array(11245,31)),BITS_SET_IN_HALF_BYTE=new Array(0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4);FormatInformation.numBitsDiffering=function(a,b){return a^=b,BITS_SET_IN_HALF_BYTE[15&a]+BITS_SET_IN_HALF_BYTE[15&URShift(a,4)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,8)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,12)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,16)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,20)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,24)]+BITS_SET_IN_HALF_BYTE[15&URShift(a,28)]},FormatInformation.decodeFormatInformation=function(maskedFormatInfo){var formatInfo=FormatInformation.doDecodeFormatInformation(maskedFormatInfo);return null!=formatInfo?formatInfo:FormatInformation.doDecodeFormatInformation(maskedFormatInfo^FORMAT_INFO_MASK_QR)},FormatInformation.doDecodeFormatInformation=function(maskedFormatInfo){for(var bestDifference=4294967295,bestFormatInfo=0,i=0;ibitsDifference&&(bestFormatInfo=decodeInfo[1],bestDifference=bitsDifference)}return 3>=bestDifference?new FormatInformation(bestFormatInfo):null},ErrorCorrectionLevel.forBits=function(bits){if(0>bits||bits>=FOR_BITS.length)throw"ArgumentException";return FOR_BITS[bits]};var L=new ErrorCorrectionLevel(0,1,"L"),M=new ErrorCorrectionLevel(1,0,"M"),Q=new ErrorCorrectionLevel(2,3,"Q"),H=new ErrorCorrectionLevel(3,2,"H"),FOR_BITS=new Array(M,L,H,Q);DataBlock.getDataBlocks=function(rawCodewords,version,ecLevel){if(rawCodewords.length!=version.TotalCodewords)throw"ArgumentException";for(var ecBlocks=version.getECBlocksForLevel(ecLevel),totalBlocks=0,ecBlockArray=ecBlocks.getECBlocks(),i=0;i=0;){var numCodewords=result[longerBlocksStartAt].codewords.length;if(numCodewords==shorterBlocksTotalCodewords)break;longerBlocksStartAt--}longerBlocksStartAt++;for(var shorterBlocksNumDataCodewords=shorterBlocksTotalCodewords-ecBlocks.ECCodewordsPerBlock,rawCodewordsOffset=0,i=0;shorterBlocksNumDataCodewords>i;i++)for(var j=0;numResultBlocks>j;j++)result[j].codewords[i]=rawCodewords[rawCodewordsOffset++];for(var j=longerBlocksStartAt;numResultBlocks>j;j++)result[j].codewords[shorterBlocksNumDataCodewords]=rawCodewords[rawCodewordsOffset++];for(var max=result[0].codewords.length,i=shorterBlocksNumDataCodewords;max>i;i++)for(var j=0;numResultBlocks>j;j++){var iOffset=longerBlocksStartAt>j?i:i+1;result[j].codewords[iOffset]=rawCodewords[rawCodewordsOffset++]}return result},DataMask={},DataMask.forReference=function(reference){if(0>reference||reference>7)throw"System.ArgumentException";return DataMask.DATA_MASKS[reference]},DataMask.DATA_MASKS=new Array(new DataMask000,new DataMask001,new DataMask010,new DataMask011,new DataMask100,new DataMask101,new DataMask110,new DataMask111),GF256.QR_CODE_FIELD=new GF256(285),GF256.DATA_MATRIX_FIELD=new GF256(301),GF256.addOrSubtract=function(a,b){return a^b},Decoder={},Decoder.rsDecoder=new ReedSolomonDecoder(GF256.QR_CODE_FIELD),Decoder.correctErrors=function(codewordBytes,numDataCodewords){for(var numCodewords=codewordBytes.length,codewordsInts=new Array(numCodewords),i=0;numCodewords>i;i++)codewordsInts[i]=255&codewordBytes[i];var numECCodewords=codewordBytes.length-numDataCodewords;try{Decoder.rsDecoder.decode(codewordsInts,numECCodewords)}catch(rse){throw rse}for(var i=0;numDataCodewords>i;i++)codewordBytes[i]=codewordsInts[i]},Decoder.decode=function(bits){for(var parser=new BitMatrixParser(bits),version=parser.readVersion(),ecLevel=parser.readFormatInformation().ErrorCorrectionLevel,codewords=parser.readCodewords(),dataBlocks=DataBlock.getDataBlocks(codewords,version,ecLevel),totalBytes=0,i=0;ii;i++)resultBytes[resultOffset++]=codewordBytes[i]}var reader=new QRCodeDataBlockReader(resultBytes,version.VersionNumber,ecLevel.Bits);return reader},qrcode=window.qrcode||{},qrcode.imagedata=null,qrcode.width=0,qrcode.height=0,qrcode.qrCodeSymbol=null,qrcode.debug=!1,qrcode.maxImgSize=1048576,qrcode.sizeOfDataLengthInfo=[[10,9,8,8],[12,11,16,10],[14,13,16,12]],qrcode.callback=null,qrcode.decode=function(src){if(0==arguments.length){var canvas_qr=document.getElementById("qr-canvas"),context=canvas_qr.getContext("2d");return qrcode.width=canvas_qr.width,qrcode.height=canvas_qr.height,qrcode.imagedata=context.getImageData(0,0,qrcode.width,qrcode.height),qrcode.result=qrcode.process(context),null!=qrcode.callback&&qrcode.callback(qrcode.result),qrcode.result}var image=new Image;image.onload=function(){var canvas_qr=document.createElement("canvas"),context=canvas_qr.getContext("2d"),nheight=image.height,nwidth=image.width;if(image.width*image.height>qrcode.maxImgSize){var ir=image.width/image.height;nheight=Math.sqrt(qrcode.maxImgSize/ir),nwidth=ir*nheight}canvas_qr.width=nwidth,canvas_qr.height=nheight,context.drawImage(image,0,0,canvas_qr.width,canvas_qr.height),qrcode.width=canvas_qr.width,qrcode.height=canvas_qr.height;try{qrcode.imagedata=context.getImageData(0,0,canvas_qr.width,canvas_qr.height)}catch(e){return qrcode.result="Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!",void(null!=qrcode.callback&&qrcode.callback(qrcode.result))}try{qrcode.result=qrcode.process(context)}catch(e){console.log(e),qrcode.result="error decoding QR Code"}null!=qrcode.callback&&qrcode.callback(qrcode.result)},image.src=src},qrcode.isUrl=function(s){var regexp=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return regexp.test(s)},qrcode.decode_url=function(s){var escaped="";try{escaped=escape(s)}catch(e){console.log(e),escaped=s}var ret="";try{ret=decodeURIComponent(escaped)}catch(e){console.log(e),ret=escaped}return ret},qrcode.decode_utf8=function(s){return qrcode.isUrl(s)?qrcode.decode_url(s):s},qrcode.process=function(ctx){var start=(new Date).getTime(),image=qrcode.grayScaleToBitmap(qrcode.grayscale());if(qrcode.debug){for(var y=0;y=gray?!0:!1}return ret},qrcode.getMiddleBrightnessPerArea=function(image){for(var numSqrtArea=4,areaWidth=Math.floor(qrcode.width/numSqrtArea),areaHeight=Math.floor(qrcode.height/numSqrtArea),minmax=new Array(numSqrtArea),i=0;numSqrtArea>i;i++){minmax[i]=new Array(numSqrtArea);for(var i2=0;numSqrtArea>i2;i2++)minmax[i][i2]=new Array(0,0)}for(var ay=0;numSqrtArea>ay;ay++)for(var ax=0;numSqrtArea>ax;ax++){minmax[ax][ay][0]=255;for(var dy=0;areaHeight>dy;dy++)for(var dx=0;areaWidth>dx;dx++){var target=image[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width];targetminmax[ax][ay][1]&&(minmax[ax][ay][1]=target)}}for(var middle=new Array(numSqrtArea),i3=0;numSqrtArea>i3;i3++)middle[i3]=new Array(numSqrtArea);for(var ay=0;numSqrtArea>ay;ay++)for(var ax=0;numSqrtArea>ax;ax++)middle[ax][ay]=Math.floor((minmax[ax][ay][0]+minmax[ax][ay][1])/2);return middle},qrcode.grayScaleToBitmap=function(grayScale){for(var middle=qrcode.getMiddleBrightnessPerArea(grayScale),sqrtNumArea=middle.length,areaWidth=Math.floor(qrcode.width/sqrtNumArea),areaHeight=Math.floor(qrcode.height/sqrtNumArea),bitmap=new Array(qrcode.height*qrcode.width),ay=0;sqrtNumArea>ay;ay++)for(var ax=0;sqrtNumArea>ax;ax++)for(var dy=0;areaHeight>dy;dy++)for(var dx=0;areaWidth>dx;dx++)bitmap[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width]=grayScale[areaWidth*ax+dx+(areaHeight*ay+dy)*qrcode.width]from?this.length+from:from,this.push.apply(this,rest)};var MIN_SKIP=3,MAX_MODULES=57,INTEGER_MATH_SHIFT=8,CENTER_QUORUM=2;qrcode.orderBestPatterns=function(patterns){function distance(pattern1,pattern2){return xDiff=pattern1.X-pattern2.X,yDiff=pattern1.Y-pattern2.Y,Math.sqrt(xDiff*xDiff+yDiff*yDiff)}function crossProductZ(pointA,pointB,pointC){var bX=pointB.x,bY=pointB.y;return(pointC.x-bX)*(pointA.y-bY)-(pointC.y-bY)*(pointA.x-bX)}var pointA,pointB,pointC,zeroOneDistance=distance(patterns[0],patterns[1]),oneTwoDistance=distance(patterns[1],patterns[2]),zeroTwoDistance=distance(patterns[0],patterns[2]);if(oneTwoDistance>=zeroOneDistance&&oneTwoDistance>=zeroTwoDistance?(pointB=patterns[0],pointA=patterns[1],pointC=patterns[2]):zeroTwoDistance>=oneTwoDistance&&zeroTwoDistance>=zeroOneDistance?(pointB=patterns[1],pointA=patterns[0],pointC=patterns[2]):(pointB=patterns[2],pointA=patterns[0],pointC=patterns[1]),crossProductZ(pointA,pointB,pointC)<0){var temp=pointA;pointA=pointC,pointC=temp}patterns[0]=pointA,patterns[1]=pointB,patterns[2]=pointC},function(a){function b(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function c(a,b){return function(c){return k(a.call(this,c),b)}}function d(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function e(){}function f(a){w(a),h(this,a)}function g(a){var b=q(a),c=b.year||0,d=b.month||0,e=b.week||0,f=b.day||0,g=b.hour||0,h=b.minute||0,i=b.second||0,j=b.millisecond||0;this._milliseconds=+j+1e3*i+6e4*h+36e5*g,this._days=+f+7*e,this._months=+d+12*c,this._data={},this._bubble()}function h(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty("toString")&&(a.toString=b.toString),b.hasOwnProperty("valueOf")&&(a.valueOf=b.valueOf),a}function i(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&qb.hasOwnProperty(b)&&(c[b]=a[b]);return c}function j(a){return 0>a?Math.ceil(a):Math.floor(a)}function k(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&s(a[d])!==s(b[d]))&&g++;return g+f}function p(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=Tb[a]||Ub[b]||b}return a}function q(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=p(c),b&&(d[b]=a[c]));return d}function r(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}db[b]=function(e,f){var g,h,i=db.fn._lang[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=db().utc().set(d,a);return i.call(db.fn._lang,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function s(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function t(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function u(a){return v(a)?366:365}function v(a){return a%4===0&&a%100!==0||a%400===0}function w(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[jb]<0||a._a[jb]>11?jb:a._a[kb]<1||a._a[kb]>t(a._a[ib],a._a[jb])?kb:a._a[lb]<0||a._a[lb]>23?lb:a._a[mb]<0||a._a[mb]>59?mb:a._a[nb]<0||a._a[nb]>59?nb:a._a[ob]<0||a._a[ob]>999?ob:-1,a._pf._overflowDayOfYear&&(ib>b||b>kb)&&(b=kb),a._pf.overflow=b)}function x(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function y(a){return a?a.toLowerCase().replace("_","-"):a}function z(a,b){return b._isUTC?db(a).zone(b._offset||0):db(a).local()}function A(a,b){return b.abbr=a,pb[a]||(pb[a]=new e),pb[a].set(b),pb[a]}function B(a){delete pb[a]}function C(a){var b,c,d,e,f=0,g=function(a){if(!pb[a]&&rb)try{require("./lang/"+a)}catch(b){}return pb[a]};if(!a)return db.fn._lang;if(!m(a)){if(c=g(a))return c;a=[a]}for(;f0;){if(c=g(e.slice(0,b).join("-")))return c;if(d&&d.length>=b&&o(e,d,!0)>=b-1)break;b--}f++}return db.fn._lang}function D(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function E(a){var b,c,d=a.match(vb);for(b=0,c=d.length;c>b;b++)d[b]=Yb[d[b]]?Yb[d[b]]:D(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function F(a,b){return a.isValid()?(b=G(b,a.lang()),Vb[b]||(Vb[b]=E(b)),Vb[b](a)):a.lang().invalidDate()}function G(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(wb.lastIndex=0;d>=0&&wb.test(a);)a=a.replace(wb,c),wb.lastIndex=0,d-=1;return a}function H(a,b){var c,d=b._strict;switch(a){case"DDDD":return Ib;case"YYYY":case"GGGG":case"gggg":return d?Jb:zb;case"Y":case"G":case"g":return Lb;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?Kb:Ab;case"S":if(d)return Gb;case"SS":if(d)return Hb;case"SSS":if(d)return Ib;case"DDD":return yb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Cb;case"a":case"A":return C(b._l)._meridiemParse;case"X":return Fb;case"Z":case"ZZ":return Db;case"T":return Eb;case"SSSS":return Bb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?Hb:xb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return xb;default:return c=new RegExp(P(O(a.replace("\\","")),"i"))}}function I(a){a=a||"";var b=a.match(Db)||[],c=b[b.length-1]||[],d=(c+"").match(Qb)||["-",0,0],e=+(60*d[1])+s(d[2]);return"+"===d[0]?-e:e}function J(a,b,c){var d,e=c._a;switch(a){case"M":case"MM":null!=b&&(e[jb]=s(b)-1);break;case"MMM":case"MMMM":d=C(c._l).monthsParse(b),null!=d?e[jb]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[kb]=s(b));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=s(b));break;case"YY":e[ib]=s(b)+(s(b)>68?1900:2e3); -break;case"YYYY":case"YYYYY":case"YYYYYY":e[ib]=s(b);break;case"a":case"A":c._isPm=C(c._l).isPM(b);break;case"H":case"HH":case"h":case"hh":e[lb]=s(b);break;case"m":case"mm":e[mb]=s(b);break;case"s":case"ss":e[nb]=s(b);break;case"S":case"SS":case"SSS":case"SSSS":e[ob]=s(1e3*("0."+b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=I(b);break;case"w":case"ww":case"W":case"WW":case"d":case"dd":case"ddd":case"dddd":case"e":case"E":a=a.substr(0,1);case"gg":case"gggg":case"GG":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=b)}}function K(a){var b,c,d,e,f,g,h,i,j,k,l=[];if(!a._d){for(d=M(a),a._w&&null==a._a[kb]&&null==a._a[jb]&&(f=function(b){var c=parseInt(b,10);return b?b.length<3?c>68?1900+c:2e3+c:c:null==a._a[ib]?db().weekYear():a._a[ib]},g=a._w,null!=g.GG||null!=g.W||null!=g.E?h=Z(f(g.GG),g.W||1,g.E,4,1):(i=C(a._l),j=null!=g.d?V(g.d,i):null!=g.e?parseInt(g.e,10)+i._week.dow:0,k=parseInt(g.w,10)||1,null!=g.d&&ju(e)&&(a._pf._overflowDayOfYear=!0),c=U(e,0,a._dayOfYear),a._a[jb]=c.getUTCMonth(),a._a[kb]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=l[b]=d[b];for(;7>b;b++)a._a[b]=l[b]=null==a._a[b]?2===b?1:0:a._a[b];l[lb]+=s((a._tzm||0)/60),l[mb]+=s((a._tzm||0)%60),a._d=(a._useUTC?U:T).apply(null,l)}}function L(a){var b;a._d||(b=q(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],K(a))}function M(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function N(a){a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=C(a._l),h=""+a._i,i=h.length,j=0;for(d=G(a._f,g).match(vb)||[],b=0;b0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),Yb[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),J(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[lb]<12&&(a._a[lb]+=12),a._isPm===!1&&12===a._a[lb]&&(a._a[lb]=0),K(a),w(a)}function O(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function P(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function Q(a){var c,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(NaN));for(f=0;fg)&&(e=g,d=c));h(a,d||c)}function R(a){var b,c,d=a._i,e=Mb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Ob.length;c>b;b++)if(Ob[b][1].exec(d)){a._f=Ob[b][0]+(e[6]||" ");break}for(b=0,c=Pb.length;c>b;b++)if(Pb[b][1].exec(d)){a._f+=Pb[b][0];break}d.match(Db)&&(a._f+="Z"),N(a)}else a._d=new Date(d)}function S(b){var c=b._i,d=sb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):"string"==typeof c?R(b):m(c)?(b._a=c.slice(0),K(b)):n(c)?b._d=new Date(+c):"object"==typeof c?L(b):b._d=new Date(c)}function T(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function U(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function V(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function W(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function X(a,b,c){var d=hb(Math.abs(a)/1e3),e=hb(d/60),f=hb(e/60),g=hb(f/24),h=hb(g/365),i=45>d&&["s",d]||1===e&&["m"]||45>e&&["mm",e]||1===f&&["h"]||22>f&&["hh",f]||1===g&&["d"]||25>=g&&["dd",g]||45>=g&&["M"]||345>g&&["MM",hb(g/30)]||1===h&&["y"]||["yy",h];return i[2]=b,i[3]=a>0,i[4]=c,W.apply({},i)}function Y(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=db(a).add("d",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function Z(a,b,c,d,e){var f,g,h=U(a,0,1).getUTCDay();return c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:u(a-1)+g}}function $(a){var b=a._i,c=a._f;return null===b?db.invalid({nullInput:!0}):("string"==typeof b&&(a._i=b=C().preparse(b)),db.isMoment(b)?(a=i(b),a._d=new Date(+b._d)):c?m(c)?Q(a):N(a):S(a),new f(a))}function _(a,b){db.fn[a]=db.fn[a+"s"]=function(a){var c=this._isUTC?"UTC":"";return null!=a?(this._d["set"+c+b](a),db.updateOffset(this),this):this._d["get"+c+b]()}}function ab(a){db.duration.fn[a]=function(){return this._data[a]}}function bb(a,b){db.duration.fn["as"+a]=function(){return+this/b}}function cb(a){var b=!1,c=db;"undefined"==typeof ender&&(a?(gb.moment=function(){return!b&&console&&console.warn&&(b=!0,console.warn("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.")),c.apply(null,arguments)},h(gb.moment,c)):gb.moment=db)}for(var db,eb,fb="2.5.1",gb=this,hb=Math.round,ib=0,jb=1,kb=2,lb=3,mb=4,nb=5,ob=6,pb={},qb={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_isUTC:null,_offset:null,_pf:null,_lang:null},rb="undefined"!=typeof module&&module.exports&&"undefined"!=typeof require,sb=/^\/?Date\((\-?\d+)/i,tb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,ub=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,vb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,wb=/(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,xb=/\d\d?/,yb=/\d{1,3}/,zb=/\d{1,4}/,Ab=/[+\-]?\d{1,6}/,Bb=/\d+/,Cb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Db=/Z|[\+\-]\d\d:?\d\d/gi,Eb=/T/i,Fb=/[\+\-]?\d+(\.\d{1,3})?/,Gb=/\d/,Hb=/\d\d/,Ib=/\d{3}/,Jb=/\d{4}/,Kb=/[+-]?\d{6}/,Lb=/[+-]?\d+/,Mb=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Nb="YYYY-MM-DDTHH:mm:ssZ",Ob=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],Pb=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],Qb=/([\+\-]|\d\d)/gi,Rb="Date|Hours|Minutes|Seconds|Milliseconds".split("|"),Sb={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6},Tb={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},Ub={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},Vb={},Wb="DDD w W M D d".split(" "),Xb="M D H h m s w W".split(" "),Yb={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return k(this.year()%100,2)},YYYY:function(){return k(this.year(),4)},YYYYY:function(){return k(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+k(Math.abs(a),6)},gg:function(){return k(this.weekYear()%100,2)},gggg:function(){return k(this.weekYear(),4)},ggggg:function(){return k(this.weekYear(),5)},GG:function(){return k(this.isoWeekYear()%100,2)},GGGG:function(){return k(this.isoWeekYear(),4)},GGGGG:function(){return k(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return s(this.milliseconds()/100)},SS:function(){return k(s(this.milliseconds()/10),2)},SSS:function(){return k(this.milliseconds(),3)},SSSS:function(){return k(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+":"+k(s(a)%60,2)},ZZ:function(){var a=-this.zone(),b="+";return 0>a&&(a=-a,b="-"),b+k(s(a/60),2)+k(s(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},Zb=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"];Wb.length;)eb=Wb.pop(),Yb[eb+"o"]=d(Yb[eb],eb);for(;Xb.length;)eb=Xb.pop(),Yb[eb+eb]=c(Yb[eb],2);for(Yb.DDDD=c(Yb.DDD,3),h(e.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=db.utc([2e3,b]),d="^"+this.months(c,"")+"|^"+this.monthsShort(c,""),this._monthsParse[b]=new RegExp(d.replace(".",""),"i")),this._monthsParse[b].test(a))return b},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=db([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D YYYY",LLL:"MMMM D YYYY LT",LLLL:"dddd, MMMM D YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b){var c=this._calendar[a];return"function"==typeof c?c.apply(b):c},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return Y(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),db=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=c,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=b(),$(g)},db.utc=function(c,d,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=c,g._f=d,g._strict=f,g._pf=b(),$(g).utc()},db.unix=function(a){return db(1e3*a)},db.duration=function(a,b){var c,d,e,f=a,h=null;return db.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=tb.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:s(h[kb])*c,h:s(h[lb])*c,m:s(h[mb])*c,s:s(h[nb])*c,ms:s(h[ob])*c}):(h=ub.exec(a))&&(c="-"===h[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*c},f={y:e(h[2]),M:e(h[3]),d:e(h[4]),h:e(h[5]),m:e(h[6]),s:e(h[7]),w:e(h[8])}),d=new g(f),db.isDuration(a)&&a.hasOwnProperty("_lang")&&(d._lang=a._lang),d},db.version=fb,db.defaultFormat=Nb,db.updateOffset=function(){},db.lang=function(a,b){var c;return a?(b?A(y(a),b):null===b?(B(a),a="en"):pb[a]||C(a),c=db.duration.fn._lang=db.fn._lang=C(a),c._abbr):db.fn._lang._abbr},db.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),C(a)},db.isMoment=function(a){return a instanceof f||null!=a&&a.hasOwnProperty("_isAMomentObject")},db.isDuration=function(a){return a instanceof g},eb=Zb.length-1;eb>=0;--eb)r(Zb[eb]);for(db.normalizeUnits=function(a){return p(a)},db.invalid=function(a){var b=db.utc(NaN);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b},db.parseZone=function(a){return db(a).parseZone()},h(db.fn=f.prototype,{clone:function(){return db(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=db(this).utc();return 00:!1},parsingFlags:function(){return h({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=F(this,a||db.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,1),this},subtract:function(a,b){var c;return c="string"==typeof a?db.duration(+b,a):db.duration(a,b),l(this,c,-1),this},diff:function(a,b,c){var d,e,f=z(a,this),g=6e4*(this.zone()-f.zone());return b=p(b),"year"===b||"month"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-db(this).startOf("month")-(f-db(f).startOf("month")))/d,e-=6e4*(this.zone()-db(this).startOf("month").zone()-(f.zone()-db(f).startOf("month").zone()))/d,"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:j(e)},from:function(a,b){return db.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(db(),a)},calendar:function(){var a=z(db(),this).startOf("day"),b=this.diff(a,"days",!0),c=-6>b?"sameElse":-1>b?"lastWeek":0>b?"lastDay":1>b?"sameDay":2>b?"nextDay":7>b?"nextWeek":"sameElse";return this.format(this.lang().calendar(c,this))},isLeapYear:function(){return v(this.year())},isDST:function(){return this.zone()+db(a).startOf(b)},isBefore:function(a,b){return b="undefined"!=typeof b?b:"millisecond",+this.clone().startOf(b)<+db(a).startOf(b)},isSame:function(a,b){return b=b||"ms",+this.clone().startOf(b)===+z(a,this).startOf(b)},min:function(a){return a=db.apply(null,arguments),this>a?this:a},max:function(a){return a=db.apply(null,arguments),a>this?this:a},zone:function(a){var b=this._offset||0;return null==a?this._isUTC?b:this._d.getTimezoneOffset():("string"==typeof a&&(a=I(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,b!==a&&l(this,db.duration(b-a,"m"),1,!0),this)},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.zone(this._tzm):"string"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?db(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return t(this.year(),this.month())},dayOfYear:function(a){var b=hb((db(this).startOf("day")-db(this).startOf("year"))/864e5)+1;return null==a?b:this.add("d",a-b)},quarter:function(){return Math.ceil((this.month()+1)/3)},weekYear:function(a){var b=Y(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add("y",a-b)},isoWeekYear:function(a){var b=Y(this,1,4).year;return null==a?b:this.add("y",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add("d",7*(a-b))},isoWeek:function(a){var b=Y(this,1,4).week;return null==a?b:this.add("d",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add("d",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},get:function(a){return a=p(a),this[a]()},set:function(a,b){return a=p(a),"function"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=C(b),this)}}),eb=0;eb` to your `index.html`: - -```html - -``` - -Then add `ngAnimate` as a dependency for your app: - -```javascript -angular.module('myApp', ['ngAnimate']); -``` - -## Documentation - -Documentation is available on the -[AngularJS docs site](http://docs.angularjs.org/api/ngAnimate). - -## License - -The MIT License - -Copyright (c) 2010-2015 Google, Inc. http://angularjs.org - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/server/insight-ui/public/lib/angular-animate/angular-animate.js b/server/insight-ui/public/lib/angular-animate/angular-animate.js deleted file mode 100644 index 84c4e4f..0000000 --- a/server/insight-ui/public/lib/angular-animate/angular-animate.js +++ /dev/null @@ -1,1704 +0,0 @@ -/** - * @license AngularJS v1.2.32 - * (c) 2010-2014 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular, undefined) {'use strict'; - -/* jshint maxlen: false */ - -/** - * @ngdoc module - * @name ngAnimate - * @description - * - * # ngAnimate - * - * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives. - * - * - *
      - * - * # Usage - * - * To see animations in action, all that is required is to define the appropriate CSS classes - * or to register a JavaScript animation via the myModule.animation() function. The directives that support animation automatically are: - * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation - * by using the `$animate` service. - * - * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives: - * - * | Directive | Supported Animations | - * |---------------------------------------------------------- |----------------------------------------------------| - * | {@link ng.directive:ngRepeat#usage_animations ngRepeat} | enter, leave and move | - * | {@link ngRoute.directive:ngView#usage_animations ngView} | enter and leave | - * | {@link ng.directive:ngInclude#usage_animations ngInclude} | enter and leave | - * | {@link ng.directive:ngSwitch#usage_animations ngSwitch} | enter and leave | - * | {@link ng.directive:ngIf#usage_animations ngIf} | enter and leave | - * | {@link ng.directive:ngClass#usage_animations ngClass} | add and remove | - * | {@link ng.directive:ngShow#usage_animations ngShow & ngHide} | add and remove (the ng-hide class value) | - * | {@link ng.directive:form#usage_animations form} | add and remove (dirty, pristine, valid, invalid & all other validations) | - * | {@link ng.directive:ngModel#usage_animations ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) | - * - * You can find out more information about animations upon visiting each directive page. - * - * Below is an example of how to apply animations to a directive that supports animation hooks: - * - * ```html - * - * - * - * - * ``` - * - * Keep in mind that, by default, if an animation is running, any child elements cannot be animated - * until the parent element's animation has completed. This blocking feature can be overridden by - * placing the `ng-animate-children` attribute on a parent container tag. - * - * ```html - *
      - *
      - *
      - * ... - *
      - *
      - *
      - * ``` - * - * When the `on` expression value changes and an animation is triggered then each of the elements within - * will all animate without the block being applied to child elements. - * - *

      CSS-defined Animations

      - * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes - * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported - * and can be used to play along with this naming structure. - * - * The following code below demonstrates how to perform animations using **CSS transitions** with Angular: - * - * ```html - * - * - *
      - *
      - *
      - * ``` - * - * The following code below demonstrates how to perform animations using **CSS animations** with Angular: - * - * ```html - * - * - *
      - *
      - *
      - * ``` - * - * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing. - * - * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add - * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically - * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be - * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end - * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element - * has no CSS transition/animation classes applied to it. - * - *

      CSS Staggering Animations

      - * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a - * curtain-like effect. The ngAnimate module, as of 1.2.0, supports staggering animations and the stagger effect can be - * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for - * the animation. The style property expected within the stagger class can either be a **transition-delay** or an - * **animation-delay** property (or both if your animation contains both transitions and keyframe animations). - * - * ```css - * .my-animation.ng-enter { - * /* standard transition code */ - * -webkit-transition: 1s linear all; - * transition: 1s linear all; - * opacity:0; - * } - * .my-animation.ng-enter-stagger { - * /* this will have a 100ms delay between each successive leave animation */ - * -webkit-transition-delay: 0.1s; - * transition-delay: 0.1s; - * - * /* in case the stagger doesn't work then these two values - * must be set to 0 to avoid an accidental CSS inheritance */ - * -webkit-transition-duration: 0s; - * transition-duration: 0s; - * } - * .my-animation.ng-enter.ng-enter-active { - * /* standard transition styles */ - * opacity:1; - * } - * ``` - * - * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations - * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this - * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation - * will also be reset if more than 10ms has passed after the last animation has been fired. - * - * The following code will issue the **ng-leave-stagger** event on the element provided: - * - * ```js - * var kids = parent.children(); - * - * $animate.leave(kids[0]); //stagger index=0 - * $animate.leave(kids[1]); //stagger index=1 - * $animate.leave(kids[2]); //stagger index=2 - * $animate.leave(kids[3]); //stagger index=3 - * $animate.leave(kids[4]); //stagger index=4 - * - * $timeout(function() { - * //stagger has reset itself - * $animate.leave(kids[5]); //stagger index=0 - * $animate.leave(kids[6]); //stagger index=1 - * }, 100, false); - * ``` - * - * Stagger animations are currently only supported within CSS-defined animations. - * - *

      JavaScript-defined Animations

      - * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not - * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module. - * - * ```js - * //!annotate="YourApp" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application. - * var ngModule = angular.module('YourApp', ['ngAnimate']); - * ngModule.animation('.my-crazy-animation', function() { - * return { - * enter: function(element, done) { - * //run the animation here and call done when the animation is complete - * return function(cancelled) { - * //this (optional) function will be called when the animation - * //completes or when the animation is cancelled (the cancelled - * //flag will be set to true if cancelled). - * }; - * }, - * leave: function(element, done) { }, - * move: function(element, done) { }, - * - * //animation that can be triggered before the class is added - * beforeAddClass: function(element, className, done) { }, - * - * //animation that can be triggered after the class is added - * addClass: function(element, className, done) { }, - * - * //animation that can be triggered before the class is removed - * beforeRemoveClass: function(element, className, done) { }, - * - * //animation that can be triggered after the class is removed - * removeClass: function(element, className, done) { } - * }; - * }); - * ``` - * - * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run - * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits - * the element's CSS class attribute value and then run the matching animation event function (if found). - * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will - * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported). - * - * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned. - * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run, - * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation - * or transition code that is defined via a stylesheet). - * - */ - -angular.module('ngAnimate', ['ng']) - - /** - * @ngdoc provider - * @name $animateProvider - * @description - * - * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module. - * When an animation is triggered, the $animate service will query the $animate service to find any animations that match - * the provided name value. - * - * Requires the {@link ngAnimate `ngAnimate`} module to be installed. - * - * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. - * - */ - .directive('ngAnimateChildren', function() { - var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; - return function(scope, element, attrs) { - var val = attrs.ngAnimateChildren; - if(angular.isString(val) && val.length === 0) { //empty attribute - element.data(NG_ANIMATE_CHILDREN, true); - } else { - scope.$watch(val, function(value) { - element.data(NG_ANIMATE_CHILDREN, !!value); - }); - } - }; - }) - - //this private service is only used within CSS-enabled animations - //IE8 + IE9 do not support rAF natively, but that is fine since they - //also don't support transitions and keyframes which means that the code - //below will never be used by the two browsers. - .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) { - var bod = $document[0].body; - return function(fn) { - //the returned function acts as the cancellation function - return $$rAF(function() { - //the line below will force the browser to perform a repaint - //so that all the animated elements within the animation frame - //will be properly updated and drawn on screen. This is - //required to perform multi-class CSS based animations with - //Firefox. DO NOT REMOVE THIS LINE. DO NOT OPTIMIZE THIS LINE. - //THE MINIFIER WILL REMOVE IT OTHERWISE WHICH WILL RESULT IN AN - //UNPREDICTABLE BUG THAT IS VERY HARD TO TRACK DOWN AND WILL - //TAKE YEARS AWAY FROM YOUR LIFE! - fn(bod.offsetWidth); - }); - }; - }]) - - .config(['$provide', '$animateProvider', function($provide, $animateProvider) { - var noop = angular.noop; - var forEach = angular.forEach; - var selectors = $animateProvider.$$selectors; - - var ELEMENT_NODE = 1; - var NG_ANIMATE_STATE = '$$ngAnimateState'; - var NG_ANIMATE_CHILDREN = '$$ngAnimateChildren'; - var NG_ANIMATE_CLASS_NAME = 'ng-animate'; - var rootAnimateState = {running: true}; - - function extractElementNode(element) { - for(var i = 0; i < element.length; i++) { - var elm = element[i]; - if(elm.nodeType == ELEMENT_NODE) { - return elm; - } - } - } - - function prepareElement(element) { - return element && angular.element(element); - } - - function stripCommentsFromElement(element) { - return angular.element(extractElementNode(element)); - } - - function isMatchingElement(elm1, elm2) { - return extractElementNode(elm1) == extractElementNode(elm2); - } - - $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document', - function($delegate, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document) { - - var globalAnimationCounter = 0; - $rootElement.data(NG_ANIMATE_STATE, rootAnimateState); - - // disable animations during bootstrap, but once we bootstrapped, wait again - // for another digest until enabling animations. The reason why we digest twice - // is because all structural animations (enter, leave and move) all perform a - // post digest operation before animating. If we only wait for a single digest - // to pass then the structural animation would render its animation on page load. - // (which is what we're trying to avoid when the application first boots up.) - $rootScope.$$postDigest(function() { - $rootScope.$$postDigest(function() { - rootAnimateState.running = false; - }); - }); - - var classNameFilter = $animateProvider.classNameFilter(); - var isAnimatableClassName = !classNameFilter - ? function() { return true; } - : function(className) { - return classNameFilter.test(className); - }; - - function blockElementAnimations(element) { - var data = element.data(NG_ANIMATE_STATE) || {}; - data.running = true; - element.data(NG_ANIMATE_STATE, data); - } - - function lookup(name) { - if (name) { - var matches = [], - flagMap = {}, - classes = name.substr(1).split('.'); - - //the empty string value is the default animation - //operation which performs CSS transition and keyframe - //animations sniffing. This is always included for each - //element animation procedure if the browser supports - //transitions and/or keyframe animations. The default - //animation is added to the top of the list to prevent - //any previous animations from affecting the element styling - //prior to the element being animated. - if ($sniffer.transitions || $sniffer.animations) { - matches.push($injector.get(selectors[''])); - } - - for(var i=0; i < classes.length; i++) { - var klass = classes[i], - selectorFactoryName = selectors[klass]; - if(selectorFactoryName && !flagMap[klass]) { - matches.push($injector.get(selectorFactoryName)); - flagMap[klass] = true; - } - } - return matches; - } - } - - function animationRunner(element, animationEvent, className) { - //transcluded directives may sometimes fire an animation using only comment nodes - //best to catch this early on to prevent any animation operations from occurring - var node = element[0]; - if(!node) { - return; - } - - var isSetClassOperation = animationEvent == 'setClass'; - var isClassBased = isSetClassOperation || - animationEvent == 'addClass' || - animationEvent == 'removeClass'; - - var classNameAdd, classNameRemove; - if(angular.isArray(className)) { - classNameAdd = className[0]; - classNameRemove = className[1]; - className = classNameAdd + ' ' + classNameRemove; - } - - var currentClassName = element.attr('class'); - var classes = currentClassName + ' ' + className; - if(!isAnimatableClassName(classes)) { - return; - } - - var beforeComplete = noop, - beforeCancel = [], - before = [], - afterComplete = noop, - afterCancel = [], - after = []; - - var animationLookup = (' ' + classes).replace(/\s+/g,'.'); - forEach(lookup(animationLookup), function(animationFactory) { - var created = registerAnimation(animationFactory, animationEvent); - if(!created && isSetClassOperation) { - registerAnimation(animationFactory, 'addClass'); - registerAnimation(animationFactory, 'removeClass'); - } - }); - - function registerAnimation(animationFactory, event) { - var afterFn = animationFactory[event]; - var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)]; - if(afterFn || beforeFn) { - if(event == 'leave') { - beforeFn = afterFn; - //when set as null then animation knows to skip this phase - afterFn = null; - } - after.push({ - event : event, fn : afterFn - }); - before.push({ - event : event, fn : beforeFn - }); - return true; - } - } - - function run(fns, cancellations, allCompleteFn) { - var animations = []; - forEach(fns, function(animation) { - animation.fn && animations.push(animation); - }); - - var count = 0; - function afterAnimationComplete(index) { - if(cancellations) { - (cancellations[index] || noop)(); - if(++count < animations.length) return; - cancellations = null; - } - allCompleteFn(); - } - - //The code below adds directly to the array in order to work with - //both sync and async animations. Sync animations are when the done() - //operation is called right away. DO NOT REFACTOR! - forEach(animations, function(animation, index) { - var progress = function() { - afterAnimationComplete(index); - }; - switch(animation.event) { - case 'setClass': - cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress)); - break; - case 'addClass': - cancellations.push(animation.fn(element, classNameAdd || className, progress)); - break; - case 'removeClass': - cancellations.push(animation.fn(element, classNameRemove || className, progress)); - break; - default: - cancellations.push(animation.fn(element, progress)); - break; - } - }); - - if(cancellations && cancellations.length === 0) { - allCompleteFn(); - } - } - - return { - node : node, - event : animationEvent, - className : className, - isClassBased : isClassBased, - isSetClassOperation : isSetClassOperation, - before : function(allCompleteFn) { - beforeComplete = allCompleteFn; - run(before, beforeCancel, function() { - beforeComplete = noop; - allCompleteFn(); - }); - }, - after : function(allCompleteFn) { - afterComplete = allCompleteFn; - run(after, afterCancel, function() { - afterComplete = noop; - allCompleteFn(); - }); - }, - cancel : function() { - if(beforeCancel) { - forEach(beforeCancel, function(cancelFn) { - (cancelFn || noop)(true); - }); - beforeComplete(true); - } - if(afterCancel) { - forEach(afterCancel, function(cancelFn) { - (cancelFn || noop)(true); - }); - afterComplete(true); - } - } - }; - } - - /** - * @ngdoc service - * @name $animate - * @kind function - * - * @description - * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations. - * When any of these operations are run, the $animate service - * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object) - * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run. - * - * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives - * will work out of the box without any extra configuration. - * - * Requires the {@link ngAnimate `ngAnimate`} module to be installed. - * - * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application. - * - */ - return { - /** - * @ngdoc method - * @name $animate#enter - * @kind function - * - * @description - * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once - * the animation is started, the following CSS classes will be present on the element for the duration of the animation: - * - * Below is a breakdown of each step that occurs during enter animation: - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------|---------------------------------------------| - * | 1. $animate.enter(...) is called | class="my-animation" | - * | 2. element is inserted into the parentElement element or beside the afterElement element | class="my-animation" | - * | 3. $animate runs any JavaScript-defined animations on the element | class="my-animation ng-animate" | - * | 4. the .ng-enter class is added to the element | class="my-animation ng-animate ng-enter" | - * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate ng-enter" | - * | 6. $animate waits for 10ms (this performs a reflow) | class="my-animation ng-animate ng-enter" | - * | 7. the .ng-enter-active and .ng-animate-active classes are added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active ng-enter ng-enter-active" | - * | 8. $animate waits for X milliseconds for the animation to complete | class="my-animation ng-animate ng-animate-active ng-enter ng-enter-active" | - * | 9. The animation ends and all generated CSS classes are removed from the element | class="my-animation" | - * | 10. The doneCallback() callback is fired (if provided) | class="my-animation" | - * - * @param {DOMElement} element the element that will be the focus of the enter animation - * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation - * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation - * @param {function()=} doneCallback the callback function that will be called once the animation is complete - */ - enter : function(element, parentElement, afterElement, doneCallback) { - element = angular.element(element); - parentElement = prepareElement(parentElement); - afterElement = prepareElement(afterElement); - - blockElementAnimations(element); - $delegate.enter(element, parentElement, afterElement); - $rootScope.$$postDigest(function() { - element = stripCommentsFromElement(element); - performAnimation('enter', 'ng-enter', element, parentElement, afterElement, noop, doneCallback); - }); - }, - - /** - * @ngdoc method - * @name $animate#leave - * @kind function - * - * @description - * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once - * the animation is started, the following CSS classes will be added for the duration of the animation: - * - * Below is a breakdown of each step that occurs during leave animation: - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------|---------------------------------------------| - * | 1. $animate.leave(...) is called | class="my-animation" | - * | 2. $animate runs any JavaScript-defined animations on the element | class="my-animation ng-animate" | - * | 3. the .ng-leave class is added to the element | class="my-animation ng-animate ng-leave" | - * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate ng-leave" | - * | 5. $animate waits for 10ms (this performs a reflow) | class="my-animation ng-animate ng-leave" | - * | 6. the .ng-leave-active and .ng-animate-active classes is added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active ng-leave ng-leave-active" | - * | 7. $animate waits for X milliseconds for the animation to complete | class="my-animation ng-animate ng-animate-active ng-leave ng-leave-active" | - * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation" | - * | 9. The element is removed from the DOM | ... | - * | 10. The doneCallback() callback is fired (if provided) | ... | - * - * @param {DOMElement} element the element that will be the focus of the leave animation - * @param {function()=} doneCallback the callback function that will be called once the animation is complete - */ - leave : function(element, doneCallback) { - element = angular.element(element); - cancelChildAnimations(element); - blockElementAnimations(element); - $rootScope.$$postDigest(function() { - performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() { - $delegate.leave(element); - }, doneCallback); - }); - }, - - /** - * @ngdoc method - * @name $animate#move - * @kind function - * - * @description - * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or - * add the element directly after the afterElement element if present. Then the move animation will be run. Once - * the animation is started, the following CSS classes will be added for the duration of the animation: - * - * Below is a breakdown of each step that occurs during move animation: - * - * | Animation Step | What the element class attribute looks like | - * |----------------------------------------------------------------------------------------------|---------------------------------------------| - * | 1. $animate.move(...) is called | class="my-animation" | - * | 2. element is moved into the parentElement element or beside the afterElement element | class="my-animation" | - * | 3. $animate runs any JavaScript-defined animations on the element | class="my-animation ng-animate" | - * | 4. the .ng-move class is added to the element | class="my-animation ng-animate ng-move" | - * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate ng-move" | - * | 6. $animate waits for 10ms (this performs a reflow) | class="my-animation ng-animate ng-move" | - * | 7. the .ng-move-active and .ng-animate-active classes is added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active ng-move ng-move-active" | - * | 8. $animate waits for X milliseconds for the animation to complete | class="my-animation ng-animate ng-animate-active ng-move ng-move-active" | - * | 9. The animation ends and all generated CSS classes are removed from the element | class="my-animation" | - * | 10. The doneCallback() callback is fired (if provided) | class="my-animation" | - * - * @param {DOMElement} element the element that will be the focus of the move animation - * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation - * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation - * @param {function()=} doneCallback the callback function that will be called once the animation is complete - */ - move : function(element, parentElement, afterElement, doneCallback) { - element = angular.element(element); - parentElement = prepareElement(parentElement); - afterElement = prepareElement(afterElement); - - cancelChildAnimations(element); - blockElementAnimations(element); - $delegate.move(element, parentElement, afterElement); - $rootScope.$$postDigest(function() { - element = stripCommentsFromElement(element); - performAnimation('move', 'ng-move', element, parentElement, afterElement, noop, doneCallback); - }); - }, - - /** - * @ngdoc method - * @name $animate#addClass - * - * @description - * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class. - * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide - * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions - * or keyframes are defined on the -add or base CSS class). - * - * Below is a breakdown of each step that occurs during addClass animation: - * - * | Animation Step | What the element class attribute looks like | - * |------------------------------------------------------------------------------------------------|---------------------------------------------| - * | 1. $animate.addClass(element, 'super') is called | class="my-animation" | - * | 2. $animate runs any JavaScript-defined animations on the element | class="my-animation ng-animate" | - * | 3. the .super-add class are added to the element | class="my-animation ng-animate super-add" | - * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation ng-animate super-add" | - * | 5. $animate waits for 10ms (this performs a reflow) | class="my-animation ng-animate super-add" | - * | 6. the .super, .super-add-active and .ng-animate-active classes are added (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active super super-add super-add-active" | - * | 7. $animate waits for X milliseconds for the animation to complete | class="my-animation super super-add super-add-active" | - * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation super" | - * | 9. The super class is kept on the element | class="my-animation super" | - * | 10. The doneCallback() callback is fired (if provided) | class="my-animation super" | - * - * @param {DOMElement} element the element that will be animated - * @param {string} className the CSS class that will be added to the element and then animated - * @param {function()=} doneCallback the callback function that will be called once the animation is complete - */ - addClass : function(element, className, doneCallback) { - element = angular.element(element); - element = stripCommentsFromElement(element); - performAnimation('addClass', className, element, null, null, function() { - $delegate.addClass(element, className); - }, doneCallback); - }, - - /** - * @ngdoc method - * @name $animate#removeClass - * - * @description - * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value - * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in - * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if - * no CSS transitions or keyframes are defined on the -remove or base CSS classes). - * - * Below is a breakdown of each step that occurs during removeClass animation: - * - * | Animation Step | What the element class attribute looks like | - * |-----------------------------------------------------------------------------------------------|---------------------------------------------| - * | 1. $animate.removeClass(element, 'super') is called | class="my-animation super" | - * | 2. $animate runs any JavaScript-defined animations on the element | class="my-animation super ng-animate" | - * | 3. the .super-remove class are added to the element | class="my-animation super ng-animate super-remove"| - * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class="my-animation super ng-animate super-remove" | - * | 5. $animate waits for 10ms (this performs a reflow) | class="my-animation super ng-animate super-remove" | - * | 6. the .super-remove-active and .ng-animate-active classes are added and .super is removed (this triggers the CSS transition/animation) | class="my-animation ng-animate ng-animate-active super-remove super-remove-active" | - * | 7. $animate waits for X milliseconds for the animation to complete | class="my-animation ng-animate ng-animate-active super-remove super-remove-active" | - * | 8. The animation ends and all generated CSS classes are removed from the element | class="my-animation" | - * | 9. The doneCallback() callback is fired (if provided) | class="my-animation" | - * - * - * @param {DOMElement} element the element that will be animated - * @param {string} className the CSS class that will be animated and then removed from the element - * @param {function()=} doneCallback the callback function that will be called once the animation is complete - */ - removeClass : function(element, className, doneCallback) { - element = angular.element(element); - element = stripCommentsFromElement(element); - performAnimation('removeClass', className, element, null, null, function() { - $delegate.removeClass(element, className); - }, doneCallback); - }, - - /** - * - * @ngdoc function - * @name $animate#setClass - * @function - * @description Adds and/or removes the given CSS classes to and from the element. - * Once complete, the done() callback will be fired (if provided). - * @param {DOMElement} element the element which will its CSS classes changed - * removed from it - * @param {string} add the CSS classes which will be added to the element - * @param {string} remove the CSS class which will be removed from the element - * @param {Function=} done the callback function (if provided) that will be fired after the - * CSS classes have been set on the element - */ - setClass : function(element, add, remove, doneCallback) { - element = angular.element(element); - element = stripCommentsFromElement(element); - performAnimation('setClass', [add, remove], element, null, null, function() { - $delegate.setClass(element, add, remove); - }, doneCallback); - }, - - /** - * @ngdoc method - * @name $animate#enabled - * @kind function - * - * @param {boolean=} value If provided then set the animation on or off. - * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation - * @return {boolean} Current animation state. - * - * @description - * Globally enables/disables animations. - * - */ - enabled : function(value, element) { - switch(arguments.length) { - case 2: - if(value) { - cleanup(element); - } else { - var data = element.data(NG_ANIMATE_STATE) || {}; - data.disabled = true; - element.data(NG_ANIMATE_STATE, data); - } - break; - - case 1: - rootAnimateState.disabled = !value; - break; - - default: - value = !rootAnimateState.disabled; - break; - } - return !!value; - } - }; - - /* - all animations call this shared animation triggering function internally. - The animationEvent variable refers to the JavaScript animation event that will be triggered - and the className value is the name of the animation that will be applied within the - CSS code. Element, parentElement and afterElement are provided DOM elements for the animation - and the onComplete callback will be fired once the animation is fully complete. - */ - function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) { - - var runner = animationRunner(element, animationEvent, className); - if(!runner) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - closeAnimation(); - return; - } - - className = runner.className; - var elementEvents = angular.element._data(runner.node); - elementEvents = elementEvents && elementEvents.events; - - if (!parentElement) { - parentElement = afterElement ? afterElement.parent() : element.parent(); - } - - var ngAnimateState = element.data(NG_ANIMATE_STATE) || {}; - var runningAnimations = ngAnimateState.active || {}; - var totalActiveAnimations = ngAnimateState.totalActive || 0; - var lastAnimation = ngAnimateState.last; - - //only allow animations if the currently running animation is not structural - //or if there is no animation running at all - var skipAnimations; - if (runner.isClassBased) { - skipAnimations = ngAnimateState.running || - ngAnimateState.disabled || - (lastAnimation && !lastAnimation.isClassBased); - } - - //skip the animation if animations are disabled, a parent is already being animated, - //the element is not currently attached to the document body or then completely close - //the animation if any matching animations are not found at all. - //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found. - if (skipAnimations || animationsDisabled(element, parentElement)) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - closeAnimation(); - return; - } - - var skipAnimation = false; - if(totalActiveAnimations > 0) { - var animationsToCancel = []; - if(!runner.isClassBased) { - if(animationEvent == 'leave' && runningAnimations['ng-leave']) { - skipAnimation = true; - } else { - //cancel all animations when a structural animation takes place - for(var klass in runningAnimations) { - animationsToCancel.push(runningAnimations[klass]); - cleanup(element, klass); - } - runningAnimations = {}; - totalActiveAnimations = 0; - } - } else if(lastAnimation.event == 'setClass') { - animationsToCancel.push(lastAnimation); - cleanup(element, className); - } - else if(runningAnimations[className]) { - var current = runningAnimations[className]; - if(current.event == animationEvent) { - skipAnimation = true; - } else { - animationsToCancel.push(current); - cleanup(element, className); - } - } - - if(animationsToCancel.length > 0) { - forEach(animationsToCancel, function(operation) { - operation.cancel(); - }); - } - } - - if(runner.isClassBased && !runner.isSetClassOperation && !skipAnimation) { - skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR - } - - if(skipAnimation) { - fireDOMOperation(); - fireBeforeCallbackAsync(); - fireAfterCallbackAsync(); - fireDoneCallbackAsync(); - return; - } - - if(animationEvent == 'leave') { - //there's no need to ever remove the listener since the element - //will be removed (destroyed) after the leave animation ends or - //is cancelled midway - element.one('$destroy', function(e) { - var element = angular.element(this); - var state = element.data(NG_ANIMATE_STATE); - if(state) { - var activeLeaveAnimation = state.active['ng-leave']; - if(activeLeaveAnimation) { - activeLeaveAnimation.cancel(); - cleanup(element, 'ng-leave'); - } - } - }); - } - - //the ng-animate class does nothing, but it's here to allow for - //parent animations to find and cancel child animations when needed - element.addClass(NG_ANIMATE_CLASS_NAME); - - var localAnimationCount = globalAnimationCounter++; - totalActiveAnimations++; - runningAnimations[className] = runner; - - element.data(NG_ANIMATE_STATE, { - last : runner, - active : runningAnimations, - index : localAnimationCount, - totalActive : totalActiveAnimations - }); - - //first we run the before animations and when all of those are complete - //then we perform the DOM operation and run the next set of animations - fireBeforeCallbackAsync(); - runner.before(function(cancelled) { - var data = element.data(NG_ANIMATE_STATE); - cancelled = cancelled || - !data || !data.active[className] || - (runner.isClassBased && data.active[className].event != animationEvent); - - fireDOMOperation(); - if(cancelled === true) { - closeAnimation(); - } else { - fireAfterCallbackAsync(); - runner.after(closeAnimation); - } - }); - - function fireDOMCallback(animationPhase) { - var eventName = '$animate:' + animationPhase; - if(elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) { - $$asyncCallback(function() { - element.triggerHandler(eventName, { - event : animationEvent, - className : className - }); - }); - } - } - - function fireBeforeCallbackAsync() { - fireDOMCallback('before'); - } - - function fireAfterCallbackAsync() { - fireDOMCallback('after'); - } - - function fireDoneCallbackAsync() { - fireDOMCallback('close'); - if(doneCallback) { - $$asyncCallback(function() { - doneCallback(); - }); - } - } - - //it is less complicated to use a flag than managing and canceling - //timeouts containing multiple callbacks. - function fireDOMOperation() { - if(!fireDOMOperation.hasBeenRun) { - fireDOMOperation.hasBeenRun = true; - domOperation(); - } - } - - function closeAnimation() { - if(!closeAnimation.hasBeenRun) { - closeAnimation.hasBeenRun = true; - var data = element.data(NG_ANIMATE_STATE); - if(data) { - /* only structural animations wait for reflow before removing an - animation, but class-based animations don't. An example of this - failing would be when a parent HTML tag has a ng-class attribute - causing ALL directives below to skip animations during the digest */ - if(runner && runner.isClassBased) { - cleanup(element, className); - } else { - $$asyncCallback(function() { - var data = element.data(NG_ANIMATE_STATE) || {}; - if(localAnimationCount == data.index) { - cleanup(element, className, animationEvent); - } - }); - element.data(NG_ANIMATE_STATE, data); - } - } - fireDoneCallbackAsync(); - } - } - } - - function cancelChildAnimations(element) { - var node = extractElementNode(element); - if (node) { - var nodes = angular.isFunction(node.getElementsByClassName) ? - node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) : - node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME); - forEach(nodes, function(element) { - element = angular.element(element); - var data = element.data(NG_ANIMATE_STATE); - if(data && data.active) { - forEach(data.active, function(runner) { - runner.cancel(); - }); - } - }); - } - } - - function cleanup(element, className) { - if(isMatchingElement(element, $rootElement)) { - if(!rootAnimateState.disabled) { - rootAnimateState.running = false; - rootAnimateState.structural = false; - } - } else if(className) { - var data = element.data(NG_ANIMATE_STATE) || {}; - - var removeAnimations = className === true; - if(!removeAnimations && data.active && data.active[className]) { - data.totalActive--; - delete data.active[className]; - } - - if(removeAnimations || !data.totalActive) { - element.removeClass(NG_ANIMATE_CLASS_NAME); - element.removeData(NG_ANIMATE_STATE); - } - } - } - - function animationsDisabled(element, parentElement) { - if (rootAnimateState.disabled) { - return true; - } - - if (isMatchingElement(element, $rootElement)) { - return rootAnimateState.running; - } - - var allowChildAnimations, parentRunningAnimation, hasParent; - do { - //the element did not reach the root element which means that it - //is not apart of the DOM. Therefore there is no reason to do - //any animations on it - if (parentElement.length === 0) break; - - var isRoot = isMatchingElement(parentElement, $rootElement); - var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {}); - if (state.disabled) { - return true; - } - - //no matter what, for an animation to work it must reach the root element - //this implies that the element is attached to the DOM when the animation is run - if (isRoot) { - hasParent = true; - } - - //once a flag is found that is strictly false then everything before - //it will be discarded and all child animations will be restricted - if (allowChildAnimations !== false) { - var animateChildrenFlag = parentElement.data(NG_ANIMATE_CHILDREN); - if(angular.isDefined(animateChildrenFlag)) { - allowChildAnimations = animateChildrenFlag; - } - } - - parentRunningAnimation = parentRunningAnimation || - state.running || - (state.last && !state.last.isClassBased); - } - while(parentElement = parentElement.parent()); - - return !hasParent || (!allowChildAnimations && parentRunningAnimation); - } - }]); - - $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow', - function($window, $sniffer, $timeout, $$animateReflow) { - // Detect proper transitionend/animationend event names. - var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; - - // If unprefixed events are not supported but webkit-prefixed are, use the latter. - // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them. - // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend` - // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`. - // Register both events in case `window.onanimationend` is not supported because of that, - // do the same for `transitionend` as Safari is likely to exhibit similar behavior. - // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit - // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition - if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) { - CSS_PREFIX = '-webkit-'; - TRANSITION_PROP = 'WebkitTransition'; - TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend'; - } else { - TRANSITION_PROP = 'transition'; - TRANSITIONEND_EVENT = 'transitionend'; - } - - if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) { - CSS_PREFIX = '-webkit-'; - ANIMATION_PROP = 'WebkitAnimation'; - ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend'; - } else { - ANIMATION_PROP = 'animation'; - ANIMATIONEND_EVENT = 'animationend'; - } - - var DURATION_KEY = 'Duration'; - var PROPERTY_KEY = 'Property'; - var DELAY_KEY = 'Delay'; - var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount'; - var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey'; - var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data'; - var NG_ANIMATE_BLOCK_CLASS_NAME = 'ng-animate-block-transitions'; - var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3; - var CLOSING_TIME_BUFFER = 1.5; - var ONE_SECOND = 1000; - - var lookupCache = {}; - var parentCounter = 0; - var animationReflowQueue = []; - var cancelAnimationReflow; - function clearCacheAfterReflow() { - if (!cancelAnimationReflow) { - cancelAnimationReflow = $$animateReflow(function() { - animationReflowQueue = []; - cancelAnimationReflow = null; - lookupCache = {}; - }); - } - } - - function afterReflow(element, callback) { - if(cancelAnimationReflow) { - cancelAnimationReflow(); - } - animationReflowQueue.push(callback); - cancelAnimationReflow = $$animateReflow(function() { - forEach(animationReflowQueue, function(fn) { - fn(); - }); - - animationReflowQueue = []; - cancelAnimationReflow = null; - lookupCache = {}; - }); - } - - var closingTimer = null; - var closingTimestamp = 0; - var animationElementQueue = []; - function animationCloseHandler(element, totalTime) { - var node = extractElementNode(element); - element = angular.element(node); - - //this item will be garbage collected by the closing - //animation timeout - animationElementQueue.push(element); - - //but it may not need to cancel out the existing timeout - //if the timestamp is less than the previous one - var futureTimestamp = Date.now() + totalTime; - if(futureTimestamp <= closingTimestamp) { - return; - } - - $timeout.cancel(closingTimer); - - closingTimestamp = futureTimestamp; - closingTimer = $timeout(function() { - closeAllAnimations(animationElementQueue); - animationElementQueue = []; - }, totalTime, false); - } - - function closeAllAnimations(elements) { - forEach(elements, function(element) { - var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); - if(elementData) { - (elementData.closeAnimationFn || noop)(); - } - }); - } - - function getElementAnimationDetails(element, cacheKey) { - var data = cacheKey ? lookupCache[cacheKey] : null; - if(!data) { - var transitionDuration = 0; - var transitionDelay = 0; - var animationDuration = 0; - var animationDelay = 0; - var transitionDelayStyle; - var animationDelayStyle; - var transitionDurationStyle; - var transitionPropertyStyle; - - //we want all the styles defined before and after - forEach(element, function(element) { - if (element.nodeType == ELEMENT_NODE) { - var elementStyles = $window.getComputedStyle(element) || {}; - - transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY]; - - transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration); - - transitionPropertyStyle = elementStyles[TRANSITION_PROP + PROPERTY_KEY]; - - transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY]; - - transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay); - - animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY]; - - animationDelay = Math.max(parseMaxTime(animationDelayStyle), animationDelay); - - var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]); - - if(aDuration > 0) { - aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1; - } - - animationDuration = Math.max(aDuration, animationDuration); - } - }); - data = { - total : 0, - transitionPropertyStyle: transitionPropertyStyle, - transitionDurationStyle: transitionDurationStyle, - transitionDelayStyle: transitionDelayStyle, - transitionDelay: transitionDelay, - transitionDuration: transitionDuration, - animationDelayStyle: animationDelayStyle, - animationDelay: animationDelay, - animationDuration: animationDuration - }; - if(cacheKey) { - lookupCache[cacheKey] = data; - } - } - return data; - } - - function parseMaxTime(str) { - var maxValue = 0; - var values = angular.isString(str) ? - str.split(/\s*,\s*/) : - []; - forEach(values, function(value) { - maxValue = Math.max(parseFloat(value) || 0, maxValue); - }); - return maxValue; - } - - function getCacheKey(element) { - var parentElement = element.parent(); - var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY); - if(!parentID) { - parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter); - parentID = parentCounter; - } - return parentID + '-' + extractElementNode(element).getAttribute('class'); - } - - function animateSetup(animationEvent, element, className, calculationDecorator) { - var cacheKey = getCacheKey(element); - var eventCacheKey = cacheKey + ' ' + className; - var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0; - - var stagger = {}; - if(itemIndex > 0) { - var staggerClassName = className + '-stagger'; - var staggerCacheKey = cacheKey + ' ' + staggerClassName; - var applyClasses = !lookupCache[staggerCacheKey]; - - applyClasses && element.addClass(staggerClassName); - - stagger = getElementAnimationDetails(element, staggerCacheKey); - - applyClasses && element.removeClass(staggerClassName); - } - - /* the animation itself may need to add/remove special CSS classes - * before calculating the anmation styles */ - calculationDecorator = calculationDecorator || - function(fn) { return fn(); }; - - element.addClass(className); - - var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {}; - - var timings = calculationDecorator(function() { - return getElementAnimationDetails(element, eventCacheKey); - }); - - var transitionDuration = timings.transitionDuration; - var animationDuration = timings.animationDuration; - if(transitionDuration === 0 && animationDuration === 0) { - element.removeClass(className); - return false; - } - - element.data(NG_ANIMATE_CSS_DATA_KEY, { - running : formerData.running || 0, - itemIndex : itemIndex, - stagger : stagger, - timings : timings, - closeAnimationFn : noop - }); - - //temporarily disable the transition so that the enter styles - //don't animate twice (this is here to avoid a bug in Chrome/FF). - var isCurrentlyAnimating = formerData.running > 0 || animationEvent == 'setClass'; - if(transitionDuration > 0) { - blockTransitions(element, className, isCurrentlyAnimating); - } - - //staggering keyframe animations work by adjusting the `animation-delay` CSS property - //on the given element, however, the delay value can only calculated after the reflow - //since by that time $animate knows how many elements are being animated. Therefore, - //until the reflow occurs the element needs to be blocked (where the keyframe animation - //is set to `none 0s`). This blocking mechanism should only be set for when a stagger - //animation is detected and when the element item index is greater than 0. - if(animationDuration > 0 && stagger.animationDelay > 0 && stagger.animationDuration === 0) { - blockKeyframeAnimations(element); - } - - return true; - } - - function isStructuralAnimation(className) { - return className == 'ng-enter' || className == 'ng-move' || className == 'ng-leave'; - } - - function blockTransitions(element, className, isAnimating) { - if(isStructuralAnimation(className) || !isAnimating) { - extractElementNode(element).style[TRANSITION_PROP + PROPERTY_KEY] = 'none'; - } else { - element.addClass(NG_ANIMATE_BLOCK_CLASS_NAME); - } - } - - function blockKeyframeAnimations(element) { - extractElementNode(element).style[ANIMATION_PROP] = 'none 0s'; - } - - function unblockTransitions(element, className) { - var prop = TRANSITION_PROP + PROPERTY_KEY; - var node = extractElementNode(element); - if(node.style[prop] && node.style[prop].length > 0) { - node.style[prop] = ''; - } - element.removeClass(NG_ANIMATE_BLOCK_CLASS_NAME); - } - - function unblockKeyframeAnimations(element) { - var prop = ANIMATION_PROP; - var node = extractElementNode(element); - if(node.style[prop] && node.style[prop].length > 0) { - node.style[prop] = ''; - } - } - - function animateRun(animationEvent, element, className, activeAnimationComplete) { - var node = extractElementNode(element); - var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY); - if(node.getAttribute('class').indexOf(className) == -1 || !elementData) { - activeAnimationComplete(); - return; - } - - var activeClassName = ''; - forEach(className.split(' '), function(klass, i) { - activeClassName += (i > 0 ? ' ' : '') + klass + '-active'; - }); - - var stagger = elementData.stagger; - var timings = elementData.timings; - var itemIndex = elementData.itemIndex; - var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration); - var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay); - var maxDelayTime = maxDelay * ONE_SECOND; - - var startTime = Date.now(); - var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT; - - var style = '', appliedStyles = []; - if(timings.transitionDuration > 0) { - var propertyStyle = timings.transitionPropertyStyle; - if(propertyStyle.indexOf('all') == -1) { - style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ';'; - style += CSS_PREFIX + 'transition-duration: ' + timings.transitionDurationStyle + ';'; - appliedStyles.push(CSS_PREFIX + 'transition-property'); - appliedStyles.push(CSS_PREFIX + 'transition-duration'); - } - } - - if(itemIndex > 0) { - if(stagger.transitionDelay > 0 && stagger.transitionDuration === 0) { - var delayStyle = timings.transitionDelayStyle; - style += CSS_PREFIX + 'transition-delay: ' + - prepareStaggerDelay(delayStyle, stagger.transitionDelay, itemIndex) + '; '; - appliedStyles.push(CSS_PREFIX + 'transition-delay'); - } - - if(stagger.animationDelay > 0 && stagger.animationDuration === 0) { - style += CSS_PREFIX + 'animation-delay: ' + - prepareStaggerDelay(timings.animationDelayStyle, stagger.animationDelay, itemIndex) + '; '; - appliedStyles.push(CSS_PREFIX + 'animation-delay'); - } - } - - if(appliedStyles.length > 0) { - //the element being animated may sometimes contain comment nodes in - //the jqLite object, so we're safe to use a single variable to house - //the styles since there is always only one element being animated - var oldStyle = node.getAttribute('style') || ''; - node.setAttribute('style', oldStyle + '; ' + style); - } - - element.on(css3AnimationEvents, onAnimationProgress); - element.addClass(activeClassName); - elementData.closeAnimationFn = function() { - onEnd(); - activeAnimationComplete(); - }; - - var staggerTime = itemIndex * (Math.max(stagger.animationDelay, stagger.transitionDelay) || 0); - var animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER; - var totalTime = (staggerTime + animationTime) * ONE_SECOND; - - elementData.running++; - animationCloseHandler(element, totalTime); - return onEnd; - - // This will automatically be called by $animate so - // there is no need to attach this internally to the - // timeout done method. - function onEnd(cancelled) { - element.off(css3AnimationEvents, onAnimationProgress); - element.removeClass(activeClassName); - animateClose(element, className); - var node = extractElementNode(element); - for (var i in appliedStyles) { - node.style.removeProperty(appliedStyles[i]); - } - } - - function onAnimationProgress(event) { - event.stopPropagation(); - var ev = event.originalEvent || event; - var timeStamp = ev.$manualTimeStamp || Date.now(); - - /* Firefox (or possibly just Gecko) likes to not round values up - * when a ms measurement is used for the animation */ - var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES)); - - /* $manualTimeStamp is a mocked timeStamp value which is set - * within browserTrigger(). This is only here so that tests can - * mock animations properly. Real events fallback to Date.now(), - * or, if they don't, then a timeStamp is automatically created for them. - * We're checking to see if the timeStamp surpasses the expected delay, - * but we're using elapsedTime instead of the timeStamp on the 2nd - * pre-condition since animations sometimes close off early */ - if(Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) { - activeAnimationComplete(); - } - } - } - - function prepareStaggerDelay(delayStyle, staggerDelay, index) { - var style = ''; - forEach(delayStyle.split(','), function(val, i) { - style += (i > 0 ? ',' : '') + - (index * staggerDelay + parseInt(val, 10)) + 's'; - }); - return style; - } - - function animateBefore(animationEvent, element, className, calculationDecorator) { - if(animateSetup(animationEvent, element, className, calculationDecorator)) { - return function(cancelled) { - cancelled && animateClose(element, className); - }; - } - } - - function animateAfter(animationEvent, element, className, afterAnimationComplete) { - if(element.data(NG_ANIMATE_CSS_DATA_KEY)) { - return animateRun(animationEvent, element, className, afterAnimationComplete); - } else { - animateClose(element, className); - afterAnimationComplete(); - } - } - - function animate(animationEvent, element, className, animationComplete) { - //If the animateSetup function doesn't bother returning a - //cancellation function then it means that there is no animation - //to perform at all - var preReflowCancellation = animateBefore(animationEvent, element, className); - if (!preReflowCancellation) { - clearCacheAfterReflow(); - animationComplete(); - return; - } - - //There are two cancellation functions: one is before the first - //reflow animation and the second is during the active state - //animation. The first function will take care of removing the - //data from the element which will not make the 2nd animation - //happen in the first place - var cancel = preReflowCancellation; - afterReflow(element, function() { - unblockTransitions(element, className); - unblockKeyframeAnimations(element); - //once the reflow is complete then we point cancel to - //the new cancellation function which will remove all of the - //animation properties from the active animation - cancel = animateAfter(animationEvent, element, className, animationComplete); - }); - - return function(cancelled) { - (cancel || noop)(cancelled); - }; - } - - function animateClose(element, className) { - element.removeClass(className); - var data = element.data(NG_ANIMATE_CSS_DATA_KEY); - if(data) { - if(data.running) { - data.running--; - } - if(!data.running || data.running === 0) { - element.removeData(NG_ANIMATE_CSS_DATA_KEY); - } - } - } - - return { - enter : function(element, animationCompleted) { - return animate('enter', element, 'ng-enter', animationCompleted); - }, - - leave : function(element, animationCompleted) { - return animate('leave', element, 'ng-leave', animationCompleted); - }, - - move : function(element, animationCompleted) { - return animate('move', element, 'ng-move', animationCompleted); - }, - - beforeSetClass : function(element, add, remove, animationCompleted) { - var className = suffixClasses(remove, '-remove') + ' ' + - suffixClasses(add, '-add'); - var cancellationMethod = animateBefore('setClass', element, className, function(fn) { - /* when classes are removed from an element then the transition style - * that is applied is the transition defined on the element without the - * CSS class being there. This is how CSS3 functions outside of ngAnimate. - * http://plnkr.co/edit/j8OzgTNxHTb4n3zLyjGW?p=preview */ - var klass = element.attr('class'); - element.removeClass(remove); - element.addClass(add); - var timings = fn(); - element.attr('class', klass); - return timings; - }); - - if(cancellationMethod) { - afterReflow(element, function() { - unblockTransitions(element, className); - unblockKeyframeAnimations(element); - animationCompleted(); - }); - return cancellationMethod; - } - clearCacheAfterReflow(); - animationCompleted(); - }, - - beforeAddClass : function(element, className, animationCompleted) { - var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), function(fn) { - - /* when a CSS class is added to an element then the transition style that - * is applied is the transition defined on the element when the CSS class - * is added at the time of the animation. This is how CSS3 functions - * outside of ngAnimate. */ - element.addClass(className); - var timings = fn(); - element.removeClass(className); - return timings; - }); - - if(cancellationMethod) { - afterReflow(element, function() { - unblockTransitions(element, className); - unblockKeyframeAnimations(element); - animationCompleted(); - }); - return cancellationMethod; - } - clearCacheAfterReflow(); - animationCompleted(); - }, - - setClass : function(element, add, remove, animationCompleted) { - remove = suffixClasses(remove, '-remove'); - add = suffixClasses(add, '-add'); - var className = remove + ' ' + add; - return animateAfter('setClass', element, className, animationCompleted); - }, - - addClass : function(element, className, animationCompleted) { - return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted); - }, - - beforeRemoveClass : function(element, className, animationCompleted) { - var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), function(fn) { - /* when classes are removed from an element then the transition style - * that is applied is the transition defined on the element without the - * CSS class being there. This is how CSS3 functions outside of ngAnimate. - * http://plnkr.co/edit/j8OzgTNxHTb4n3zLyjGW?p=preview */ - var klass = element.attr('class'); - element.removeClass(className); - var timings = fn(); - element.attr('class', klass); - return timings; - }); - - if(cancellationMethod) { - afterReflow(element, function() { - unblockTransitions(element, className); - unblockKeyframeAnimations(element); - animationCompleted(); - }); - return cancellationMethod; - } - animationCompleted(); - }, - - removeClass : function(element, className, animationCompleted) { - return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted); - } - }; - - function suffixClasses(classes, suffix) { - var className = ''; - classes = angular.isArray(classes) ? classes : classes.split(/\s+/); - forEach(classes, function(klass, i) { - if(klass && klass.length > 0) { - className += (i > 0 ? ' ' : '') + klass + suffix; - } - }); - return className; - } - }]); - }]); - - -})(window, window.angular); diff --git a/server/insight-ui/public/lib/angular-animate/angular-animate.min.js b/server/insight-ui/public/lib/angular-animate/angular-animate.min.js deleted file mode 100644 index c0f1185..0000000 --- a/server/insight-ui/public/lib/angular-animate/angular-animate.min.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - AngularJS v1.2.32 - (c) 2010-2014 Google, Inc. http://angularjs.org - License: MIT -*/ -(function(G,d,P){'use strict';d.module("ngAnimate",["ng"]).directive("ngAnimateChildren",function(){return function(H,k,e){e=e.ngAnimateChildren;d.isString(e)&&0===e.length?k.data("$$ngAnimateChildren",!0):H.$watch(e,function(d){k.data("$$ngAnimateChildren",!!d)})}}).factory("$$animateReflow",["$$rAF","$document",function(d,k){var e=k[0].body;return function(k){return d(function(){k(e.offsetWidth)})}}]).config(["$provide","$animateProvider",function(H,k){function e(d){for(var e=0;e=y&&b>=r&&d()}var k=e(b);a=b.data(v);if(-1!=k.getAttribute("class").indexOf(c)&&a){var l="";x(c.split(" "),function(a,b){l+=(0", - "license": "MIT", - "bugs": { - "url": "https://github.com/angular/angular.js/issues" - }, - "homepage": "http://angularjs.org", - "jspm": { - "shim": { - "angular-animate": { - "deps": ["angular"] - } - } - } -} diff --git a/server/insight-ui/public/lib/angular-bootstrap/.bower.json b/server/insight-ui/public/lib/angular-bootstrap/.bower.json deleted file mode 100644 index 9eb4726..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/.bower.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "author": { - "name": "https://github.com/angular-ui/bootstrap/graphs/contributors" - }, - "name": "angular-bootstrap", - "version": "0.10.0", - "main": [ - "./ui-bootstrap-tpls.js" - ], - "dependencies": { - "angular": ">=1" - }, - "homepage": "https://github.com/angular-ui/bootstrap-bower", - "_release": "0.10.0", - "_resolution": { - "type": "version", - "tag": "0.10.0", - "commit": "f486d33d6f4c60d905ed0792eacbba2456a32b87" - }, - "_source": "https://github.com/angular-ui/bootstrap-bower.git", - "_target": "~0.10.0", - "_originalSource": "angular-bootstrap" -} \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-bootstrap/bower.json b/server/insight-ui/public/lib/angular-bootstrap/bower.json deleted file mode 100644 index dd5536c..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/bower.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "author": { - "name": "https://github.com/angular-ui/bootstrap/graphs/contributors" - }, - "name": "angular-bootstrap", - "version": "0.10.0", - "main": ["./ui-bootstrap-tpls.js"], - "dependencies": { - "angular": ">=1" - } -} diff --git a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.js b/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.js deleted file mode 100644 index cfec6be..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.js +++ /dev/null @@ -1,3677 +0,0 @@ -/* - * angular-ui-bootstrap - * http://angular-ui.github.io/bootstrap/ - - * Version: 0.10.0 - 2014-01-13 - * License: MIT - */ -angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); -angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); -angular.module('ui.bootstrap.transition', []) - -/** - * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. - * @param {DOMElement} element The DOMElement that will be animated. - * @param {string|object|function} trigger The thing that will cause the transition to start: - * - As a string, it represents the css class to be added to the element. - * - As an object, it represents a hash of style attributes to be applied to the element. - * - As a function, it represents a function to be called that will cause the transition to occur. - * @return {Promise} A promise that is resolved when the transition finishes. - */ -.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { - - var $transition = function(element, trigger, options) { - options = options || {}; - var deferred = $q.defer(); - var endEventName = $transition[options.animation ? "animationEndEventName" : "transitionEndEventName"]; - - var transitionEndHandler = function(event) { - $rootScope.$apply(function() { - element.unbind(endEventName, transitionEndHandler); - deferred.resolve(element); - }); - }; - - if (endEventName) { - element.bind(endEventName, transitionEndHandler); - } - - // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur - $timeout(function() { - if ( angular.isString(trigger) ) { - element.addClass(trigger); - } else if ( angular.isFunction(trigger) ) { - trigger(element); - } else if ( angular.isObject(trigger) ) { - element.css(trigger); - } - //If browser does not support transitions, instantly resolve - if ( !endEventName ) { - deferred.resolve(element); - } - }); - - // Add our custom cancel function to the promise that is returned - // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, - // i.e. it will therefore never raise a transitionEnd event for that transition - deferred.promise.cancel = function() { - if ( endEventName ) { - element.unbind(endEventName, transitionEndHandler); - } - deferred.reject('Transition cancelled'); - }; - - return deferred.promise; - }; - - // Work out the name of the transitionEnd event - var transElement = document.createElement('trans'); - var transitionEndEventNames = { - 'WebkitTransition': 'webkitTransitionEnd', - 'MozTransition': 'transitionend', - 'OTransition': 'oTransitionEnd', - 'transition': 'transitionend' - }; - var animationEndEventNames = { - 'WebkitTransition': 'webkitAnimationEnd', - 'MozTransition': 'animationend', - 'OTransition': 'oAnimationEnd', - 'transition': 'animationend' - }; - function findEndEventName(endEventNames) { - for (var name in endEventNames){ - if (transElement.style[name] !== undefined) { - return endEventNames[name]; - } - } - } - $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); - $transition.animationEndEventName = findEndEventName(animationEndEventNames); - return $transition; -}]); - -angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) - - .directive('collapse', ['$transition', function ($transition, $timeout) { - - return { - link: function (scope, element, attrs) { - - var initialAnimSkip = true; - var currentTransition; - - function doTransition(change) { - var newTransition = $transition(element, change); - if (currentTransition) { - currentTransition.cancel(); - } - currentTransition = newTransition; - newTransition.then(newTransitionDone, newTransitionDone); - return newTransition; - - function newTransitionDone() { - // Make sure it's this transition, otherwise, leave it alone. - if (currentTransition === newTransition) { - currentTransition = undefined; - } - } - } - - function expand() { - if (initialAnimSkip) { - initialAnimSkip = false; - expandDone(); - } else { - element.removeClass('collapse').addClass('collapsing'); - doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); - } - } - - function expandDone() { - element.removeClass('collapsing'); - element.addClass('collapse in'); - element.css({height: 'auto'}); - } - - function collapse() { - if (initialAnimSkip) { - initialAnimSkip = false; - collapseDone(); - element.css({height: 0}); - } else { - // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value - element.css({ height: element[0].scrollHeight + 'px' }); - //trigger reflow so a browser realizes that height was updated from auto to a specific value - var x = element[0].offsetWidth; - - element.removeClass('collapse in').addClass('collapsing'); - - doTransition({ height: 0 }).then(collapseDone); - } - } - - function collapseDone() { - element.removeClass('collapsing'); - element.addClass('collapse'); - } - - scope.$watch(attrs.collapse, function (shouldCollapse) { - if (shouldCollapse) { - collapse(); - } else { - expand(); - } - }); - } - }; - }]); - -angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) - -.constant('accordionConfig', { - closeOthers: true -}) - -.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { - - // This array keeps track of the accordion groups - this.groups = []; - - // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to - this.closeOthers = function(openGroup) { - var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; - if ( closeOthers ) { - angular.forEach(this.groups, function (group) { - if ( group !== openGroup ) { - group.isOpen = false; - } - }); - } - }; - - // This is called from the accordion-group directive to add itself to the accordion - this.addGroup = function(groupScope) { - var that = this; - this.groups.push(groupScope); - - groupScope.$on('$destroy', function (event) { - that.removeGroup(groupScope); - }); - }; - - // This is called from the accordion-group directive when to remove itself - this.removeGroup = function(group) { - var index = this.groups.indexOf(group); - if ( index !== -1 ) { - this.groups.splice(this.groups.indexOf(group), 1); - } - }; - -}]) - -// The accordion directive simply sets up the directive controller -// and adds an accordion CSS class to itself element. -.directive('accordion', function () { - return { - restrict:'EA', - controller:'AccordionController', - transclude: true, - replace: false, - templateUrl: 'template/accordion/accordion.html' - }; -}) - -// The accordion-group directive indicates a block of html that will expand and collapse in an accordion -.directive('accordionGroup', ['$parse', function($parse) { - return { - require:'^accordion', // We need this directive to be inside an accordion - restrict:'EA', - transclude:true, // It transcludes the contents of the directive into the template - replace: true, // The element containing the directive will be replaced with the template - templateUrl:'template/accordion/accordion-group.html', - scope:{ heading:'@' }, // Create an isolated scope and interpolate the heading attribute onto this scope - controller: function() { - this.setHeading = function(element) { - this.heading = element; - }; - }, - link: function(scope, element, attrs, accordionCtrl) { - var getIsOpen, setIsOpen; - - accordionCtrl.addGroup(scope); - - scope.isOpen = false; - - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - scope.$parent.$watch(getIsOpen, function(value) { - scope.isOpen = !!value; - }); - } - - scope.$watch('isOpen', function(value) { - if ( value ) { - accordionCtrl.closeOthers(scope); - } - if ( setIsOpen ) { - setIsOpen(scope.$parent, value); - } - }); - } - }; -}]) - -// Use accordion-heading below an accordion-group to provide a heading containing HTML -// -// Heading containing HTML - -// -.directive('accordionHeading', function() { - return { - restrict: 'EA', - transclude: true, // Grab the contents to be used as the heading - template: '', // In effect remove this element! - replace: true, - require: '^accordionGroup', - compile: function(element, attr, transclude) { - return function link(scope, element, attr, accordionGroupCtrl) { - // Pass the heading to the accordion-group controller - // so that it can be transcluded into the right place in the template - // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] - accordionGroupCtrl.setHeading(transclude(scope, function() {})); - }; - } - }; -}) - -// Use in the accordion-group template to indicate where you want the heading to be transcluded -// You must provide the property on the accordion-group controller that will hold the transcluded element -//
      -// -// ... -//
      -.directive('accordionTransclude', function() { - return { - require: '^accordionGroup', - link: function(scope, element, attr, controller) { - scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { - if ( heading ) { - element.html(''); - element.append(heading); - } - }); - } - }; -}); - -angular.module("ui.bootstrap.alert", []) - -.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { - $scope.closeable = 'close' in $attrs; -}]) - -.directive('alert', function () { - return { - restrict:'EA', - controller:'AlertController', - templateUrl:'template/alert/alert.html', - transclude:true, - replace:true, - scope: { - type: '=', - close: '&' - } - }; -}); - -angular.module('ui.bootstrap.bindHtml', []) - - .directive('bindHtmlUnsafe', function () { - return function (scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); - scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { - element.html(value || ''); - }); - }; - }); -angular.module('ui.bootstrap.buttons', []) - -.constant('buttonConfig', { - activeClass: 'active', - toggleEvent: 'click' -}) - -.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { - this.activeClass = buttonConfig.activeClass || 'active'; - this.toggleEvent = buttonConfig.toggleEvent || 'click'; -}]) - -.directive('btnRadio', function () { - return { - require: ['btnRadio', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - if (!element.hasClass(buttonsCtrl.activeClass)) { - scope.$apply(function () { - ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)); - ngModelCtrl.$render(); - }); - } - }); - } - }; -}) - -.directive('btnCheckbox', function () { - return { - require: ['btnCheckbox', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - function getTrueValue() { - return getCheckboxValue(attrs.btnCheckboxTrue, true); - } - - function getFalseValue() { - return getCheckboxValue(attrs.btnCheckboxFalse, false); - } - - function getCheckboxValue(attributeValue, defaultValue) { - var val = scope.$eval(attributeValue); - return angular.isDefined(val) ? val : defaultValue; - } - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - scope.$apply(function () { - ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); - ngModelCtrl.$render(); - }); - }); - } - }; -}); - -/** -* @ngdoc overview -* @name ui.bootstrap.carousel -* -* @description -* AngularJS version of an image carousel. -* -*/ -angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) -.controller('CarouselController', ['$scope', '$timeout', '$transition', '$q', function ($scope, $timeout, $transition, $q) { - var self = this, - slides = self.slides = [], - currentIndex = -1, - currentTimeout, isPlaying; - self.currentSlide = null; - - var destroyed = false; - /* direction: "prev" or "next" */ - self.select = function(nextSlide, direction) { - var nextIndex = slides.indexOf(nextSlide); - //Decide direction if it's not given - if (direction === undefined) { - direction = nextIndex > currentIndex ? "next" : "prev"; - } - if (nextSlide && nextSlide !== self.currentSlide) { - if ($scope.$currentTransition) { - $scope.$currentTransition.cancel(); - //Timeout so ng-class in template has time to fix classes for finished slide - $timeout(goNext); - } else { - goNext(); - } - } - function goNext() { - // Scope has been destroyed, stop here. - if (destroyed) { return; } - //If we have a slide to transition from and we have a transition type and we're allowed, go - if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { - //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime - nextSlide.$element.addClass(direction); - var reflow = nextSlide.$element[0].offsetWidth; //force reflow - - //Set all other slides to stop doing their stuff for the new transition - angular.forEach(slides, function(slide) { - angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); - }); - angular.extend(nextSlide, {direction: direction, active: true, entering: true}); - angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); - - $scope.$currentTransition = $transition(nextSlide.$element, {}); - //We have to create new pointers inside a closure since next & current will change - (function(next,current) { - $scope.$currentTransition.then( - function(){ transitionDone(next, current); }, - function(){ transitionDone(next, current); } - ); - }(nextSlide, self.currentSlide)); - } else { - transitionDone(nextSlide, self.currentSlide); - } - self.currentSlide = nextSlide; - currentIndex = nextIndex; - //every time you change slides, reset the timer - restartTimer(); - } - function transitionDone(next, current) { - angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); - angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); - $scope.$currentTransition = null; - } - }; - $scope.$on('$destroy', function () { - destroyed = true; - }); - - /* Allow outside people to call indexOf on slides array */ - self.indexOfSlide = function(slide) { - return slides.indexOf(slide); - }; - - $scope.next = function() { - var newIndex = (currentIndex + 1) % slides.length; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'next'); - } - }; - - $scope.prev = function() { - var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'prev'); - } - }; - - $scope.select = function(slide) { - self.select(slide); - }; - - $scope.isActive = function(slide) { - return self.currentSlide === slide; - }; - - $scope.slides = function() { - return slides; - }; - - $scope.$watch('interval', restartTimer); - $scope.$on('$destroy', resetTimer); - - function restartTimer() { - resetTimer(); - var interval = +$scope.interval; - if (!isNaN(interval) && interval>=0) { - currentTimeout = $timeout(timerFn, interval); - } - } - - function resetTimer() { - if (currentTimeout) { - $timeout.cancel(currentTimeout); - currentTimeout = null; - } - } - - function timerFn() { - if (isPlaying) { - $scope.next(); - restartTimer(); - } else { - $scope.pause(); - } - } - - $scope.play = function() { - if (!isPlaying) { - isPlaying = true; - restartTimer(); - } - }; - $scope.pause = function() { - if (!$scope.noPause) { - isPlaying = false; - resetTimer(); - } - }; - - self.addSlide = function(slide, element) { - slide.$element = element; - slides.push(slide); - //if this is the first slide or the slide is set to active, select it - if(slides.length === 1 || slide.active) { - self.select(slides[slides.length-1]); - if (slides.length == 1) { - $scope.play(); - } - } else { - slide.active = false; - } - }; - - self.removeSlide = function(slide) { - //get the index of the slide inside the carousel - var index = slides.indexOf(slide); - slides.splice(index, 1); - if (slides.length > 0 && slide.active) { - if (index >= slides.length) { - self.select(slides[index-1]); - } else { - self.select(slides[index]); - } - } else if (currentIndex > index) { - currentIndex--; - } - }; - -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:carousel - * @restrict EA - * - * @description - * Carousel is the outer container for a set of image 'slides' to showcase. - * - * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. - * @param {boolean=} noTransition Whether to disable transitions on the carousel. - * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). - * - * @example - - - - - - - - - - - - - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - - - */ -.directive('carousel', [function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - controller: 'CarouselController', - require: 'carousel', - templateUrl: 'template/carousel/carousel.html', - scope: { - interval: '=', - noTransition: '=', - noPause: '=' - } - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:slide - * @restrict EA - * - * @description - * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. - * - * @param {boolean=} active Model binding, whether or not this slide is currently active. - * - * @example - - -
      - - - - - - -
      -
      -
        -
      • - - {{$index}}: {{slide.text}} -
      • -
      - Add Slide -
      -
      - Interval, in milliseconds: -
      Enter a negative number to stop the interval. -
      -
      -
      -
      - -function CarouselDemoCtrl($scope) { - $scope.myInterval = 5000; - var slides = $scope.slides = []; - $scope.addSlide = function() { - var newWidth = 200 + ((slides.length + (25 * slides.length)) % 150); - slides.push({ - image: 'http://placekitten.com/' + newWidth + '/200', - text: ['More','Extra','Lots of','Surplus'][slides.length % 4] + ' ' - ['Cats', 'Kittys', 'Felines', 'Cutes'][slides.length % 4] - }); - }; - for (var i=0; i<4; i++) $scope.addSlide(); -} - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - -
      -*/ - -.directive('slide', ['$parse', function($parse) { - return { - require: '^carousel', - restrict: 'EA', - transclude: true, - replace: true, - templateUrl: 'template/carousel/slide.html', - scope: { - }, - link: function (scope, element, attrs, carouselCtrl) { - //Set up optional 'active' = binding - if (attrs.active) { - var getActive = $parse(attrs.active); - var setActive = getActive.assign; - var lastValue = scope.active = getActive(scope.$parent); - scope.$watch(function parentActiveWatch() { - var parentActive = getActive(scope.$parent); - - if (parentActive !== scope.active) { - // we are out of sync and need to copy - if (parentActive !== lastValue) { - // parent changed and it has precedence - lastValue = scope.active = parentActive; - } else { - // if the parent can be assigned then do so - setActive(scope.$parent, parentActive = lastValue = scope.active); - } - } - return parentActive; - }); - } - - carouselCtrl.addSlide(scope, element); - //when the scope is destroyed then remove the slide from the current slides array - scope.$on('$destroy', function() { - carouselCtrl.removeSlide(scope); - }); - - scope.$watch('active', function(active) { - if (active) { - carouselCtrl.select(scope); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.position', []) - -/** - * A set of utility methods that can be use to retrieve position of DOM elements. - * It is meant to be used where we need to absolute-position DOM elements in - * relation to other, existing elements (this is the case for tooltips, popovers, - * typeahead suggestions etc.). - */ - .factory('$position', ['$document', '$window', function ($document, $window) { - - function getStyle(el, cssprop) { - if (el.currentStyle) { //IE - return el.currentStyle[cssprop]; - } else if ($window.getComputedStyle) { - return $window.getComputedStyle(el)[cssprop]; - } - // finally try and get inline style - return el.style[cssprop]; - } - - /** - * Checks if a given element is statically positioned - * @param element - raw DOM element - */ - function isStaticPositioned(element) { - return (getStyle(element, "position") || 'static' ) === 'static'; - } - - /** - * returns the closest, non-statically positioned parentOffset of a given element - * @param element - */ - var parentOffsetEl = function (element) { - var docDomEl = $document[0]; - var offsetParent = element.offsetParent || docDomEl; - while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || docDomEl; - }; - - return { - /** - * Provides read-only equivalent of jQuery's position function: - * http://api.jquery.com/position/ - */ - position: function (element) { - var elBCR = this.offset(element); - var offsetParentBCR = { top: 0, left: 0 }; - var offsetParentEl = parentOffsetEl(element[0]); - if (offsetParentEl != $document[0]) { - offsetParentBCR = this.offset(angular.element(offsetParentEl)); - offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; - offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; - } - - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: elBCR.top - offsetParentBCR.top, - left: elBCR.left - offsetParentBCR.left - }; - }, - - /** - * Provides read-only equivalent of jQuery's offset function: - * http://api.jquery.com/offset/ - */ - offset: function (element) { - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop), - left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft) - }; - } - }; - }]); - -angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.position']) - -.constant('datepickerConfig', { - dayFormat: 'dd', - monthFormat: 'MMMM', - yearFormat: 'yyyy', - dayHeaderFormat: 'EEE', - dayTitleFormat: 'MMMM yyyy', - monthTitleFormat: 'yyyy', - showWeeks: true, - startingDay: 0, - yearRange: 20, - minDate: null, - maxDate: null -}) - -.controller('DatepickerController', ['$scope', '$attrs', 'dateFilter', 'datepickerConfig', function($scope, $attrs, dateFilter, dtConfig) { - var format = { - day: getValue($attrs.dayFormat, dtConfig.dayFormat), - month: getValue($attrs.monthFormat, dtConfig.monthFormat), - year: getValue($attrs.yearFormat, dtConfig.yearFormat), - dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat), - dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat), - monthTitle: getValue($attrs.monthTitleFormat, dtConfig.monthTitleFormat) - }, - startingDay = getValue($attrs.startingDay, dtConfig.startingDay), - yearRange = getValue($attrs.yearRange, dtConfig.yearRange); - - this.minDate = dtConfig.minDate ? new Date(dtConfig.minDate) : null; - this.maxDate = dtConfig.maxDate ? new Date(dtConfig.maxDate) : null; - - function getValue(value, defaultValue) { - return angular.isDefined(value) ? $scope.$parent.$eval(value) : defaultValue; - } - - function getDaysInMonth( year, month ) { - return new Date(year, month, 0).getDate(); - } - - function getDates(startDate, n) { - var dates = new Array(n); - var current = startDate, i = 0; - while (i < n) { - dates[i++] = new Date(current); - current.setDate( current.getDate() + 1 ); - } - return dates; - } - - function makeDate(date, format, isSelected, isSecondary) { - return { date: date, label: dateFilter(date, format), selected: !!isSelected, secondary: !!isSecondary }; - } - - this.modes = [ - { - name: 'day', - getVisibleDates: function(date, selected) { - var year = date.getFullYear(), month = date.getMonth(), firstDayOfMonth = new Date(year, month, 1); - var difference = startingDay - firstDayOfMonth.getDay(), - numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, - firstDate = new Date(firstDayOfMonth), numDates = 0; - - if ( numDisplayedFromPreviousMonth > 0 ) { - firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); - numDates += numDisplayedFromPreviousMonth; // Previous - } - numDates += getDaysInMonth(year, month + 1); // Current - numDates += (7 - numDates % 7) % 7; // Next - - var days = getDates(firstDate, numDates), labels = new Array(7); - for (var i = 0; i < numDates; i ++) { - var dt = new Date(days[i]); - days[i] = makeDate(dt, format.day, (selected && selected.getDate() === dt.getDate() && selected.getMonth() === dt.getMonth() && selected.getFullYear() === dt.getFullYear()), dt.getMonth() !== month); - } - for (var j = 0; j < 7; j++) { - labels[j] = dateFilter(days[j].date, format.dayHeader); - } - return { objects: days, title: dateFilter(date, format.dayTitle), labels: labels }; - }, - compare: function(date1, date2) { - return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); - }, - split: 7, - step: { months: 1 } - }, - { - name: 'month', - getVisibleDates: function(date, selected) { - var months = new Array(12), year = date.getFullYear(); - for ( var i = 0; i < 12; i++ ) { - var dt = new Date(year, i, 1); - months[i] = makeDate(dt, format.month, (selected && selected.getMonth() === i && selected.getFullYear() === year)); - } - return { objects: months, title: dateFilter(date, format.monthTitle) }; - }, - compare: function(date1, date2) { - return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); - }, - split: 3, - step: { years: 1 } - }, - { - name: 'year', - getVisibleDates: function(date, selected) { - var years = new Array(yearRange), year = date.getFullYear(), startYear = parseInt((year - 1) / yearRange, 10) * yearRange + 1; - for ( var i = 0; i < yearRange; i++ ) { - var dt = new Date(startYear + i, 0, 1); - years[i] = makeDate(dt, format.year, (selected && selected.getFullYear() === dt.getFullYear())); - } - return { objects: years, title: [years[0].label, years[yearRange - 1].label].join(' - ') }; - }, - compare: function(date1, date2) { - return date1.getFullYear() - date2.getFullYear(); - }, - split: 5, - step: { years: yearRange } - } - ]; - - this.isDisabled = function(date, mode) { - var currentMode = this.modes[mode || 0]; - return ((this.minDate && currentMode.compare(date, this.minDate) < 0) || (this.maxDate && currentMode.compare(date, this.maxDate) > 0) || ($scope.dateDisabled && $scope.dateDisabled({date: date, mode: currentMode.name}))); - }; -}]) - -.directive( 'datepicker', ['dateFilter', '$parse', 'datepickerConfig', '$log', function (dateFilter, $parse, datepickerConfig, $log) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/datepicker/datepicker.html', - scope: { - dateDisabled: '&' - }, - require: ['datepicker', '?^ngModel'], - controller: 'DatepickerController', - link: function(scope, element, attrs, ctrls) { - var datepickerCtrl = ctrls[0], ngModel = ctrls[1]; - - if (!ngModel) { - return; // do nothing if no ng-model - } - - // Configuration parameters - var mode = 0, selected = new Date(), showWeeks = datepickerConfig.showWeeks; - - if (attrs.showWeeks) { - scope.$parent.$watch($parse(attrs.showWeeks), function(value) { - showWeeks = !! value; - updateShowWeekNumbers(); - }); - } else { - updateShowWeekNumbers(); - } - - if (attrs.min) { - scope.$parent.$watch($parse(attrs.min), function(value) { - datepickerCtrl.minDate = value ? new Date(value) : null; - refill(); - }); - } - if (attrs.max) { - scope.$parent.$watch($parse(attrs.max), function(value) { - datepickerCtrl.maxDate = value ? new Date(value) : null; - refill(); - }); - } - - function updateShowWeekNumbers() { - scope.showWeekNumbers = mode === 0 && showWeeks; - } - - // Split array into smaller arrays - function split(arr, size) { - var arrays = []; - while (arr.length > 0) { - arrays.push(arr.splice(0, size)); - } - return arrays; - } - - function refill( updateSelected ) { - var date = null, valid = true; - - if ( ngModel.$modelValue ) { - date = new Date( ngModel.$modelValue ); - - if ( isNaN(date) ) { - valid = false; - $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else if ( updateSelected ) { - selected = date; - } - } - ngModel.$setValidity('date', valid); - - var currentMode = datepickerCtrl.modes[mode], data = currentMode.getVisibleDates(selected, date); - angular.forEach(data.objects, function(obj) { - obj.disabled = datepickerCtrl.isDisabled(obj.date, mode); - }); - - ngModel.$setValidity('date-disabled', (!date || !datepickerCtrl.isDisabled(date))); - - scope.rows = split(data.objects, currentMode.split); - scope.labels = data.labels || []; - scope.title = data.title; - } - - function setMode(value) { - mode = value; - updateShowWeekNumbers(); - refill(); - } - - ngModel.$render = function() { - refill( true ); - }; - - scope.select = function( date ) { - if ( mode === 0 ) { - var dt = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); - dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); - ngModel.$setViewValue( dt ); - refill( true ); - } else { - selected = date; - setMode( mode - 1 ); - } - }; - scope.move = function(direction) { - var step = datepickerCtrl.modes[mode].step; - selected.setMonth( selected.getMonth() + direction * (step.months || 0) ); - selected.setFullYear( selected.getFullYear() + direction * (step.years || 0) ); - refill(); - }; - scope.toggleMode = function() { - setMode( (mode + 1) % datepickerCtrl.modes.length ); - }; - scope.getWeekNumber = function(row) { - return ( mode === 0 && scope.showWeekNumbers && row.length === 7 ) ? getISO8601WeekNumber(row[0].date) : null; - }; - - function getISO8601WeekNumber(date) { - var checkDate = new Date(date); - checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday - var time = checkDate.getTime(); - checkDate.setMonth(0); // Compare with Jan 1 - checkDate.setDate(1); - return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; - } - } - }; -}]) - -.constant('datepickerPopupConfig', { - dateFormat: 'yyyy-MM-dd', - currentText: 'Today', - toggleWeeksText: 'Weeks', - clearText: 'Clear', - closeText: 'Done', - closeOnDateSelection: true, - appendToBody: false, - showButtonBar: true -}) - -.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'datepickerPopupConfig', 'datepickerConfig', -function ($compile, $parse, $document, $position, dateFilter, datepickerPopupConfig, datepickerConfig) { - return { - restrict: 'EA', - require: 'ngModel', - link: function(originalScope, element, attrs, ngModel) { - var scope = originalScope.$new(), // create a child scope so we are not polluting original one - dateFormat, - closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? originalScope.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, - appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? originalScope.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; - - attrs.$observe('datepickerPopup', function(value) { - dateFormat = value || datepickerPopupConfig.dateFormat; - ngModel.$render(); - }); - - scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? originalScope.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; - - originalScope.$on('$destroy', function() { - $popup.remove(); - scope.$destroy(); - }); - - attrs.$observe('currentText', function(text) { - scope.currentText = angular.isDefined(text) ? text : datepickerPopupConfig.currentText; - }); - attrs.$observe('toggleWeeksText', function(text) { - scope.toggleWeeksText = angular.isDefined(text) ? text : datepickerPopupConfig.toggleWeeksText; - }); - attrs.$observe('clearText', function(text) { - scope.clearText = angular.isDefined(text) ? text : datepickerPopupConfig.clearText; - }); - attrs.$observe('closeText', function(text) { - scope.closeText = angular.isDefined(text) ? text : datepickerPopupConfig.closeText; - }); - - var getIsOpen, setIsOpen; - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - originalScope.$watch(getIsOpen, function updateOpen(value) { - scope.isOpen = !! value; - }); - } - scope.isOpen = getIsOpen ? getIsOpen(originalScope) : false; // Initial state - - function setOpen( value ) { - if (setIsOpen) { - setIsOpen(originalScope, !!value); - } else { - scope.isOpen = !!value; - } - } - - var documentClickBind = function(event) { - if (scope.isOpen && event.target !== element[0]) { - scope.$apply(function() { - setOpen(false); - }); - } - }; - - var elementFocusBind = function() { - scope.$apply(function() { - setOpen( true ); - }); - }; - - // popup element used to display calendar - var popupEl = angular.element('
      '); - popupEl.attr({ - 'ng-model': 'date', - 'ng-change': 'dateSelection()' - }); - var datepickerEl = angular.element(popupEl.children()[0]), - datepickerOptions = {}; - if (attrs.datepickerOptions) { - datepickerOptions = originalScope.$eval(attrs.datepickerOptions); - datepickerEl.attr(angular.extend({}, datepickerOptions)); - } - - // TODO: reverse from dateFilter string to Date object - function parseDate(viewValue) { - if (!viewValue) { - ngModel.$setValidity('date', true); - return null; - } else if (angular.isDate(viewValue)) { - ngModel.$setValidity('date', true); - return viewValue; - } else if (angular.isString(viewValue)) { - var date = new Date(viewValue); - if (isNaN(date)) { - ngModel.$setValidity('date', false); - return undefined; - } else { - ngModel.$setValidity('date', true); - return date; - } - } else { - ngModel.$setValidity('date', false); - return undefined; - } - } - ngModel.$parsers.unshift(parseDate); - - // Inner change - scope.dateSelection = function(dt) { - if (angular.isDefined(dt)) { - scope.date = dt; - } - ngModel.$setViewValue(scope.date); - ngModel.$render(); - - if (closeOnDateSelection) { - setOpen( false ); - } - }; - - element.bind('input change keyup', function() { - scope.$apply(function() { - scope.date = ngModel.$modelValue; - }); - }); - - // Outter change - ngModel.$render = function() { - var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; - element.val(date); - scope.date = ngModel.$modelValue; - }; - - function addWatchableAttribute(attribute, scopeProperty, datepickerAttribute) { - if (attribute) { - originalScope.$watch($parse(attribute), function(value){ - scope[scopeProperty] = value; - }); - datepickerEl.attr(datepickerAttribute || scopeProperty, scopeProperty); - } - } - addWatchableAttribute(attrs.min, 'min'); - addWatchableAttribute(attrs.max, 'max'); - if (attrs.showWeeks) { - addWatchableAttribute(attrs.showWeeks, 'showWeeks', 'show-weeks'); - } else { - scope.showWeeks = 'show-weeks' in datepickerOptions ? datepickerOptions['show-weeks'] : datepickerConfig.showWeeks; - datepickerEl.attr('show-weeks', 'showWeeks'); - } - if (attrs.dateDisabled) { - datepickerEl.attr('date-disabled', attrs.dateDisabled); - } - - function updatePosition() { - scope.position = appendToBody ? $position.offset(element) : $position.position(element); - scope.position.top = scope.position.top + element.prop('offsetHeight'); - } - - var documentBindingInitialized = false, elementFocusInitialized = false; - scope.$watch('isOpen', function(value) { - if (value) { - updatePosition(); - $document.bind('click', documentClickBind); - if(elementFocusInitialized) { - element.unbind('focus', elementFocusBind); - } - element[0].focus(); - documentBindingInitialized = true; - } else { - if(documentBindingInitialized) { - $document.unbind('click', documentClickBind); - } - element.bind('focus', elementFocusBind); - elementFocusInitialized = true; - } - - if ( setIsOpen ) { - setIsOpen(originalScope, value); - } - }); - - scope.today = function() { - scope.dateSelection(new Date()); - }; - scope.clear = function() { - scope.dateSelection(null); - }; - - var $popup = $compile(popupEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; -}]) - -.directive('datepickerPopupWrap', function() { - return { - restrict:'EA', - replace: true, - transclude: true, - templateUrl: 'template/datepicker/popup.html', - link:function (scope, element, attrs) { - element.bind('click', function(event) { - event.preventDefault(); - event.stopPropagation(); - }); - } - }; -}); - -/* - * dropdownToggle - Provides dropdown menu functionality in place of bootstrap js - * @restrict class or attribute - * @example: - - */ - -angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) { - var openElement = null, - closeMenu = angular.noop; - return { - restrict: 'CA', - link: function(scope, element, attrs) { - scope.$watch('$location.path', function() { closeMenu(); }); - element.parent().bind('click', function() { closeMenu(); }); - element.bind('click', function (event) { - - var elementWasOpen = (element === openElement); - - event.preventDefault(); - event.stopPropagation(); - - if (!!openElement) { - closeMenu(); - } - - if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) { - element.parent().addClass('open'); - openElement = element; - closeMenu = function (event) { - if (event) { - event.preventDefault(); - event.stopPropagation(); - } - $document.unbind('click', closeMenu); - element.parent().removeClass('open'); - closeMenu = angular.noop; - openElement = null; - }; - $document.bind('click', closeMenu); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) - -/** - * A helper, internal data structure that acts as a map but also allows getting / removing - * elements in the LIFO order - */ - .factory('$$stackedMap', function () { - return { - createNew: function () { - var stack = []; - - return { - add: function (key, value) { - stack.push({ - key: key, - value: value - }); - }, - get: function (key) { - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - return stack[i]; - } - } - }, - keys: function() { - var keys = []; - for (var i = 0; i < stack.length; i++) { - keys.push(stack[i].key); - } - return keys; - }, - top: function () { - return stack[stack.length - 1]; - }, - remove: function (key) { - var idx = -1; - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - idx = i; - break; - } - } - return stack.splice(idx, 1)[0]; - }, - removeTop: function () { - return stack.splice(stack.length - 1, 1)[0]; - }, - length: function () { - return stack.length; - } - }; - } - }; - }) - -/** - * A helper directive for the $modal service. It creates a backdrop element. - */ - .directive('modalBackdrop', ['$timeout', function ($timeout) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/modal/backdrop.html', - link: function (scope) { - - scope.animate = false; - - //trigger CSS transitions - $timeout(function () { - scope.animate = true; - }); - } - }; - }]) - - .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { - return { - restrict: 'EA', - scope: { - index: '@', - animate: '=' - }, - replace: true, - transclude: true, - templateUrl: 'template/modal/window.html', - link: function (scope, element, attrs) { - scope.windowClass = attrs.windowClass || ''; - - $timeout(function () { - // trigger CSS transitions - scope.animate = true; - // focus a freshly-opened modal - element[0].focus(); - }); - - scope.close = function (evt) { - var modal = $modalStack.getTop(); - if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { - evt.preventDefault(); - evt.stopPropagation(); - $modalStack.dismiss(modal.key, 'backdrop click'); - } - }; - } - }; - }]) - - .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', - function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { - - var OPENED_MODAL_CLASS = 'modal-open'; - - var backdropDomEl, backdropScope; - var openedWindows = $$stackedMap.createNew(); - var $modalStack = {}; - - function backdropIndex() { - var topBackdropIndex = -1; - var opened = openedWindows.keys(); - for (var i = 0; i < opened.length; i++) { - if (openedWindows.get(opened[i]).value.backdrop) { - topBackdropIndex = i; - } - } - return topBackdropIndex; - } - - $rootScope.$watch(backdropIndex, function(newBackdropIndex){ - if (backdropScope) { - backdropScope.index = newBackdropIndex; - } - }); - - function removeModalWindow(modalInstance) { - - var body = $document.find('body').eq(0); - var modalWindow = openedWindows.get(modalInstance).value; - - //clean up the stack - openedWindows.remove(modalInstance); - - //remove window DOM element - removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, checkRemoveBackdrop); - body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); - } - - function checkRemoveBackdrop() { - //remove backdrop if no longer needed - if (backdropDomEl && backdropIndex() == -1) { - var backdropScopeRef = backdropScope; - removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { - backdropScopeRef.$destroy(); - backdropScopeRef = null; - }); - backdropDomEl = undefined; - backdropScope = undefined; - } - } - - function removeAfterAnimate(domEl, scope, emulateTime, done) { - // Closing animation - scope.animate = false; - - var transitionEndEventName = $transition.transitionEndEventName; - if (transitionEndEventName) { - // transition out - var timeout = $timeout(afterAnimating, emulateTime); - - domEl.bind(transitionEndEventName, function () { - $timeout.cancel(timeout); - afterAnimating(); - scope.$apply(); - }); - } else { - // Ensure this call is async - $timeout(afterAnimating, 0); - } - - function afterAnimating() { - if (afterAnimating.done) { - return; - } - afterAnimating.done = true; - - domEl.remove(); - if (done) { - done(); - } - } - } - - $document.bind('keydown', function (evt) { - var modal; - - if (evt.which === 27) { - modal = openedWindows.top(); - if (modal && modal.value.keyboard) { - $rootScope.$apply(function () { - $modalStack.dismiss(modal.key); - }); - } - } - }); - - $modalStack.open = function (modalInstance, modal) { - - openedWindows.add(modalInstance, { - deferred: modal.deferred, - modalScope: modal.scope, - backdrop: modal.backdrop, - keyboard: modal.keyboard - }); - - var body = $document.find('body').eq(0), - currBackdropIndex = backdropIndex(); - - if (currBackdropIndex >= 0 && !backdropDomEl) { - backdropScope = $rootScope.$new(true); - backdropScope.index = currBackdropIndex; - backdropDomEl = $compile('
      ')(backdropScope); - body.append(backdropDomEl); - } - - var angularDomEl = angular.element('
      '); - angularDomEl.attr('window-class', modal.windowClass); - angularDomEl.attr('index', openedWindows.length() - 1); - angularDomEl.attr('animate', 'animate'); - angularDomEl.html(modal.content); - - var modalDomEl = $compile(angularDomEl)(modal.scope); - openedWindows.top().value.modalDomEl = modalDomEl; - body.append(modalDomEl); - body.addClass(OPENED_MODAL_CLASS); - }; - - $modalStack.close = function (modalInstance, result) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.resolve(result); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismiss = function (modalInstance, reason) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.reject(reason); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismissAll = function (reason) { - var topModal = this.getTop(); - while (topModal) { - this.dismiss(topModal.key, reason); - topModal = this.getTop(); - } - }; - - $modalStack.getTop = function () { - return openedWindows.top(); - }; - - return $modalStack; - }]) - - .provider('$modal', function () { - - var $modalProvider = { - options: { - backdrop: true, //can be also false or 'static' - keyboard: true - }, - $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', - function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { - - var $modal = {}; - - function getTemplatePromise(options) { - return options.template ? $q.when(options.template) : - $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { - return result.data; - }); - } - - function getResolvePromises(resolves) { - var promisesArr = []; - angular.forEach(resolves, function (value, key) { - if (angular.isFunction(value) || angular.isArray(value)) { - promisesArr.push($q.when($injector.invoke(value))); - } - }); - return promisesArr; - } - - $modal.open = function (modalOptions) { - - var modalResultDeferred = $q.defer(); - var modalOpenedDeferred = $q.defer(); - - //prepare an instance of a modal to be injected into controllers and returned to a caller - var modalInstance = { - result: modalResultDeferred.promise, - opened: modalOpenedDeferred.promise, - close: function (result) { - $modalStack.close(modalInstance, result); - }, - dismiss: function (reason) { - $modalStack.dismiss(modalInstance, reason); - } - }; - - //merge and clean up options - modalOptions = angular.extend({}, $modalProvider.options, modalOptions); - modalOptions.resolve = modalOptions.resolve || {}; - - //verify options - if (!modalOptions.template && !modalOptions.templateUrl) { - throw new Error('One of template or templateUrl options is required.'); - } - - var templateAndResolvePromise = - $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); - - - templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { - - var modalScope = (modalOptions.scope || $rootScope).$new(); - modalScope.$close = modalInstance.close; - modalScope.$dismiss = modalInstance.dismiss; - - var ctrlInstance, ctrlLocals = {}; - var resolveIter = 1; - - //controllers - if (modalOptions.controller) { - ctrlLocals.$scope = modalScope; - ctrlLocals.$modalInstance = modalInstance; - angular.forEach(modalOptions.resolve, function (value, key) { - ctrlLocals[key] = tplAndVars[resolveIter++]; - }); - - ctrlInstance = $controller(modalOptions.controller, ctrlLocals); - } - - $modalStack.open(modalInstance, { - scope: modalScope, - deferred: modalResultDeferred, - content: tplAndVars[0], - backdrop: modalOptions.backdrop, - keyboard: modalOptions.keyboard, - windowClass: modalOptions.windowClass - }); - - }, function resolveError(reason) { - modalResultDeferred.reject(reason); - }); - - templateAndResolvePromise.then(function () { - modalOpenedDeferred.resolve(true); - }, function () { - modalOpenedDeferred.reject(false); - }); - - return modalInstance; - }; - - return $modal; - }] - }; - - return $modalProvider; - }); - -angular.module('ui.bootstrap.pagination', []) - -.controller('PaginationController', ['$scope', '$attrs', '$parse', '$interpolate', function ($scope, $attrs, $parse, $interpolate) { - var self = this, - setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; - - this.init = function(defaultItemsPerPage) { - if ($attrs.itemsPerPage) { - $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { - self.itemsPerPage = parseInt(value, 10); - $scope.totalPages = self.calculateTotalPages(); - }); - } else { - this.itemsPerPage = defaultItemsPerPage; - } - }; - - this.noPrevious = function() { - return this.page === 1; - }; - this.noNext = function() { - return this.page === $scope.totalPages; - }; - - this.isActive = function(page) { - return this.page === page; - }; - - this.calculateTotalPages = function() { - var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); - return Math.max(totalPages || 0, 1); - }; - - this.getAttributeValue = function(attribute, defaultValue, interpolate) { - return angular.isDefined(attribute) ? (interpolate ? $interpolate(attribute)($scope.$parent) : $scope.$parent.$eval(attribute)) : defaultValue; - }; - - this.render = function() { - this.page = parseInt($scope.page, 10) || 1; - if (this.page > 0 && this.page <= $scope.totalPages) { - $scope.pages = this.getPages(this.page, $scope.totalPages); - } - }; - - $scope.selectPage = function(page) { - if ( ! self.isActive(page) && page > 0 && page <= $scope.totalPages) { - $scope.page = page; - $scope.onSelectPage({ page: page }); - } - }; - - $scope.$watch('page', function() { - self.render(); - }); - - $scope.$watch('totalItems', function() { - $scope.totalPages = self.calculateTotalPages(); - }); - - $scope.$watch('totalPages', function(value) { - setNumPages($scope.$parent, value); // Readonly variable - - if ( self.page > value ) { - $scope.selectPage(value); - } else { - self.render(); - } - }); -}]) - -.constant('paginationConfig', { - itemsPerPage: 10, - boundaryLinks: false, - directionLinks: true, - firstText: 'First', - previousText: 'Previous', - nextText: 'Next', - lastText: 'Last', - rotate: true -}) - -.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pagination.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var maxSize, - boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks ), - directionLinks = paginationCtrl.getAttributeValue(attrs.directionLinks, config.directionLinks ), - firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true), - previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - lastText = paginationCtrl.getAttributeValue(attrs.lastText, config.lastText, true), - rotate = paginationCtrl.getAttributeValue(attrs.rotate, config.rotate); - - paginationCtrl.init(config.itemsPerPage); - - if (attrs.maxSize) { - scope.$parent.$watch($parse(attrs.maxSize), function(value) { - maxSize = parseInt(value, 10); - paginationCtrl.render(); - }); - } - - // Create page object used in template - function makePage(number, text, isActive, isDisabled) { - return { - number: number, - text: text, - active: isActive, - disabled: isDisabled - }; - } - - paginationCtrl.getPages = function(currentPage, totalPages) { - var pages = []; - - // Default page limits - var startPage = 1, endPage = totalPages; - var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); - - // recompute if maxSize - if ( isMaxSized ) { - if ( rotate ) { - // Current page is displayed in the middle of the visible ones - startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); - endPage = startPage + maxSize - 1; - - // Adjust if limit is exceeded - if (endPage > totalPages) { - endPage = totalPages; - startPage = endPage - maxSize + 1; - } - } else { - // Visible pages are paginated with maxSize - startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; - - // Adjust last page if limit is exceeded - endPage = Math.min(startPage + maxSize - 1, totalPages); - } - } - - // Add page number links - for (var number = startPage; number <= endPage; number++) { - var page = makePage(number, number, paginationCtrl.isActive(number), false); - pages.push(page); - } - - // Add links to move between page sets - if ( isMaxSized && ! rotate ) { - if ( startPage > 1 ) { - var previousPageSet = makePage(startPage - 1, '...', false, false); - pages.unshift(previousPageSet); - } - - if ( endPage < totalPages ) { - var nextPageSet = makePage(endPage + 1, '...', false, false); - pages.push(nextPageSet); - } - } - - // Add previous & next links - if (directionLinks) { - var previousPage = makePage(currentPage - 1, previousText, false, paginationCtrl.noPrevious()); - pages.unshift(previousPage); - - var nextPage = makePage(currentPage + 1, nextText, false, paginationCtrl.noNext()); - pages.push(nextPage); - } - - // Add first & last links - if (boundaryLinks) { - var firstPage = makePage(1, firstText, false, paginationCtrl.noPrevious()); - pages.unshift(firstPage); - - var lastPage = makePage(totalPages, lastText, false, paginationCtrl.noNext()); - pages.push(lastPage); - } - - return pages; - }; - } - }; -}]) - -.constant('pagerConfig', { - itemsPerPage: 10, - previousText: '« Previous', - nextText: 'Next »', - align: true -}) - -.directive('pager', ['pagerConfig', function(config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pager.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - align = paginationCtrl.getAttributeValue(attrs.align, config.align); - - paginationCtrl.init(config.itemsPerPage); - - // Create page object used in template - function makePage(number, text, isDisabled, isPrevious, isNext) { - return { - number: number, - text: text, - disabled: isDisabled, - previous: ( align && isPrevious ), - next: ( align && isNext ) - }; - } - - paginationCtrl.getPages = function(currentPage) { - return [ - makePage(currentPage - 1, previousText, paginationCtrl.noPrevious(), true, false), - makePage(currentPage + 1, nextText, paginationCtrl.noNext(), false, true) - ]; - }; - } - }; -}]); - -/** - * The following features are still outstanding: animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html tooltips, and selector delegation. - */ -angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) - -/** - * The $tooltip service creates tooltip- and popover-like directives as well as - * houses global options for them. - */ -.provider( '$tooltip', function () { - // The default options tooltip and popover. - var defaultOptions = { - placement: 'top', - animation: true, - popupDelay: 0 - }; - - // Default hide triggers for each show trigger - var triggerMap = { - 'mouseenter': 'mouseleave', - 'click': 'click', - 'focus': 'blur' - }; - - // The options specified to the provider globally. - var globalOptions = {}; - - /** - * `options({})` allows global configuration of all tooltips in the - * application. - * - * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { - * // place tooltips left instead of top by default - * $tooltipProvider.options( { placement: 'left' } ); - * }); - */ - this.options = function( value ) { - angular.extend( globalOptions, value ); - }; - - /** - * This allows you to extend the set of trigger mappings available. E.g.: - * - * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); - */ - this.setTriggers = function setTriggers ( triggers ) { - angular.extend( triggerMap, triggers ); - }; - - /** - * This is a helper function for translating camel-case to snake-case. - */ - function snake_case(name){ - var regexp = /[A-Z]/g; - var separator = '-'; - return name.replace(regexp, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); - } - - /** - * Returns the actual instance of the $tooltip service. - * TODO support multiple triggers - */ - this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { - return function $tooltip ( type, prefix, defaultTriggerShow ) { - var options = angular.extend( {}, defaultOptions, globalOptions ); - - /** - * Returns an object of show and hide triggers. - * - * If a trigger is supplied, - * it is used to show the tooltip; otherwise, it will use the `trigger` - * option passed to the `$tooltipProvider.options` method; else it will - * default to the trigger supplied to this directive factory. - * - * The hide trigger is based on the show trigger. If the `trigger` option - * was passed to the `$tooltipProvider.options` method, it will use the - * mapped trigger from `triggerMap` or the passed trigger if the map is - * undefined; otherwise, it uses the `triggerMap` value of the show - * trigger; else it will just use the show trigger. - */ - function getTriggers ( trigger ) { - var show = trigger || options.trigger || defaultTriggerShow; - var hide = triggerMap[show] || show; - return { - show: show, - hide: hide - }; - } - - var directiveName = snake_case( type ); - - var startSym = $interpolate.startSymbol(); - var endSym = $interpolate.endSymbol(); - var template = - '
      '+ - '
      '; - - return { - restrict: 'EA', - scope: true, - compile: function (tElem, tAttrs) { - var tooltipLinker = $compile( template ); - - return function link ( scope, element, attrs ) { - var tooltip; - var transitionTimeout; - var popupTimeout; - var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; - var triggers = getTriggers( undefined ); - var hasRegisteredTriggers = false; - var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); - - var positionTooltip = function (){ - var position, - ttWidth, - ttHeight, - ttPosition; - // Get the position of the directive element. - position = appendToBody ? $position.offset( element ) : $position.position( element ); - - // Get the height and width of the tooltip so we can center it. - ttWidth = tooltip.prop( 'offsetWidth' ); - ttHeight = tooltip.prop( 'offsetHeight' ); - - // Calculate the tooltip's top and left coordinates to center it with - // this directive. - switch ( scope.tt_placement ) { - case 'right': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left + position.width - }; - break; - case 'bottom': - ttPosition = { - top: position.top + position.height, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - case 'left': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left - ttWidth - }; - break; - default: - ttPosition = { - top: position.top - ttHeight, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - } - - ttPosition.top += 'px'; - ttPosition.left += 'px'; - - // Now set the calculated positioning. - tooltip.css( ttPosition ); - - }; - - // By default, the tooltip is not open. - // TODO add ability to start tooltip opened - scope.tt_isOpen = false; - - function toggleTooltipBind () { - if ( ! scope.tt_isOpen ) { - showTooltipBind(); - } else { - hideTooltipBind(); - } - } - - // Show the tooltip with delay if specified, otherwise show it immediately - function showTooltipBind() { - if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { - return; - } - if ( scope.tt_popupDelay ) { - popupTimeout = $timeout( show, scope.tt_popupDelay, false ); - popupTimeout.then(function(reposition){reposition();}); - } else { - show()(); - } - } - - function hideTooltipBind () { - scope.$apply(function () { - hide(); - }); - } - - // Show the tooltip popup element. - function show() { - - - // Don't show empty tooltips. - if ( ! scope.tt_content ) { - return angular.noop; - } - - createTooltip(); - - // If there is a pending remove transition, we must cancel it, lest the - // tooltip be mysteriously removed. - if ( transitionTimeout ) { - $timeout.cancel( transitionTimeout ); - } - - // Set the initial positioning. - tooltip.css({ top: 0, left: 0, display: 'block' }); - - // Now we add it to the DOM because need some info about it. But it's not - // visible yet anyway. - if ( appendToBody ) { - $document.find( 'body' ).append( tooltip ); - } else { - element.after( tooltip ); - } - - positionTooltip(); - - // And show the tooltip. - scope.tt_isOpen = true; - scope.$digest(); // digest required as $apply is not called - - // Return positioning function as promise callback for correct - // positioning after draw. - return positionTooltip; - } - - // Hide the tooltip popup element. - function hide() { - // First things first: we don't show it anymore. - scope.tt_isOpen = false; - - //if tooltip is going to be shown after delay, we must cancel this - $timeout.cancel( popupTimeout ); - - // And now we remove it from the DOM. However, if we have animation, we - // need to wait for it to expire beforehand. - // FIXME: this is a placeholder for a port of the transitions library. - if ( scope.tt_animation ) { - transitionTimeout = $timeout(removeTooltip, 500); - } else { - removeTooltip(); - } - } - - function createTooltip() { - // There can only be one tooltip element per directive shown at once. - if (tooltip) { - removeTooltip(); - } - tooltip = tooltipLinker(scope, function () {}); - - // Get contents rendered into the tooltip - scope.$digest(); - } - - function removeTooltip() { - if (tooltip) { - tooltip.remove(); - tooltip = null; - } - } - - /** - * Observe the relevant attributes. - */ - attrs.$observe( type, function ( val ) { - scope.tt_content = val; - - if (!val && scope.tt_isOpen ) { - hide(); - } - }); - - attrs.$observe( prefix+'Title', function ( val ) { - scope.tt_title = val; - }); - - attrs.$observe( prefix+'Placement', function ( val ) { - scope.tt_placement = angular.isDefined( val ) ? val : options.placement; - }); - - attrs.$observe( prefix+'PopupDelay', function ( val ) { - var delay = parseInt( val, 10 ); - scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; - }); - - var unregisterTriggers = function() { - if (hasRegisteredTriggers) { - element.unbind( triggers.show, showTooltipBind ); - element.unbind( triggers.hide, hideTooltipBind ); - } - }; - - attrs.$observe( prefix+'Trigger', function ( val ) { - unregisterTriggers(); - - triggers = getTriggers( val ); - - if ( triggers.show === triggers.hide ) { - element.bind( triggers.show, toggleTooltipBind ); - } else { - element.bind( triggers.show, showTooltipBind ); - element.bind( triggers.hide, hideTooltipBind ); - } - - hasRegisteredTriggers = true; - }); - - var animation = scope.$eval(attrs[prefix + 'Animation']); - scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; - - attrs.$observe( prefix+'AppendToBody', function ( val ) { - appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; - }); - - // if a tooltip is attached to we need to remove it on - // location change as its parent scope will probably not be destroyed - // by the change. - if ( appendToBody ) { - scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { - if ( scope.tt_isOpen ) { - hide(); - } - }); - } - - // Make sure tooltip is destroyed and removed. - scope.$on('$destroy', function onDestroyTooltip() { - $timeout.cancel( transitionTimeout ); - $timeout.cancel( popupTimeout ); - unregisterTriggers(); - removeTooltip(); - }); - }; - } - }; - }; - }]; -}) - -.directive( 'tooltipPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-popup.html' - }; -}) - -.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); -}]) - -.directive( 'tooltipHtmlUnsafePopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' - }; -}) - -.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); -}]); - -/** - * The following features are still outstanding: popup delay, animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html popovers, and selector delegatation. - */ -angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) - -.directive( 'popoverPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/popover/popover.html' - }; -}) - -.directive( 'popover', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'popover', 'popover', 'click' ); -}]); - -angular.module('ui.bootstrap.progressbar', ['ui.bootstrap.transition']) - -.constant('progressConfig', { - animate: true, - max: 100 -}) - -.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', '$transition', function($scope, $attrs, progressConfig, $transition) { - var self = this, - bars = [], - max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max, - animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; - - this.addBar = function(bar, element) { - var oldValue = 0, index = bar.$parent.$index; - if ( angular.isDefined(index) && bars[index] ) { - oldValue = bars[index].value; - } - bars.push(bar); - - this.update(element, bar.value, oldValue); - - bar.$watch('value', function(value, oldValue) { - if (value !== oldValue) { - self.update(element, value, oldValue); - } - }); - - bar.$on('$destroy', function() { - self.removeBar(bar); - }); - }; - - // Update bar element width - this.update = function(element, newValue, oldValue) { - var percent = this.getPercentage(newValue); - - if (animate) { - element.css('width', this.getPercentage(oldValue) + '%'); - $transition(element, {width: percent + '%'}); - } else { - element.css({'transition': 'none', 'width': percent + '%'}); - } - }; - - this.removeBar = function(bar) { - bars.splice(bars.indexOf(bar), 1); - }; - - this.getPercentage = function(value) { - return Math.round(100 * value / max); - }; -}]) - -.directive('progress', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - require: 'progress', - scope: {}, - template: '
      ' - //templateUrl: 'template/progressbar/progress.html' // Works in AngularJS 1.2 - }; -}) - -.directive('bar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - require: '^progress', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/bar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, element); - } - }; -}) - -.directive('progressbar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/progressbar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, angular.element(element.children()[0])); - } - }; -}); -angular.module('ui.bootstrap.rating', []) - -.constant('ratingConfig', { - max: 5, - stateOn: null, - stateOff: null -}) - -.controller('RatingController', ['$scope', '$attrs', '$parse', 'ratingConfig', function($scope, $attrs, $parse, ratingConfig) { - - this.maxRange = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max; - this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; - this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; - - this.createRateObjects = function(states) { - var defaultOptions = { - stateOn: this.stateOn, - stateOff: this.stateOff - }; - - for (var i = 0, n = states.length; i < n; i++) { - states[i] = angular.extend({ index: i }, defaultOptions, states[i]); - } - return states; - }; - - // Get objects used in template - $scope.range = angular.isDefined($attrs.ratingStates) ? this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))): this.createRateObjects(new Array(this.maxRange)); - - $scope.rate = function(value) { - if ( $scope.value !== value && !$scope.readonly ) { - $scope.value = value; - } - }; - - $scope.enter = function(value) { - if ( ! $scope.readonly ) { - $scope.val = value; - } - $scope.onHover({value: value}); - }; - - $scope.reset = function() { - $scope.val = angular.copy($scope.value); - $scope.onLeave(); - }; - - $scope.$watch('value', function(value) { - $scope.val = value; - }); - - $scope.readonly = false; - if ($attrs.readonly) { - $scope.$parent.$watch($parse($attrs.readonly), function(value) { - $scope.readonly = !!value; - }); - } -}]) - -.directive('rating', function() { - return { - restrict: 'EA', - scope: { - value: '=', - onHover: '&', - onLeave: '&' - }, - controller: 'RatingController', - templateUrl: 'template/rating/rating.html', - replace: true - }; -}); - -/** - * @ngdoc overview - * @name ui.bootstrap.tabs - * - * @description - * AngularJS version of the tabs directive. - */ - -angular.module('ui.bootstrap.tabs', []) - -.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { - var ctrl = this, - tabs = ctrl.tabs = $scope.tabs = []; - - ctrl.select = function(tab) { - angular.forEach(tabs, function(tab) { - tab.active = false; - }); - tab.active = true; - }; - - ctrl.addTab = function addTab(tab) { - tabs.push(tab); - if (tabs.length === 1 || tab.active) { - ctrl.select(tab); - } - }; - - ctrl.removeTab = function removeTab(tab) { - var index = tabs.indexOf(tab); - //Select a new tab if the tab to be removed is selected - if (tab.active && tabs.length > 1) { - //If this is the last tab, select the previous tab. else, the next tab. - var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; - ctrl.select(tabs[newActiveIndex]); - } - tabs.splice(index, 1); - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabset - * @restrict EA - * - * @description - * Tabset is the outer container for the tabs directive - * - * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. - * @param {boolean=} justified Whether or not to use justified styling for the tabs. - * - * @example - - - - First Content! - Second Content! - -
      - - First Vertical Content! - Second Vertical Content! - - - First Justified Content! - Second Justified Content! - -
      -
      - */ -.directive('tabset', function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - scope: {}, - controller: 'TabsetController', - templateUrl: 'template/tabs/tabset.html', - link: function(scope, element, attrs) { - scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; - scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; - scope.type = angular.isDefined(attrs.type) ? scope.$parent.$eval(attrs.type) : 'tabs'; - } - }; -}) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tab - * @restrict EA - * - * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. - * @param {string=} select An expression to evaluate when the tab is selected. - * @param {boolean=} active A binding, telling whether or not this tab is selected. - * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. - * - * @description - * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. - * - * @example - - -
      - - -
      - - First Tab - - Alert me! - Second Tab, with alert callback and html heading! - - - {{item.content}} - - -
      -
      - - function TabsDemoCtrl($scope) { - $scope.items = [ - { title:"Dynamic Title 1", content:"Dynamic Item 0" }, - { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } - ]; - - $scope.alertMe = function() { - setTimeout(function() { - alert("You've selected the alert tab!"); - }); - }; - }; - -
      - */ - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabHeading - * @restrict EA - * - * @description - * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. - * - * @example - - - - - HTML in my titles?! - And some content, too! - - - Icon heading?!? - That's right. - - - - - */ -.directive('tab', ['$parse', function($parse) { - return { - require: '^tabset', - restrict: 'EA', - replace: true, - templateUrl: 'template/tabs/tab.html', - transclude: true, - scope: { - heading: '@', - onSelect: '&select', //This callback is called in contentHeadingTransclude - //once it inserts the tab's content into the dom - onDeselect: '&deselect' - }, - controller: function() { - //Empty controller so other directives can require being 'under' a tab - }, - compile: function(elm, attrs, transclude) { - return function postLink(scope, elm, attrs, tabsetCtrl) { - var getActive, setActive; - if (attrs.active) { - getActive = $parse(attrs.active); - setActive = getActive.assign; - scope.$parent.$watch(getActive, function updateActive(value, oldVal) { - // Avoid re-initializing scope.active as it is already initialized - // below. (watcher is called async during init with value === - // oldVal) - if (value !== oldVal) { - scope.active = !!value; - } - }); - scope.active = getActive(scope.$parent); - } else { - setActive = getActive = angular.noop; - } - - scope.$watch('active', function(active) { - // Note this watcher also initializes and assigns scope.active to the - // attrs.active expression. - setActive(scope.$parent, active); - if (active) { - tabsetCtrl.select(scope); - scope.onSelect(); - } else { - scope.onDeselect(); - } - }); - - scope.disabled = false; - if ( attrs.disabled ) { - scope.$parent.$watch($parse(attrs.disabled), function(value) { - scope.disabled = !! value; - }); - } - - scope.select = function() { - if ( ! scope.disabled ) { - scope.active = true; - } - }; - - tabsetCtrl.addTab(scope); - scope.$on('$destroy', function() { - tabsetCtrl.removeTab(scope); - }); - - - //We need to transclude later, once the content container is ready. - //when this link happens, we're inside a tab heading. - scope.$transcludeFn = transclude; - }; - } - }; -}]) - -.directive('tabHeadingTransclude', [function() { - return { - restrict: 'A', - require: '^tab', - link: function(scope, elm, attrs, tabCtrl) { - scope.$watch('headingElement', function updateHeadingElement(heading) { - if (heading) { - elm.html(''); - elm.append(heading); - } - }); - } - }; -}]) - -.directive('tabContentTransclude', function() { - return { - restrict: 'A', - require: '^tabset', - link: function(scope, elm, attrs) { - var tab = scope.$eval(attrs.tabContentTransclude); - - //Now our tab is ready to be transcluded: both the tab heading area - //and the tab content area are loaded. Transclude 'em both. - tab.$transcludeFn(tab.$parent, function(contents) { - angular.forEach(contents, function(node) { - if (isTabHeading(node)) { - //Let tabHeadingTransclude know. - tab.headingElement = node; - } else { - elm.append(node); - } - }); - }); - } - }; - function isTabHeading(node) { - return node.tagName && ( - node.hasAttribute('tab-heading') || - node.hasAttribute('data-tab-heading') || - node.tagName.toLowerCase() === 'tab-heading' || - node.tagName.toLowerCase() === 'data-tab-heading' - ); - } -}) - -; - -angular.module('ui.bootstrap.timepicker', []) - -.constant('timepickerConfig', { - hourStep: 1, - minuteStep: 1, - showMeridian: true, - meridians: null, - readonlyInput: false, - mousewheel: true -}) - -.directive('timepicker', ['$parse', '$log', 'timepickerConfig', '$locale', function ($parse, $log, timepickerConfig, $locale) { - return { - restrict: 'EA', - require:'?^ngModel', - replace: true, - scope: {}, - templateUrl: 'template/timepicker/timepicker.html', - link: function(scope, element, attrs, ngModel) { - if ( !ngModel ) { - return; // do nothing if no ng-model - } - - var selected = new Date(), - meridians = angular.isDefined(attrs.meridians) ? scope.$parent.$eval(attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; - - var hourStep = timepickerConfig.hourStep; - if (attrs.hourStep) { - scope.$parent.$watch($parse(attrs.hourStep), function(value) { - hourStep = parseInt(value, 10); - }); - } - - var minuteStep = timepickerConfig.minuteStep; - if (attrs.minuteStep) { - scope.$parent.$watch($parse(attrs.minuteStep), function(value) { - minuteStep = parseInt(value, 10); - }); - } - - // 12H / 24H mode - scope.showMeridian = timepickerConfig.showMeridian; - if (attrs.showMeridian) { - scope.$parent.$watch($parse(attrs.showMeridian), function(value) { - scope.showMeridian = !!value; - - if ( ngModel.$error.time ) { - // Evaluate from template - var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); - if (angular.isDefined( hours ) && angular.isDefined( minutes )) { - selected.setHours( hours ); - refresh(); - } - } else { - updateTemplate(); - } - }); - } - - // Get scope.hours in 24H mode if valid - function getHoursFromTemplate ( ) { - var hours = parseInt( scope.hours, 10 ); - var valid = ( scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); - if ( !valid ) { - return undefined; - } - - if ( scope.showMeridian ) { - if ( hours === 12 ) { - hours = 0; - } - if ( scope.meridian === meridians[1] ) { - hours = hours + 12; - } - } - return hours; - } - - function getMinutesFromTemplate() { - var minutes = parseInt(scope.minutes, 10); - return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; - } - - function pad( value ) { - return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; - } - - // Input elements - var inputs = element.find('input'), hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1); - - // Respond on mousewheel spin - var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel; - if ( mousewheel ) { - - var isScrollingUp = function(e) { - if (e.originalEvent) { - e = e.originalEvent; - } - //pick correct delta variable depending on event - var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; - return (e.detail || delta > 0); - }; - - hoursInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() ); - e.preventDefault(); - }); - - minutesInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() ); - e.preventDefault(); - }); - } - - scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : timepickerConfig.readonlyInput; - if ( ! scope.readonlyInput ) { - - var invalidate = function(invalidHours, invalidMinutes) { - ngModel.$setViewValue( null ); - ngModel.$setValidity('time', false); - if (angular.isDefined(invalidHours)) { - scope.invalidHours = invalidHours; - } - if (angular.isDefined(invalidMinutes)) { - scope.invalidMinutes = invalidMinutes; - } - }; - - scope.updateHours = function() { - var hours = getHoursFromTemplate(); - - if ( angular.isDefined(hours) ) { - selected.setHours( hours ); - refresh( 'h' ); - } else { - invalidate(true); - } - }; - - hoursInputEl.bind('blur', function(e) { - if ( !scope.validHours && scope.hours < 10) { - scope.$apply( function() { - scope.hours = pad( scope.hours ); - }); - } - }); - - scope.updateMinutes = function() { - var minutes = getMinutesFromTemplate(); - - if ( angular.isDefined(minutes) ) { - selected.setMinutes( minutes ); - refresh( 'm' ); - } else { - invalidate(undefined, true); - } - }; - - minutesInputEl.bind('blur', function(e) { - if ( !scope.invalidMinutes && scope.minutes < 10 ) { - scope.$apply( function() { - scope.minutes = pad( scope.minutes ); - }); - } - }); - } else { - scope.updateHours = angular.noop; - scope.updateMinutes = angular.noop; - } - - ngModel.$render = function() { - var date = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : null; - - if ( isNaN(date) ) { - ngModel.$setValidity('time', false); - $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else { - if ( date ) { - selected = date; - } - makeValid(); - updateTemplate(); - } - }; - - // Call internally when we know that model is valid. - function refresh( keyboardChange ) { - makeValid(); - ngModel.$setViewValue( new Date(selected) ); - updateTemplate( keyboardChange ); - } - - function makeValid() { - ngModel.$setValidity('time', true); - scope.invalidHours = false; - scope.invalidMinutes = false; - } - - function updateTemplate( keyboardChange ) { - var hours = selected.getHours(), minutes = selected.getMinutes(); - - if ( scope.showMeridian ) { - hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system - } - scope.hours = keyboardChange === 'h' ? hours : pad(hours); - scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); - scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; - } - - function addMinutes( minutes ) { - var dt = new Date( selected.getTime() + minutes * 60000 ); - selected.setHours( dt.getHours(), dt.getMinutes() ); - refresh(); - } - - scope.incrementHours = function() { - addMinutes( hourStep * 60 ); - }; - scope.decrementHours = function() { - addMinutes( - hourStep * 60 ); - }; - scope.incrementMinutes = function() { - addMinutes( minuteStep ); - }; - scope.decrementMinutes = function() { - addMinutes( - minuteStep ); - }; - scope.toggleMeridian = function() { - addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); - }; - } - }; -}]); - -angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) - -/** - * A helper service that can parse typeahead's syntax (string provided by users) - * Extracted to a separate service for ease of unit testing - */ - .factory('typeaheadParser', ['$parse', function ($parse) { - - // 00000111000000000000022200000000000000003333333333333330000000000044000 - var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; - - return { - parse:function (input) { - - var match = input.match(TYPEAHEAD_REGEXP), modelMapper, viewMapper, source; - if (!match) { - throw new Error( - "Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_'" + - " but got '" + input + "'."); - } - - return { - itemName:match[3], - source:$parse(match[4]), - viewMapper:$parse(match[2] || match[1]), - modelMapper:$parse(match[1]) - }; - } - }; -}]) - - .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', - function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { - - var HOT_KEYS = [9, 13, 27, 38, 40]; - - return { - require:'ngModel', - link:function (originalScope, element, attrs, modelCtrl) { - - //SUPPORTED ATTRIBUTES (OPTIONS) - - //minimal no of characters that needs to be entered before typeahead kicks-in - var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; - - //minimal wait time after last character typed before typehead kicks-in - var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; - - //should it restrict model values to the ones selected from the popup only? - var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; - - //binding to a variable that indicates if matches are being retrieved asynchronously - var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; - - //a callback executed when a match is selected - var onSelectCallback = $parse(attrs.typeaheadOnSelect); - - var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; - - var appendToBody = attrs.typeaheadAppendToBody ? $parse(attrs.typeaheadAppendToBody) : false; - - //INTERNAL VARIABLES - - //model setter executed upon match selection - var $setModelValue = $parse(attrs.ngModel).assign; - - //expressions used by typeahead - var parserResult = typeaheadParser.parse(attrs.typeahead); - - var hasFocus; - - //pop-up element used to display matches - var popUpEl = angular.element('
      '); - popUpEl.attr({ - matches: 'matches', - active: 'activeIdx', - select: 'select(activeIdx)', - query: 'query', - position: 'position' - }); - //custom item template - if (angular.isDefined(attrs.typeaheadTemplateUrl)) { - popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); - } - - //create a child scope for the typeahead directive so we are not polluting original scope - //with typeahead-specific data (matches, query etc.) - var scope = originalScope.$new(); - originalScope.$on('$destroy', function(){ - scope.$destroy(); - }); - - var resetMatches = function() { - scope.matches = []; - scope.activeIdx = -1; - }; - - var getMatchesAsync = function(inputValue) { - - var locals = {$viewValue: inputValue}; - isLoadingSetter(originalScope, true); - $q.when(parserResult.source(originalScope, locals)).then(function(matches) { - - //it might happen that several async queries were in progress if a user were typing fast - //but we are interested only in responses that correspond to the current view value - if (inputValue === modelCtrl.$viewValue && hasFocus) { - if (matches.length > 0) { - - scope.activeIdx = 0; - scope.matches.length = 0; - - //transform labels - for(var i=0; i= minSearch) { - if (waitTime > 0) { - if (timeoutPromise) { - $timeout.cancel(timeoutPromise);//cancel previous timeout - } - timeoutPromise = $timeout(function () { - getMatchesAsync(inputValue); - }, waitTime); - } else { - getMatchesAsync(inputValue); - } - } else { - isLoadingSetter(originalScope, false); - resetMatches(); - } - - if (isEditable) { - return inputValue; - } else { - if (!inputValue) { - // Reset in case user had typed something previously. - modelCtrl.$setValidity('editable', true); - return inputValue; - } else { - modelCtrl.$setValidity('editable', false); - return undefined; - } - } - }); - - modelCtrl.$formatters.push(function (modelValue) { - - var candidateViewValue, emptyViewValue; - var locals = {}; - - if (inputFormatter) { - - locals['$model'] = modelValue; - return inputFormatter(originalScope, locals); - - } else { - - //it might happen that we don't have enough info to properly render input value - //we need to check for this situation and simply return model value if we can't apply custom formatting - locals[parserResult.itemName] = modelValue; - candidateViewValue = parserResult.viewMapper(originalScope, locals); - locals[parserResult.itemName] = undefined; - emptyViewValue = parserResult.viewMapper(originalScope, locals); - - return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; - } - }); - - scope.select = function (activeIdx) { - //called from within the $digest() cycle - var locals = {}; - var model, item; - - locals[parserResult.itemName] = item = scope.matches[activeIdx].model; - model = parserResult.modelMapper(originalScope, locals); - $setModelValue(originalScope, model); - modelCtrl.$setValidity('editable', true); - - onSelectCallback(originalScope, { - $item: item, - $model: model, - $label: parserResult.viewMapper(originalScope, locals) - }); - - resetMatches(); - - //return focus to the input element if a mach was selected via a mouse click event - element[0].focus(); - }; - - //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) - element.bind('keydown', function (evt) { - - //typeahead is open and an "interesting" key was pressed - if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { - return; - } - - evt.preventDefault(); - - if (evt.which === 40) { - scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; - scope.$digest(); - - } else if (evt.which === 38) { - scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; - scope.$digest(); - - } else if (evt.which === 13 || evt.which === 9) { - scope.$apply(function () { - scope.select(scope.activeIdx); - }); - - } else if (evt.which === 27) { - evt.stopPropagation(); - - resetMatches(); - scope.$digest(); - } - }); - - element.bind('blur', function (evt) { - hasFocus = false; - }); - - // Keep reference to click handler to unbind it. - var dismissClickHandler = function (evt) { - if (element[0] !== evt.target) { - resetMatches(); - scope.$digest(); - } - }; - - $document.bind('click', dismissClickHandler); - - originalScope.$on('$destroy', function(){ - $document.unbind('click', dismissClickHandler); - }); - - var $popup = $compile(popUpEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; - -}]) - - .directive('typeaheadPopup', function () { - return { - restrict:'EA', - scope:{ - matches:'=', - query:'=', - active:'=', - position:'=', - select:'&' - }, - replace:true, - templateUrl:'template/typeahead/typeahead-popup.html', - link:function (scope, element, attrs) { - - scope.templateUrl = attrs.templateUrl; - - scope.isOpen = function () { - return scope.matches.length > 0; - }; - - scope.isActive = function (matchIdx) { - return scope.active == matchIdx; - }; - - scope.selectActive = function (matchIdx) { - scope.active = matchIdx; - }; - - scope.selectMatch = function (activeIdx) { - scope.select({activeIdx:activeIdx}); - }; - } - }; - }) - - .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { - return { - restrict:'EA', - scope:{ - index:'=', - match:'=', - query:'=' - }, - link:function (scope, element, attrs) { - var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; - $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ - element.replaceWith($compile(tplContent.trim())(scope)); - }); - } - }; - }]) - - .filter('typeaheadHighlight', function() { - - function escapeRegexp(queryToEscape) { - return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - } - - return function(matchItem, query) { - return query ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; - }; - }); -angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/accordion/accordion-group.html", - "
      \n" + - "
      \n" + - "

      \n" + - " {{heading}}\n" + - "

      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - "
      "); -}]); - -angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/accordion/accordion.html", - "
      "); -}]); - -angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/alert/alert.html", - "
      \n" + - " \n" + - "
      \n" + - "
      \n" + - ""); -}]); - -angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/carousel/carousel.html", - "
      \n" + - "
        1\">\n" + - "
      1. \n" + - "
      \n" + - "
      \n" + - " 1\">\n" + - " 1\">\n" + - "
      \n" + - ""); -}]); - -angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/carousel/slide.html", - "
      \n" + - ""); -}]); - -angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/datepicker/datepicker.html", - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " 0\" class=\"h6\">\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
      #{{label}}
      {{ getWeekNumber(row) }}\n" + - " \n" + - "
      \n" + - ""); -}]); - -angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/datepicker/popup.html", - "
        \n" + - "
      • \n" + - "
      • \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
      • \n" + - "
      \n" + - ""); -}]); - -angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/modal/backdrop.html", - "
      "); -}]); - -angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/modal/window.html", - "
      \n" + - "
      \n" + - "
      "); -}]); - -angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/pagination/pager.html", - ""); -}]); - -angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/pagination/pagination.html", - ""); -}]); - -angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - ""); -}]); - -angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tooltip/tooltip-popup.html", - "
      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - ""); -}]); - -angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/popover/popover.html", - "
      \n" + - "
      \n" + - "\n" + - "
      \n" + - "

      \n" + - "
      \n" + - "
      \n" + - "
      \n" + - ""); -}]); - -angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/bar.html", - "
      "); -}]); - -angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/progress.html", - "
      "); -}]); - -angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/progressbar/progressbar.html", - "
      "); -}]); - -angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/rating/rating.html", - "\n" + - " \n" + - ""); -}]); - -angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tab.html", - "
    • \n" + - " {{heading}}\n" + - "
    • \n" + - ""); -}]); - -angular.module("template/tabs/tabset-titles.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tabset-titles.html", - "
        \n" + - "
      \n" + - ""); -}]); - -angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/tabs/tabset.html", - "\n" + - "
      \n" + - "
        \n" + - "
        \n" + - "
        \n" + - "
        \n" + - "
        \n" + - "
        \n" + - ""); -}]); - -angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/timepicker/timepicker.html", - "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "
         
        \n" + - " \n" + - " :\n" + - " \n" + - "
         
        \n" + - ""); -}]); - -angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/typeahead/typeahead-match.html", - ""); -}]); - -angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { - $templateCache.put("template/typeahead/typeahead-popup.html", - "
          \n" + - "
        • \n" + - "
          \n" + - "
        • \n" + - "
        "); -}]); diff --git a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js b/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js deleted file mode 100644 index 0830f35..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap-tpls.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * angular-ui-bootstrap - * http://angular-ui.github.io/bootstrap/ - - * Version: 0.10.0 - 2014-01-13 - * License: MIT - */ -angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/popup.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(this.groups.indexOf(a),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function(a){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(b,c,d,e){var f,g;e.addGroup(b),b.isOpen=!1,d.isOpen&&(f=a(d.isOpen),g=f.assign,b.$parent.$watch(f,function(a){b.isOpen=!!a})),b.$watch("isOpen",function(a){a&&e.closeOthers(b),g&&g(b.$parent,a)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(a,b,c){return function(a,b,d,e){e.setHeading(c(a,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){b.hasClass(e.activeClass)||a.$apply(function(){f.$setViewValue(a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function(a,b,c){function d(){e();var c=+a.interval;!isNaN(c)&&c>=0&&(g=b(f,c))}function e(){g&&(b.cancel(g),g=null)}function f(){h?(a.next(),d()):a.pause()}var g,h,i=this,j=i.slides=[],k=-1;i.currentSlide=null;var l=!1;i.select=function(e,f){function g(){if(!l){if(i.currentSlide&&angular.isString(f)&&!a.noTransition&&e.$element){e.$element.addClass(f);{e.$element[0].offsetWidth}angular.forEach(j,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(e,{direction:f,active:!0,entering:!0}),angular.extend(i.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=c(e.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(e,i.currentSlide)}else h(e,i.currentSlide);i.currentSlide=e,k=m,d()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var m=j.indexOf(e);void 0===f&&(f=m>k?"next":"prev"),e&&e!==i.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){l=!0}),i.indexOfSlide=function(a){return j.indexOf(a)},a.next=function(){var b=(k+1)%j.length;return a.$currentTransition?void 0:i.select(j[b],"next")},a.prev=function(){var b=0>k-1?j.length-1:k-1;return a.$currentTransition?void 0:i.select(j[b],"prev")},a.select=function(a){i.select(a)},a.isActive=function(a){return i.currentSlide===a},a.slides=function(){return j},a.$watch("interval",d),a.$on("$destroy",e),a.play=function(){h||(h=!0,d())},a.pause=function(){a.noPause||(h=!1,e())},i.addSlide=function(b,c){b.$element=c,j.push(b),1===j.length||b.active?(i.select(j[j.length-1]),1==j.length&&a.play()):b.active=!1},i.removeSlide=function(a){var b=j.indexOf(a);j.splice(b,1),j.length>0&&a.active?b>=j.length?i.select(j[b-1]):i.select(j[b]):k>b&&k--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function(a){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(b,c,d,e){if(d.active){var f=a(d.active),g=f.assign,h=b.active=f(b.$parent);b.$watch(function(){var a=f(b.$parent);return a!==b.active&&(a!==h?h=b.active=a:g(b.$parent,a=h=b.active)),a})}e.addSlide(b,c),b.$on("$destroy",function(){e.removeSlide(b)}),b.$watch("active",function(a){a&&e.select(b)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].body.scrollTop||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].body.scrollLeft||a[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function(a,b,c,d){function e(b,c){return angular.isDefined(b)?a.$parent.$eval(b):c}function f(a,b){return new Date(a,b,0).getDate()}function g(a,b){for(var c=new Array(b),d=a,e=0;b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a,b,d,e){return{date:a,label:c(a,b),selected:!!d,secondary:!!e}}var i={day:e(b.dayFormat,d.dayFormat),month:e(b.monthFormat,d.monthFormat),year:e(b.yearFormat,d.yearFormat),dayHeader:e(b.dayHeaderFormat,d.dayHeaderFormat),dayTitle:e(b.dayTitleFormat,d.dayTitleFormat),monthTitle:e(b.monthTitleFormat,d.monthTitleFormat)},j=e(b.startingDay,d.startingDay),k=e(b.yearRange,d.yearRange);this.minDate=d.minDate?new Date(d.minDate):null,this.maxDate=d.maxDate?new Date(d.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(a,b){var d=a.getFullYear(),e=a.getMonth(),k=new Date(d,e,1),l=j-k.getDay(),m=l>0?7-l:-l,n=new Date(k),o=0;m>0&&(n.setDate(-m+1),o+=m),o+=f(d,e+1),o+=(7-o%7)%7;for(var p=g(n,o),q=new Array(7),r=0;o>r;r++){var s=new Date(p[r]);p[r]=h(s,i.day,b&&b.getDate()===s.getDate()&&b.getMonth()===s.getMonth()&&b.getFullYear()===s.getFullYear(),s.getMonth()!==e)}for(var t=0;7>t;t++)q[t]=c(p[t].date,i.dayHeader);return{objects:p,title:c(a,i.dayTitle),labels:q}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(a,b){for(var d=new Array(12),e=a.getFullYear(),f=0;12>f;f++){var g=new Date(e,f,1);d[f]=h(g,i.month,b&&b.getMonth()===f&&b.getFullYear()===e)}return{objects:d,title:c(a,i.monthTitle)}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(a,b){for(var c=new Array(k),d=a.getFullYear(),e=parseInt((d-1)/k,10)*k+1,f=0;k>f;f++){var g=new Date(e+f,0,1);c[f]=h(g,i.year,b&&b.getFullYear()===g.getFullYear())}return{objects:c,title:[c[0].label,c[k-1].label].join(" - ")}},compare:function(a,b){return a.getFullYear()-b.getFullYear()},split:5,step:{years:k}}],this.isDisabled=function(b,c){var d=this.modes[c||0];return this.minDate&&d.compare(b,this.minDate)<0||this.maxDate&&d.compare(b,this.maxDate)>0||a.dateDisabled&&a.dateDisabled({date:b,mode:d.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(a,b,c,d){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,e,f,g){function h(){a.showWeekNumbers=0===o&&q}function i(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}function j(b){var c=null,e=!0;n.$modelValue&&(c=new Date(n.$modelValue),isNaN(c)?(e=!1,d.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):b&&(p=c)),n.$setValidity("date",e);var f=m.modes[o],g=f.getVisibleDates(p,c);angular.forEach(g.objects,function(a){a.disabled=m.isDisabled(a.date,o)}),n.$setValidity("date-disabled",!c||!m.isDisabled(c)),a.rows=i(g.objects,f.split),a.labels=g.labels||[],a.title=g.title}function k(a){o=a,h(),j()}function l(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var m=g[0],n=g[1];if(n){var o=0,p=new Date,q=c.showWeeks;f.showWeeks?a.$parent.$watch(b(f.showWeeks),function(a){q=!!a,h()}):h(),f.min&&a.$parent.$watch(b(f.min),function(a){m.minDate=a?new Date(a):null,j()}),f.max&&a.$parent.$watch(b(f.max),function(a){m.maxDate=a?new Date(a):null,j()}),n.$render=function(){j(!0)},a.select=function(a){if(0===o){var b=n.$modelValue?new Date(n.$modelValue):new Date(0,0,0,0,0,0,0);b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),n.$setViewValue(b),j(!0)}else p=a,k(o-1)},a.move=function(a){var b=m.modes[o].step;p.setMonth(p.getMonth()+a*(b.months||0)),p.setFullYear(p.getFullYear()+a*(b.years||0)),j()},a.toggleMode=function(){k((o+1)%m.modes.length)},a.getWeekNumber=function(b){return 0===o&&a.showWeekNumbers&&7===b.length?l(b[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",link:function(h,i,j,k){function l(a){u?u(h,!!a):q.isOpen=!!a}function m(a){if(a){if(angular.isDate(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=new Date(a);return isNaN(b)?(k.$setValidity("date",!1),void 0):(k.$setValidity("date",!0),b)}return k.$setValidity("date",!1),void 0}return k.$setValidity("date",!0),null}function n(a,c,d){a&&(h.$watch(b(a),function(a){q[c]=a}),y.attr(d||c,c))}function o(){q.position=s?d.offset(i):d.position(i),q.position.top=q.position.top+i.prop("offsetHeight")}var p,q=h.$new(),r=angular.isDefined(j.closeOnDateSelection)?h.$eval(j.closeOnDateSelection):f.closeOnDateSelection,s=angular.isDefined(j.datepickerAppendToBody)?h.$eval(j.datepickerAppendToBody):f.appendToBody;j.$observe("datepickerPopup",function(a){p=a||f.dateFormat,k.$render()}),q.showButtonBar=angular.isDefined(j.showButtonBar)?h.$eval(j.showButtonBar):f.showButtonBar,h.$on("$destroy",function(){C.remove(),q.$destroy()}),j.$observe("currentText",function(a){q.currentText=angular.isDefined(a)?a:f.currentText}),j.$observe("toggleWeeksText",function(a){q.toggleWeeksText=angular.isDefined(a)?a:f.toggleWeeksText}),j.$observe("clearText",function(a){q.clearText=angular.isDefined(a)?a:f.clearText}),j.$observe("closeText",function(a){q.closeText=angular.isDefined(a)?a:f.closeText});var t,u;j.isOpen&&(t=b(j.isOpen),u=t.assign,h.$watch(t,function(a){q.isOpen=!!a})),q.isOpen=t?t(h):!1;var v=function(a){q.isOpen&&a.target!==i[0]&&q.$apply(function(){l(!1)})},w=function(){q.$apply(function(){l(!0)})},x=angular.element("
        ");x.attr({"ng-model":"date","ng-change":"dateSelection()"});var y=angular.element(x.children()[0]),z={};j.datepickerOptions&&(z=h.$eval(j.datepickerOptions),y.attr(angular.extend({},z))),k.$parsers.unshift(m),q.dateSelection=function(a){angular.isDefined(a)&&(q.date=a),k.$setViewValue(q.date),k.$render(),r&&l(!1)},i.bind("input change keyup",function(){q.$apply(function(){q.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,p):"";i.val(a),q.date=k.$modelValue},n(j.min,"min"),n(j.max,"max"),j.showWeeks?n(j.showWeeks,"showWeeks","show-weeks"):(q.showWeeks="show-weeks"in z?z["show-weeks"]:g.showWeeks,y.attr("show-weeks","showWeeks")),j.dateDisabled&&y.attr("date-disabled",j.dateDisabled);var A=!1,B=!1;q.$watch("isOpen",function(a){a?(o(),c.bind("click",v),B&&i.unbind("focus",w),i[0].focus(),A=!0):(A&&c.unbind("click",v),i.bind("focus",w),B=!0),u&&u(h,a)}),q.today=function(){q.dateSelection(new Date)},q.clear=function(){q.dateSelection(null)};var C=a(x)(q);s?c.find("body").append(C):i.after(C)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function(a){var b=null,c=angular.noop;return{restrict:"CA",link:function(d,e){d.$watch("$location.path",function(){c()}),e.parent().bind("click",function(){c()}),e.bind("click",function(d){var f=e===b;d.preventDefault(),d.stopPropagation(),b&&c(),f||e.hasClass("disabled")||e.prop("disabled")||(e.parent().addClass("open"),b=e,c=function(d){d&&(d.preventDefault(),d.stopPropagation()),a.unbind("click",c),e.parent().removeClass("open"),c=angular.noop,b=null},a.bind("click",c))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0)}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g,0)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&e.$apply(function(){o.dismiss(b.key)}))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();h>=0&&!k&&(l=e.$new(!0),l.index=h,k=d("
        ")(l),f.append(k));var i=angular.element("
        ");i.attr("window-class",b.windowClass),i.attr("index",n.length()-1),i.attr("animate","animate"),i.html(b.content);var j=d(i)(b.scope);n.top().value.modalDomEl=j,f.append(j),f.addClass(m)},o.close=function(a,b){var c=n.get(a).value;c&&(c.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a).value;c&&(c.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function(a,b,c,d){var e=this,f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(d){b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){e.itemsPerPage=parseInt(b,10),a.totalPages=e.calculateTotalPages()}):this.itemsPerPage=d},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===a.totalPages},this.isActive=function(a){return this.page===a},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.getAttributeValue=function(b,c,e){return angular.isDefined(b)?e?d(b)(a.$parent):a.$parent.$eval(b):c},this.render=function(){this.page=parseInt(a.page,10)||1,this.page>0&&this.page<=a.totalPages&&(a.pages=this.getPages(this.page,a.totalPages))},a.selectPage=function(b){!e.isActive(b)&&b>0&&b<=a.totalPages&&(a.page=b,a.onSelectPage({page:b}))},a.$watch("page",function(){e.render()}),a.$watch("totalItems",function(){a.totalPages=e.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),e.page>b?a.selectPage(b):e.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c,d){return{number:a,text:b,active:c,disabled:d}}var h,i=f.getAttributeValue(e.boundaryLinks,b.boundaryLinks),j=f.getAttributeValue(e.directionLinks,b.directionLinks),k=f.getAttributeValue(e.firstText,b.firstText,!0),l=f.getAttributeValue(e.previousText,b.previousText,!0),m=f.getAttributeValue(e.nextText,b.nextText,!0),n=f.getAttributeValue(e.lastText,b.lastText,!0),o=f.getAttributeValue(e.rotate,b.rotate);f.init(b.itemsPerPage),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){h=parseInt(a,10),f.render()}),f.getPages=function(a,b){var c=[],d=1,e=b,p=angular.isDefined(h)&&b>h;p&&(o?(d=Math.max(a-Math.floor(h/2),1),e=d+h-1,e>b&&(e=b,d=e-h+1)):(d=(Math.ceil(a/h)-1)*h+1,e=Math.min(d+h-1,b)));for(var q=d;e>=q;q++){var r=g(q,q,f.isActive(q),!1);c.push(r)}if(p&&!o){if(d>1){var s=g(d-1,"...",!1,!1);c.unshift(s)}if(b>e){var t=g(e+1,"...",!1,!1);c.push(t)}}if(j){var u=g(a-1,l,!1,f.noPrevious());c.unshift(u);var v=g(a+1,m,!1,f.noNext());c.push(v)}if(i){var w=g(1,k,!1,f.noPrevious());c.unshift(w);var x=g(b,n,!1,f.noNext());c.push(x)}return c}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){function f(a,b,c,d,e){return{number:a,text:b,disabled:c,previous:i&&d,next:i&&e}}var g=e.getAttributeValue(d.previousText,a.previousText,!0),h=e.getAttributeValue(d.nextText,a.nextText,!0),i=e.getAttributeValue(d.align,a.align);e.init(a.itemsPerPage),e.getPages=function(a){return[f(a-1,g,e.noPrevious(),!0,!1),f(a+1,h,e.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function(e,f,g,h,i,j,k){return function(e,l,m){function n(a){var b=a||o.trigger||m,d=c[b]||b;return{show:b,hide:d}}var o=angular.extend({},b,d),p=a(e),q=k.startSymbol(),r=k.endSymbol(),s="
        ';return{restrict:"EA",scope:!0,compile:function(){var a=f(s);return function(b,c,d){function f(){b.tt_isOpen?m():k()}function k(){(!z||b.$eval(d[l+"Enable"]))&&(b.tt_popupDelay?(v=g(p,b.tt_popupDelay,!1),v.then(function(a){a()})):p()())}function m(){b.$apply(function(){q()})}function p(){return b.tt_content?(r(),u&&g.cancel(u),t.css({top:0,left:0,display:"block"}),w?i.find("body").append(t):c.after(t),A(),b.tt_isOpen=!0,b.$digest(),A):angular.noop}function q(){b.tt_isOpen=!1,g.cancel(v),b.tt_animation?u=g(s,500):s()}function r(){t&&s(),t=a(b,function(){}),b.$digest()}function s(){t&&(t.remove(),t=null)}var t,u,v,w=angular.isDefined(o.appendToBody)?o.appendToBody:!1,x=n(void 0),y=!1,z=angular.isDefined(d[l+"Enable"]),A=function(){var a,d,e,f;switch(a=w?j.offset(c):j.position(c),d=t.prop("offsetWidth"),e=t.prop("offsetHeight"),b.tt_placement){case"right":f={top:a.top+a.height/2-e/2,left:a.left+a.width};break;case"bottom":f={top:a.top+a.height,left:a.left+a.width/2-d/2};break;case"left":f={top:a.top+a.height/2-e/2,left:a.left-d};break;default:f={top:a.top-e,left:a.left+a.width/2-d/2}}f.top+="px",f.left+="px",t.css(f)};b.tt_isOpen=!1,d.$observe(e,function(a){b.tt_content=a,!a&&b.tt_isOpen&&q()}),d.$observe(l+"Title",function(a){b.tt_title=a}),d.$observe(l+"Placement",function(a){b.tt_placement=angular.isDefined(a)?a:o.placement}),d.$observe(l+"PopupDelay",function(a){var c=parseInt(a,10);b.tt_popupDelay=isNaN(c)?o.popupDelay:c});var B=function(){y&&(c.unbind(x.show,k),c.unbind(x.hide,m))};d.$observe(l+"Trigger",function(a){B(),x=n(a),x.show===x.hide?c.bind(x.show,f):(c.bind(x.show,k),c.bind(x.hide,m)),y=!0});var C=b.$eval(d[l+"Animation"]);b.tt_animation=angular.isDefined(C)?!!C:o.animation,d.$observe(l+"AppendToBody",function(a){w=angular.isDefined(a)?h(a)(b):w}),w&&b.$on("$locationChangeSuccess",function(){b.tt_isOpen&&q()}),b.$on("$destroy",function(){g.cancel(u),g.cancel(v),B(),s()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function(a,b,c,d){var e=this,f=[],g=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,h=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.addBar=function(a,b){var c=0,d=a.$parent.$index;angular.isDefined(d)&&f[d]&&(c=f[d].value),f.push(a),this.update(b,a.value,c),a.$watch("value",function(a,c){a!==c&&e.update(b,a,c)}),a.$on("$destroy",function(){e.removeBar(a)})},this.update=function(a,b,c){var e=this.getPercentage(b);h?(a.css("width",this.getPercentage(c)+"%"),d(a,{width:e+"%"})):a.css({transition:"none",width:e+"%"})},this.removeBar=function(a){f.splice(f.indexOf(a),1)},this.getPercentage=function(a){return Math.round(100*a/g)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
        '}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function(a,b,c,d){this.maxRange=angular.isDefined(b.max)?a.$parent.$eval(b.max):d.max,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):d.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):d.stateOff,this.createRateObjects=function(a){for(var b={stateOn:this.stateOn,stateOff:this.stateOff},c=0,d=a.length;d>c;c++)a[c]=angular.extend({index:c},b,a[c]);return a},a.range=angular.isDefined(b.ratingStates)?this.createRateObjects(angular.copy(a.$parent.$eval(b.ratingStates))):this.createRateObjects(new Array(this.maxRange)),a.rate=function(b){a.value===b||a.readonly||(a.value=b) -},a.enter=function(b){a.readonly||(a.val=b),a.onHover({value:b})},a.reset=function(){a.val=angular.copy(a.value),a.onLeave()},a.$watch("value",function(b){a.val=b}),a.readonly=!1,b.readonly&&a.$parent.$watch(c(b.readonly),function(b){a.readonly=!!b})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(a){a.active=!1}),a.active=!0},b.addTab=function(a){c.push(a),(1===c.length||a.active)&&b.select(a)},b.removeTab=function(a){var d=c.indexOf(a);if(a.active&&c.length>1){var e=d==c.length-1?d-1:d+1;b.select(c[e])}c.splice(d,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1,a.type=angular.isDefined(c.type)?a.$parent.$eval(c.type):"tabs"}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){var g,h;e.active?(g=a(e.active),h=g.assign,b.$parent.$watch(g,function(a,c){a!==c&&(b.active=!!a)}),b.active=g(b.$parent)):h=g=angular.noop,b.$watch("active",function(a){h(b.$parent,a),a?(f.select(b),b.onSelect()):b.onDeselect()}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function(a,b,c,d){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(e,f,g,h){function i(){var a=parseInt(e.hours,10),b=e.showMeridian?a>0&&13>a:a>=0&&24>a;return b?(e.showMeridian&&(12===a&&(a=0),e.meridian===q[1]&&(a+=12)),a):void 0}function j(){var a=parseInt(e.minutes,10);return a>=0&&60>a?a:void 0}function k(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function l(a){m(),h.$setViewValue(new Date(p)),n(a)}function m(){h.$setValidity("time",!0),e.invalidHours=!1,e.invalidMinutes=!1}function n(a){var b=p.getHours(),c=p.getMinutes();e.showMeridian&&(b=0===b||12===b?12:b%12),e.hours="h"===a?b:k(b),e.minutes="m"===a?c:k(c),e.meridian=p.getHours()<12?q[0]:q[1]}function o(a){var b=new Date(p.getTime()+6e4*a);p.setHours(b.getHours(),b.getMinutes()),l()}if(h){var p=new Date,q=angular.isDefined(g.meridians)?e.$parent.$eval(g.meridians):c.meridians||d.DATETIME_FORMATS.AMPMS,r=c.hourStep;g.hourStep&&e.$parent.$watch(a(g.hourStep),function(a){r=parseInt(a,10)});var s=c.minuteStep;g.minuteStep&&e.$parent.$watch(a(g.minuteStep),function(a){s=parseInt(a,10)}),e.showMeridian=c.showMeridian,g.showMeridian&&e.$parent.$watch(a(g.showMeridian),function(a){if(e.showMeridian=!!a,h.$error.time){var b=i(),c=j();angular.isDefined(b)&&angular.isDefined(c)&&(p.setHours(b),l())}else n()});var t=f.find("input"),u=t.eq(0),v=t.eq(1),w=angular.isDefined(g.mousewheel)?e.$eval(g.mousewheel):c.mousewheel;if(w){var x=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};u.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementHours():e.decrementHours()),a.preventDefault()}),v.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementMinutes():e.decrementMinutes()),a.preventDefault()})}if(e.readonlyInput=angular.isDefined(g.readonlyInput)?e.$eval(g.readonlyInput):c.readonlyInput,e.readonlyInput)e.updateHours=angular.noop,e.updateMinutes=angular.noop;else{var y=function(a,b){h.$setViewValue(null),h.$setValidity("time",!1),angular.isDefined(a)&&(e.invalidHours=a),angular.isDefined(b)&&(e.invalidMinutes=b)};e.updateHours=function(){var a=i();angular.isDefined(a)?(p.setHours(a),l("h")):y(!0)},u.bind("blur",function(){!e.validHours&&e.hours<10&&e.$apply(function(){e.hours=k(e.hours)})}),e.updateMinutes=function(){var a=j();angular.isDefined(a)?(p.setMinutes(a),l("m")):y(void 0,!0)},v.bind("blur",function(){!e.invalidMinutes&&e.minutes<10&&e.$apply(function(){e.minutes=k(e.minutes)})})}h.$render=function(){var a=h.$modelValue?new Date(h.$modelValue):null;isNaN(a)?(h.$setValidity("time",!1),b.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(p=a),m(),n())},e.incrementHours=function(){o(60*r)},e.decrementHours=function(){o(60*-r)},e.incrementMinutes=function(){o(s)},e.decrementMinutes=function(){o(-s)},e.toggleMeridian=function(){o(720*(p.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+c+"'.");return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?b(k.typeaheadAppendToBody):!1,u=b(k.ngModel).assign,v=g.parse(k.typeahead),w=angular.element("
        ");w.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&w.attr("template-url",k.typeaheadTemplateUrl);var x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y=function(){x.matches=[],x.activeIdx=-1},z=function(a){var b={$viewValue:a};q(i,!0),c.when(v.source(i,b)).then(function(c){if(a===l.$viewValue&&m){if(c.length>0){x.activeIdx=0,x.matches.length=0;for(var d=0;d=n?o>0?(A&&d.cancel(A),A=d(function(){z(a)},o)):z(a):(q(i,!1),y()),p?a:a?(l.$setValidity("editable",!1),void 0):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[v.itemName]=a,b=v.viewMapper(i,d),d[v.itemName]=void 0,c=v.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,d={};d[v.itemName]=c=x.matches[a].model,b=v.modelMapper(i,d),u(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:v.viewMapper(i,d)}),y(),j[0].focus()},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),y(),x.$digest()))}),j.bind("blur",function(){m=!1});var B=function(a){j[0]!==a.target&&(y(),x.$digest())};e.bind("click",B),i.$on("$destroy",function(){e.unbind("click",B)});var C=a(w)(x);t?e.find("body").append(C):j.after(C)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?b.replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
        \n
        \n

        \n {{heading}}\n

        \n
        \n
        \n
        \n
        \n
        ')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
        ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html","
        \n \n
        \n
        \n")}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","
        \n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
        #{{label}}
        {{ getWeekNumber(row) }}\n \n
        \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html","
          \n
        • \n"+'
        • \n \n \n \n \n \n \n
        • \n
        \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
        \n
        \n
        \n
        \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
        \n
        \n
        \n
        \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
        \n
        \n\n
        \n

        \n
        \n
        \n
        \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
        ')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
        ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
        ')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
      • \n {{heading}}\n
      • \n')}]),angular.module("template/tabs/tabset-titles.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset-titles.html","
          \n
        \n")}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'\n
        \n \n
        \n
        \n
        \n
        \n
        \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
         
        \n \n :\n \n
         
        \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html","
          \n"+'
        • \n
          \n
        • \n
        ')}]); \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.js b/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.js deleted file mode 100644 index deda5d0..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.js +++ /dev/null @@ -1,3427 +0,0 @@ -/* - * angular-ui-bootstrap - * http://angular-ui.github.io/bootstrap/ - - * Version: 0.10.0 - 2014-01-13 - * License: MIT - */ -angular.module("ui.bootstrap", ["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); -angular.module('ui.bootstrap.transition', []) - -/** - * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. - * @param {DOMElement} element The DOMElement that will be animated. - * @param {string|object|function} trigger The thing that will cause the transition to start: - * - As a string, it represents the css class to be added to the element. - * - As an object, it represents a hash of style attributes to be applied to the element. - * - As a function, it represents a function to be called that will cause the transition to occur. - * @return {Promise} A promise that is resolved when the transition finishes. - */ -.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { - - var $transition = function(element, trigger, options) { - options = options || {}; - var deferred = $q.defer(); - var endEventName = $transition[options.animation ? "animationEndEventName" : "transitionEndEventName"]; - - var transitionEndHandler = function(event) { - $rootScope.$apply(function() { - element.unbind(endEventName, transitionEndHandler); - deferred.resolve(element); - }); - }; - - if (endEventName) { - element.bind(endEventName, transitionEndHandler); - } - - // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur - $timeout(function() { - if ( angular.isString(trigger) ) { - element.addClass(trigger); - } else if ( angular.isFunction(trigger) ) { - trigger(element); - } else if ( angular.isObject(trigger) ) { - element.css(trigger); - } - //If browser does not support transitions, instantly resolve - if ( !endEventName ) { - deferred.resolve(element); - } - }); - - // Add our custom cancel function to the promise that is returned - // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, - // i.e. it will therefore never raise a transitionEnd event for that transition - deferred.promise.cancel = function() { - if ( endEventName ) { - element.unbind(endEventName, transitionEndHandler); - } - deferred.reject('Transition cancelled'); - }; - - return deferred.promise; - }; - - // Work out the name of the transitionEnd event - var transElement = document.createElement('trans'); - var transitionEndEventNames = { - 'WebkitTransition': 'webkitTransitionEnd', - 'MozTransition': 'transitionend', - 'OTransition': 'oTransitionEnd', - 'transition': 'transitionend' - }; - var animationEndEventNames = { - 'WebkitTransition': 'webkitAnimationEnd', - 'MozTransition': 'animationend', - 'OTransition': 'oAnimationEnd', - 'transition': 'animationend' - }; - function findEndEventName(endEventNames) { - for (var name in endEventNames){ - if (transElement.style[name] !== undefined) { - return endEventNames[name]; - } - } - } - $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); - $transition.animationEndEventName = findEndEventName(animationEndEventNames); - return $transition; -}]); - -angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) - - .directive('collapse', ['$transition', function ($transition, $timeout) { - - return { - link: function (scope, element, attrs) { - - var initialAnimSkip = true; - var currentTransition; - - function doTransition(change) { - var newTransition = $transition(element, change); - if (currentTransition) { - currentTransition.cancel(); - } - currentTransition = newTransition; - newTransition.then(newTransitionDone, newTransitionDone); - return newTransition; - - function newTransitionDone() { - // Make sure it's this transition, otherwise, leave it alone. - if (currentTransition === newTransition) { - currentTransition = undefined; - } - } - } - - function expand() { - if (initialAnimSkip) { - initialAnimSkip = false; - expandDone(); - } else { - element.removeClass('collapse').addClass('collapsing'); - doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); - } - } - - function expandDone() { - element.removeClass('collapsing'); - element.addClass('collapse in'); - element.css({height: 'auto'}); - } - - function collapse() { - if (initialAnimSkip) { - initialAnimSkip = false; - collapseDone(); - element.css({height: 0}); - } else { - // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value - element.css({ height: element[0].scrollHeight + 'px' }); - //trigger reflow so a browser realizes that height was updated from auto to a specific value - var x = element[0].offsetWidth; - - element.removeClass('collapse in').addClass('collapsing'); - - doTransition({ height: 0 }).then(collapseDone); - } - } - - function collapseDone() { - element.removeClass('collapsing'); - element.addClass('collapse'); - } - - scope.$watch(attrs.collapse, function (shouldCollapse) { - if (shouldCollapse) { - collapse(); - } else { - expand(); - } - }); - } - }; - }]); - -angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) - -.constant('accordionConfig', { - closeOthers: true -}) - -.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { - - // This array keeps track of the accordion groups - this.groups = []; - - // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to - this.closeOthers = function(openGroup) { - var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; - if ( closeOthers ) { - angular.forEach(this.groups, function (group) { - if ( group !== openGroup ) { - group.isOpen = false; - } - }); - } - }; - - // This is called from the accordion-group directive to add itself to the accordion - this.addGroup = function(groupScope) { - var that = this; - this.groups.push(groupScope); - - groupScope.$on('$destroy', function (event) { - that.removeGroup(groupScope); - }); - }; - - // This is called from the accordion-group directive when to remove itself - this.removeGroup = function(group) { - var index = this.groups.indexOf(group); - if ( index !== -1 ) { - this.groups.splice(this.groups.indexOf(group), 1); - } - }; - -}]) - -// The accordion directive simply sets up the directive controller -// and adds an accordion CSS class to itself element. -.directive('accordion', function () { - return { - restrict:'EA', - controller:'AccordionController', - transclude: true, - replace: false, - templateUrl: 'template/accordion/accordion.html' - }; -}) - -// The accordion-group directive indicates a block of html that will expand and collapse in an accordion -.directive('accordionGroup', ['$parse', function($parse) { - return { - require:'^accordion', // We need this directive to be inside an accordion - restrict:'EA', - transclude:true, // It transcludes the contents of the directive into the template - replace: true, // The element containing the directive will be replaced with the template - templateUrl:'template/accordion/accordion-group.html', - scope:{ heading:'@' }, // Create an isolated scope and interpolate the heading attribute onto this scope - controller: function() { - this.setHeading = function(element) { - this.heading = element; - }; - }, - link: function(scope, element, attrs, accordionCtrl) { - var getIsOpen, setIsOpen; - - accordionCtrl.addGroup(scope); - - scope.isOpen = false; - - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - scope.$parent.$watch(getIsOpen, function(value) { - scope.isOpen = !!value; - }); - } - - scope.$watch('isOpen', function(value) { - if ( value ) { - accordionCtrl.closeOthers(scope); - } - if ( setIsOpen ) { - setIsOpen(scope.$parent, value); - } - }); - } - }; -}]) - -// Use accordion-heading below an accordion-group to provide a heading containing HTML -// -// Heading containing HTML - -// -.directive('accordionHeading', function() { - return { - restrict: 'EA', - transclude: true, // Grab the contents to be used as the heading - template: '', // In effect remove this element! - replace: true, - require: '^accordionGroup', - compile: function(element, attr, transclude) { - return function link(scope, element, attr, accordionGroupCtrl) { - // Pass the heading to the accordion-group controller - // so that it can be transcluded into the right place in the template - // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] - accordionGroupCtrl.setHeading(transclude(scope, function() {})); - }; - } - }; -}) - -// Use in the accordion-group template to indicate where you want the heading to be transcluded -// You must provide the property on the accordion-group controller that will hold the transcluded element -//
        -// -// ... -//
        -.directive('accordionTransclude', function() { - return { - require: '^accordionGroup', - link: function(scope, element, attr, controller) { - scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { - if ( heading ) { - element.html(''); - element.append(heading); - } - }); - } - }; -}); - -angular.module("ui.bootstrap.alert", []) - -.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { - $scope.closeable = 'close' in $attrs; -}]) - -.directive('alert', function () { - return { - restrict:'EA', - controller:'AlertController', - templateUrl:'template/alert/alert.html', - transclude:true, - replace:true, - scope: { - type: '=', - close: '&' - } - }; -}); - -angular.module('ui.bootstrap.bindHtml', []) - - .directive('bindHtmlUnsafe', function () { - return function (scope, element, attr) { - element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); - scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { - element.html(value || ''); - }); - }; - }); -angular.module('ui.bootstrap.buttons', []) - -.constant('buttonConfig', { - activeClass: 'active', - toggleEvent: 'click' -}) - -.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { - this.activeClass = buttonConfig.activeClass || 'active'; - this.toggleEvent = buttonConfig.toggleEvent || 'click'; -}]) - -.directive('btnRadio', function () { - return { - require: ['btnRadio', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - if (!element.hasClass(buttonsCtrl.activeClass)) { - scope.$apply(function () { - ngModelCtrl.$setViewValue(scope.$eval(attrs.btnRadio)); - ngModelCtrl.$render(); - }); - } - }); - } - }; -}) - -.directive('btnCheckbox', function () { - return { - require: ['btnCheckbox', 'ngModel'], - controller: 'ButtonsController', - link: function (scope, element, attrs, ctrls) { - var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; - - function getTrueValue() { - return getCheckboxValue(attrs.btnCheckboxTrue, true); - } - - function getFalseValue() { - return getCheckboxValue(attrs.btnCheckboxFalse, false); - } - - function getCheckboxValue(attributeValue, defaultValue) { - var val = scope.$eval(attributeValue); - return angular.isDefined(val) ? val : defaultValue; - } - - //model -> UI - ngModelCtrl.$render = function () { - element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); - }; - - //ui->model - element.bind(buttonsCtrl.toggleEvent, function () { - scope.$apply(function () { - ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); - ngModelCtrl.$render(); - }); - }); - } - }; -}); - -/** -* @ngdoc overview -* @name ui.bootstrap.carousel -* -* @description -* AngularJS version of an image carousel. -* -*/ -angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) -.controller('CarouselController', ['$scope', '$timeout', '$transition', '$q', function ($scope, $timeout, $transition, $q) { - var self = this, - slides = self.slides = [], - currentIndex = -1, - currentTimeout, isPlaying; - self.currentSlide = null; - - var destroyed = false; - /* direction: "prev" or "next" */ - self.select = function(nextSlide, direction) { - var nextIndex = slides.indexOf(nextSlide); - //Decide direction if it's not given - if (direction === undefined) { - direction = nextIndex > currentIndex ? "next" : "prev"; - } - if (nextSlide && nextSlide !== self.currentSlide) { - if ($scope.$currentTransition) { - $scope.$currentTransition.cancel(); - //Timeout so ng-class in template has time to fix classes for finished slide - $timeout(goNext); - } else { - goNext(); - } - } - function goNext() { - // Scope has been destroyed, stop here. - if (destroyed) { return; } - //If we have a slide to transition from and we have a transition type and we're allowed, go - if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { - //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime - nextSlide.$element.addClass(direction); - var reflow = nextSlide.$element[0].offsetWidth; //force reflow - - //Set all other slides to stop doing their stuff for the new transition - angular.forEach(slides, function(slide) { - angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); - }); - angular.extend(nextSlide, {direction: direction, active: true, entering: true}); - angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); - - $scope.$currentTransition = $transition(nextSlide.$element, {}); - //We have to create new pointers inside a closure since next & current will change - (function(next,current) { - $scope.$currentTransition.then( - function(){ transitionDone(next, current); }, - function(){ transitionDone(next, current); } - ); - }(nextSlide, self.currentSlide)); - } else { - transitionDone(nextSlide, self.currentSlide); - } - self.currentSlide = nextSlide; - currentIndex = nextIndex; - //every time you change slides, reset the timer - restartTimer(); - } - function transitionDone(next, current) { - angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); - angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); - $scope.$currentTransition = null; - } - }; - $scope.$on('$destroy', function () { - destroyed = true; - }); - - /* Allow outside people to call indexOf on slides array */ - self.indexOfSlide = function(slide) { - return slides.indexOf(slide); - }; - - $scope.next = function() { - var newIndex = (currentIndex + 1) % slides.length; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'next'); - } - }; - - $scope.prev = function() { - var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; - - //Prevent this user-triggered transition from occurring if there is already one in progress - if (!$scope.$currentTransition) { - return self.select(slides[newIndex], 'prev'); - } - }; - - $scope.select = function(slide) { - self.select(slide); - }; - - $scope.isActive = function(slide) { - return self.currentSlide === slide; - }; - - $scope.slides = function() { - return slides; - }; - - $scope.$watch('interval', restartTimer); - $scope.$on('$destroy', resetTimer); - - function restartTimer() { - resetTimer(); - var interval = +$scope.interval; - if (!isNaN(interval) && interval>=0) { - currentTimeout = $timeout(timerFn, interval); - } - } - - function resetTimer() { - if (currentTimeout) { - $timeout.cancel(currentTimeout); - currentTimeout = null; - } - } - - function timerFn() { - if (isPlaying) { - $scope.next(); - restartTimer(); - } else { - $scope.pause(); - } - } - - $scope.play = function() { - if (!isPlaying) { - isPlaying = true; - restartTimer(); - } - }; - $scope.pause = function() { - if (!$scope.noPause) { - isPlaying = false; - resetTimer(); - } - }; - - self.addSlide = function(slide, element) { - slide.$element = element; - slides.push(slide); - //if this is the first slide or the slide is set to active, select it - if(slides.length === 1 || slide.active) { - self.select(slides[slides.length-1]); - if (slides.length == 1) { - $scope.play(); - } - } else { - slide.active = false; - } - }; - - self.removeSlide = function(slide) { - //get the index of the slide inside the carousel - var index = slides.indexOf(slide); - slides.splice(index, 1); - if (slides.length > 0 && slide.active) { - if (index >= slides.length) { - self.select(slides[index-1]); - } else { - self.select(slides[index]); - } - } else if (currentIndex > index) { - currentIndex--; - } - }; - -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:carousel - * @restrict EA - * - * @description - * Carousel is the outer container for a set of image 'slides' to showcase. - * - * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. - * @param {boolean=} noTransition Whether to disable transitions on the carousel. - * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). - * - * @example - - - - - - - - - - - - - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - - - */ -.directive('carousel', [function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - controller: 'CarouselController', - require: 'carousel', - templateUrl: 'template/carousel/carousel.html', - scope: { - interval: '=', - noTransition: '=', - noPause: '=' - } - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.carousel.directive:slide - * @restrict EA - * - * @description - * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. - * - * @param {boolean=} active Model binding, whether or not this slide is currently active. - * - * @example - - -
        - - - - - - -
        -
        -
          -
        • - - {{$index}}: {{slide.text}} -
        • -
        - Add Slide -
        -
        - Interval, in milliseconds: -
        Enter a negative number to stop the interval. -
        -
        -
        -
        - -function CarouselDemoCtrl($scope) { - $scope.myInterval = 5000; - var slides = $scope.slides = []; - $scope.addSlide = function() { - var newWidth = 200 + ((slides.length + (25 * slides.length)) % 150); - slides.push({ - image: 'http://placekitten.com/' + newWidth + '/200', - text: ['More','Extra','Lots of','Surplus'][slides.length % 4] + ' ' - ['Cats', 'Kittys', 'Felines', 'Cutes'][slides.length % 4] - }); - }; - for (var i=0; i<4; i++) $scope.addSlide(); -} - - - .carousel-indicators { - top: auto; - bottom: 15px; - } - -
        -*/ - -.directive('slide', ['$parse', function($parse) { - return { - require: '^carousel', - restrict: 'EA', - transclude: true, - replace: true, - templateUrl: 'template/carousel/slide.html', - scope: { - }, - link: function (scope, element, attrs, carouselCtrl) { - //Set up optional 'active' = binding - if (attrs.active) { - var getActive = $parse(attrs.active); - var setActive = getActive.assign; - var lastValue = scope.active = getActive(scope.$parent); - scope.$watch(function parentActiveWatch() { - var parentActive = getActive(scope.$parent); - - if (parentActive !== scope.active) { - // we are out of sync and need to copy - if (parentActive !== lastValue) { - // parent changed and it has precedence - lastValue = scope.active = parentActive; - } else { - // if the parent can be assigned then do so - setActive(scope.$parent, parentActive = lastValue = scope.active); - } - } - return parentActive; - }); - } - - carouselCtrl.addSlide(scope, element); - //when the scope is destroyed then remove the slide from the current slides array - scope.$on('$destroy', function() { - carouselCtrl.removeSlide(scope); - }); - - scope.$watch('active', function(active) { - if (active) { - carouselCtrl.select(scope); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.position', []) - -/** - * A set of utility methods that can be use to retrieve position of DOM elements. - * It is meant to be used where we need to absolute-position DOM elements in - * relation to other, existing elements (this is the case for tooltips, popovers, - * typeahead suggestions etc.). - */ - .factory('$position', ['$document', '$window', function ($document, $window) { - - function getStyle(el, cssprop) { - if (el.currentStyle) { //IE - return el.currentStyle[cssprop]; - } else if ($window.getComputedStyle) { - return $window.getComputedStyle(el)[cssprop]; - } - // finally try and get inline style - return el.style[cssprop]; - } - - /** - * Checks if a given element is statically positioned - * @param element - raw DOM element - */ - function isStaticPositioned(element) { - return (getStyle(element, "position") || 'static' ) === 'static'; - } - - /** - * returns the closest, non-statically positioned parentOffset of a given element - * @param element - */ - var parentOffsetEl = function (element) { - var docDomEl = $document[0]; - var offsetParent = element.offsetParent || docDomEl; - while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || docDomEl; - }; - - return { - /** - * Provides read-only equivalent of jQuery's position function: - * http://api.jquery.com/position/ - */ - position: function (element) { - var elBCR = this.offset(element); - var offsetParentBCR = { top: 0, left: 0 }; - var offsetParentEl = parentOffsetEl(element[0]); - if (offsetParentEl != $document[0]) { - offsetParentBCR = this.offset(angular.element(offsetParentEl)); - offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; - offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; - } - - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: elBCR.top - offsetParentBCR.top, - left: elBCR.left - offsetParentBCR.left - }; - }, - - /** - * Provides read-only equivalent of jQuery's offset function: - * http://api.jquery.com/offset/ - */ - offset: function (element) { - var boundingClientRect = element[0].getBoundingClientRect(); - return { - width: boundingClientRect.width || element.prop('offsetWidth'), - height: boundingClientRect.height || element.prop('offsetHeight'), - top: boundingClientRect.top + ($window.pageYOffset || $document[0].body.scrollTop || $document[0].documentElement.scrollTop), - left: boundingClientRect.left + ($window.pageXOffset || $document[0].body.scrollLeft || $document[0].documentElement.scrollLeft) - }; - } - }; - }]); - -angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.position']) - -.constant('datepickerConfig', { - dayFormat: 'dd', - monthFormat: 'MMMM', - yearFormat: 'yyyy', - dayHeaderFormat: 'EEE', - dayTitleFormat: 'MMMM yyyy', - monthTitleFormat: 'yyyy', - showWeeks: true, - startingDay: 0, - yearRange: 20, - minDate: null, - maxDate: null -}) - -.controller('DatepickerController', ['$scope', '$attrs', 'dateFilter', 'datepickerConfig', function($scope, $attrs, dateFilter, dtConfig) { - var format = { - day: getValue($attrs.dayFormat, dtConfig.dayFormat), - month: getValue($attrs.monthFormat, dtConfig.monthFormat), - year: getValue($attrs.yearFormat, dtConfig.yearFormat), - dayHeader: getValue($attrs.dayHeaderFormat, dtConfig.dayHeaderFormat), - dayTitle: getValue($attrs.dayTitleFormat, dtConfig.dayTitleFormat), - monthTitle: getValue($attrs.monthTitleFormat, dtConfig.monthTitleFormat) - }, - startingDay = getValue($attrs.startingDay, dtConfig.startingDay), - yearRange = getValue($attrs.yearRange, dtConfig.yearRange); - - this.minDate = dtConfig.minDate ? new Date(dtConfig.minDate) : null; - this.maxDate = dtConfig.maxDate ? new Date(dtConfig.maxDate) : null; - - function getValue(value, defaultValue) { - return angular.isDefined(value) ? $scope.$parent.$eval(value) : defaultValue; - } - - function getDaysInMonth( year, month ) { - return new Date(year, month, 0).getDate(); - } - - function getDates(startDate, n) { - var dates = new Array(n); - var current = startDate, i = 0; - while (i < n) { - dates[i++] = new Date(current); - current.setDate( current.getDate() + 1 ); - } - return dates; - } - - function makeDate(date, format, isSelected, isSecondary) { - return { date: date, label: dateFilter(date, format), selected: !!isSelected, secondary: !!isSecondary }; - } - - this.modes = [ - { - name: 'day', - getVisibleDates: function(date, selected) { - var year = date.getFullYear(), month = date.getMonth(), firstDayOfMonth = new Date(year, month, 1); - var difference = startingDay - firstDayOfMonth.getDay(), - numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, - firstDate = new Date(firstDayOfMonth), numDates = 0; - - if ( numDisplayedFromPreviousMonth > 0 ) { - firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); - numDates += numDisplayedFromPreviousMonth; // Previous - } - numDates += getDaysInMonth(year, month + 1); // Current - numDates += (7 - numDates % 7) % 7; // Next - - var days = getDates(firstDate, numDates), labels = new Array(7); - for (var i = 0; i < numDates; i ++) { - var dt = new Date(days[i]); - days[i] = makeDate(dt, format.day, (selected && selected.getDate() === dt.getDate() && selected.getMonth() === dt.getMonth() && selected.getFullYear() === dt.getFullYear()), dt.getMonth() !== month); - } - for (var j = 0; j < 7; j++) { - labels[j] = dateFilter(days[j].date, format.dayHeader); - } - return { objects: days, title: dateFilter(date, format.dayTitle), labels: labels }; - }, - compare: function(date1, date2) { - return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); - }, - split: 7, - step: { months: 1 } - }, - { - name: 'month', - getVisibleDates: function(date, selected) { - var months = new Array(12), year = date.getFullYear(); - for ( var i = 0; i < 12; i++ ) { - var dt = new Date(year, i, 1); - months[i] = makeDate(dt, format.month, (selected && selected.getMonth() === i && selected.getFullYear() === year)); - } - return { objects: months, title: dateFilter(date, format.monthTitle) }; - }, - compare: function(date1, date2) { - return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); - }, - split: 3, - step: { years: 1 } - }, - { - name: 'year', - getVisibleDates: function(date, selected) { - var years = new Array(yearRange), year = date.getFullYear(), startYear = parseInt((year - 1) / yearRange, 10) * yearRange + 1; - for ( var i = 0; i < yearRange; i++ ) { - var dt = new Date(startYear + i, 0, 1); - years[i] = makeDate(dt, format.year, (selected && selected.getFullYear() === dt.getFullYear())); - } - return { objects: years, title: [years[0].label, years[yearRange - 1].label].join(' - ') }; - }, - compare: function(date1, date2) { - return date1.getFullYear() - date2.getFullYear(); - }, - split: 5, - step: { years: yearRange } - } - ]; - - this.isDisabled = function(date, mode) { - var currentMode = this.modes[mode || 0]; - return ((this.minDate && currentMode.compare(date, this.minDate) < 0) || (this.maxDate && currentMode.compare(date, this.maxDate) > 0) || ($scope.dateDisabled && $scope.dateDisabled({date: date, mode: currentMode.name}))); - }; -}]) - -.directive( 'datepicker', ['dateFilter', '$parse', 'datepickerConfig', '$log', function (dateFilter, $parse, datepickerConfig, $log) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/datepicker/datepicker.html', - scope: { - dateDisabled: '&' - }, - require: ['datepicker', '?^ngModel'], - controller: 'DatepickerController', - link: function(scope, element, attrs, ctrls) { - var datepickerCtrl = ctrls[0], ngModel = ctrls[1]; - - if (!ngModel) { - return; // do nothing if no ng-model - } - - // Configuration parameters - var mode = 0, selected = new Date(), showWeeks = datepickerConfig.showWeeks; - - if (attrs.showWeeks) { - scope.$parent.$watch($parse(attrs.showWeeks), function(value) { - showWeeks = !! value; - updateShowWeekNumbers(); - }); - } else { - updateShowWeekNumbers(); - } - - if (attrs.min) { - scope.$parent.$watch($parse(attrs.min), function(value) { - datepickerCtrl.minDate = value ? new Date(value) : null; - refill(); - }); - } - if (attrs.max) { - scope.$parent.$watch($parse(attrs.max), function(value) { - datepickerCtrl.maxDate = value ? new Date(value) : null; - refill(); - }); - } - - function updateShowWeekNumbers() { - scope.showWeekNumbers = mode === 0 && showWeeks; - } - - // Split array into smaller arrays - function split(arr, size) { - var arrays = []; - while (arr.length > 0) { - arrays.push(arr.splice(0, size)); - } - return arrays; - } - - function refill( updateSelected ) { - var date = null, valid = true; - - if ( ngModel.$modelValue ) { - date = new Date( ngModel.$modelValue ); - - if ( isNaN(date) ) { - valid = false; - $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else if ( updateSelected ) { - selected = date; - } - } - ngModel.$setValidity('date', valid); - - var currentMode = datepickerCtrl.modes[mode], data = currentMode.getVisibleDates(selected, date); - angular.forEach(data.objects, function(obj) { - obj.disabled = datepickerCtrl.isDisabled(obj.date, mode); - }); - - ngModel.$setValidity('date-disabled', (!date || !datepickerCtrl.isDisabled(date))); - - scope.rows = split(data.objects, currentMode.split); - scope.labels = data.labels || []; - scope.title = data.title; - } - - function setMode(value) { - mode = value; - updateShowWeekNumbers(); - refill(); - } - - ngModel.$render = function() { - refill( true ); - }; - - scope.select = function( date ) { - if ( mode === 0 ) { - var dt = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); - dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); - ngModel.$setViewValue( dt ); - refill( true ); - } else { - selected = date; - setMode( mode - 1 ); - } - }; - scope.move = function(direction) { - var step = datepickerCtrl.modes[mode].step; - selected.setMonth( selected.getMonth() + direction * (step.months || 0) ); - selected.setFullYear( selected.getFullYear() + direction * (step.years || 0) ); - refill(); - }; - scope.toggleMode = function() { - setMode( (mode + 1) % datepickerCtrl.modes.length ); - }; - scope.getWeekNumber = function(row) { - return ( mode === 0 && scope.showWeekNumbers && row.length === 7 ) ? getISO8601WeekNumber(row[0].date) : null; - }; - - function getISO8601WeekNumber(date) { - var checkDate = new Date(date); - checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday - var time = checkDate.getTime(); - checkDate.setMonth(0); // Compare with Jan 1 - checkDate.setDate(1); - return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; - } - } - }; -}]) - -.constant('datepickerPopupConfig', { - dateFormat: 'yyyy-MM-dd', - currentText: 'Today', - toggleWeeksText: 'Weeks', - clearText: 'Clear', - closeText: 'Done', - closeOnDateSelection: true, - appendToBody: false, - showButtonBar: true -}) - -.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'datepickerPopupConfig', 'datepickerConfig', -function ($compile, $parse, $document, $position, dateFilter, datepickerPopupConfig, datepickerConfig) { - return { - restrict: 'EA', - require: 'ngModel', - link: function(originalScope, element, attrs, ngModel) { - var scope = originalScope.$new(), // create a child scope so we are not polluting original one - dateFormat, - closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? originalScope.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, - appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? originalScope.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; - - attrs.$observe('datepickerPopup', function(value) { - dateFormat = value || datepickerPopupConfig.dateFormat; - ngModel.$render(); - }); - - scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? originalScope.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; - - originalScope.$on('$destroy', function() { - $popup.remove(); - scope.$destroy(); - }); - - attrs.$observe('currentText', function(text) { - scope.currentText = angular.isDefined(text) ? text : datepickerPopupConfig.currentText; - }); - attrs.$observe('toggleWeeksText', function(text) { - scope.toggleWeeksText = angular.isDefined(text) ? text : datepickerPopupConfig.toggleWeeksText; - }); - attrs.$observe('clearText', function(text) { - scope.clearText = angular.isDefined(text) ? text : datepickerPopupConfig.clearText; - }); - attrs.$observe('closeText', function(text) { - scope.closeText = angular.isDefined(text) ? text : datepickerPopupConfig.closeText; - }); - - var getIsOpen, setIsOpen; - if ( attrs.isOpen ) { - getIsOpen = $parse(attrs.isOpen); - setIsOpen = getIsOpen.assign; - - originalScope.$watch(getIsOpen, function updateOpen(value) { - scope.isOpen = !! value; - }); - } - scope.isOpen = getIsOpen ? getIsOpen(originalScope) : false; // Initial state - - function setOpen( value ) { - if (setIsOpen) { - setIsOpen(originalScope, !!value); - } else { - scope.isOpen = !!value; - } - } - - var documentClickBind = function(event) { - if (scope.isOpen && event.target !== element[0]) { - scope.$apply(function() { - setOpen(false); - }); - } - }; - - var elementFocusBind = function() { - scope.$apply(function() { - setOpen( true ); - }); - }; - - // popup element used to display calendar - var popupEl = angular.element('
        '); - popupEl.attr({ - 'ng-model': 'date', - 'ng-change': 'dateSelection()' - }); - var datepickerEl = angular.element(popupEl.children()[0]), - datepickerOptions = {}; - if (attrs.datepickerOptions) { - datepickerOptions = originalScope.$eval(attrs.datepickerOptions); - datepickerEl.attr(angular.extend({}, datepickerOptions)); - } - - // TODO: reverse from dateFilter string to Date object - function parseDate(viewValue) { - if (!viewValue) { - ngModel.$setValidity('date', true); - return null; - } else if (angular.isDate(viewValue)) { - ngModel.$setValidity('date', true); - return viewValue; - } else if (angular.isString(viewValue)) { - var date = new Date(viewValue); - if (isNaN(date)) { - ngModel.$setValidity('date', false); - return undefined; - } else { - ngModel.$setValidity('date', true); - return date; - } - } else { - ngModel.$setValidity('date', false); - return undefined; - } - } - ngModel.$parsers.unshift(parseDate); - - // Inner change - scope.dateSelection = function(dt) { - if (angular.isDefined(dt)) { - scope.date = dt; - } - ngModel.$setViewValue(scope.date); - ngModel.$render(); - - if (closeOnDateSelection) { - setOpen( false ); - } - }; - - element.bind('input change keyup', function() { - scope.$apply(function() { - scope.date = ngModel.$modelValue; - }); - }); - - // Outter change - ngModel.$render = function() { - var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; - element.val(date); - scope.date = ngModel.$modelValue; - }; - - function addWatchableAttribute(attribute, scopeProperty, datepickerAttribute) { - if (attribute) { - originalScope.$watch($parse(attribute), function(value){ - scope[scopeProperty] = value; - }); - datepickerEl.attr(datepickerAttribute || scopeProperty, scopeProperty); - } - } - addWatchableAttribute(attrs.min, 'min'); - addWatchableAttribute(attrs.max, 'max'); - if (attrs.showWeeks) { - addWatchableAttribute(attrs.showWeeks, 'showWeeks', 'show-weeks'); - } else { - scope.showWeeks = 'show-weeks' in datepickerOptions ? datepickerOptions['show-weeks'] : datepickerConfig.showWeeks; - datepickerEl.attr('show-weeks', 'showWeeks'); - } - if (attrs.dateDisabled) { - datepickerEl.attr('date-disabled', attrs.dateDisabled); - } - - function updatePosition() { - scope.position = appendToBody ? $position.offset(element) : $position.position(element); - scope.position.top = scope.position.top + element.prop('offsetHeight'); - } - - var documentBindingInitialized = false, elementFocusInitialized = false; - scope.$watch('isOpen', function(value) { - if (value) { - updatePosition(); - $document.bind('click', documentClickBind); - if(elementFocusInitialized) { - element.unbind('focus', elementFocusBind); - } - element[0].focus(); - documentBindingInitialized = true; - } else { - if(documentBindingInitialized) { - $document.unbind('click', documentClickBind); - } - element.bind('focus', elementFocusBind); - elementFocusInitialized = true; - } - - if ( setIsOpen ) { - setIsOpen(originalScope, value); - } - }); - - scope.today = function() { - scope.dateSelection(new Date()); - }; - scope.clear = function() { - scope.dateSelection(null); - }; - - var $popup = $compile(popupEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; -}]) - -.directive('datepickerPopupWrap', function() { - return { - restrict:'EA', - replace: true, - transclude: true, - templateUrl: 'template/datepicker/popup.html', - link:function (scope, element, attrs) { - element.bind('click', function(event) { - event.preventDefault(); - event.stopPropagation(); - }); - } - }; -}); - -/* - * dropdownToggle - Provides dropdown menu functionality in place of bootstrap js - * @restrict class or attribute - * @example: - - */ - -angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) { - var openElement = null, - closeMenu = angular.noop; - return { - restrict: 'CA', - link: function(scope, element, attrs) { - scope.$watch('$location.path', function() { closeMenu(); }); - element.parent().bind('click', function() { closeMenu(); }); - element.bind('click', function (event) { - - var elementWasOpen = (element === openElement); - - event.preventDefault(); - event.stopPropagation(); - - if (!!openElement) { - closeMenu(); - } - - if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) { - element.parent().addClass('open'); - openElement = element; - closeMenu = function (event) { - if (event) { - event.preventDefault(); - event.stopPropagation(); - } - $document.unbind('click', closeMenu); - element.parent().removeClass('open'); - closeMenu = angular.noop; - openElement = null; - }; - $document.bind('click', closeMenu); - } - }); - } - }; -}]); - -angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) - -/** - * A helper, internal data structure that acts as a map but also allows getting / removing - * elements in the LIFO order - */ - .factory('$$stackedMap', function () { - return { - createNew: function () { - var stack = []; - - return { - add: function (key, value) { - stack.push({ - key: key, - value: value - }); - }, - get: function (key) { - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - return stack[i]; - } - } - }, - keys: function() { - var keys = []; - for (var i = 0; i < stack.length; i++) { - keys.push(stack[i].key); - } - return keys; - }, - top: function () { - return stack[stack.length - 1]; - }, - remove: function (key) { - var idx = -1; - for (var i = 0; i < stack.length; i++) { - if (key == stack[i].key) { - idx = i; - break; - } - } - return stack.splice(idx, 1)[0]; - }, - removeTop: function () { - return stack.splice(stack.length - 1, 1)[0]; - }, - length: function () { - return stack.length; - } - }; - } - }; - }) - -/** - * A helper directive for the $modal service. It creates a backdrop element. - */ - .directive('modalBackdrop', ['$timeout', function ($timeout) { - return { - restrict: 'EA', - replace: true, - templateUrl: 'template/modal/backdrop.html', - link: function (scope) { - - scope.animate = false; - - //trigger CSS transitions - $timeout(function () { - scope.animate = true; - }); - } - }; - }]) - - .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { - return { - restrict: 'EA', - scope: { - index: '@', - animate: '=' - }, - replace: true, - transclude: true, - templateUrl: 'template/modal/window.html', - link: function (scope, element, attrs) { - scope.windowClass = attrs.windowClass || ''; - - $timeout(function () { - // trigger CSS transitions - scope.animate = true; - // focus a freshly-opened modal - element[0].focus(); - }); - - scope.close = function (evt) { - var modal = $modalStack.getTop(); - if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { - evt.preventDefault(); - evt.stopPropagation(); - $modalStack.dismiss(modal.key, 'backdrop click'); - } - }; - } - }; - }]) - - .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', - function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { - - var OPENED_MODAL_CLASS = 'modal-open'; - - var backdropDomEl, backdropScope; - var openedWindows = $$stackedMap.createNew(); - var $modalStack = {}; - - function backdropIndex() { - var topBackdropIndex = -1; - var opened = openedWindows.keys(); - for (var i = 0; i < opened.length; i++) { - if (openedWindows.get(opened[i]).value.backdrop) { - topBackdropIndex = i; - } - } - return topBackdropIndex; - } - - $rootScope.$watch(backdropIndex, function(newBackdropIndex){ - if (backdropScope) { - backdropScope.index = newBackdropIndex; - } - }); - - function removeModalWindow(modalInstance) { - - var body = $document.find('body').eq(0); - var modalWindow = openedWindows.get(modalInstance).value; - - //clean up the stack - openedWindows.remove(modalInstance); - - //remove window DOM element - removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, checkRemoveBackdrop); - body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); - } - - function checkRemoveBackdrop() { - //remove backdrop if no longer needed - if (backdropDomEl && backdropIndex() == -1) { - var backdropScopeRef = backdropScope; - removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { - backdropScopeRef.$destroy(); - backdropScopeRef = null; - }); - backdropDomEl = undefined; - backdropScope = undefined; - } - } - - function removeAfterAnimate(domEl, scope, emulateTime, done) { - // Closing animation - scope.animate = false; - - var transitionEndEventName = $transition.transitionEndEventName; - if (transitionEndEventName) { - // transition out - var timeout = $timeout(afterAnimating, emulateTime); - - domEl.bind(transitionEndEventName, function () { - $timeout.cancel(timeout); - afterAnimating(); - scope.$apply(); - }); - } else { - // Ensure this call is async - $timeout(afterAnimating, 0); - } - - function afterAnimating() { - if (afterAnimating.done) { - return; - } - afterAnimating.done = true; - - domEl.remove(); - if (done) { - done(); - } - } - } - - $document.bind('keydown', function (evt) { - var modal; - - if (evt.which === 27) { - modal = openedWindows.top(); - if (modal && modal.value.keyboard) { - $rootScope.$apply(function () { - $modalStack.dismiss(modal.key); - }); - } - } - }); - - $modalStack.open = function (modalInstance, modal) { - - openedWindows.add(modalInstance, { - deferred: modal.deferred, - modalScope: modal.scope, - backdrop: modal.backdrop, - keyboard: modal.keyboard - }); - - var body = $document.find('body').eq(0), - currBackdropIndex = backdropIndex(); - - if (currBackdropIndex >= 0 && !backdropDomEl) { - backdropScope = $rootScope.$new(true); - backdropScope.index = currBackdropIndex; - backdropDomEl = $compile('
        ')(backdropScope); - body.append(backdropDomEl); - } - - var angularDomEl = angular.element('
        '); - angularDomEl.attr('window-class', modal.windowClass); - angularDomEl.attr('index', openedWindows.length() - 1); - angularDomEl.attr('animate', 'animate'); - angularDomEl.html(modal.content); - - var modalDomEl = $compile(angularDomEl)(modal.scope); - openedWindows.top().value.modalDomEl = modalDomEl; - body.append(modalDomEl); - body.addClass(OPENED_MODAL_CLASS); - }; - - $modalStack.close = function (modalInstance, result) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.resolve(result); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismiss = function (modalInstance, reason) { - var modalWindow = openedWindows.get(modalInstance).value; - if (modalWindow) { - modalWindow.deferred.reject(reason); - removeModalWindow(modalInstance); - } - }; - - $modalStack.dismissAll = function (reason) { - var topModal = this.getTop(); - while (topModal) { - this.dismiss(topModal.key, reason); - topModal = this.getTop(); - } - }; - - $modalStack.getTop = function () { - return openedWindows.top(); - }; - - return $modalStack; - }]) - - .provider('$modal', function () { - - var $modalProvider = { - options: { - backdrop: true, //can be also false or 'static' - keyboard: true - }, - $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', - function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { - - var $modal = {}; - - function getTemplatePromise(options) { - return options.template ? $q.when(options.template) : - $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { - return result.data; - }); - } - - function getResolvePromises(resolves) { - var promisesArr = []; - angular.forEach(resolves, function (value, key) { - if (angular.isFunction(value) || angular.isArray(value)) { - promisesArr.push($q.when($injector.invoke(value))); - } - }); - return promisesArr; - } - - $modal.open = function (modalOptions) { - - var modalResultDeferred = $q.defer(); - var modalOpenedDeferred = $q.defer(); - - //prepare an instance of a modal to be injected into controllers and returned to a caller - var modalInstance = { - result: modalResultDeferred.promise, - opened: modalOpenedDeferred.promise, - close: function (result) { - $modalStack.close(modalInstance, result); - }, - dismiss: function (reason) { - $modalStack.dismiss(modalInstance, reason); - } - }; - - //merge and clean up options - modalOptions = angular.extend({}, $modalProvider.options, modalOptions); - modalOptions.resolve = modalOptions.resolve || {}; - - //verify options - if (!modalOptions.template && !modalOptions.templateUrl) { - throw new Error('One of template or templateUrl options is required.'); - } - - var templateAndResolvePromise = - $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); - - - templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { - - var modalScope = (modalOptions.scope || $rootScope).$new(); - modalScope.$close = modalInstance.close; - modalScope.$dismiss = modalInstance.dismiss; - - var ctrlInstance, ctrlLocals = {}; - var resolveIter = 1; - - //controllers - if (modalOptions.controller) { - ctrlLocals.$scope = modalScope; - ctrlLocals.$modalInstance = modalInstance; - angular.forEach(modalOptions.resolve, function (value, key) { - ctrlLocals[key] = tplAndVars[resolveIter++]; - }); - - ctrlInstance = $controller(modalOptions.controller, ctrlLocals); - } - - $modalStack.open(modalInstance, { - scope: modalScope, - deferred: modalResultDeferred, - content: tplAndVars[0], - backdrop: modalOptions.backdrop, - keyboard: modalOptions.keyboard, - windowClass: modalOptions.windowClass - }); - - }, function resolveError(reason) { - modalResultDeferred.reject(reason); - }); - - templateAndResolvePromise.then(function () { - modalOpenedDeferred.resolve(true); - }, function () { - modalOpenedDeferred.reject(false); - }); - - return modalInstance; - }; - - return $modal; - }] - }; - - return $modalProvider; - }); - -angular.module('ui.bootstrap.pagination', []) - -.controller('PaginationController', ['$scope', '$attrs', '$parse', '$interpolate', function ($scope, $attrs, $parse, $interpolate) { - var self = this, - setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; - - this.init = function(defaultItemsPerPage) { - if ($attrs.itemsPerPage) { - $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { - self.itemsPerPage = parseInt(value, 10); - $scope.totalPages = self.calculateTotalPages(); - }); - } else { - this.itemsPerPage = defaultItemsPerPage; - } - }; - - this.noPrevious = function() { - return this.page === 1; - }; - this.noNext = function() { - return this.page === $scope.totalPages; - }; - - this.isActive = function(page) { - return this.page === page; - }; - - this.calculateTotalPages = function() { - var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); - return Math.max(totalPages || 0, 1); - }; - - this.getAttributeValue = function(attribute, defaultValue, interpolate) { - return angular.isDefined(attribute) ? (interpolate ? $interpolate(attribute)($scope.$parent) : $scope.$parent.$eval(attribute)) : defaultValue; - }; - - this.render = function() { - this.page = parseInt($scope.page, 10) || 1; - if (this.page > 0 && this.page <= $scope.totalPages) { - $scope.pages = this.getPages(this.page, $scope.totalPages); - } - }; - - $scope.selectPage = function(page) { - if ( ! self.isActive(page) && page > 0 && page <= $scope.totalPages) { - $scope.page = page; - $scope.onSelectPage({ page: page }); - } - }; - - $scope.$watch('page', function() { - self.render(); - }); - - $scope.$watch('totalItems', function() { - $scope.totalPages = self.calculateTotalPages(); - }); - - $scope.$watch('totalPages', function(value) { - setNumPages($scope.$parent, value); // Readonly variable - - if ( self.page > value ) { - $scope.selectPage(value); - } else { - self.render(); - } - }); -}]) - -.constant('paginationConfig', { - itemsPerPage: 10, - boundaryLinks: false, - directionLinks: true, - firstText: 'First', - previousText: 'Previous', - nextText: 'Next', - lastText: 'Last', - rotate: true -}) - -.directive('pagination', ['$parse', 'paginationConfig', function($parse, config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pagination.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var maxSize, - boundaryLinks = paginationCtrl.getAttributeValue(attrs.boundaryLinks, config.boundaryLinks ), - directionLinks = paginationCtrl.getAttributeValue(attrs.directionLinks, config.directionLinks ), - firstText = paginationCtrl.getAttributeValue(attrs.firstText, config.firstText, true), - previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - lastText = paginationCtrl.getAttributeValue(attrs.lastText, config.lastText, true), - rotate = paginationCtrl.getAttributeValue(attrs.rotate, config.rotate); - - paginationCtrl.init(config.itemsPerPage); - - if (attrs.maxSize) { - scope.$parent.$watch($parse(attrs.maxSize), function(value) { - maxSize = parseInt(value, 10); - paginationCtrl.render(); - }); - } - - // Create page object used in template - function makePage(number, text, isActive, isDisabled) { - return { - number: number, - text: text, - active: isActive, - disabled: isDisabled - }; - } - - paginationCtrl.getPages = function(currentPage, totalPages) { - var pages = []; - - // Default page limits - var startPage = 1, endPage = totalPages; - var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); - - // recompute if maxSize - if ( isMaxSized ) { - if ( rotate ) { - // Current page is displayed in the middle of the visible ones - startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); - endPage = startPage + maxSize - 1; - - // Adjust if limit is exceeded - if (endPage > totalPages) { - endPage = totalPages; - startPage = endPage - maxSize + 1; - } - } else { - // Visible pages are paginated with maxSize - startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; - - // Adjust last page if limit is exceeded - endPage = Math.min(startPage + maxSize - 1, totalPages); - } - } - - // Add page number links - for (var number = startPage; number <= endPage; number++) { - var page = makePage(number, number, paginationCtrl.isActive(number), false); - pages.push(page); - } - - // Add links to move between page sets - if ( isMaxSized && ! rotate ) { - if ( startPage > 1 ) { - var previousPageSet = makePage(startPage - 1, '...', false, false); - pages.unshift(previousPageSet); - } - - if ( endPage < totalPages ) { - var nextPageSet = makePage(endPage + 1, '...', false, false); - pages.push(nextPageSet); - } - } - - // Add previous & next links - if (directionLinks) { - var previousPage = makePage(currentPage - 1, previousText, false, paginationCtrl.noPrevious()); - pages.unshift(previousPage); - - var nextPage = makePage(currentPage + 1, nextText, false, paginationCtrl.noNext()); - pages.push(nextPage); - } - - // Add first & last links - if (boundaryLinks) { - var firstPage = makePage(1, firstText, false, paginationCtrl.noPrevious()); - pages.unshift(firstPage); - - var lastPage = makePage(totalPages, lastText, false, paginationCtrl.noNext()); - pages.push(lastPage); - } - - return pages; - }; - } - }; -}]) - -.constant('pagerConfig', { - itemsPerPage: 10, - previousText: '« Previous', - nextText: 'Next »', - align: true -}) - -.directive('pager', ['pagerConfig', function(config) { - return { - restrict: 'EA', - scope: { - page: '=', - totalItems: '=', - onSelectPage:' &' - }, - controller: 'PaginationController', - templateUrl: 'template/pagination/pager.html', - replace: true, - link: function(scope, element, attrs, paginationCtrl) { - - // Setup configuration parameters - var previousText = paginationCtrl.getAttributeValue(attrs.previousText, config.previousText, true), - nextText = paginationCtrl.getAttributeValue(attrs.nextText, config.nextText, true), - align = paginationCtrl.getAttributeValue(attrs.align, config.align); - - paginationCtrl.init(config.itemsPerPage); - - // Create page object used in template - function makePage(number, text, isDisabled, isPrevious, isNext) { - return { - number: number, - text: text, - disabled: isDisabled, - previous: ( align && isPrevious ), - next: ( align && isNext ) - }; - } - - paginationCtrl.getPages = function(currentPage) { - return [ - makePage(currentPage - 1, previousText, paginationCtrl.noPrevious(), true, false), - makePage(currentPage + 1, nextText, paginationCtrl.noNext(), false, true) - ]; - }; - } - }; -}]); - -/** - * The following features are still outstanding: animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html tooltips, and selector delegation. - */ -angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) - -/** - * The $tooltip service creates tooltip- and popover-like directives as well as - * houses global options for them. - */ -.provider( '$tooltip', function () { - // The default options tooltip and popover. - var defaultOptions = { - placement: 'top', - animation: true, - popupDelay: 0 - }; - - // Default hide triggers for each show trigger - var triggerMap = { - 'mouseenter': 'mouseleave', - 'click': 'click', - 'focus': 'blur' - }; - - // The options specified to the provider globally. - var globalOptions = {}; - - /** - * `options({})` allows global configuration of all tooltips in the - * application. - * - * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { - * // place tooltips left instead of top by default - * $tooltipProvider.options( { placement: 'left' } ); - * }); - */ - this.options = function( value ) { - angular.extend( globalOptions, value ); - }; - - /** - * This allows you to extend the set of trigger mappings available. E.g.: - * - * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); - */ - this.setTriggers = function setTriggers ( triggers ) { - angular.extend( triggerMap, triggers ); - }; - - /** - * This is a helper function for translating camel-case to snake-case. - */ - function snake_case(name){ - var regexp = /[A-Z]/g; - var separator = '-'; - return name.replace(regexp, function(letter, pos) { - return (pos ? separator : '') + letter.toLowerCase(); - }); - } - - /** - * Returns the actual instance of the $tooltip service. - * TODO support multiple triggers - */ - this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { - return function $tooltip ( type, prefix, defaultTriggerShow ) { - var options = angular.extend( {}, defaultOptions, globalOptions ); - - /** - * Returns an object of show and hide triggers. - * - * If a trigger is supplied, - * it is used to show the tooltip; otherwise, it will use the `trigger` - * option passed to the `$tooltipProvider.options` method; else it will - * default to the trigger supplied to this directive factory. - * - * The hide trigger is based on the show trigger. If the `trigger` option - * was passed to the `$tooltipProvider.options` method, it will use the - * mapped trigger from `triggerMap` or the passed trigger if the map is - * undefined; otherwise, it uses the `triggerMap` value of the show - * trigger; else it will just use the show trigger. - */ - function getTriggers ( trigger ) { - var show = trigger || options.trigger || defaultTriggerShow; - var hide = triggerMap[show] || show; - return { - show: show, - hide: hide - }; - } - - var directiveName = snake_case( type ); - - var startSym = $interpolate.startSymbol(); - var endSym = $interpolate.endSymbol(); - var template = - '
        '+ - '
        '; - - return { - restrict: 'EA', - scope: true, - compile: function (tElem, tAttrs) { - var tooltipLinker = $compile( template ); - - return function link ( scope, element, attrs ) { - var tooltip; - var transitionTimeout; - var popupTimeout; - var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; - var triggers = getTriggers( undefined ); - var hasRegisteredTriggers = false; - var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); - - var positionTooltip = function (){ - var position, - ttWidth, - ttHeight, - ttPosition; - // Get the position of the directive element. - position = appendToBody ? $position.offset( element ) : $position.position( element ); - - // Get the height and width of the tooltip so we can center it. - ttWidth = tooltip.prop( 'offsetWidth' ); - ttHeight = tooltip.prop( 'offsetHeight' ); - - // Calculate the tooltip's top and left coordinates to center it with - // this directive. - switch ( scope.tt_placement ) { - case 'right': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left + position.width - }; - break; - case 'bottom': - ttPosition = { - top: position.top + position.height, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - case 'left': - ttPosition = { - top: position.top + position.height / 2 - ttHeight / 2, - left: position.left - ttWidth - }; - break; - default: - ttPosition = { - top: position.top - ttHeight, - left: position.left + position.width / 2 - ttWidth / 2 - }; - break; - } - - ttPosition.top += 'px'; - ttPosition.left += 'px'; - - // Now set the calculated positioning. - tooltip.css( ttPosition ); - - }; - - // By default, the tooltip is not open. - // TODO add ability to start tooltip opened - scope.tt_isOpen = false; - - function toggleTooltipBind () { - if ( ! scope.tt_isOpen ) { - showTooltipBind(); - } else { - hideTooltipBind(); - } - } - - // Show the tooltip with delay if specified, otherwise show it immediately - function showTooltipBind() { - if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { - return; - } - if ( scope.tt_popupDelay ) { - popupTimeout = $timeout( show, scope.tt_popupDelay, false ); - popupTimeout.then(function(reposition){reposition();}); - } else { - show()(); - } - } - - function hideTooltipBind () { - scope.$apply(function () { - hide(); - }); - } - - // Show the tooltip popup element. - function show() { - - - // Don't show empty tooltips. - if ( ! scope.tt_content ) { - return angular.noop; - } - - createTooltip(); - - // If there is a pending remove transition, we must cancel it, lest the - // tooltip be mysteriously removed. - if ( transitionTimeout ) { - $timeout.cancel( transitionTimeout ); - } - - // Set the initial positioning. - tooltip.css({ top: 0, left: 0, display: 'block' }); - - // Now we add it to the DOM because need some info about it. But it's not - // visible yet anyway. - if ( appendToBody ) { - $document.find( 'body' ).append( tooltip ); - } else { - element.after( tooltip ); - } - - positionTooltip(); - - // And show the tooltip. - scope.tt_isOpen = true; - scope.$digest(); // digest required as $apply is not called - - // Return positioning function as promise callback for correct - // positioning after draw. - return positionTooltip; - } - - // Hide the tooltip popup element. - function hide() { - // First things first: we don't show it anymore. - scope.tt_isOpen = false; - - //if tooltip is going to be shown after delay, we must cancel this - $timeout.cancel( popupTimeout ); - - // And now we remove it from the DOM. However, if we have animation, we - // need to wait for it to expire beforehand. - // FIXME: this is a placeholder for a port of the transitions library. - if ( scope.tt_animation ) { - transitionTimeout = $timeout(removeTooltip, 500); - } else { - removeTooltip(); - } - } - - function createTooltip() { - // There can only be one tooltip element per directive shown at once. - if (tooltip) { - removeTooltip(); - } - tooltip = tooltipLinker(scope, function () {}); - - // Get contents rendered into the tooltip - scope.$digest(); - } - - function removeTooltip() { - if (tooltip) { - tooltip.remove(); - tooltip = null; - } - } - - /** - * Observe the relevant attributes. - */ - attrs.$observe( type, function ( val ) { - scope.tt_content = val; - - if (!val && scope.tt_isOpen ) { - hide(); - } - }); - - attrs.$observe( prefix+'Title', function ( val ) { - scope.tt_title = val; - }); - - attrs.$observe( prefix+'Placement', function ( val ) { - scope.tt_placement = angular.isDefined( val ) ? val : options.placement; - }); - - attrs.$observe( prefix+'PopupDelay', function ( val ) { - var delay = parseInt( val, 10 ); - scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; - }); - - var unregisterTriggers = function() { - if (hasRegisteredTriggers) { - element.unbind( triggers.show, showTooltipBind ); - element.unbind( triggers.hide, hideTooltipBind ); - } - }; - - attrs.$observe( prefix+'Trigger', function ( val ) { - unregisterTriggers(); - - triggers = getTriggers( val ); - - if ( triggers.show === triggers.hide ) { - element.bind( triggers.show, toggleTooltipBind ); - } else { - element.bind( triggers.show, showTooltipBind ); - element.bind( triggers.hide, hideTooltipBind ); - } - - hasRegisteredTriggers = true; - }); - - var animation = scope.$eval(attrs[prefix + 'Animation']); - scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; - - attrs.$observe( prefix+'AppendToBody', function ( val ) { - appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; - }); - - // if a tooltip is attached to we need to remove it on - // location change as its parent scope will probably not be destroyed - // by the change. - if ( appendToBody ) { - scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { - if ( scope.tt_isOpen ) { - hide(); - } - }); - } - - // Make sure tooltip is destroyed and removed. - scope.$on('$destroy', function onDestroyTooltip() { - $timeout.cancel( transitionTimeout ); - $timeout.cancel( popupTimeout ); - unregisterTriggers(); - removeTooltip(); - }); - }; - } - }; - }; - }]; -}) - -.directive( 'tooltipPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-popup.html' - }; -}) - -.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); -}]) - -.directive( 'tooltipHtmlUnsafePopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' - }; -}) - -.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); -}]); - -/** - * The following features are still outstanding: popup delay, animation as a - * function, placement as a function, inside, support for more triggers than - * just mouse enter/leave, html popovers, and selector delegatation. - */ -angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) - -.directive( 'popoverPopup', function () { - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - templateUrl: 'template/popover/popover.html' - }; -}) - -.directive( 'popover', [ '$tooltip', function ( $tooltip ) { - return $tooltip( 'popover', 'popover', 'click' ); -}]); - -angular.module('ui.bootstrap.progressbar', ['ui.bootstrap.transition']) - -.constant('progressConfig', { - animate: true, - max: 100 -}) - -.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', '$transition', function($scope, $attrs, progressConfig, $transition) { - var self = this, - bars = [], - max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max, - animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; - - this.addBar = function(bar, element) { - var oldValue = 0, index = bar.$parent.$index; - if ( angular.isDefined(index) && bars[index] ) { - oldValue = bars[index].value; - } - bars.push(bar); - - this.update(element, bar.value, oldValue); - - bar.$watch('value', function(value, oldValue) { - if (value !== oldValue) { - self.update(element, value, oldValue); - } - }); - - bar.$on('$destroy', function() { - self.removeBar(bar); - }); - }; - - // Update bar element width - this.update = function(element, newValue, oldValue) { - var percent = this.getPercentage(newValue); - - if (animate) { - element.css('width', this.getPercentage(oldValue) + '%'); - $transition(element, {width: percent + '%'}); - } else { - element.css({'transition': 'none', 'width': percent + '%'}); - } - }; - - this.removeBar = function(bar) { - bars.splice(bars.indexOf(bar), 1); - }; - - this.getPercentage = function(value) { - return Math.round(100 * value / max); - }; -}]) - -.directive('progress', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - require: 'progress', - scope: {}, - template: '
        ' - //templateUrl: 'template/progressbar/progress.html' // Works in AngularJS 1.2 - }; -}) - -.directive('bar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - require: '^progress', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/bar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, element); - } - }; -}) - -.directive('progressbar', function() { - return { - restrict: 'EA', - replace: true, - transclude: true, - controller: 'ProgressController', - scope: { - value: '=', - type: '@' - }, - templateUrl: 'template/progressbar/progressbar.html', - link: function(scope, element, attrs, progressCtrl) { - progressCtrl.addBar(scope, angular.element(element.children()[0])); - } - }; -}); -angular.module('ui.bootstrap.rating', []) - -.constant('ratingConfig', { - max: 5, - stateOn: null, - stateOff: null -}) - -.controller('RatingController', ['$scope', '$attrs', '$parse', 'ratingConfig', function($scope, $attrs, $parse, ratingConfig) { - - this.maxRange = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max; - this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; - this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; - - this.createRateObjects = function(states) { - var defaultOptions = { - stateOn: this.stateOn, - stateOff: this.stateOff - }; - - for (var i = 0, n = states.length; i < n; i++) { - states[i] = angular.extend({ index: i }, defaultOptions, states[i]); - } - return states; - }; - - // Get objects used in template - $scope.range = angular.isDefined($attrs.ratingStates) ? this.createRateObjects(angular.copy($scope.$parent.$eval($attrs.ratingStates))): this.createRateObjects(new Array(this.maxRange)); - - $scope.rate = function(value) { - if ( $scope.value !== value && !$scope.readonly ) { - $scope.value = value; - } - }; - - $scope.enter = function(value) { - if ( ! $scope.readonly ) { - $scope.val = value; - } - $scope.onHover({value: value}); - }; - - $scope.reset = function() { - $scope.val = angular.copy($scope.value); - $scope.onLeave(); - }; - - $scope.$watch('value', function(value) { - $scope.val = value; - }); - - $scope.readonly = false; - if ($attrs.readonly) { - $scope.$parent.$watch($parse($attrs.readonly), function(value) { - $scope.readonly = !!value; - }); - } -}]) - -.directive('rating', function() { - return { - restrict: 'EA', - scope: { - value: '=', - onHover: '&', - onLeave: '&' - }, - controller: 'RatingController', - templateUrl: 'template/rating/rating.html', - replace: true - }; -}); - -/** - * @ngdoc overview - * @name ui.bootstrap.tabs - * - * @description - * AngularJS version of the tabs directive. - */ - -angular.module('ui.bootstrap.tabs', []) - -.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { - var ctrl = this, - tabs = ctrl.tabs = $scope.tabs = []; - - ctrl.select = function(tab) { - angular.forEach(tabs, function(tab) { - tab.active = false; - }); - tab.active = true; - }; - - ctrl.addTab = function addTab(tab) { - tabs.push(tab); - if (tabs.length === 1 || tab.active) { - ctrl.select(tab); - } - }; - - ctrl.removeTab = function removeTab(tab) { - var index = tabs.indexOf(tab); - //Select a new tab if the tab to be removed is selected - if (tab.active && tabs.length > 1) { - //If this is the last tab, select the previous tab. else, the next tab. - var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; - ctrl.select(tabs[newActiveIndex]); - } - tabs.splice(index, 1); - }; -}]) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabset - * @restrict EA - * - * @description - * Tabset is the outer container for the tabs directive - * - * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. - * @param {boolean=} justified Whether or not to use justified styling for the tabs. - * - * @example - - - - First Content! - Second Content! - -
        - - First Vertical Content! - Second Vertical Content! - - - First Justified Content! - Second Justified Content! - -
        -
        - */ -.directive('tabset', function() { - return { - restrict: 'EA', - transclude: true, - replace: true, - scope: {}, - controller: 'TabsetController', - templateUrl: 'template/tabs/tabset.html', - link: function(scope, element, attrs) { - scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; - scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; - scope.type = angular.isDefined(attrs.type) ? scope.$parent.$eval(attrs.type) : 'tabs'; - } - }; -}) - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tab - * @restrict EA - * - * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. - * @param {string=} select An expression to evaluate when the tab is selected. - * @param {boolean=} active A binding, telling whether or not this tab is selected. - * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. - * - * @description - * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. - * - * @example - - -
        - - -
        - - First Tab - - Alert me! - Second Tab, with alert callback and html heading! - - - {{item.content}} - - -
        -
        - - function TabsDemoCtrl($scope) { - $scope.items = [ - { title:"Dynamic Title 1", content:"Dynamic Item 0" }, - { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } - ]; - - $scope.alertMe = function() { - setTimeout(function() { - alert("You've selected the alert tab!"); - }); - }; - }; - -
        - */ - -/** - * @ngdoc directive - * @name ui.bootstrap.tabs.directive:tabHeading - * @restrict EA - * - * @description - * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. - * - * @example - - - - - HTML in my titles?! - And some content, too! - - - Icon heading?!? - That's right. - - - - - */ -.directive('tab', ['$parse', function($parse) { - return { - require: '^tabset', - restrict: 'EA', - replace: true, - templateUrl: 'template/tabs/tab.html', - transclude: true, - scope: { - heading: '@', - onSelect: '&select', //This callback is called in contentHeadingTransclude - //once it inserts the tab's content into the dom - onDeselect: '&deselect' - }, - controller: function() { - //Empty controller so other directives can require being 'under' a tab - }, - compile: function(elm, attrs, transclude) { - return function postLink(scope, elm, attrs, tabsetCtrl) { - var getActive, setActive; - if (attrs.active) { - getActive = $parse(attrs.active); - setActive = getActive.assign; - scope.$parent.$watch(getActive, function updateActive(value, oldVal) { - // Avoid re-initializing scope.active as it is already initialized - // below. (watcher is called async during init with value === - // oldVal) - if (value !== oldVal) { - scope.active = !!value; - } - }); - scope.active = getActive(scope.$parent); - } else { - setActive = getActive = angular.noop; - } - - scope.$watch('active', function(active) { - // Note this watcher also initializes and assigns scope.active to the - // attrs.active expression. - setActive(scope.$parent, active); - if (active) { - tabsetCtrl.select(scope); - scope.onSelect(); - } else { - scope.onDeselect(); - } - }); - - scope.disabled = false; - if ( attrs.disabled ) { - scope.$parent.$watch($parse(attrs.disabled), function(value) { - scope.disabled = !! value; - }); - } - - scope.select = function() { - if ( ! scope.disabled ) { - scope.active = true; - } - }; - - tabsetCtrl.addTab(scope); - scope.$on('$destroy', function() { - tabsetCtrl.removeTab(scope); - }); - - - //We need to transclude later, once the content container is ready. - //when this link happens, we're inside a tab heading. - scope.$transcludeFn = transclude; - }; - } - }; -}]) - -.directive('tabHeadingTransclude', [function() { - return { - restrict: 'A', - require: '^tab', - link: function(scope, elm, attrs, tabCtrl) { - scope.$watch('headingElement', function updateHeadingElement(heading) { - if (heading) { - elm.html(''); - elm.append(heading); - } - }); - } - }; -}]) - -.directive('tabContentTransclude', function() { - return { - restrict: 'A', - require: '^tabset', - link: function(scope, elm, attrs) { - var tab = scope.$eval(attrs.tabContentTransclude); - - //Now our tab is ready to be transcluded: both the tab heading area - //and the tab content area are loaded. Transclude 'em both. - tab.$transcludeFn(tab.$parent, function(contents) { - angular.forEach(contents, function(node) { - if (isTabHeading(node)) { - //Let tabHeadingTransclude know. - tab.headingElement = node; - } else { - elm.append(node); - } - }); - }); - } - }; - function isTabHeading(node) { - return node.tagName && ( - node.hasAttribute('tab-heading') || - node.hasAttribute('data-tab-heading') || - node.tagName.toLowerCase() === 'tab-heading' || - node.tagName.toLowerCase() === 'data-tab-heading' - ); - } -}) - -; - -angular.module('ui.bootstrap.timepicker', []) - -.constant('timepickerConfig', { - hourStep: 1, - minuteStep: 1, - showMeridian: true, - meridians: null, - readonlyInput: false, - mousewheel: true -}) - -.directive('timepicker', ['$parse', '$log', 'timepickerConfig', '$locale', function ($parse, $log, timepickerConfig, $locale) { - return { - restrict: 'EA', - require:'?^ngModel', - replace: true, - scope: {}, - templateUrl: 'template/timepicker/timepicker.html', - link: function(scope, element, attrs, ngModel) { - if ( !ngModel ) { - return; // do nothing if no ng-model - } - - var selected = new Date(), - meridians = angular.isDefined(attrs.meridians) ? scope.$parent.$eval(attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; - - var hourStep = timepickerConfig.hourStep; - if (attrs.hourStep) { - scope.$parent.$watch($parse(attrs.hourStep), function(value) { - hourStep = parseInt(value, 10); - }); - } - - var minuteStep = timepickerConfig.minuteStep; - if (attrs.minuteStep) { - scope.$parent.$watch($parse(attrs.minuteStep), function(value) { - minuteStep = parseInt(value, 10); - }); - } - - // 12H / 24H mode - scope.showMeridian = timepickerConfig.showMeridian; - if (attrs.showMeridian) { - scope.$parent.$watch($parse(attrs.showMeridian), function(value) { - scope.showMeridian = !!value; - - if ( ngModel.$error.time ) { - // Evaluate from template - var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); - if (angular.isDefined( hours ) && angular.isDefined( minutes )) { - selected.setHours( hours ); - refresh(); - } - } else { - updateTemplate(); - } - }); - } - - // Get scope.hours in 24H mode if valid - function getHoursFromTemplate ( ) { - var hours = parseInt( scope.hours, 10 ); - var valid = ( scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); - if ( !valid ) { - return undefined; - } - - if ( scope.showMeridian ) { - if ( hours === 12 ) { - hours = 0; - } - if ( scope.meridian === meridians[1] ) { - hours = hours + 12; - } - } - return hours; - } - - function getMinutesFromTemplate() { - var minutes = parseInt(scope.minutes, 10); - return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; - } - - function pad( value ) { - return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; - } - - // Input elements - var inputs = element.find('input'), hoursInputEl = inputs.eq(0), minutesInputEl = inputs.eq(1); - - // Respond on mousewheel spin - var mousewheel = (angular.isDefined(attrs.mousewheel)) ? scope.$eval(attrs.mousewheel) : timepickerConfig.mousewheel; - if ( mousewheel ) { - - var isScrollingUp = function(e) { - if (e.originalEvent) { - e = e.originalEvent; - } - //pick correct delta variable depending on event - var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; - return (e.detail || delta > 0); - }; - - hoursInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementHours() : scope.decrementHours() ); - e.preventDefault(); - }); - - minutesInputEl.bind('mousewheel wheel', function(e) { - scope.$apply( (isScrollingUp(e)) ? scope.incrementMinutes() : scope.decrementMinutes() ); - e.preventDefault(); - }); - } - - scope.readonlyInput = (angular.isDefined(attrs.readonlyInput)) ? scope.$eval(attrs.readonlyInput) : timepickerConfig.readonlyInput; - if ( ! scope.readonlyInput ) { - - var invalidate = function(invalidHours, invalidMinutes) { - ngModel.$setViewValue( null ); - ngModel.$setValidity('time', false); - if (angular.isDefined(invalidHours)) { - scope.invalidHours = invalidHours; - } - if (angular.isDefined(invalidMinutes)) { - scope.invalidMinutes = invalidMinutes; - } - }; - - scope.updateHours = function() { - var hours = getHoursFromTemplate(); - - if ( angular.isDefined(hours) ) { - selected.setHours( hours ); - refresh( 'h' ); - } else { - invalidate(true); - } - }; - - hoursInputEl.bind('blur', function(e) { - if ( !scope.validHours && scope.hours < 10) { - scope.$apply( function() { - scope.hours = pad( scope.hours ); - }); - } - }); - - scope.updateMinutes = function() { - var minutes = getMinutesFromTemplate(); - - if ( angular.isDefined(minutes) ) { - selected.setMinutes( minutes ); - refresh( 'm' ); - } else { - invalidate(undefined, true); - } - }; - - minutesInputEl.bind('blur', function(e) { - if ( !scope.invalidMinutes && scope.minutes < 10 ) { - scope.$apply( function() { - scope.minutes = pad( scope.minutes ); - }); - } - }); - } else { - scope.updateHours = angular.noop; - scope.updateMinutes = angular.noop; - } - - ngModel.$render = function() { - var date = ngModel.$modelValue ? new Date( ngModel.$modelValue ) : null; - - if ( isNaN(date) ) { - ngModel.$setValidity('time', false); - $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); - } else { - if ( date ) { - selected = date; - } - makeValid(); - updateTemplate(); - } - }; - - // Call internally when we know that model is valid. - function refresh( keyboardChange ) { - makeValid(); - ngModel.$setViewValue( new Date(selected) ); - updateTemplate( keyboardChange ); - } - - function makeValid() { - ngModel.$setValidity('time', true); - scope.invalidHours = false; - scope.invalidMinutes = false; - } - - function updateTemplate( keyboardChange ) { - var hours = selected.getHours(), minutes = selected.getMinutes(); - - if ( scope.showMeridian ) { - hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system - } - scope.hours = keyboardChange === 'h' ? hours : pad(hours); - scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); - scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; - } - - function addMinutes( minutes ) { - var dt = new Date( selected.getTime() + minutes * 60000 ); - selected.setHours( dt.getHours(), dt.getMinutes() ); - refresh(); - } - - scope.incrementHours = function() { - addMinutes( hourStep * 60 ); - }; - scope.decrementHours = function() { - addMinutes( - hourStep * 60 ); - }; - scope.incrementMinutes = function() { - addMinutes( minuteStep ); - }; - scope.decrementMinutes = function() { - addMinutes( - minuteStep ); - }; - scope.toggleMeridian = function() { - addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); - }; - } - }; -}]); - -angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) - -/** - * A helper service that can parse typeahead's syntax (string provided by users) - * Extracted to a separate service for ease of unit testing - */ - .factory('typeaheadParser', ['$parse', function ($parse) { - - // 00000111000000000000022200000000000000003333333333333330000000000044000 - var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; - - return { - parse:function (input) { - - var match = input.match(TYPEAHEAD_REGEXP), modelMapper, viewMapper, source; - if (!match) { - throw new Error( - "Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_'" + - " but got '" + input + "'."); - } - - return { - itemName:match[3], - source:$parse(match[4]), - viewMapper:$parse(match[2] || match[1]), - modelMapper:$parse(match[1]) - }; - } - }; -}]) - - .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', - function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { - - var HOT_KEYS = [9, 13, 27, 38, 40]; - - return { - require:'ngModel', - link:function (originalScope, element, attrs, modelCtrl) { - - //SUPPORTED ATTRIBUTES (OPTIONS) - - //minimal no of characters that needs to be entered before typeahead kicks-in - var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; - - //minimal wait time after last character typed before typehead kicks-in - var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; - - //should it restrict model values to the ones selected from the popup only? - var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; - - //binding to a variable that indicates if matches are being retrieved asynchronously - var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; - - //a callback executed when a match is selected - var onSelectCallback = $parse(attrs.typeaheadOnSelect); - - var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; - - var appendToBody = attrs.typeaheadAppendToBody ? $parse(attrs.typeaheadAppendToBody) : false; - - //INTERNAL VARIABLES - - //model setter executed upon match selection - var $setModelValue = $parse(attrs.ngModel).assign; - - //expressions used by typeahead - var parserResult = typeaheadParser.parse(attrs.typeahead); - - var hasFocus; - - //pop-up element used to display matches - var popUpEl = angular.element('
        '); - popUpEl.attr({ - matches: 'matches', - active: 'activeIdx', - select: 'select(activeIdx)', - query: 'query', - position: 'position' - }); - //custom item template - if (angular.isDefined(attrs.typeaheadTemplateUrl)) { - popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); - } - - //create a child scope for the typeahead directive so we are not polluting original scope - //with typeahead-specific data (matches, query etc.) - var scope = originalScope.$new(); - originalScope.$on('$destroy', function(){ - scope.$destroy(); - }); - - var resetMatches = function() { - scope.matches = []; - scope.activeIdx = -1; - }; - - var getMatchesAsync = function(inputValue) { - - var locals = {$viewValue: inputValue}; - isLoadingSetter(originalScope, true); - $q.when(parserResult.source(originalScope, locals)).then(function(matches) { - - //it might happen that several async queries were in progress if a user were typing fast - //but we are interested only in responses that correspond to the current view value - if (inputValue === modelCtrl.$viewValue && hasFocus) { - if (matches.length > 0) { - - scope.activeIdx = 0; - scope.matches.length = 0; - - //transform labels - for(var i=0; i= minSearch) { - if (waitTime > 0) { - if (timeoutPromise) { - $timeout.cancel(timeoutPromise);//cancel previous timeout - } - timeoutPromise = $timeout(function () { - getMatchesAsync(inputValue); - }, waitTime); - } else { - getMatchesAsync(inputValue); - } - } else { - isLoadingSetter(originalScope, false); - resetMatches(); - } - - if (isEditable) { - return inputValue; - } else { - if (!inputValue) { - // Reset in case user had typed something previously. - modelCtrl.$setValidity('editable', true); - return inputValue; - } else { - modelCtrl.$setValidity('editable', false); - return undefined; - } - } - }); - - modelCtrl.$formatters.push(function (modelValue) { - - var candidateViewValue, emptyViewValue; - var locals = {}; - - if (inputFormatter) { - - locals['$model'] = modelValue; - return inputFormatter(originalScope, locals); - - } else { - - //it might happen that we don't have enough info to properly render input value - //we need to check for this situation and simply return model value if we can't apply custom formatting - locals[parserResult.itemName] = modelValue; - candidateViewValue = parserResult.viewMapper(originalScope, locals); - locals[parserResult.itemName] = undefined; - emptyViewValue = parserResult.viewMapper(originalScope, locals); - - return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; - } - }); - - scope.select = function (activeIdx) { - //called from within the $digest() cycle - var locals = {}; - var model, item; - - locals[parserResult.itemName] = item = scope.matches[activeIdx].model; - model = parserResult.modelMapper(originalScope, locals); - $setModelValue(originalScope, model); - modelCtrl.$setValidity('editable', true); - - onSelectCallback(originalScope, { - $item: item, - $model: model, - $label: parserResult.viewMapper(originalScope, locals) - }); - - resetMatches(); - - //return focus to the input element if a mach was selected via a mouse click event - element[0].focus(); - }; - - //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) - element.bind('keydown', function (evt) { - - //typeahead is open and an "interesting" key was pressed - if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { - return; - } - - evt.preventDefault(); - - if (evt.which === 40) { - scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; - scope.$digest(); - - } else if (evt.which === 38) { - scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; - scope.$digest(); - - } else if (evt.which === 13 || evt.which === 9) { - scope.$apply(function () { - scope.select(scope.activeIdx); - }); - - } else if (evt.which === 27) { - evt.stopPropagation(); - - resetMatches(); - scope.$digest(); - } - }); - - element.bind('blur', function (evt) { - hasFocus = false; - }); - - // Keep reference to click handler to unbind it. - var dismissClickHandler = function (evt) { - if (element[0] !== evt.target) { - resetMatches(); - scope.$digest(); - } - }; - - $document.bind('click', dismissClickHandler); - - originalScope.$on('$destroy', function(){ - $document.unbind('click', dismissClickHandler); - }); - - var $popup = $compile(popUpEl)(scope); - if ( appendToBody ) { - $document.find('body').append($popup); - } else { - element.after($popup); - } - } - }; - -}]) - - .directive('typeaheadPopup', function () { - return { - restrict:'EA', - scope:{ - matches:'=', - query:'=', - active:'=', - position:'=', - select:'&' - }, - replace:true, - templateUrl:'template/typeahead/typeahead-popup.html', - link:function (scope, element, attrs) { - - scope.templateUrl = attrs.templateUrl; - - scope.isOpen = function () { - return scope.matches.length > 0; - }; - - scope.isActive = function (matchIdx) { - return scope.active == matchIdx; - }; - - scope.selectActive = function (matchIdx) { - scope.active = matchIdx; - }; - - scope.selectMatch = function (activeIdx) { - scope.select({activeIdx:activeIdx}); - }; - } - }; - }) - - .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { - return { - restrict:'EA', - scope:{ - index:'=', - match:'=', - query:'=' - }, - link:function (scope, element, attrs) { - var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; - $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ - element.replaceWith($compile(tplContent.trim())(scope)); - }); - } - }; - }]) - - .filter('typeaheadHighlight', function() { - - function escapeRegexp(queryToEscape) { - return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); - } - - return function(matchItem, query) { - return query ? matchItem.replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; - }; - }); \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.min.js b/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.min.js deleted file mode 100644 index 08ee33a..0000000 --- a/server/insight-ui/public/lib/angular-bootstrap/ui-bootstrap.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * angular-ui-bootstrap - * http://angular-ui.github.io/bootstrap/ - - * Version: 0.10.0 - 2014-01-13 - * License: MIT - */ -angular.module("ui.bootstrap",["ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdownToggle","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(this.groups.indexOf(a),1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",["$parse",function(a){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(b,c,d,e){var f,g;e.addGroup(b),b.isOpen=!1,d.isOpen&&(f=a(d.isOpen),g=f.assign,b.$parent.$watch(f,function(a){b.isOpen=!!a})),b.$watch("isOpen",function(a){a&&e.closeOthers(b),g&&g(b.$parent,a)})}}}]).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",compile:function(a,b,c){return function(a,b,d,e){e.setHeading(c(a,function(){}))}}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"=",close:"&"}}}),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){b.hasClass(e.activeClass)||a.$apply(function(){f.$setViewValue(a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$transition","$q",function(a,b,c){function d(){e();var c=+a.interval;!isNaN(c)&&c>=0&&(g=b(f,c))}function e(){g&&(b.cancel(g),g=null)}function f(){h?(a.next(),d()):a.pause()}var g,h,i=this,j=i.slides=[],k=-1;i.currentSlide=null;var l=!1;i.select=function(e,f){function g(){if(!l){if(i.currentSlide&&angular.isString(f)&&!a.noTransition&&e.$element){e.$element.addClass(f);{e.$element[0].offsetWidth}angular.forEach(j,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(e,{direction:f,active:!0,entering:!0}),angular.extend(i.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=c(e.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(e,i.currentSlide)}else h(e,i.currentSlide);i.currentSlide=e,k=m,d()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var m=j.indexOf(e);void 0===f&&(f=m>k?"next":"prev"),e&&e!==i.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){l=!0}),i.indexOfSlide=function(a){return j.indexOf(a)},a.next=function(){var b=(k+1)%j.length;return a.$currentTransition?void 0:i.select(j[b],"next")},a.prev=function(){var b=0>k-1?j.length-1:k-1;return a.$currentTransition?void 0:i.select(j[b],"prev")},a.select=function(a){i.select(a)},a.isActive=function(a){return i.currentSlide===a},a.slides=function(){return j},a.$watch("interval",d),a.$on("$destroy",e),a.play=function(){h||(h=!0,d())},a.pause=function(){a.noPause||(h=!1,e())},i.addSlide=function(b,c){b.$element=c,j.push(b),1===j.length||b.active?(i.select(j[j.length-1]),1==j.length&&a.play()):b.active=!1},i.removeSlide=function(a){var b=j.indexOf(a);j.splice(b,1),j.length>0&&a.active?b>=j.length?i.select(j[b-1]):i.select(j[b]):k>b&&k--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",["$parse",function(a){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{},link:function(b,c,d,e){if(d.active){var f=a(d.active),g=f.assign,h=b.active=f(b.$parent);b.$watch(function(){var a=f(b.$parent);return a!==b.active&&(a!==h?h=b.active=a:g(b.$parent,a=h=b.active)),a})}e.addSlide(b,c),b.$on("$destroy",function(){e.removeSlide(b)}),b.$watch("active",function(a){a&&e.select(b)})}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].body.scrollTop||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].body.scrollLeft||a[0].documentElement.scrollLeft)}}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.position"]).constant("datepickerConfig",{dayFormat:"dd",monthFormat:"MMMM",yearFormat:"yyyy",dayHeaderFormat:"EEE",dayTitleFormat:"MMMM yyyy",monthTitleFormat:"yyyy",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","dateFilter","datepickerConfig",function(a,b,c,d){function e(b,c){return angular.isDefined(b)?a.$parent.$eval(b):c}function f(a,b){return new Date(a,b,0).getDate()}function g(a,b){for(var c=new Array(b),d=a,e=0;b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a,b,d,e){return{date:a,label:c(a,b),selected:!!d,secondary:!!e}}var i={day:e(b.dayFormat,d.dayFormat),month:e(b.monthFormat,d.monthFormat),year:e(b.yearFormat,d.yearFormat),dayHeader:e(b.dayHeaderFormat,d.dayHeaderFormat),dayTitle:e(b.dayTitleFormat,d.dayTitleFormat),monthTitle:e(b.monthTitleFormat,d.monthTitleFormat)},j=e(b.startingDay,d.startingDay),k=e(b.yearRange,d.yearRange);this.minDate=d.minDate?new Date(d.minDate):null,this.maxDate=d.maxDate?new Date(d.maxDate):null,this.modes=[{name:"day",getVisibleDates:function(a,b){var d=a.getFullYear(),e=a.getMonth(),k=new Date(d,e,1),l=j-k.getDay(),m=l>0?7-l:-l,n=new Date(k),o=0;m>0&&(n.setDate(-m+1),o+=m),o+=f(d,e+1),o+=(7-o%7)%7;for(var p=g(n,o),q=new Array(7),r=0;o>r;r++){var s=new Date(p[r]);p[r]=h(s,i.day,b&&b.getDate()===s.getDate()&&b.getMonth()===s.getMonth()&&b.getFullYear()===s.getFullYear(),s.getMonth()!==e)}for(var t=0;7>t;t++)q[t]=c(p[t].date,i.dayHeader);return{objects:p,title:c(a,i.dayTitle),labels:q}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},split:7,step:{months:1}},{name:"month",getVisibleDates:function(a,b){for(var d=new Array(12),e=a.getFullYear(),f=0;12>f;f++){var g=new Date(e,f,1);d[f]=h(g,i.month,b&&b.getMonth()===f&&b.getFullYear()===e)}return{objects:d,title:c(a,i.monthTitle)}},compare:function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},split:3,step:{years:1}},{name:"year",getVisibleDates:function(a,b){for(var c=new Array(k),d=a.getFullYear(),e=parseInt((d-1)/k,10)*k+1,f=0;k>f;f++){var g=new Date(e+f,0,1);c[f]=h(g,i.year,b&&b.getFullYear()===g.getFullYear())}return{objects:c,title:[c[0].label,c[k-1].label].join(" - ")}},compare:function(a,b){return a.getFullYear()-b.getFullYear()},split:5,step:{years:k}}],this.isDisabled=function(b,c){var d=this.modes[c||0];return this.minDate&&d.compare(b,this.minDate)<0||this.maxDate&&d.compare(b,this.maxDate)>0||a.dateDisabled&&a.dateDisabled({date:b,mode:d.name})}}]).directive("datepicker",["dateFilter","$parse","datepickerConfig","$log",function(a,b,c,d){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,e,f,g){function h(){a.showWeekNumbers=0===o&&q}function i(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c}function j(b){var c=null,e=!0;n.$modelValue&&(c=new Date(n.$modelValue),isNaN(c)?(e=!1,d.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):b&&(p=c)),n.$setValidity("date",e);var f=m.modes[o],g=f.getVisibleDates(p,c);angular.forEach(g.objects,function(a){a.disabled=m.isDisabled(a.date,o)}),n.$setValidity("date-disabled",!c||!m.isDisabled(c)),a.rows=i(g.objects,f.split),a.labels=g.labels||[],a.title=g.title}function k(a){o=a,h(),j()}function l(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}var m=g[0],n=g[1];if(n){var o=0,p=new Date,q=c.showWeeks;f.showWeeks?a.$parent.$watch(b(f.showWeeks),function(a){q=!!a,h()}):h(),f.min&&a.$parent.$watch(b(f.min),function(a){m.minDate=a?new Date(a):null,j()}),f.max&&a.$parent.$watch(b(f.max),function(a){m.maxDate=a?new Date(a):null,j()}),n.$render=function(){j(!0)},a.select=function(a){if(0===o){var b=n.$modelValue?new Date(n.$modelValue):new Date(0,0,0,0,0,0,0);b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),n.$setViewValue(b),j(!0)}else p=a,k(o-1)},a.move=function(a){var b=m.modes[o].step;p.setMonth(p.getMonth()+a*(b.months||0)),p.setFullYear(p.getFullYear()+a*(b.years||0)),j()},a.toggleMode=function(){k((o+1)%m.modes.length)},a.getWeekNumber=function(b){return 0===o&&a.showWeekNumbers&&7===b.length?l(b[0].date):null}}}}}]).constant("datepickerPopupConfig",{dateFormat:"yyyy-MM-dd",currentText:"Today",toggleWeeksText:"Weeks",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","datepickerPopupConfig","datepickerConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",link:function(h,i,j,k){function l(a){u?u(h,!!a):q.isOpen=!!a}function m(a){if(a){if(angular.isDate(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=new Date(a);return isNaN(b)?(k.$setValidity("date",!1),void 0):(k.$setValidity("date",!0),b)}return k.$setValidity("date",!1),void 0}return k.$setValidity("date",!0),null}function n(a,c,d){a&&(h.$watch(b(a),function(a){q[c]=a}),y.attr(d||c,c))}function o(){q.position=s?d.offset(i):d.position(i),q.position.top=q.position.top+i.prop("offsetHeight")}var p,q=h.$new(),r=angular.isDefined(j.closeOnDateSelection)?h.$eval(j.closeOnDateSelection):f.closeOnDateSelection,s=angular.isDefined(j.datepickerAppendToBody)?h.$eval(j.datepickerAppendToBody):f.appendToBody;j.$observe("datepickerPopup",function(a){p=a||f.dateFormat,k.$render()}),q.showButtonBar=angular.isDefined(j.showButtonBar)?h.$eval(j.showButtonBar):f.showButtonBar,h.$on("$destroy",function(){C.remove(),q.$destroy()}),j.$observe("currentText",function(a){q.currentText=angular.isDefined(a)?a:f.currentText}),j.$observe("toggleWeeksText",function(a){q.toggleWeeksText=angular.isDefined(a)?a:f.toggleWeeksText}),j.$observe("clearText",function(a){q.clearText=angular.isDefined(a)?a:f.clearText}),j.$observe("closeText",function(a){q.closeText=angular.isDefined(a)?a:f.closeText});var t,u;j.isOpen&&(t=b(j.isOpen),u=t.assign,h.$watch(t,function(a){q.isOpen=!!a})),q.isOpen=t?t(h):!1;var v=function(a){q.isOpen&&a.target!==i[0]&&q.$apply(function(){l(!1)})},w=function(){q.$apply(function(){l(!0)})},x=angular.element("
        ");x.attr({"ng-model":"date","ng-change":"dateSelection()"});var y=angular.element(x.children()[0]),z={};j.datepickerOptions&&(z=h.$eval(j.datepickerOptions),y.attr(angular.extend({},z))),k.$parsers.unshift(m),q.dateSelection=function(a){angular.isDefined(a)&&(q.date=a),k.$setViewValue(q.date),k.$render(),r&&l(!1)},i.bind("input change keyup",function(){q.$apply(function(){q.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,p):"";i.val(a),q.date=k.$modelValue},n(j.min,"min"),n(j.max,"max"),j.showWeeks?n(j.showWeeks,"showWeeks","show-weeks"):(q.showWeeks="show-weeks"in z?z["show-weeks"]:g.showWeeks,y.attr("show-weeks","showWeeks")),j.dateDisabled&&y.attr("date-disabled",j.dateDisabled);var A=!1,B=!1;q.$watch("isOpen",function(a){a?(o(),c.bind("click",v),B&&i.unbind("focus",w),i[0].focus(),A=!0):(A&&c.unbind("click",v),i.bind("focus",w),B=!0),u&&u(h,a)}),q.today=function(){q.dateSelection(new Date)},q.clear=function(){q.dateSelection(null)};var C=a(x)(q);s?c.find("body").append(C):i.after(C)}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdownToggle",[]).directive("dropdownToggle",["$document","$location",function(a){var b=null,c=angular.noop;return{restrict:"CA",link:function(d,e){d.$watch("$location.path",function(){c()}),e.parent().bind("click",function(){c()}),e.bind("click",function(d){var f=e===b;d.preventDefault(),d.stopPropagation(),b&&c(),f||e.hasClass("disabled")||e.prop("disabled")||(e.parent().addClass("open"),b=e,c=function(d){d&&(d.preventDefault(),d.stopPropagation()),a.unbind("click",c),e.parent().removeClass("open"),c=angular.noop,b=null},a.bind("click",c))})}}}]),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0)}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g,0)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&e.$apply(function(){o.dismiss(b.key)}))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();h>=0&&!k&&(l=e.$new(!0),l.index=h,k=d("
        ")(l),f.append(k));var i=angular.element("
        ");i.attr("window-class",b.windowClass),i.attr("index",n.length()-1),i.attr("animate","animate"),i.html(b.content);var j=d(i)(b.scope);n.top().value.modalDomEl=j,f.append(j),f.addClass(m)},o.close=function(a,b){var c=n.get(a).value;c&&(c.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a).value;c&&(c.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,windowClass:b.windowClass})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse","$interpolate",function(a,b,c,d){var e=this,f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(d){b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){e.itemsPerPage=parseInt(b,10),a.totalPages=e.calculateTotalPages()}):this.itemsPerPage=d},this.noPrevious=function(){return 1===this.page},this.noNext=function(){return this.page===a.totalPages},this.isActive=function(a){return this.page===a},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.getAttributeValue=function(b,c,e){return angular.isDefined(b)?e?d(b)(a.$parent):a.$parent.$eval(b):c},this.render=function(){this.page=parseInt(a.page,10)||1,this.page>0&&this.page<=a.totalPages&&(a.pages=this.getPages(this.page,a.totalPages))},a.selectPage=function(b){!e.isActive(b)&&b>0&&b<=a.totalPages&&(a.page=b,a.onSelectPage({page:b}))},a.$watch("page",function(){e.render()}),a.$watch("totalItems",function(){a.totalPages=e.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),e.page>b?a.selectPage(b):e.render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c,d){return{number:a,text:b,active:c,disabled:d}}var h,i=f.getAttributeValue(e.boundaryLinks,b.boundaryLinks),j=f.getAttributeValue(e.directionLinks,b.directionLinks),k=f.getAttributeValue(e.firstText,b.firstText,!0),l=f.getAttributeValue(e.previousText,b.previousText,!0),m=f.getAttributeValue(e.nextText,b.nextText,!0),n=f.getAttributeValue(e.lastText,b.lastText,!0),o=f.getAttributeValue(e.rotate,b.rotate);f.init(b.itemsPerPage),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){h=parseInt(a,10),f.render()}),f.getPages=function(a,b){var c=[],d=1,e=b,p=angular.isDefined(h)&&b>h;p&&(o?(d=Math.max(a-Math.floor(h/2),1),e=d+h-1,e>b&&(e=b,d=e-h+1)):(d=(Math.ceil(a/h)-1)*h+1,e=Math.min(d+h-1,b)));for(var q=d;e>=q;q++){var r=g(q,q,f.isActive(q),!1);c.push(r)}if(p&&!o){if(d>1){var s=g(d-1,"...",!1,!1);c.unshift(s)}if(b>e){var t=g(e+1,"...",!1,!1);c.push(t)}}if(j){var u=g(a-1,l,!1,f.noPrevious());c.unshift(u);var v=g(a+1,m,!1,f.noNext());c.push(v)}if(i){var w=g(1,k,!1,f.noPrevious());c.unshift(w);var x=g(b,n,!1,f.noNext());c.push(x)}return c}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{page:"=",totalItems:"=",onSelectPage:" &"},controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){function f(a,b,c,d,e){return{number:a,text:b,disabled:c,previous:i&&d,next:i&&e}}var g=e.getAttributeValue(d.previousText,a.previousText,!0),h=e.getAttributeValue(d.nextText,a.nextText,!0),i=e.getAttributeValue(d.align,a.align);e.init(a.itemsPerPage),e.getPages=function(a){return[f(a-1,g,e.noPrevious(),!0,!1),f(a+1,h,e.noNext(),!1,!0)]}}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$parse","$document","$position","$interpolate",function(e,f,g,h,i,j,k){return function(e,l,m){function n(a){var b=a||o.trigger||m,d=c[b]||b;return{show:b,hide:d}}var o=angular.extend({},b,d),p=a(e),q=k.startSymbol(),r=k.endSymbol(),s="
        ';return{restrict:"EA",scope:!0,compile:function(){var a=f(s);return function(b,c,d){function f(){b.tt_isOpen?m():k()}function k(){(!z||b.$eval(d[l+"Enable"]))&&(b.tt_popupDelay?(v=g(p,b.tt_popupDelay,!1),v.then(function(a){a()})):p()())}function m(){b.$apply(function(){q()})}function p(){return b.tt_content?(r(),u&&g.cancel(u),t.css({top:0,left:0,display:"block"}),w?i.find("body").append(t):c.after(t),A(),b.tt_isOpen=!0,b.$digest(),A):angular.noop}function q(){b.tt_isOpen=!1,g.cancel(v),b.tt_animation?u=g(s,500):s()}function r(){t&&s(),t=a(b,function(){}),b.$digest()}function s(){t&&(t.remove(),t=null)}var t,u,v,w=angular.isDefined(o.appendToBody)?o.appendToBody:!1,x=n(void 0),y=!1,z=angular.isDefined(d[l+"Enable"]),A=function(){var a,d,e,f;switch(a=w?j.offset(c):j.position(c),d=t.prop("offsetWidth"),e=t.prop("offsetHeight"),b.tt_placement){case"right":f={top:a.top+a.height/2-e/2,left:a.left+a.width};break;case"bottom":f={top:a.top+a.height,left:a.left+a.width/2-d/2};break;case"left":f={top:a.top+a.height/2-e/2,left:a.left-d};break;default:f={top:a.top-e,left:a.left+a.width/2-d/2}}f.top+="px",f.left+="px",t.css(f)};b.tt_isOpen=!1,d.$observe(e,function(a){b.tt_content=a,!a&&b.tt_isOpen&&q()}),d.$observe(l+"Title",function(a){b.tt_title=a}),d.$observe(l+"Placement",function(a){b.tt_placement=angular.isDefined(a)?a:o.placement}),d.$observe(l+"PopupDelay",function(a){var c=parseInt(a,10);b.tt_popupDelay=isNaN(c)?o.popupDelay:c});var B=function(){y&&(c.unbind(x.show,k),c.unbind(x.hide,m))};d.$observe(l+"Trigger",function(a){B(),x=n(a),x.show===x.hide?c.bind(x.show,f):(c.bind(x.show,k),c.bind(x.hide,m)),y=!0});var C=b.$eval(d[l+"Animation"]);b.tt_animation=angular.isDefined(C)?!!C:o.animation,d.$observe(l+"AppendToBody",function(a){w=angular.isDefined(a)?h(a)(b):w}),w&&b.$on("$locationChangeSuccess",function(){b.tt_isOpen&&q()}),b.$on("$destroy",function(){g.cancel(u),g.cancel(v),B(),s()})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",["ui.bootstrap.transition"]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig","$transition",function(a,b,c,d){var e=this,f=[],g=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,h=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.addBar=function(a,b){var c=0,d=a.$parent.$index;angular.isDefined(d)&&f[d]&&(c=f[d].value),f.push(a),this.update(b,a.value,c),a.$watch("value",function(a,c){a!==c&&e.update(b,a,c)}),a.$on("$destroy",function(){e.removeBar(a)})},this.update=function(a,b,c){var e=this.getPercentage(b);h?(a.css("width",this.getPercentage(c)+"%"),d(a,{width:e+"%"})):a.css({transition:"none",width:e+"%"})},this.removeBar=function(a){f.splice(f.indexOf(a),1)},this.getPercentage=function(a){return Math.round(100*a/g)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},template:'
        '}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","$parse","ratingConfig",function(a,b,c,d){this.maxRange=angular.isDefined(b.max)?a.$parent.$eval(b.max):d.max,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):d.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):d.stateOff,this.createRateObjects=function(a){for(var b={stateOn:this.stateOn,stateOff:this.stateOff},c=0,d=a.length;d>c;c++)a[c]=angular.extend({index:c},b,a[c]);return a},a.range=angular.isDefined(b.ratingStates)?this.createRateObjects(angular.copy(a.$parent.$eval(b.ratingStates))):this.createRateObjects(new Array(this.maxRange)),a.rate=function(b){a.value===b||a.readonly||(a.value=b)},a.enter=function(b){a.readonly||(a.val=b),a.onHover({value:b})},a.reset=function(){a.val=angular.copy(a.value),a.onLeave()},a.$watch("value",function(b){a.val=b}),a.readonly=!1,b.readonly&&a.$parent.$watch(c(b.readonly),function(b){a.readonly=!!b})}]).directive("rating",function(){return{restrict:"EA",scope:{value:"=",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(a){a.active=!1}),a.active=!0},b.addTab=function(a){c.push(a),(1===c.length||a.active)&&b.select(a)},b.removeTab=function(a){var d=c.indexOf(a);if(a.active&&c.length>1){var e=d==c.length-1?d-1:d+1;b.select(c[e])}c.splice(d,1)}}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1,a.type=angular.isDefined(c.type)?a.$parent.$eval(c.type):"tabs" -}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){var g,h;e.active?(g=a(e.active),h=g.assign,b.$parent.$watch(g,function(a,c){a!==c&&(b.active=!!a)}),b.active=g(b.$parent)):h=g=angular.noop,b.$watch("active",function(a){h(b.$parent,a),a?(f.select(b),b.onSelect()):b.onDeselect()}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).directive("timepicker",["$parse","$log","timepickerConfig","$locale",function(a,b,c,d){return{restrict:"EA",require:"?^ngModel",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(e,f,g,h){function i(){var a=parseInt(e.hours,10),b=e.showMeridian?a>0&&13>a:a>=0&&24>a;return b?(e.showMeridian&&(12===a&&(a=0),e.meridian===q[1]&&(a+=12)),a):void 0}function j(){var a=parseInt(e.minutes,10);return a>=0&&60>a?a:void 0}function k(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function l(a){m(),h.$setViewValue(new Date(p)),n(a)}function m(){h.$setValidity("time",!0),e.invalidHours=!1,e.invalidMinutes=!1}function n(a){var b=p.getHours(),c=p.getMinutes();e.showMeridian&&(b=0===b||12===b?12:b%12),e.hours="h"===a?b:k(b),e.minutes="m"===a?c:k(c),e.meridian=p.getHours()<12?q[0]:q[1]}function o(a){var b=new Date(p.getTime()+6e4*a);p.setHours(b.getHours(),b.getMinutes()),l()}if(h){var p=new Date,q=angular.isDefined(g.meridians)?e.$parent.$eval(g.meridians):c.meridians||d.DATETIME_FORMATS.AMPMS,r=c.hourStep;g.hourStep&&e.$parent.$watch(a(g.hourStep),function(a){r=parseInt(a,10)});var s=c.minuteStep;g.minuteStep&&e.$parent.$watch(a(g.minuteStep),function(a){s=parseInt(a,10)}),e.showMeridian=c.showMeridian,g.showMeridian&&e.$parent.$watch(a(g.showMeridian),function(a){if(e.showMeridian=!!a,h.$error.time){var b=i(),c=j();angular.isDefined(b)&&angular.isDefined(c)&&(p.setHours(b),l())}else n()});var t=f.find("input"),u=t.eq(0),v=t.eq(1),w=angular.isDefined(g.mousewheel)?e.$eval(g.mousewheel):c.mousewheel;if(w){var x=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};u.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementHours():e.decrementHours()),a.preventDefault()}),v.bind("mousewheel wheel",function(a){e.$apply(x(a)?e.incrementMinutes():e.decrementMinutes()),a.preventDefault()})}if(e.readonlyInput=angular.isDefined(g.readonlyInput)?e.$eval(g.readonlyInput):c.readonlyInput,e.readonlyInput)e.updateHours=angular.noop,e.updateMinutes=angular.noop;else{var y=function(a,b){h.$setViewValue(null),h.$setValidity("time",!1),angular.isDefined(a)&&(e.invalidHours=a),angular.isDefined(b)&&(e.invalidMinutes=b)};e.updateHours=function(){var a=i();angular.isDefined(a)?(p.setHours(a),l("h")):y(!0)},u.bind("blur",function(){!e.validHours&&e.hours<10&&e.$apply(function(){e.hours=k(e.hours)})}),e.updateMinutes=function(){var a=j();angular.isDefined(a)?(p.setMinutes(a),l("m")):y(void 0,!0)},v.bind("blur",function(){!e.invalidMinutes&&e.minutes<10&&e.$apply(function(){e.minutes=k(e.minutes)})})}h.$render=function(){var a=h.$modelValue?new Date(h.$modelValue):null;isNaN(a)?(h.$setValidity("time",!1),b.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(p=a),m(),n())},e.incrementHours=function(){o(60*r)},e.decrementHours=function(){o(60*-r)},e.incrementMinutes=function(){o(s)},e.decrementMinutes=function(){o(-s)},e.toggleMeridian=function(){o(720*(p.getHours()<12?1:-1))}}}}}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error("Expected typeahead specification in form of '_modelValue_ (as _label_)? for _item_ in _collection_' but got '"+c+"'.");return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?b(k.typeaheadAppendToBody):!1,u=b(k.ngModel).assign,v=g.parse(k.typeahead),w=angular.element("
        ");w.attr({matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&w.attr("template-url",k.typeaheadTemplateUrl);var x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y=function(){x.matches=[],x.activeIdx=-1},z=function(a){var b={$viewValue:a};q(i,!0),c.when(v.source(i,b)).then(function(c){if(a===l.$viewValue&&m){if(c.length>0){x.activeIdx=0,x.matches.length=0;for(var d=0;d=n?o>0?(A&&d.cancel(A),A=d(function(){z(a)},o)):z(a):(q(i,!1),y()),p?a:a?(l.$setValidity("editable",!1),void 0):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[v.itemName]=a,b=v.viewMapper(i,d),d[v.itemName]=void 0,c=v.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,d={};d[v.itemName]=c=x.matches[a].model,b=v.modelMapper(i,d),u(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:v.viewMapper(i,d)}),y(),j[0].focus()},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),y(),x.$digest()))}),j.bind("blur",function(){m=!1});var B=function(a){j[0]!==a.target&&(y(),x.$digest())};e.bind("click",B),i.$on("$destroy",function(){e.unbind("click",B)});var C=a(w)(x);t?e.find("body").append(C):j.after(C)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?b.replace(new RegExp(a(c),"gi"),"$&"):b}}); \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-gettext/.bower.json b/server/insight-ui/public/lib/angular-gettext/.bower.json deleted file mode 100644 index 71a7b89..0000000 --- a/server/insight-ui/public/lib/angular-gettext/.bower.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "angular-gettext", - "version": "1.1.4", - "main": "dist/angular-gettext.js", - "ignore": [ - "**/.*", - "src", - "node_modules", - "bower_components", - "test", - "genplurals.py", - "Gruntfile.js" - ], - "dependencies": { - "angular": ">=1.2.0" - }, - "devDependencies": { - "jquery": ">=1.8.0", - "angular-mocks": ">=1.2.0" - }, - "homepage": "https://github.com/rubenv/angular-gettext", - "_release": "1.1.4", - "_resolution": { - "type": "version", - "tag": "v1.1.4", - "commit": "8bc3a498bc94a19b7106e6e25faab0cc9ce4cea3" - }, - "_source": "https://github.com/rubenv/angular-gettext.git", - "_target": "~1.1.0", - "_originalSource": "angular-gettext" -} \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-gettext/LICENSE b/server/insight-ui/public/lib/angular-gettext/LICENSE deleted file mode 100644 index aeb72da..0000000 --- a/server/insight-ui/public/lib/angular-gettext/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2013-2014 by Ruben Vermeersch - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/server/insight-ui/public/lib/angular-gettext/README.md b/server/insight-ui/public/lib/angular-gettext/README.md deleted file mode 100644 index 0f9831f..0000000 --- a/server/insight-ui/public/lib/angular-gettext/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# angular-gettext - gettext utilities for angular.js - -> Translate your Angular.JS applications with gettext. - -[![Build Status](https://travis-ci.org/rubenv/angular-gettext.png?branch=master)](https://travis-ci.org/rubenv/angular-gettext) - -Check the website for usage instructions: [http://angular-gettext.rocketeer.be/](http://angular-gettext.rocketeer.be/). - -## License - - (The MIT License) - - Copyright (C) 2013-2014 by Ruben Vermeersch - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/server/insight-ui/public/lib/angular-gettext/bower.json b/server/insight-ui/public/lib/angular-gettext/bower.json deleted file mode 100644 index c799553..0000000 --- a/server/insight-ui/public/lib/angular-gettext/bower.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "angular-gettext", - "version": "1.1.4", - "main": "dist/angular-gettext.js", - "ignore": [ - "**/.*", - "src", - "node_modules", - "bower_components", - "test", - "genplurals.py", - "Gruntfile.js" - ], - "dependencies": { - "angular": ">=1.2.0" - }, - "devDependencies": { - "jquery": ">=1.8.0", - "angular-mocks": ">=1.2.0" - } -} diff --git a/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.js b/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.js deleted file mode 100644 index 4790821..0000000 --- a/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.js +++ /dev/null @@ -1,294 +0,0 @@ -angular.module('gettext', []); - -angular.module('gettext').constant('gettext', function (str) { - /* - * Does nothing, simply returns the input string. - * - * This function serves as a marker for `grunt-angular-gettext` to know that - * this string should be extracted for translations. - */ - return str; -}); - -angular.module('gettext').factory('gettextCatalog', ["gettextPlurals", "$http", "$cacheFactory", "$interpolate", "$rootScope", function (gettextPlurals, $http, $cacheFactory, $interpolate, $rootScope) { - var catalog; - - var prefixDebug = function (string) { - if (catalog.debug && catalog.currentLanguage !== catalog.baseLanguage) { - return catalog.debugPrefix + string; - } else { - return string; - } - }; - - var addTranslatedMarkers = function (string) { - if (catalog.showTranslatedMarkers) { - return catalog.translatedMarkerPrefix + string + catalog.translatedMarkerSuffix; - } else { - return string; - } - }; - - function broadcastUpdated() { - $rootScope.$broadcast('gettextLanguageChanged'); - } - - catalog = { - debug: false, - debugPrefix: '[MISSING]: ', - showTranslatedMarkers: false, - translatedMarkerPrefix: '[', - translatedMarkerSuffix: ']', - strings: {}, - baseLanguage: 'en', - currentLanguage: 'en', - cache: $cacheFactory('strings'), - - setCurrentLanguage: function (lang) { - this.currentLanguage = lang; - broadcastUpdated(); - }, - - setStrings: function (language, strings) { - if (!this.strings[language]) { - this.strings[language] = {}; - } - - for (var key in strings) { - var val = strings[key]; - if (typeof val === 'string') { - this.strings[language][key] = [val]; - } else { - this.strings[language][key] = val; - } - } - - broadcastUpdated(); - }, - - getStringForm: function (string, n) { - var stringTable = this.strings[this.currentLanguage] || {}; - var plurals = stringTable[string] || []; - return plurals[n]; - }, - - getString: function (string, context) { - string = this.getStringForm(string, 0) || prefixDebug(string); - string = context ? $interpolate(string)(context) : string; - return addTranslatedMarkers(string); - }, - - getPlural: function (n, string, stringPlural, context) { - var form = gettextPlurals(this.currentLanguage, n); - string = this.getStringForm(string, form) || prefixDebug(n === 1 ? string : stringPlural); - string = context ? $interpolate(string)(context) : string; - return addTranslatedMarkers(string); - }, - - loadRemote: function (url) { - return $http({ - method: 'GET', - url: url, - cache: catalog.cache - }).success(function (data) { - for (var lang in data) { - catalog.setStrings(lang, data[lang]); - } - }); - } - }; - - return catalog; -}]); - -angular.module('gettext').directive('translate', ["gettextCatalog", "$parse", "$animate", "$compile", function (gettextCatalog, $parse, $animate, $compile) { - // Trim polyfill for old browsers (instead of jQuery) - // Based on AngularJS-v1.2.2 (angular.js#620) - var trim = (function () { - if (!String.prototype.trim) { - return function (value) { - return (typeof value === 'string') ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value; - }; - } - return function (value) { - return (typeof value === 'string') ? value.trim() : value; - }; - })(); - - function assert(condition, missing, found) { - if (!condition) { - throw new Error('You should add a ' + missing + ' attribute whenever you add a ' + found + ' attribute.'); - } - } - - return { - restrict: 'A', - terminal: true, - compile: function compile(element, attrs) { - // Validate attributes - assert(!attrs.translatePlural || attrs.translateN, 'translate-n', 'translate-plural'); - assert(!attrs.translateN || attrs.translatePlural, 'translate-plural', 'translate-n'); - - var msgid = trim(element.html()); - var translatePlural = attrs.translatePlural; - - return { - post: function (scope, element, attrs) { - var countFn = $parse(attrs.translateN); - var pluralScope = null; - - function update() { - // Fetch correct translated string. - var translated; - if (translatePlural) { - scope = pluralScope || (pluralScope = scope.$new()); - scope.$count = countFn(scope); - translated = gettextCatalog.getPlural(scope.$count, msgid, translatePlural); - } else { - translated = gettextCatalog.getString(msgid); - } - - // Swap in the translation - var newWrapper = angular.element('' + translated + ''); - $compile(newWrapper.contents())(scope); - var oldContents = element.contents(); - var newContents = newWrapper.contents(); - $animate.enter(newContents, element); - $animate.leave(oldContents); - } - - if (attrs.translateN) { - scope.$watch(attrs.translateN, update); - } - - scope.$on('gettextLanguageChanged', update); - - update(); - } - }; - } - }; -}]); - -angular.module('gettext').filter('translate', ["gettextCatalog", function (gettextCatalog) { - function filter(input) { - return gettextCatalog.getString(input); - } - filter.$stateful = true; - return filter; -}]); - -// Do not edit this file, it is autogenerated using genplurals.py! -angular.module("gettext").factory("gettextPlurals", function () { - return function (langCode, n) { - switch (langCode) { - case "ay": // Aymará - case "bo": // Tibetan - case "cgg": // Chiga - case "dz": // Dzongkha - case "fa": // Persian - case "id": // Indonesian - case "ja": // Japanese - case "jbo": // Lojban - case "ka": // Georgian - case "kk": // Kazakh - case "km": // Khmer - case "ko": // Korean - case "ky": // Kyrgyz - case "lo": // Lao - case "ms": // Malay - case "my": // Burmese - case "sah": // Yakut - case "su": // Sundanese - case "th": // Thai - case "tt": // Tatar - case "ug": // Uyghur - case "vi": // Vietnamese - case "wo": // Wolof - case "zh": // Chinese - // 1 form - return 0; - case "is": // Icelandic - // 2 forms - return (n%10!=1 || n%100==11) ? 1 : 0; - case "jv": // Javanese - // 2 forms - return n!=0 ? 1 : 0; - case "mk": // Macedonian - // 2 forms - return n==1 || n%10==1 ? 0 : 1; - case "ach": // Acholi - case "ak": // Akan - case "am": // Amharic - case "arn": // Mapudungun - case "br": // Breton - case "fil": // Filipino - case "fr": // French - case "gun": // Gun - case "ln": // Lingala - case "mfe": // Mauritian Creole - case "mg": // Malagasy - case "mi": // Maori - case "oc": // Occitan - case "pt_BR": // Brazilian Portuguese - case "tg": // Tajik - case "ti": // Tigrinya - case "tr": // Turkish - case "uz": // Uzbek - case "wa": // Walloon - case "zh": // Chinese - // 2 forms - return n>1 ? 1 : 0; - case "lv": // Latvian - // 3 forms - return (n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2); - case "lt": // Lithuanian - // 3 forms - return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); - case "be": // Belarusian - case "bs": // Bosnian - case "hr": // Croatian - case "ru": // Russian - case "sr": // Serbian - case "uk": // Ukrainian - // 3 forms - return (n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); - case "mnk": // Mandinka - // 3 forms - return (n==0 ? 0 : n==1 ? 1 : 2); - case "ro": // Romanian - // 3 forms - return (n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2); - case "pl": // Polish - // 3 forms - return (n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); - case "cs": // Czech - case "sk": // Slovak - // 3 forms - return (n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; - case "sl": // Slovenian - // 4 forms - return (n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); - case "mt": // Maltese - // 4 forms - return (n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3); - case "gd": // Scottish Gaelic - // 4 forms - return (n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : (n > 2 && n < 20) ? 2 : 3; - case "cy": // Welsh - // 4 forms - return (n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3; - case "kw": // Cornish - // 4 forms - return (n==1) ? 0 : (n==2) ? 1 : (n == 3) ? 2 : 3; - case "ga": // Irish - // 5 forms - return n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4; - case "ar": // Arabic - // 6 forms - return (n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5); - default: // Everything else - return n != 1 ? 1 : 0; - } - } -}); diff --git a/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.min.js b/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.min.js deleted file mode 100644 index 8424fd2..0000000 --- a/server/insight-ui/public/lib/angular-gettext/dist/angular-gettext.min.js +++ /dev/null @@ -1 +0,0 @@ -angular.module("gettext",[]),angular.module("gettext").constant("gettext",function(a){return a}),angular.module("gettext").factory("gettextCatalog",["gettextPlurals","$http","$cacheFactory","$interpolate","$rootScope",function(a,b,c,d,e){function f(){e.$broadcast("gettextLanguageChanged")}var g,h=function(a){return g.debug&&g.currentLanguage!==g.baseLanguage?g.debugPrefix+a:a},i=function(a){return g.showTranslatedMarkers?g.translatedMarkerPrefix+a+g.translatedMarkerSuffix:a};return g={debug:!1,debugPrefix:"[MISSING]: ",showTranslatedMarkers:!1,translatedMarkerPrefix:"[",translatedMarkerSuffix:"]",strings:{},baseLanguage:"en",currentLanguage:"en",cache:c("strings"),setCurrentLanguage:function(a){this.currentLanguage=a,f()},setStrings:function(a,b){this.strings[a]||(this.strings[a]={});for(var c in b){var d=b[c];this.strings[a][c]="string"==typeof d?[d]:d}f()},getStringForm:function(a,b){var c=this.strings[this.currentLanguage]||{},d=c[a]||[];return d[b]},getString:function(a,b){return a=this.getStringForm(a,0)||h(a),a=b?d(a)(b):a,i(a)},getPlural:function(b,c,e,f){var g=a(this.currentLanguage,b);return c=this.getStringForm(c,g)||h(1===b?c:e),c=f?d(c)(f):c,i(c)},loadRemote:function(a){return b({method:"GET",url:a,cache:g.cache}).success(function(a){for(var b in a)g.setStrings(b,a[b])})}}}]),angular.module("gettext").directive("translate",["gettextCatalog","$parse","$animate","$compile",function(a,b,c,d){function e(a,b,c){if(!a)throw new Error("You should add a "+b+" attribute whenever you add a "+c+" attribute.")}var f=function(){return String.prototype.trim?function(a){return"string"==typeof a?a.trim():a}:function(a){return"string"==typeof a?a.replace(/^\s*/,"").replace(/\s*$/,""):a}}();return{restrict:"A",terminal:!0,compile:function(g,h){e(!h.translatePlural||h.translateN,"translate-n","translate-plural"),e(!h.translateN||h.translatePlural,"translate-plural","translate-n");var i=f(g.html()),j=h.translatePlural;return{post:function(e,f,g){function h(){var b;j?(e=l||(l=e.$new()),e.$count=k(e),b=a.getPlural(e.$count,i,j)):b=a.getString(i);var g=angular.element(""+b+"");d(g.contents())(e);var h=f.contents(),m=g.contents();c.enter(m,f),c.leave(h)}var k=b(g.translateN),l=null;g.translateN&&e.$watch(g.translateN,h),e.$on("gettextLanguageChanged",h),h()}}}}}]),angular.module("gettext").filter("translate",["gettextCatalog",function(a){function b(b){return a.getString(b)}return b.$stateful=!0,b}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return b%10!=1||b%100==11?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||b%10==1?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"pt_BR":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return b%10==1&&b%100!=11?0:0!=b?1:2;case"lt":return b%10==1&&b%100!=11?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return b%10==1&&b%100!=11?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return b%100==1?1:b%100==2?2:b%100==3||b%100==4?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}); \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-gettext/package.json b/server/insight-ui/public/lib/angular-gettext/package.json deleted file mode 100644 index 7c77e6f..0000000 --- a/server/insight-ui/public/lib/angular-gettext/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "angular-gettext", - "version": "1.1.4", - "description": "Gettext support for Angular.js", - "main": "dist/angular-gettext.js", - "directories": { - "test": "test" - }, - "scripts": { - "test": "grunt ci", - "prepublish": "grunt build" - }, - "keywords": [ - "angular", - "gettext" - ], - "author": { - "name": "Ruben Vermeersch", - "email": "ruben@rocketeer.be", - "url": "http://rocketeer.be/" - }, - "homepage": "http://angular-gettext.rocketeer.be/", - "license": "MIT", - "devDependencies": { - "grunt": "~0.4.1", - "grunt-bump": "0.0.13", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-concat": "~0.3.0", - "grunt-contrib-connect": "~0.7.1", - "grunt-contrib-jshint": "~0.10.0", - "grunt-contrib-uglify": "~0.4.0", - "grunt-contrib-watch": "~0.5.1", - "grunt-jscs": "^0.6.2", - "grunt-karma": "~0.8.3", - "grunt-ng-annotate": "^0.3.2", - "karma": "~0.12.16", - "karma-chai": "~0.1.0", - "karma-firefox-launcher": "~0.1.0", - "karma-junit-reporter": "~0.2.2", - "karma-mocha": "~0.1.0", - "karma-ng-scenario": "~0.1.0", - "karma-phantomjs-launcher": "^0.1.4" - }, - "repository": { - "type": "git", - "url": "git://github.com/rubenv/angular-gettext.git" - } -} diff --git a/server/insight-ui/public/lib/angular-moment/.bower.json b/server/insight-ui/public/lib/angular-moment/.bower.json deleted file mode 100644 index bf0bf39..0000000 --- a/server/insight-ui/public/lib/angular-moment/.bower.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "angular-moment", - "version": "0.8.3", - "description": "Moment.JS directives & filters for Angular.JS (timeago alternative)", - "author": "Uri Shaked", - "license": "MIT", - "homepage": "http://github.com/urish/angular-moment", - "main": "./angular-moment.js", - "ignore": [], - "dependencies": { - "angular": ">=1.0.0 <1.4.0", - "moment": ">=2.0.0 <2.9.0" - }, - "devDependencies": { - "angular-mocks": "1.2.x", - "moment-timezone": "0.2.1" - }, - "repository": { - "type": "git", - "url": "git://github.com/urish/angular-moment.git" - }, - "_release": "0.8.3", - "_resolution": { - "type": "version", - "tag": "0.8.3", - "commit": "585547e63f9170a39fe631590b3ef2827666efec" - }, - "_source": "https://github.com/urish/angular-moment.git", - "_target": "~0.8.0", - "_originalSource": "angular-moment" -} \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-moment/.editorconfig b/server/insight-ui/public/lib/angular-moment/.editorconfig deleted file mode 100644 index 2973682..0000000 --- a/server/insight-ui/public/lib/angular-moment/.editorconfig +++ /dev/null @@ -1,24 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - -[*] - -# Change these settings to your own preference -indent_style = tab -indent_size = 4 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[{package.json,bower.json}] -indent_style=space -indent_size=2 - -[*.md] -trim_trailing_whitespace = false diff --git a/server/insight-ui/public/lib/angular-moment/.gitignore b/server/insight-ui/public/lib/angular-moment/.gitignore deleted file mode 100644 index fccb56b..0000000 --- a/server/insight-ui/public/lib/angular-moment/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/.idea -/bower_components -/node_modules -/coverage \ No newline at end of file diff --git a/server/insight-ui/public/lib/angular-moment/.jshintrc b/server/insight-ui/public/lib/angular-moment/.jshintrc deleted file mode 100644 index d430ef2..0000000 --- a/server/insight-ui/public/lib/angular-moment/.jshintrc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "node": true, - "browser": true, - "esnext": true, - "bitwise": true, - "camelcase": true, - "curly": true, - "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, - "maxdepth": 2, - "maxcomplexity": 10, - "globals": { - "angular": false - } -} diff --git a/server/insight-ui/public/lib/angular-moment/.npmignore b/server/insight-ui/public/lib/angular-moment/.npmignore deleted file mode 100644 index 2a9c393..0000000 --- a/server/insight-ui/public/lib/angular-moment/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -bower_components -node_modules -coverage diff --git a/server/insight-ui/public/lib/angular-moment/.travis.yml b/server/insight-ui/public/lib/angular-moment/.travis.yml deleted file mode 100644 index c3ecc28..0000000 --- a/server/insight-ui/public/lib/angular-moment/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - "0.10" -before_script: - - npm install -g bower@1.3.x grunt-cli - - bower install -after_success: - - cat ./coverage/*/lcov.info | ./node_modules/coveralls/bin/coveralls.js diff --git a/server/insight-ui/public/lib/angular-moment/CHANGELOG.md b/server/insight-ui/public/lib/angular-moment/CHANGELOG.md deleted file mode 100644 index 07517aa..0000000 --- a/server/insight-ui/public/lib/angular-moment/CHANGELOG.md +++ /dev/null @@ -1,102 +0,0 @@ -# Changelog - -## 0.8.3 - 2014-12-08 -- `amTimeAgo` filter ([#96](https://github.com/urish/angular-moment/pull/96), contributed by [maxklenk](https://github.com/maxklenk)) -- Show formatted time as element title ([#78](https://github.com/urish/angular-moment/pull/78), contributed by [ctesene](https://github.com/ctesene)) -- Support commonjs and browserify ([#95](https://github.com/urish/angular-moment/pull/95), contributed by [Pencroff](https://github.com/Pencroff)) -- SystemJS Loader support ([#85](https://github.com/urish/angular-moment/pull/85), contributed by [capaj](https://github.com/capaj)) - -## 0.8.2 - 2014-09-07 -- `amMoment.changeLanguage()` was deprecated in favor of `amMoment.changeLocale()` (following [a change](http://momentjs.com/docs/#/i18n/changing-locale/) introduced in moment v2.8.1) -- Bugfix: changing the locale emitted a deprecation warning (see [#76](https://github.com/urish/angular-moment/issues/76) for details). - -## 0.8.1 - 2014-09-01 -- Support moment.js v2.8.0. See [here](https://gist.github.com/ichernev/ac3899324a5fa6c8c9b4) for changelog. -- Support moment-timezone v0.2.1. See [here](https://github.com/moment/moment-timezone/blob/develop/changelog.md#021-2014-08-02) for changelog. -- Bugfix: `updateTime()` is called too often for future dates ([#73](https://github.com/urish/angular-moment/issues/73)) - -## 0.8.0 - 2014-07-26 -- Generate source map for the minified version ([#50](https://github.com/urish/angular-moment/issues/50)) -- Add support HTML `